From 581c63a6aa293fd8d9b26ecf40a9ed02f49678db Mon Sep 17 00:00:00 2001 From: gauthiier Date: Wed, 13 Jul 2022 14:30:59 +0200 Subject: [PATCH] oxford --- .gitattributes | 3 + audio/20220622-171706.wav | 3 + audio/20220622-171706.wav.asd | 3 + .../Ableton Project Info/Project8_1.cfg | Bin 0 -> 465 bytes .../Backup/Untitled [2022-06-24 152453].als | Bin 0 -> 18413 bytes "audio/Untitled Project/Icon\r" | 0 audio/Untitled Project/Untitled.als | Bin 0 -> 21702 bytes audio/comme_ca.m4a | 3 + audio/comme_ca.wav | 3 + audio/edits/E1.read.wav | 3 + audio/edits/E10.they_only.wav | 3 + audio/edits/E11.knew.wav | 3 + audio/edits/E12.from.wav | 3 + audio/edits/E13.books.wav | 3 + audio/edits/E2.old_tales.wav | 3 + audio/edits/E3.traversed_provinces.wav | 3 + audio/edits/E4.crossed_seas.wav | 3 + audio/edits/E5.visited.wav | 3 + audio/edits/E6.new_peoples.wav | 3 + audio/edits/E7.to_see.wav | 3 + audio/edits/E8.face_to_face.wav | 3 + audio/edits/E9.persons.wav | 3 + audio/edits/EA.we_read_in_old_tales.wav | 3 + .../edits/EB.that_men_traversed_provinces.wav | 3 + ...C.crossed_seas_and_visited_new_peoples.wav | 3 + .../edits/ED.to_see_face_to_face_persons.wav | 3 + .../EE.whom_they_only_knew_from_books.wav | 3 + audio/edits/ENGLISH.wav | 3 + audio/edits/L0.legimus.wav | 3 + audio/edits/L1.in_veteribus.wav | 3 + audio/edits/L10.noverant.wav | 3 + audio/edits/L11.coram.wav | 3 + audio/edits/L12.quoque_viderent.wav | 3 + audio/edits/L2.historiis.wav | 3 + .../edits/L3.quosdam_lustrasse_provincias.wav | 3 + audio/edits/L4.novos.wav | 3 + audio/edits/L5.adiisse_populos.wav | 3 + audio/edits/L6.maria_transisse.wav | 3 + audio/edits/L7.ut_eos.wav | 3 + audio/edits/L8.quos.wav | 3 + audio/edits/L9.ex_libris.wav | 3 + .../LA.legimus_in_vereribus_historiis.wav | 3 + audio/edits/LATIN.wav | 3 + .../edits/LB.quodam_lustrasse_provincias.wav | 3 + ....novos_adiisse_populos_maria_transisse.wav | 3 + .../LD.ut_eos_quos_ex_libris_noverant.wav | 3 + audio/edits/LE.coram_quoque_viderent.wav | 3 + audio/edits/translation.rtf | 84 ++ audio/libris_laborem.m4a | 3 + audio/libris_laborem.wav | 3 + audio/phrases/ENGLISH.wav | 3 + audio/phrases/LATIN.wav | 3 + libs/42line/FASTSENSOR.h | 96 +++ libs/42line/SENSOR.h | 64 ++ libs/42line/SOUND.h | 135 +++ libs/42line/WORDS.h | 55 ++ .../FastTouchSerialReportLilypadUSB.ino | 27 + .../FastTouchSerialReportTeensy.ino | 30 + .../FastTouchSerialToneLilypadUSB.ino | 44 + .../FastTouchSerialTonePlaygroundExpress.ino | 41 + libs/FastTouch/README.md | 6 + libs/FastTouch/keywords.txt | 2 + libs/FastTouch/library.properties | 9 + libs/FastTouch/src/FastTouch.cpp | 803 ++++++++++++++++++ libs/FastTouch/src/FastTouch.h | 243 ++++++ sketch_42line/sketch_42line.ino | 377 ++++++++ 66 files changed, 2157 insertions(+) create mode 100644 .gitattributes create mode 100644 audio/20220622-171706.wav create mode 100644 audio/20220622-171706.wav.asd create mode 100644 audio/Untitled Project/Ableton Project Info/Project8_1.cfg create mode 100644 audio/Untitled Project/Backup/Untitled [2022-06-24 152453].als create mode 100644 "audio/Untitled Project/Icon\r" create mode 100644 audio/Untitled Project/Untitled.als create mode 100644 audio/comme_ca.m4a create mode 100644 audio/comme_ca.wav create mode 100644 audio/edits/E1.read.wav create mode 100644 audio/edits/E10.they_only.wav create mode 100644 audio/edits/E11.knew.wav create mode 100644 audio/edits/E12.from.wav create mode 100644 audio/edits/E13.books.wav create mode 100644 audio/edits/E2.old_tales.wav create mode 100644 audio/edits/E3.traversed_provinces.wav create mode 100644 audio/edits/E4.crossed_seas.wav create mode 100644 audio/edits/E5.visited.wav create mode 100644 audio/edits/E6.new_peoples.wav create mode 100644 audio/edits/E7.to_see.wav create mode 100644 audio/edits/E8.face_to_face.wav create mode 100644 audio/edits/E9.persons.wav create mode 100644 audio/edits/EA.we_read_in_old_tales.wav create mode 100644 audio/edits/EB.that_men_traversed_provinces.wav create mode 100644 audio/edits/EC.crossed_seas_and_visited_new_peoples.wav create mode 100644 audio/edits/ED.to_see_face_to_face_persons.wav create mode 100644 audio/edits/EE.whom_they_only_knew_from_books.wav create mode 100644 audio/edits/ENGLISH.wav create mode 100644 audio/edits/L0.legimus.wav create mode 100644 audio/edits/L1.in_veteribus.wav create mode 100644 audio/edits/L10.noverant.wav create mode 100644 audio/edits/L11.coram.wav create mode 100644 audio/edits/L12.quoque_viderent.wav create mode 100644 audio/edits/L2.historiis.wav create mode 100644 audio/edits/L3.quosdam_lustrasse_provincias.wav create mode 100644 audio/edits/L4.novos.wav create mode 100644 audio/edits/L5.adiisse_populos.wav create mode 100644 audio/edits/L6.maria_transisse.wav create mode 100644 audio/edits/L7.ut_eos.wav create mode 100644 audio/edits/L8.quos.wav create mode 100644 audio/edits/L9.ex_libris.wav create mode 100644 audio/edits/LA.legimus_in_vereribus_historiis.wav create mode 100644 audio/edits/LATIN.wav create mode 100644 audio/edits/LB.quodam_lustrasse_provincias.wav create mode 100644 audio/edits/LC.novos_adiisse_populos_maria_transisse.wav create mode 100644 audio/edits/LD.ut_eos_quos_ex_libris_noverant.wav create mode 100644 audio/edits/LE.coram_quoque_viderent.wav create mode 100644 audio/edits/translation.rtf create mode 100644 audio/libris_laborem.m4a create mode 100644 audio/libris_laborem.wav create mode 100644 audio/phrases/ENGLISH.wav create mode 100644 audio/phrases/LATIN.wav create mode 100644 libs/42line/FASTSENSOR.h create mode 100644 libs/42line/SENSOR.h create mode 100644 libs/42line/SOUND.h create mode 100644 libs/42line/WORDS.h create mode 100644 libs/FastTouch/Examples/FastTouchSerialReportLilypadUSB/FastTouchSerialReportLilypadUSB.ino create mode 100644 libs/FastTouch/Examples/FastTouchSerialReportTeensy/FastTouchSerialReportTeensy.ino create mode 100644 libs/FastTouch/Examples/FastTouchSerialToneLilypadUSB/FastTouchSerialToneLilypadUSB.ino create mode 100644 libs/FastTouch/Examples/FastTouchSerialTonePlaygroundExpress/FastTouchSerialTonePlaygroundExpress.ino create mode 100644 libs/FastTouch/README.md create mode 100755 libs/FastTouch/keywords.txt create mode 100644 libs/FastTouch/library.properties create mode 100644 libs/FastTouch/src/FastTouch.cpp create mode 100644 libs/FastTouch/src/FastTouch.h create mode 100644 sketch_42line/sketch_42line.ino diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..c09d838 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,3 @@ +*.wav filter=lfs diff=lfs merge=lfs -text +*.m4a filter=lfs diff=lfs merge=lfs -text +*.asd filter=lfs diff=lfs merge=lfs -text diff --git a/audio/20220622-171706.wav b/audio/20220622-171706.wav new file mode 100644 index 0000000..402f0d7 --- /dev/null +++ b/audio/20220622-171706.wav @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6a6db833c8438dea164e6ce4bdfbb7fe1c65829994771baa80ff2d68be0c4856 +size 34207472 diff --git a/audio/20220622-171706.wav.asd b/audio/20220622-171706.wav.asd new file mode 100644 index 0000000..0b22fd4 --- /dev/null +++ b/audio/20220622-171706.wav.asd @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2f067029f944954dedbd80f9ed60a8ccab38593f392cb3476fb1038479cf8188 +size 588437 diff --git a/audio/Untitled Project/Ableton Project Info/Project8_1.cfg b/audio/Untitled Project/Ableton Project Info/Project8_1.cfg new file mode 100644 index 0000000000000000000000000000000000000000..1da5409453acca8452577906d57e5f07ac4392dc GIT binary patch literal 465 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 F1^{gV8s7i_ literal 0 HcmV?d00001 diff --git "a/audio/Untitled Project/Icon\r" "b/audio/Untitled Project/Icon\r" new file mode 100644 index 0000000..e69de29 diff --git a/audio/Untitled Project/Untitled.als b/audio/Untitled Project/Untitled.als new file mode 100644 index 0000000000000000000000000000000000000000..66dbc8d96ce22dd92866caa3c2799158c4bf79a7 GIT binary patch literal 21702 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 T^PQCc?Jxfy_N4?gyBG-oDnV(! literal 0 HcmV?d00001 diff --git a/audio/comme_ca.m4a b/audio/comme_ca.m4a new file mode 100644 index 0000000..652afba --- /dev/null +++ b/audio/comme_ca.m4a @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:85d66357e644c3185ee88019e044607072166dc0acd301e22bb8b7a89010251d +size 98223 diff --git a/audio/comme_ca.wav b/audio/comme_ca.wav new file mode 100644 index 0000000..87f7ed2 --- /dev/null +++ b/audio/comme_ca.wav @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9814820fe2ec846f4d01514f7264f729e6edd098393548e17d96bac873ecaa91 +size 385916 diff --git a/audio/edits/E1.read.wav b/audio/edits/E1.read.wav new file mode 100644 index 0000000..799cd9e --- /dev/null +++ b/audio/edits/E1.read.wav @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bd82515c23e884e6c91b29d6a7fbd7b28d95633bcbc37a01eaa1f1e2eb331416 +size 154396 diff --git a/audio/edits/E10.they_only.wav b/audio/edits/E10.they_only.wav new file mode 100644 index 0000000..ec33372 --- /dev/null +++ b/audio/edits/E10.they_only.wav @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d164d3ff2c31a373b8f8b65ee1fc3125c36e78ddfbc0e4d86ac6b23de6190568 +size 231572 diff --git a/audio/edits/E11.knew.wav b/audio/edits/E11.knew.wav new file mode 100644 index 0000000..316253d --- /dev/null +++ b/audio/edits/E11.knew.wav @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f3babcde673b7ad53692e1a72191c77f283ad1bde06a3bcfd0292db941d26bca +size 132344 diff --git a/audio/edits/E12.from.wav b/audio/edits/E12.from.wav new file mode 100644 index 0000000..c3302c4 --- /dev/null +++ b/audio/edits/E12.from.wav @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:136ffd344fab310b72bac9b0eb32b9c32a74629a8062a73009bc5d9fddfc6f3b +size 121320 diff --git a/audio/edits/E13.books.wav b/audio/edits/E13.books.wav new file mode 100644 index 0000000..626abda --- /dev/null +++ b/audio/edits/E13.books.wav @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a1bef252f02b6f78d4ed9e5f2c7c7b8922c359fd8df5349612b6ff01f843aea4 +size 143372 diff --git a/audio/edits/E2.old_tales.wav b/audio/edits/E2.old_tales.wav new file mode 100644 index 0000000..5eb69e8 --- /dev/null +++ b/audio/edits/E2.old_tales.wav @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:79d426e9ab11757eedc92494027e568c5a94a51670040184237817759c0df3ba +size 319772 diff --git a/audio/edits/E3.traversed_provinces.wav b/audio/edits/E3.traversed_provinces.wav new file mode 100644 index 0000000..0516a07 --- /dev/null +++ b/audio/edits/E3.traversed_provinces.wav @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e5fe989040c52673c7d00aa3a1d2d035215226f8e110d862980758e9dcf64d94 +size 418996 diff --git a/audio/edits/E4.crossed_seas.wav b/audio/edits/E4.crossed_seas.wav new file mode 100644 index 0000000..09e44d7 --- /dev/null +++ b/audio/edits/E4.crossed_seas.wav @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:be0a960f52964646682ee953e410b18ddf480ab0e93667b2184fa7505cfd7b41 +size 385920 diff --git a/audio/edits/E5.visited.wav b/audio/edits/E5.visited.wav new file mode 100644 index 0000000..d08f9f2 --- /dev/null +++ b/audio/edits/E5.visited.wav @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fb1ffb123e6ebfd92b91b7bb7e55dcb6bcbdef0ef45feea9c63cef2eb0afddc9 +size 187472 diff --git a/audio/edits/E6.new_peoples.wav b/audio/edits/E6.new_peoples.wav new file mode 100644 index 0000000..ac2734d --- /dev/null +++ b/audio/edits/E6.new_peoples.wav @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3f851050e02360572825afcf37d80cbccba1df5d97b33c2773de20374de229d3 +size 253620 diff --git a/audio/edits/E7.to_see.wav b/audio/edits/E7.to_see.wav new file mode 100644 index 0000000..3eb5ba7 --- /dev/null +++ b/audio/edits/E7.to_see.wav @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:313bf334be792516922b1ec088fa0365cfd78b28461fd964ab4ea580c9d2df01 +size 209520 diff --git a/audio/edits/E8.face_to_face.wav b/audio/edits/E8.face_to_face.wav new file mode 100644 index 0000000..a0da8bd --- /dev/null +++ b/audio/edits/E8.face_to_face.wav @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e929864462dd3da5be208580e9eeef29b069ca161513f65c98c6bd4b39d4a0e9 +size 363872 diff --git a/audio/edits/E9.persons.wav b/audio/edits/E9.persons.wav new file mode 100644 index 0000000..f222b83 --- /dev/null +++ b/audio/edits/E9.persons.wav @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:beac2e31edee535271c8bc25fb757610bd2ead0fe7153f5588abc1dc8854139e +size 132344 diff --git a/audio/edits/EA.we_read_in_old_tales.wav b/audio/edits/EA.we_read_in_old_tales.wav new file mode 100644 index 0000000..8fb49b8 --- /dev/null +++ b/audio/edits/EA.we_read_in_old_tales.wav @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:afaafbf1dde9e079e41f8367d1ab79bcfe1bb30f372848675e6228062007eaf9 +size 323088 diff --git a/audio/edits/EB.that_men_traversed_provinces.wav b/audio/edits/EB.that_men_traversed_provinces.wav new file mode 100644 index 0000000..a3c8ce5 --- /dev/null +++ b/audio/edits/EB.that_men_traversed_provinces.wav @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:813a32ba4fe5a6c62ff590937cfc41e19a566afb26c1f3350b7ed74832ab5365 +size 315792 diff --git a/audio/edits/EC.crossed_seas_and_visited_new_peoples.wav b/audio/edits/EC.crossed_seas_and_visited_new_peoples.wav new file mode 100644 index 0000000..b0d5f76 --- /dev/null +++ b/audio/edits/EC.crossed_seas_and_visited_new_peoples.wav @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9dfa4d1aa38da2f025421277d4259d749158edd373a44b405750f419b23fa646 +size 546620 diff --git a/audio/edits/ED.to_see_face_to_face_persons.wav b/audio/edits/ED.to_see_face_to_face_persons.wav new file mode 100644 index 0000000..92c83a9 --- /dev/null +++ b/audio/edits/ED.to_see_face_to_face_persons.wav @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bd0febd463d74ece328fa8ef5af50f167ded9ef8984c50a7d219aaecb5ebe3f6 +size 334720 diff --git a/audio/edits/EE.whom_they_only_knew_from_books.wav b/audio/edits/EE.whom_they_only_knew_from_books.wav new file mode 100644 index 0000000..91494ec --- /dev/null +++ b/audio/edits/EE.whom_they_only_knew_from_books.wav @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:856fd5b1b79413c175f7715003235de0e74059c548ab0ce6e3cad6a074f4cbd0 +size 301992 diff --git a/audio/edits/ENGLISH.wav b/audio/edits/ENGLISH.wav new file mode 100644 index 0000000..160fb92 --- /dev/null +++ b/audio/edits/ENGLISH.wav @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f14dd2f385746b7e8de3dd68b47ee755723ea05be5c20dd2bf24643e05b8f13b +size 1984544 diff --git a/audio/edits/L0.legimus.wav b/audio/edits/L0.legimus.wav new file mode 100644 index 0000000..e0f5982 --- /dev/null +++ b/audio/edits/L0.legimus.wav @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b9cda58783cbaa77d7597819daf162028a7ac5dd8c427c6aa09d5612603a177c +size 170932 diff --git a/audio/edits/L1.in_veteribus.wav b/audio/edits/L1.in_veteribus.wav new file mode 100644 index 0000000..9f7a8ed --- /dev/null +++ b/audio/edits/L1.in_veteribus.wav @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ffdc6bcdb978fd357366f1519b74794980f2de097e05423919118d8ff0801a6d +size 344576 diff --git a/audio/edits/L10.noverant.wav b/audio/edits/L10.noverant.wav new file mode 100644 index 0000000..6dc1090 --- /dev/null +++ b/audio/edits/L10.noverant.wav @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e669618fc1af7d9493b2d2186ccbd6b37a490fff956aa1f8acf148c0093c6d56 +size 253620 diff --git a/audio/edits/L11.coram.wav b/audio/edits/L11.coram.wav new file mode 100644 index 0000000..ca623f0 --- /dev/null +++ b/audio/edits/L11.coram.wav @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9a4396d48f3ea169a4fd3b2bb5dcdc7b8c3007e6b6ce825d45da17eff21f1bb6 +size 209520 diff --git a/audio/edits/L12.quoque_viderent.wav b/audio/edits/L12.quoque_viderent.wav new file mode 100644 index 0000000..fa6392d --- /dev/null +++ b/audio/edits/L12.quoque_viderent.wav @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e80550d731332825810b44d2a39635534e50cdd463e628a1324d4d8605444506 +size 385920 diff --git a/audio/edits/L2.historiis.wav b/audio/edits/L2.historiis.wav new file mode 100644 index 0000000..2e75921 --- /dev/null +++ b/audio/edits/L2.historiis.wav @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:73adab59d08554e4740f1eef0792fc931d85d401a426d77fafbc6ca1e3e95b9d +size 319772 diff --git a/audio/edits/L3.quosdam_lustrasse_provincias.wav b/audio/edits/L3.quosdam_lustrasse_provincias.wav new file mode 100644 index 0000000..ed323b9 --- /dev/null +++ b/audio/edits/L3.quosdam_lustrasse_provincias.wav @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:54ba5733c44167b6d7a9b836f3bbf78f77fd26779316aaf89cdcda7f3fe4aec2 +size 617444 diff --git a/audio/edits/L4.novos.wav b/audio/edits/L4.novos.wav new file mode 100644 index 0000000..b3a1243 --- /dev/null +++ b/audio/edits/L4.novos.wav @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c64ef36aea8c5dcaf193a063b99702e9d29d795e01c884e8080c6454e997bcb1 +size 187472 diff --git a/audio/edits/L5.adiisse_populos.wav b/audio/edits/L5.adiisse_populos.wav new file mode 100644 index 0000000..de66b43 --- /dev/null +++ b/audio/edits/L5.adiisse_populos.wav @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dbfb5be26e93b6dd5ba1fbcd0df0c79e9f0f54ad5f04f8ae05caaf1a98855c91 +size 430020 diff --git a/audio/edits/L6.maria_transisse.wav b/audio/edits/L6.maria_transisse.wav new file mode 100644 index 0000000..641e0d0 --- /dev/null +++ b/audio/edits/L6.maria_transisse.wav @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c97d54b83af7d4f9b150c0016a27c502db73d63e4492104ff4d9f9d5d302376e +size 407972 diff --git a/audio/edits/L7.ut_eos.wav b/audio/edits/L7.ut_eos.wav new file mode 100644 index 0000000..8812932 --- /dev/null +++ b/audio/edits/L7.ut_eos.wav @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:783c1d85c33bd8f0e8ff9b5fc90ddfb28520960555ead7d1d834c59f54e3b0e1 +size 242596 diff --git a/audio/edits/L8.quos.wav b/audio/edits/L8.quos.wav new file mode 100644 index 0000000..de72e97 --- /dev/null +++ b/audio/edits/L8.quos.wav @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8877f417bbeb33e30eff7a3bd3e973a199fab95a850e92f0b6022984e95bcc4c +size 165420 diff --git a/audio/edits/L9.ex_libris.wav b/audio/edits/L9.ex_libris.wav new file mode 100644 index 0000000..85ba2be --- /dev/null +++ b/audio/edits/L9.ex_libris.wav @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:061ce4ed051d8a4b8d5cb7c775b0e138fb3a6159ca18e99fc95c8b42bf1bbdb6 +size 242596 diff --git a/audio/edits/LA.legimus_in_vereribus_historiis.wav b/audio/edits/LA.legimus_in_vereribus_historiis.wav new file mode 100644 index 0000000..a1555de --- /dev/null +++ b/audio/edits/LA.legimus_in_vereribus_historiis.wav @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cbe80bf30f76de60ec49c29608b9918a64f99dfa184e14a6d697cb671f7c0867 +size 491564 diff --git a/audio/edits/LATIN.wav b/audio/edits/LATIN.wav new file mode 100644 index 0000000..965718c --- /dev/null +++ b/audio/edits/LATIN.wav @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4eb92025c3c9b633fd6a81156b522a759acd3ca9fc4dae578f206d1434bc3557 +size 2535796 diff --git a/audio/edits/LB.quodam_lustrasse_provincias.wav b/audio/edits/LB.quodam_lustrasse_provincias.wav new file mode 100644 index 0000000..81d4999 --- /dev/null +++ b/audio/edits/LB.quodam_lustrasse_provincias.wav @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3a88e0d204e107440b567cbeec92bc879bbdb3eac3af7ffd1ba8e4dd91850dbf +size 357404 diff --git a/audio/edits/LC.novos_adiisse_populos_maria_transisse.wav b/audio/edits/LC.novos_adiisse_populos_maria_transisse.wav new file mode 100644 index 0000000..896707d --- /dev/null +++ b/audio/edits/LC.novos_adiisse_populos_maria_transisse.wav @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:64eecc1380fb446e1343f8d64f927ab2337bcc762a985ff0563cc82c70a4c081 +size 648528 diff --git a/audio/edits/LD.ut_eos_quos_ex_libris_noverant.wav b/audio/edits/LD.ut_eos_quos_ex_libris_noverant.wav new file mode 100644 index 0000000..47a6289 --- /dev/null +++ b/audio/edits/LD.ut_eos_quos_ex_libris_noverant.wav @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a76d216885cb5af8abf12fb44734aacc0bde6f05d00a772eda8d1323e299b725 +size 498776 diff --git a/audio/edits/LE.coram_quoque_viderent.wav b/audio/edits/LE.coram_quoque_viderent.wav new file mode 100644 index 0000000..07f22ae --- /dev/null +++ b/audio/edits/LE.coram_quoque_viderent.wav @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fd6b6ab19daf363fc7a6acf4fc42d1a653266661fc5068f8b5c387ac18cd2e3e +size 370084 diff --git a/audio/edits/translation.rtf b/audio/edits/translation.rtf new file mode 100644 index 0000000..6558e01 --- /dev/null +++ b/audio/edits/translation.rtf @@ -0,0 +1,84 @@ +{\rtf1\ansi\ansicpg1252\cocoartf2638 +\cocoatextscaling0\cocoaplatform0{\fonttbl\f0\froman\fcharset0 TimesNewRomanPSMT;\f1\froman\fcharset0 TimesNewRomanPS-ItalicMT;} +{\colortbl;\red255\green255\blue255;\red24\green55\blue106;\red0\green0\blue0;} +{\*\expandedcolortbl;;\cssrgb\c12157\c28627\c49020;\cssrgb\c0\c0\c0;} +\paperw11900\paperh16840\margl1440\margr1440\vieww11520\viewh8400\viewkind0 +\deftab720 +\pard\pardeftab720\partightenfactor0 + +\f0\fs37\fsmilli18667 \cf2 \expnd0\expndtw0\kerning0 +Dear Sam, +\fs32 \cf0 \ + +\fs37\fsmilli18667 \cf2 \'a0 +\fs32 \cf0 \ + +\fs37\fsmilli18667 \cf2 Thank you for the message. I am okay, and hope you are, too. +\fs32 \cf0 \ + +\fs37\fsmilli18667 \cf2 \'a0 +\fs32 \cf0 \ + +\fs37\fsmilli18667 \cf2 The section you print reads: +\fs32 \cf0 \ + +\fs37\fsmilli18667 \cf2 \'a0 +\fs32 \cf0 \ + +\fs37\fsmilli18667 \cf2 \'a0 +\fs32 \cf0 \ + +\fs37\fsmilli18667 \cf2 \'85 studia conciliant. Legimus in veteribus | +\fs32 \cf0 \ + +\fs37\fsmilli18667 \cf2 \'a0 +\fs32 \cf0 \ + +\fs37\fsmilli18667 \cf2 Historiis, quosdam lustrasse provincias, | +\fs32 \cf0 \ + +\fs37\fsmilli18667 \cf2 \'a0 +\fs32 \cf0 \ + +\fs37\fsmilli18667 \cf2 novos adiisse \{sic.\} populos, maria transisse, | +\fs32 \cf0 \ + +\fs37\fsmilli18667 \cf2 \'a0 +\fs32 \cf0 \ + +\fs37\fsmilli18667 \cf2 ut eos quos ex libris noverant, coram | +\fs32 \cf0 \ + +\fs37\fsmilli18667 \cf2 \'a0 +\fs32 \cf0 \ + +\fs37\fsmilli18667 \cf2 quoque viderent. Sicut \{sic.\} pitagoras memphi= | +\fs32 \cf0 \ + +\fs37\fsmilli18667 \cf2 \'a0 +\fs32 \cf0 \ + +\fs37\fsmilli18667 \cf2 \'a0 +\fs32 \cf0 \ + +\fs37\fsmilli18667 \cf2 I have checked this against the printing in +\f1\i Patrologia Latina +\f0\i0 , and have marked two variants: PL records \'91adisse\'92 and \'91Sic\'92, but I have transcribed what is in Gutenberg. The final phrase finishes \'91memphiticos vates\'92. +\fs32 \cf0 \ + +\fs37\fsmilli18667 \cf2 \'a0 +\fs32 \cf0 \ + +\fs37\fsmilli18667 \cf2 Hope this helps. +\fs32 \cf0 \ + +\fs37\fsmilli18667 \cf2 \'a0 +\fs32 \cf0 \ + +\fs37\fsmilli18667 \cf2 Best wishes, +\fs32 \cf0 \ + +\fs37\fsmilli18667 \cf2 \'a0 +\fs32 \cf0 \ + +\fs37\fsmilli18667 \cf2 Alan.} \ No newline at end of file diff --git a/audio/libris_laborem.m4a b/audio/libris_laborem.m4a new file mode 100644 index 0000000..f731419 --- /dev/null +++ b/audio/libris_laborem.m4a @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:19496684bb4d108a01723cddf438d12e334dd19c1bb8c47e29a3a668996e2cb0 +size 40013 diff --git a/audio/libris_laborem.wav b/audio/libris_laborem.wav new file mode 100644 index 0000000..7338df3 --- /dev/null +++ b/audio/libris_laborem.wav @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5f1510bed6fc3484cf724fae58e6bd4134891665d034729e28724dd52f66c376 +size 416684 diff --git a/audio/phrases/ENGLISH.wav b/audio/phrases/ENGLISH.wav new file mode 100644 index 0000000..160fb92 --- /dev/null +++ b/audio/phrases/ENGLISH.wav @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f14dd2f385746b7e8de3dd68b47ee755723ea05be5c20dd2bf24643e05b8f13b +size 1984544 diff --git a/audio/phrases/LATIN.wav b/audio/phrases/LATIN.wav new file mode 100644 index 0000000..965718c --- /dev/null +++ b/audio/phrases/LATIN.wav @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4eb92025c3c9b633fd6a81156b522a759acd3ca9fc4dae578f206d1434bc3557 +size 2535796 diff --git a/libs/42line/FASTSENSOR.h b/libs/42line/FASTSENSOR.h new file mode 100644 index 0000000..17e9ff6 --- /dev/null +++ b/libs/42line/FASTSENSOR.h @@ -0,0 +1,96 @@ +#pragma once + +// #include +#include + +static float alpha = 0.2; +static int baseline_fluctuation = 5; +static int baseline_fluctuation_hits = 100; +static int max_s = 60; + +typedef void(*toggle_cb)(bool, int); + +struct SENSOR_t { + + int PIN, base, num_base, max_c, v, prev, raw, cutoff_s; + int dv; + unsigned long timestamp_calib; + toggle_cb fn_toggle_cb; + bool call_toggle = false; + + SENSOR_t(const int& pin, int cutoff) { + PIN = pin; + max_c = max_s; + num_base = 0; + cutoff_s = cutoff; + fn_toggle_cb = NULL; + } + + void plug_toggle_cb(toggle_cb fn) { + fn_toggle_cb = fn; + } + + void baseline(int n, int d) { + float cum = 0; + for (int i = 0; i < n; i++){ + update(false, false); + if(abs(dv) < baseline_fluctuation){ + cum += v; + } + delay(d); + + } + base = (int)floor(cum / n); + } + + void calibrate() { + // if(abs(dv) < baseline_fluctuation) { + // num_base++; + // if (num_base > baseline_fluctuation_hits) + // base = (int) (alpha * (float)v + (1.0 - alpha) * (float)base); + // } else { + // num_base = 0; + // } + if(v > max_c) max_c = v; + timestamp_calib = millis(); + } + + void update(bool calib = true, bool filt = true) { + raw = fastTouchRead(PIN); + if(filt) + v = filter(raw); + else + v = raw; + dv = v - prev; + if(calib) calibrate(); + + if(fn_toggle_cb) { + int m_v = map(v, base, max_c, 0, 100); + int m_prev = map(prev, base, max_c, 0, 100); + if(m_prev < cutoff_s && m_v >= cutoff_s) + fn_toggle_cb(true, PIN); + else if(m_prev > cutoff_s && m_v <= cutoff_s) + fn_toggle_cb(false, PIN); + } + + prev = v; + + } + + int map_range(int min_v, int max_v) { + return map(v, base, max_c, min_v, max_v); + } + + int map_range_raw(int min_v, int max_v) { + return map(raw, base, max_c, min_v, max_v); + } + + int filter(int n) { + return (int) (alpha * n + (1.0 - alpha) * prev); + } + + bool touch() { + return (v > cutoff_s); + } + +}; diff --git a/libs/42line/SENSOR.h b/libs/42line/SENSOR.h new file mode 100644 index 0000000..cba19cf --- /dev/null +++ b/libs/42line/SENSOR.h @@ -0,0 +1,64 @@ +#pragma once + +#include + +static float alpha = 0.2; +static int baseline_fluctuation = 75; +static int max_s = 3000; + +typedef struct SENSOR_t { + + int PIN, base, num_base, max_c, v, prev; + int dv; + unsigned long timestamp_calib; + + SENSOR_t(int& pin) { + PIN = pin; + max_c = max_s; + num_base = 0; + } + + void baseline(int n, int d) { + int cum = 0; + for (int i = 0; i < n; i++){ + update(false, false); + if(abs(dv) < baseline_fluctuation){ + cum += v; + } + delay(d); + } + base = (int)(cum / n); + } + + void calibrate() { + if(abs(dv) < baseline_fluctuation) { + num_base++; + if (num_base > 25) + base = (int) (alpha * (float)v + (1.0 - alpha) * (float)base); + } else { + num_base = 0; + } + if(v > max_c) max_c = v; + timestamp_calib = millis(); + } + + void update(bool calib = true, bool filt = true) { + int d = touchRead(PIN); + if(filt) + v = filter(d); + else + v = d; + dv = v - prev; + prev = v; + if(calib) calibrate(); + } + + int map_range(int min_v, int max_v) { + return map(v, base, max_c, min_v, max_v); + } + + int filter(int n) { + return (int) (alpha * n + (1.0 - alpha) * prev); + } + +}; diff --git a/libs/42line/SOUND.h b/libs/42line/SOUND.h new file mode 100644 index 0000000..288b92f --- /dev/null +++ b/libs/42line/SOUND.h @@ -0,0 +1,135 @@ +#pragma once + +#include +#include "WORDS.h" + +static int time_interval_random_start = 2000; + +typedef void(*synth_toggle_cb)(bool, int); + +void _random_wav(AudioPlaySdWav* wav, E_WORDS* e_words, int MAX_WORD) { + int w = (int)random(0, MAX_WORD); + wav->play(words[e_words[w]]); +} + +enum WAVPLAY_STATE { + LATIN, ENGLISH, RANDOM, NONE +}; + +typedef struct WAVPLAY_t { + + int pin; + AudioPlaySdWav* wav; + E_PHRASES en_phrase; + E_PHRASES la_phrase; + E_WORDS* random_words; + int nbr_random_words; + synth_toggle_cb synth_toggle_func = NULL; + + long random_start; + + WAVPLAY_STATE state; + + WAVPLAY_t(const int p, AudioPlaySdWav* w, E_PHRASES en, E_PHRASES la, E_WORDS* wds, int nbr_wds, synth_toggle_cb synth_func) { + pin = p; + wav = w; + en_phrase = en; + la_phrase = la; + random_words = wds; + nbr_random_words = nbr_wds; + state = NONE; + synth_toggle_func = synth_func; + } + + void play(){ + + switch(state) { + case NONE: + wav->play(phrases[la_phrase]); + delay(25); + state = LATIN; + // Serial.println("state none > latin"); + break; + default: + break; + } + } + + void stop(){ + wav->stop(); + if(state == RANDOM) synth_toggle_func(false, pin); + state = NONE; + } + + void update(){ + + if(state == NONE) return; + + if(wav->isPlaying()) { + // Serial.println("..."); + return; + } + + switch(state) { + case LATIN: + wav->play(phrases[en_phrase]); + state = ENGLISH; + // Serial.println("state latin > english"); + break; + case ENGLISH: + // _random_wav(wav, random_words, nbr_random_words); + state = RANDOM; + random_start = millis(); + synth_toggle_func(true, pin); + // Serial.println("state english > random"); + break; + case RANDOM: + if(millis() - random_start > time_interval_random_start) { + _random_wav(wav, random_words, nbr_random_words); + // Serial.println("random"); + } + break; + default: + break; + } + } +}; + + +typedef struct DETUNE_t { + + AudioSynthWaveformSine sine3; + AudioSynthWaveformSine sine2; + AudioSynthWaveformSine sine1; + + int base_freq = 0; + + DETUNE_t(int freq) { + set_frequency(freq); + } + + void set_frequency(int freq) { + sine1.frequency(freq); + sine2.frequency(freq); + sine3.frequency(freq); + base_freq = freq; + } + + void set_detune(float detune) { + int det_mid = (int)(detune/2.0); + sine2.frequency(base_freq + det_mid); + + if(detune > 100) + sine3.frequency(base_freq - det_mid); + else + sine3.frequency(base_freq - 2 * det_mid); + + int r = (int)random(0, 100); + if(r > 33) + sine1.frequency(det_mid/2); + + } + +}; + + diff --git a/libs/42line/WORDS.h b/libs/42line/WORDS.h new file mode 100644 index 0000000..66a5ab9 --- /dev/null +++ b/libs/42line/WORDS.h @@ -0,0 +1,55 @@ +#pragma once + +static const char* const words[] = { +"E1.read.wav", +"E2.old_tales.wav", +"E3.traversed_provinces.wav", +"E4.crossed_seas.wav", +"E5.visited.wav", +"E6.new_peoples.wav", +"E7.to_see.wav", +"E8.face_to_face.wav", +"E9.persons.wav", +"E10.they_only.wav", +"E11.knew.wav", +"E12.from.wav", +"E13.books.wav", +"L0.legimus.wav", +"L1.in_veteribus.wav", +"L2.historiis.wav", +"L3.quosdam_lustrasse_provincias.wav", +"L4.novos.wav", +"L5.adiisse_populos.wav", +"L6.maria_transisse.wav", +"L7.ut_eos.wav", +"L8.quos.wav", +"L9.ex_libris.wav", +"L10.noverant.wav", +"L11.coram.wav", +"L12.quoque_viderent.wav", +"ENGLISH.wav", +"LATIN.wav" +}; + +enum E_WORDS { +E1,E2,E3,E4,E5,E6,E7,E8,E9,E10,E11,E12,E13,L0,L1,L2,L3,L4,L5,L6,L7,L8,L9,L10,L11,L12,EN,LAT +}; + + +static const char* const phrases[] = { + +"EA.we_read_in_old_tales.wav", +"EB.that_men_traversed_provinces.wav", +"EC.crossed_seas_and_visited_new_peoples.wav", +"ED.to_see_face_to_face_persons.wav", +"EE.whom_they_only_knew_from_books.wav", +"LA.legimus_in_vereribus_historiis.wav", +"LB.quodam_lustrasse_provincias.wav", +"LC.novos_adiisse_populos_maria_transisse.wav", +"LD.ut_eos_quos_ex_libris_noverant.wav", +"LE.coram_quoque_viderent.wav" +}; + +enum E_PHRASES { +EA, EB, EC, ED, EE, LA, LB, LC, LD, LE +}; diff --git a/libs/FastTouch/Examples/FastTouchSerialReportLilypadUSB/FastTouchSerialReportLilypadUSB.ino b/libs/FastTouch/Examples/FastTouchSerialReportLilypadUSB/FastTouchSerialReportLilypadUSB.ino new file mode 100644 index 0000000..efbf67c --- /dev/null +++ b/libs/FastTouch/Examples/FastTouchSerialReportLilypadUSB/FastTouchSerialReportLilypadUSB.ino @@ -0,0 +1,27 @@ +#include + +// Adrian Freed 2018 + +void setup() +{ + SerialUSB.begin(9600); +} + + + void loop() + { + SerialUSB.print(fastTouchRead(A2)); SerialUSB.print(" "); + SerialUSB.print(fastTouchRead(A3)); SerialUSB.print(" "); + SerialUSB.print(fastTouchRead(A4)); SerialUSB.print(" "); + SerialUSB.print(fastTouchRead(A5)); SerialUSB.print(" "); + SerialUSB.print(fastTouchRead(2)); SerialUSB.print(" "); + SerialUSB.print(fastTouchRead(3)); SerialUSB.print(" "); + + for(int i=9;i<=11;++i) + { + SerialUSB.print(fastTouchRead(i)); SerialUSB.print(" "); + } + SerialUSB.println(); + delay(100); +} + diff --git a/libs/FastTouch/Examples/FastTouchSerialReportTeensy/FastTouchSerialReportTeensy.ino b/libs/FastTouch/Examples/FastTouchSerialReportTeensy/FastTouchSerialReportTeensy.ino new file mode 100644 index 0000000..6af828a --- /dev/null +++ b/libs/FastTouch/Examples/FastTouchSerialReportTeensy/FastTouchSerialReportTeensy.ino @@ -0,0 +1,30 @@ +#include +// +// Adrian Freed 2019 +// +// report on whether pins are being touched based on how +// slow the pins arrive at HIGH from ground when a PULLUP resistor is enabled +// all pin except the built-in LED are probed. Note that each pin will be hard pulled +// to ground and that interrupts are briefly stopped during the measurement. +// + +void setup() +{ + SerialUSB.begin(9600); +} + + + void loop() + { + for(int i=0;i + +// monotone touch sequencer +// Adrian Freed 2018 + +void setup() +{ + SerialUSB.begin(9600); +} + + + void loop() + { + int r; + const int tonepin=10; + const int notelength=140, notetonote=160; + SerialUSB.print(r = fastTouchRead(A2)); SerialUSB.print(" "); + if(r>1) + { tone(tonepin, 587, notelength/(r-1)); delay(notetonote); } + SerialUSB.print(r = fastTouchRead(A3)); SerialUSB.print(" "); + if(r>1) + { tone(tonepin, 440, notelength/(r-1)); delay(notetonote); } + SerialUSB.print(r = fastTouchRead(A4)); SerialUSB.print(" "); + if(r>1) + { tone(tonepin, 880, notelength/(r-1)); delay(notetonote);} + SerialUSB.print(r = fastTouchRead(A5)); SerialUSB.print(" "); + if(r>1) + { tone(tonepin, 153, notelength/(r-1)); delay(notetonote); } + SerialUSB.print(r = fastTouchRead(2)); SerialUSB.print(" "); + if(r>1) + { tone(tonepin, 185, notelength/(r-1)); delay(notetonote);} + SerialUSB.print(r = fastTouchRead(3)); SerialUSB.print(" "); + if(r>1) + { tone(tonepin, 196, notelength/(r-1)); delay(notetonote);} + SerialUSB.print(r = fastTouchRead(9)); SerialUSB.print(" "); + if(r>1) + { tone(tonepin, 349, notelength/(r-1)); delay(notetonote);} + SerialUSB.print(r = fastTouchRead(11)); SerialUSB.print(" "); + if(r>1) + { tone(tonepin, 370, notelength/(r-1)); delay(notetonote);} + + SerialUSB.println(); +} + diff --git a/libs/FastTouch/Examples/FastTouchSerialTonePlaygroundExpress/FastTouchSerialTonePlaygroundExpress.ino b/libs/FastTouch/Examples/FastTouchSerialTonePlaygroundExpress/FastTouchSerialTonePlaygroundExpress.ino new file mode 100644 index 0000000..e151da3 --- /dev/null +++ b/libs/FastTouch/Examples/FastTouchSerialTonePlaygroundExpress/FastTouchSerialTonePlaygroundExpress.ino @@ -0,0 +1,41 @@ +#include + +// monotone touch sequencer +// Adrian Freed 2018 + +void setup() +{ + SerialUSB.begin(9600); +} + + + void loop() + { + int r; + const int tonepin=A0; + const int notelength=140, notetonote=190; + SerialUSB.print(r = fastTouchRead(A2)); SerialUSB.print(" "); + if(r>1) + { tone(tonepin, 587/2, notelength/(r-1)); delay(notetonote); } + SerialUSB.print(r = fastTouchRead(A3)); SerialUSB.print(" "); + if(r>1) + { tone(tonepin, 440, notelength/(r-1)); delay(notetonote); } + SerialUSB.print(r = fastTouchRead(A4)); SerialUSB.print(" "); + if(r>1) + { tone(tonepin, 220, notelength/(r-1)); delay(notetonote);} + SerialUSB.print(r = fastTouchRead(A5)); SerialUSB.print(" "); + if(r>1) + { tone(tonepin, 153, notelength/(r-1)); delay(notetonote); } + SerialUSB.print(r = fastTouchRead(A1)); SerialUSB.print(" "); + if(r>1) + { tone(tonepin, 185, notelength/(r-1)); delay(notetonote);} + SerialUSB.print(r = fastTouchRead(A6)); SerialUSB.print(" "); + if(r>1) + { tone(tonepin, 196, notelength/(r-1)); delay(notetonote);} + SerialUSB.print(r = fastTouchRead(A7)); SerialUSB.print(" "); + if(r>1) + { tone(tonepin, 349, notelength/(r-1)); delay(notetonote);} + + SerialUSB.println(); +} + diff --git a/libs/FastTouch/README.md b/libs/FastTouch/README.md new file mode 100644 index 0000000..599e366 --- /dev/null +++ b/libs/FastTouch/README.md @@ -0,0 +1,6 @@ +# FastTouch +Use this library to detect whether your choice of Arduino pin is being touched. +The technique works with any Arduino pin that has an internal pull up resistor that +can be enabled. It returns a measure of how long it takes for a pin to rise +to a HIGH level after the pull up is enabled. This will be slowed by any +capacitive load added. diff --git a/libs/FastTouch/keywords.txt b/libs/FastTouch/keywords.txt new file mode 100755 index 0000000..e45d161 --- /dev/null +++ b/libs/FastTouch/keywords.txt @@ -0,0 +1,2 @@ +fastTouchRead KEYWORD1 +fastTouchMax KEYWORD1 \ No newline at end of file diff --git a/libs/FastTouch/library.properties b/libs/FastTouch/library.properties new file mode 100644 index 0000000..f277c59 --- /dev/null +++ b/libs/FastTouch/library.properties @@ -0,0 +1,9 @@ +name=FastTouch +version=0.91 +author=Adrian Freed +maintainer=Adrian Freed +sentence=Fast Touch Library +paragraph=Fast Capacitive Touch on any digital pin with a pull up option +category=Device Control +url=https://github.com/AdrianFreed/FastTouch +architectures=* diff --git a/libs/FastTouch/src/FastTouch.cpp b/libs/FastTouch/src/FastTouch.cpp new file mode 100644 index 0000000..11019d3 --- /dev/null +++ b/libs/FastTouch/src/FastTouch.cpp @@ -0,0 +1,803 @@ +// +// FastTouch.cpp +// +// +// Created by AdrianFreed on 3/12/18. +// +// + +#include "FastTouch.h" + + + + +#if defined(CORE_TEENSY) + +//#if defined(__IMXRT1052__) || defined(__IMXRT10562__) + +#if defined(__IMXRT1052__) || defined(__IMXRT1062__) + +FASTRUN +int fastTouchRead(int pin) +{ + int i; + const struct digital_pin_bitband_and_config_table_struct *p; + if (pin >= CORE_NUM_DIGITAL) return -1; + p = digital_pin_to_info_PGM + pin; + + + pinMode(pin, OUTPUT_OPENDRAIN); + digitalWrite(pin, LOW); + delayMicroseconds(1); + /* disable interrupts */ + noInterrupts(); + pinMode(pin, INPUT_PULLUP); + i=0; + if((*(p->reg + 2) & p->mask)!=0) + goto out; + if((*(p->reg + 2) & p->mask)!=0) + goto out; + if((*(p->reg + 2) & p->mask)!=0) + goto out; + i++; + if((*(p->reg + 2) & p->mask)!=0) + goto out; + i++; + if((*(p->reg + 2) & p->mask)!=0) + goto out; + i++; + if((*(p->reg + 2) & p->mask)!=0) + goto out; + i++; + if((*(p->reg + 2) & p->mask)!=0) + goto out; + i++; + if((*(p->reg + 2) & p->mask)!=0) + goto out; + i++; + + for(;i<64;++i) + if((*(p->reg + 2) & p->mask)!=0) + break; +// v += fastDigitalRead(pin)? 0:1; + { + + pinMode(pin, OUTPUT_OPENDRAIN); + digitalWrite(pin, LOW); + + + + } +out: + interrupts(); + return i; +} +#elif defined(__MKL26Z64__)|| defined(__IMXRT1052__) || defined(__IMXRT1062__) /* Teensy 3LC */ +FASTRUN +int fastTouchRead(int pin) +{ + const unsigned m = digitalPinToBitMask(pin); + + pinMode(pin, OUTPUT_OPENDRAIN); + digitalWrite(pin, LOW); + delayMicroseconds(50); + /* disable interrupts */ + noInterrupts(); + pinMode(pin, INPUT_PULLUP); + + // for(int i=0;i<64;++i) + // ft_o += *port&x; + { + register unsigned a,b,c,d,e,f; + register unsigned aa,ba,ca,da; +#ifdef CONDITIONALAPPROACH + register unsigned i=0; + + + a = *portInputRegister(pin) & m ; + a = *portInputRegister(pin) & m ; + a = *portInputRegister(pin) & m ; + b = *portInputRegister(pin) & m ; + c = *portInputRegister(pin) & m ; + d = *portInputRegister(pin) & m ; + e = *portInputRegister(pin) & m ; + f = *portInputRegister(pin) & m ; + aa = *portInputRegister(pin) & m; + ba = *portInputRegister(pin) & m; + ca = *portInputRegister(pin) & m; + da = *portInputRegister(pin) & m; + if( *portInputRegister(pin) & m ) + goto out; + ++i; + if( *portInputRegister(pin) & m ) + goto out; + ++i; + if( *portInputRegister(pin) & m ) + goto out; + ++i; + if( *portInputRegister(pin) & m ) + goto out; + ++i; + if( *portInputRegister(pin) & m ) + goto out; + ++i; + if( *portInputRegister(pin) & m ) + goto out; + ++i; + if( *portInputRegister(pin) & m ) + goto out; + ++i; + if( *portInputRegister(pin) & m ) + goto out; + ++i; + if( *portInputRegister(pin) & m ) + goto out; + ++i; + if( *portInputRegister(pin) & m ) + goto out; + ++i; + if( *portInputRegister(pin) & m ) + goto out; + ++i; + if( *portInputRegister(pin) & m ) + goto out; + ++i; + if( *portInputRegister(pin) & m ) + goto out; + ++i; + if( *portInputRegister(pin) & m ) + goto out; + ++i; + if( *portInputRegister(pin) & m ) + goto out; + ++i; + if( *portInputRegister(pin) & m ) + goto out; + ++i; + if( *portInputRegister(pin) & m ) + goto out; + ++i; + if( *portInputRegister(pin) & m ) + goto out; + ++i; + if( *portInputRegister(pin) & m ) + goto out; + ++i; + if( *portInputRegister(pin) & m ) + goto out; + ++i; + if( *portInputRegister(pin) & m ) + goto out; + ++i; + if( *portInputRegister(pin) & m ) + goto out; + ++i; + if( *portInputRegister(pin) & m ) + goto out; + ++i; + if( *portInputRegister(pin) & m ) + goto out; + ++i; + if( *portInputRegister(pin) & m ) + goto out; + ++i; + if( *portInputRegister(pin) & m ) + goto out; + ++i; + if( *portInputRegister(pin) & m ) + goto out; + ++i; + if( *portInputRegister(pin) & m ) + goto out; + ++i; + if( *portInputRegister(pin) & m ) + goto out; + ++i; + if( *portInputRegister(pin) & m ) + goto out; + ++i; + if( *portInputRegister(pin) & m ) + goto out; + ++i; + if( *portInputRegister(pin) & m ) + goto out; + ++i; + if( *portInputRegister(pin) & m ) + goto out; + ++i; + if( *portInputRegister(pin) & m ) + goto out; + ++i; + if( *portInputRegister(pin) & m ) + goto out; + ++i; + if( *portInputRegister(pin) & m ) + goto out; + ++i; + if( *portInputRegister(pin) & m ) + goto out; + ++i; + if( *portInputRegister(pin) & m ) + goto out; + ++i; + if( *portInputRegister(pin) & m ) + goto out; + ++i; + if( *portInputRegister(pin) & m ) + goto out; + ++i; + if( *portInputRegister(pin) & m ) + goto out; + ++i; + if( *portInputRegister(pin) & m ) + goto out; + ++i; + if( *portInputRegister(pin) & m ) + goto out; + ++i; + if( *portInputRegister(pin) & m ) + goto out; + ++i; + if( *portInputRegister(pin) & m ) + goto out; + ++i; + if( *portInputRegister(pin) & m ) + goto out; + ++i; + if( *portInputRegister(pin) & m ) + goto out; + ++i; + if( *portInputRegister(pin) & m ) + goto out; + ++i; + if( *portInputRegister(pin) & m ) + goto out; + ++i; + if( *portInputRegister(pin) & m ) + goto out; + ++i; + if( *portInputRegister(pin) & m ) + goto out; + ++i; + if( *portInputRegister(pin) & m ) + goto out; + ++i; + if( *portInputRegister(pin) & m ) + goto out; + ++i; + if( *portInputRegister(pin) & m ) + goto out; + ++i; + if( *portInputRegister(pin) & m ) + goto out; + ++i; + if( *portInputRegister(pin) & m ) + goto out; + ++i; + out: ; + +#else + register unsigned i; + + i = *portInputRegister(pin) & m; + i = *portInputRegister(pin) & m; + + i = *portInputRegister(pin) & m; + i+= *portInputRegister(pin) & m; + i+= *portInputRegister(pin) & m; + i+= *portInputRegister(pin) & m; + i+= *portInputRegister(pin) & m; + i+= *portInputRegister(pin) & m; + i+= *portInputRegister(pin) & m; + i+= *portInputRegister(pin) & m; + + i+= *portInputRegister(pin) & m; + i+= *portInputRegister(pin) & m; + i+= *portInputRegister(pin) & m; + i+= *portInputRegister(pin) & m; + i+= *portInputRegister(pin) & m; + i+= *portInputRegister(pin) & m; + i+= *portInputRegister(pin) & m; + i+= *portInputRegister(pin) & m; + + i+= *portInputRegister(pin) & m; + i+= *portInputRegister(pin) & m; + i+= *portInputRegister(pin) & m; + i+= *portInputRegister(pin) & m; + i+= *portInputRegister(pin) & m; + i+= *portInputRegister(pin) & m; + i+= *portInputRegister(pin) & m; + i+= *portInputRegister(pin) & m; + + i+= *portInputRegister(pin) & m; + i+= *portInputRegister(pin) & m; + i+= *portInputRegister(pin) & m; + i+= *portInputRegister(pin) & m; + i+= *portInputRegister(pin) & m; + i+= *portInputRegister(pin) & m; + i+= *portInputRegister(pin) & m; + i+= *portInputRegister(pin) & m; + + i+= *portInputRegister(pin) & m; + i+= *portInputRegister(pin) & m; + i+= *portInputRegister(pin) & m; + i+= *portInputRegister(pin) & m; + i+= *portInputRegister(pin) & m; + i+= *portInputRegister(pin) & m; + i+= *portInputRegister(pin) & m; + i+= *portInputRegister(pin) & m; + + i+= *portInputRegister(pin) & m; + i+= *portInputRegister(pin) & m; + i+= *portInputRegister(pin) & m; + i+= *portInputRegister(pin) & m; + i+= *portInputRegister(pin) & m; + i+= *portInputRegister(pin) & m; + i+= *portInputRegister(pin) & m; + i+= *portInputRegister(pin) & m; + + i+= *portInputRegister(pin) & m; + i+= *portInputRegister(pin) & m; + i+= *portInputRegister(pin) & m; + i+= *portInputRegister(pin) & m; + i+= *portInputRegister(pin) & m; + i+= *portInputRegister(pin) & m; + i+= *portInputRegister(pin) & m; + i+= *portInputRegister(pin) & m; + + i+= *portInputRegister(pin) & m; + i+= *portInputRegister(pin) & m; + i+= *portInputRegister(pin) & m; + i+= *portInputRegister(pin) & m; + i+= *portInputRegister(pin) & m; + i+= *portInputRegister(pin) & m; + i+= *portInputRegister(pin) & m; + i+= *portInputRegister(pin) & m; + + + +#endif + + + interrupts(); + + // i += ((a & m)?0:1 ) + ((b& m )?0:1 ) + + // ((c & m)?0:1 ) + ((d& m)?0:1 ) + ((e & m)?0:1 ) + ((f& m)?0:1 ); + //i += ((aa & m)?0:1 ) + ((ba& m )?0:1 ) + + // ((ca & m)?0:1 ) + ((da & m)?0:1 ) + ((ea & m)?0:1 ) + ((fa& m)?0:1 ); + {volatile unsigned t = i, mm = m; + while(mm >>= 1) + t >>= 1; + i = 64 -t; } //+(a+b+c+d+e+f+da+ca+ba+aa 10+ + pinMode(pin, OUTPUT_OPENDRAIN); + digitalWrite(pin, LOW); + + return i; + + } +} +#else +FASTRUN +int fastTouchRead(int pin) +{ + pinMode(pin, OUTPUT_OPENDRAIN); + digitalWriteFast(pin, LOW); + delayMicroseconds(50); + /* disable interrupts */ + noInterrupts(); + pinMode(pin, INPUT_PULLUP); + + // for(int i=0;i<64;++i) + // ft_o += *port&x; + { + register unsigned i=0; + register uint8_t a,b,c,d,e,f; + register uint8_t aa,ba,ca,da; + + a = *portInputRegister(pin) ; + a = *portInputRegister(pin) ; + a = *portInputRegister(pin) ; + a = *portInputRegister(pin) ; + a = *portInputRegister(pin) ; + a = *portInputRegister(pin) ; + a = *portInputRegister(pin) ; + a = *portInputRegister(pin) ; + a = *portInputRegister(pin) ; + a = *portInputRegister(pin) ; + a = *portInputRegister(pin) ; + a = *portInputRegister(pin) ; + a = *portInputRegister(pin) ; + a = *portInputRegister(pin) ; + + + a = *portInputRegister(pin) ; + a = *portInputRegister(pin) ; + a = *portInputRegister(pin) ; + b = *portInputRegister(pin) ; + c = *portInputRegister(pin) ; + d = *portInputRegister(pin) ; + e = *portInputRegister(pin) ; + f = *portInputRegister(pin) ; + aa = *portInputRegister(pin) ; + ba = *portInputRegister(pin) ; + ca = *portInputRegister(pin) ; + da = *portInputRegister(pin) ; + + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + if( *portInputRegister(pin)) + goto out; + ++i; + out: + + + + interrupts(); + // i += ((a & m)?0:1 ) + ((b& m )?0:1 ) + + // ((c & m)?0:1 ) + ((d& m)?0:1 ) + ((e & m)?0:1 ) + ((f& m)?0:1 ); + //i += ((aa & m)?0:1 ) + ((ba& m )?0:1 ) + + // ((ca & m)?0:1 ) + ((da & m)?0:1 ) + ((ea & m)?0:1 ) + ((fa& m)?0:1 ); + {volatile uint8_t t =10-(a+b+c+d+e+f+da+ca+ba+aa); + i+= t; } + pinMode(pin, OUTPUT_OPENDRAIN); + digitalWriteFast(pin, LOW); + + return i; + + } +} +#endif +#endif + +int fastTouchMax() +{ + return 60; +} + + diff --git a/libs/FastTouch/src/FastTouch.h b/libs/FastTouch/src/FastTouch.h new file mode 100644 index 0000000..a53eaa0 --- /dev/null +++ b/libs/FastTouch/src/FastTouch.h @@ -0,0 +1,243 @@ +// +// +//FastTouch.h +// Fast Touch Sensing for AVR and Teensy 3 +// Adrian Freed 2006-2018 Copyright. All Rights Reserved. +// Tested on Teensy 2.0, Clio, Lilypad, Lilypad USB, Flora, Leonardo, UNO, Micro, BLEpad, PRO Mini, +// Teensy 3.2 (more sensitive with optimized compiler settings and higher clock rate) +// Teensy 3LC +// + +#ifndef FastTouch_h +#define FastTouch_h + +#include +#if defined(CORE_TEENSY) +#include "core_pins.h" +#endif + +#ifndef BIT_SET +# define BIT_SET(value, bit) ((value) |= (1UL << (bit))) +#endif + + + +//Arduino +#if (defined(ARDUINO_AVR_MEGA) || \ +defined(ARDUINO_AVR_MEGA1280) || \ +defined(ARDUINO_AVR_MEGA2560) || \ +defined(__AVR_ATmega1280__) || \ +defined(__AVR_ATmega1281__) || \ +defined(__AVR_ATmega2560__) || \ +defined(__AVR_ATmega2561__)) + +#define __digitalPinToPortReg(P) \ +(((P) >= 22 && (P) <= 29) ? &PORTA : \ +((((P) >= 10 && (P) <= 13) || ((P) >= 50 && (P) <= 53)) ? &PORTB : \ +(((P) >= 30 && (P) <= 37) ? &PORTC : \ +((((P) >= 18 && (P) <= 21) || (P) == 38) ? &PORTD : \ +((((P) >= 0 && (P) <= 3) || (P) == 5) ? &PORTE : \ +(((P) >= 54 && (P) <= 61) ? &PORTF : \ +((((P) >= 39 && (P) <= 41) || (P) == 4) ? &PORTG : \ +((((P) >= 6 && (P) <= 9) || (P) == 16 || (P) == 17) ? &PORTH : \ +(((P) == 14 || (P) == 15) ? &PORTJ : \ +(((P) >= 62 && (P) <= 69) ? &PORTK : &PORTL)))))))))) + +#define __digitalPinToDDRReg(P) \ +(((P) >= 22 && (P) <= 29) ? &DDRA : \ +((((P) >= 10 && (P) <= 13) || ((P) >= 50 && (P) <= 53)) ? &DDRB : \ +(((P) >= 30 && (P) <= 37) ? &DDRC : \ +((((P) >= 18 && (P) <= 21) || (P) == 38) ? &DDRD : \ +((((P) >= 0 && (P) <= 3) || (P) == 5) ? &DDRE : \ +(((P) >= 54 && (P) <= 61) ? &DDRF : \ +((((P) >= 39 && (P) <= 41) || (P) == 4) ? &DDRG : \ +((((P) >= 6 && (P) <= 9) || (P) == 16 || (P) == 17) ? &DDRH : \ +(((P) == 14 || (P) == 15) ? &DDRJ : \ +(((P) >= 62 && (P) <= 69) ? &DDRK : &DDRL)))))))))) + +#define __digitalPinToPINReg(P) \ +(((P) >= 22 && (P) <= 29) ? &PINA : \ +((((P) >= 10 && (P) <= 13) || ((P) >= 50 && (P) <= 53)) ? &PINB : \ +(((P) >= 30 && (P) <= 37) ? &PINC : \ +((((P) >= 18 && (P) <= 21) || (P) == 38) ? &PIND : \ +((((P) >= 0 && (P) <= 3) || (P) == 5) ? &PINE : \ +(((P) >= 54 && (P) <= 61) ? &PINF : \ +((((P) >= 39 && (P) <= 41) || (P) == 4) ? &PING : \ +((((P) >= 6 && (P) <= 9) || (P) == 16 || (P) == 17) ? &PINH : \ +(((P) == 14 || (P) == 15) ? &PINJ : \ +(((P) >= 62 && (P) <= 69) ? &PINK : &PINL)))))))))) + +#define __digitalPinToBit(P) \ +(((P) >= 7 && (P) <= 9) ? (P) - 3 : \ +(((P) >= 10 && (P) <= 13) ? (P) - 6 : \ +(((P) >= 22 && (P) <= 29) ? (P) - 22 : \ +(((P) >= 30 && (P) <= 37) ? 37 - (P) : \ +(((P) >= 39 && (P) <= 41) ? 41 - (P) : \ +(((P) >= 42 && (P) <= 49) ? 49 - (P) : \ +(((P) >= 50 && (P) <= 53) ? 53 - (P) : \ +(((P) >= 54 && (P) <= 61) ? (P) - 54 : \ +(((P) >= 62 && (P) <= 69) ? (P) - 62 : \ +(((P) == 0 || (P) == 15 || (P) == 17 || (P) == 21) ? 0 : \ +(((P) == 1 || (P) == 14 || (P) == 16 || (P) == 20) ? 1 : \ +(((P) == 19) ? 2 : \ +(((P) == 5 || (P) == 6 || (P) == 18) ? 3 : \ +(((P) == 2) ? 4 : \ +(((P) == 3 || (P) == 4) ? 5 : 7))))))))))))))) + + +// --- Arduino 644 --- +#elif (defined(__AVR_ATmega644__) || \ +defined(__AVR_ATmega644P__)) + +#define __digitalPinToPortReg(P) \ +(((P) >= 0 && (P) <= 7) ? &PORTB : (((P) >= 8 && (P) <= 15) ? &PORTD : (((P) >= 16 && (P) <= 23) ? &PORTC : &PORTA))) +#define __digitalPinToDDRReg(P) \ +(((P) >= 0 && (P) <= 7) ? &DDRB : (((P) >= 8 && (P) <= 15) ? &DDRD : (((P) >= 8 && (P) <= 15) ? &DDRC : &DDRA))) +#define __digitalPinToPINReg(P) \ +(((P) >= 0 && (P) <= 7) ? &PINB : (((P) >= 8 && (P) <= 15) ? &PIND : (((P) >= 8 && (P) <= 15) ? &PINC : &PINA))) +#define __digitalPinToBit(P) \ +(((P) >= 0 && (P) <= 7) ? (P) : (((P) >= 8 && (P) <= 15) ? (P) - 8 : (((P) >= 16 && (P) <= 23) ? (P) - 16 : (P) - 24))) + +#elif defined(__AVR_ATmega32U4__) && defined(CORE_TEENSY) +#define __digitalPinToPortReg(P) \ +(((P) == 22 || (P) == 23 || (P) == 5 || (P) == 6 || (P) == 7 || (P) == 8 || (P) == 11 || (P) == 12) ? &PORTD : (((P) == 9 || (P) == 10) ? &PORTC : (((P) >= 17 && (P) <= 21)) ? &PORTF : (((P) == 24) ? &PORTE : &PORTB))) +#define __digitalPinToDDRReg(P) \ +(((P) == 22 || (P) == 23 || (P) == 5 || (P) == 6 || (P) == 7 || (P) == 8 || (P) == 11 || (P) == 12) ? &DDRD : (((P) == 9 || (P) == 10) ? &DDRC : (((P) >= 17 && (P) <= 21)) ? &DDRF : (((P) == 24) ? &DDRE : &DDRB))) +#define __digitalPinToPINReg(P) \ +(((P) == 22 || (P) == 23 || (P) == 5 || (P) == 6 || (P) == 7 || (P) == 8 || (P) == 11 || (P) == 12) ? &PIND : (((P) == 9 || (P) == 10) ? &PINC : (((P) >= 17 && (P) <= 21)) ? &PINF : (((P) == 24) ? &PINE : &PINB))) +#define __digitalPinToBit(P) \ +(((P) >= 0 && (P) <= 3) ? (P) : (((P) >= 5 && (P) < 9) ? (P) - 5 : (((P) == 4) ? 7 : (((P) == 9) ? 6 : (((P) == 10) ? 7 : \ +(((P) == 11) ? 6 : (((P) == 12) ? 7 : (((P) == 13) ? 4 : (((P) == 14) ? 5 : (((P) == 15) ? 6 : (((P) == 16) ? 7 :\ +(((P) == 17) ? 6 : (((P) == 18) ? 5 : (((P) == 19) ? 4 : (((P) == 20) ? 1 : (((P) == 21) ? 0 : (((P) == 22) ? 4 : (((P) == 23) ? 5 :\ +(((P) == 24) ? 6 : 6 ))))))))))))))))))) + +// --- Arduino Leonardo --- +#elif (defined(ARDUINO_AVR_LEONARDO) || \ +defined(__AVR_ATmega16U4__) || \ +defined(__AVR_ATmega32U4__)) + + +#define __digitalPinToPortReg(P) \ +((((P) >= 0 && (P) <= 4) || (P) == 6 || (P) == 12 || (P) == 24 || (P) == 25 || (P) == 29) ? &PORTD : (((P) == 5 || (P) == 13) ? &PORTC : (((P) >= 18 && (P) <= 23)) ? &PORTF : (((P) == 7) ? &PORTE : &PORTB))) +#define __digitalPinToDDRReg(P) \ +((((P) >= 0 && (P) <= 4) || (P) == 6 || (P) == 12 || (P) == 24 || (P) == 25 || (P) == 29) ? &DDRD : (((P) == 5 || (P) == 13) ? &DDRC : (((P) >= 18 && (P) <= 23)) ? &DDRF : (((P) == 7) ? &DDRE : &DDRB))) +#define __digitalPinToPINReg(P) \ +((((P) >= 0 && (P) <= 4) || (P) == 6 || (P) == 12 || (P) == 24 || (P) == 25 || (P) == 29) ? &PIND : (((P) == 5 || (P) == 13) ? &PINC : (((P) >= 18 && (P) <= 23)) ? &PINF : (((P) == 7) ? &PINE : &PINB))) +#define __digitalPinToBit(P) \ +(((P) >= 8 && (P) <= 11) ? (P) - 4 : (((P) >= 18 && (P) <= 21) ? 25 - (P) : (((P) == 0) ? 2 : (((P) == 1) ? 3 : (((P) == 2) ? 1 : (((P) == 3) ? 0 : (((P) == 4) ? 4 : (((P) == 6) ? 7 : (((P) == 13) ? 7 : (((P) == 14) ? 3 : (((P) == 15) ? 1 : (((P) == 16) ? 2 : (((P) == 17) ? 0 : (((P) == 22) ? 1 : (((P) == 23) ? 0 : (((P) == 24) ? 4 : (((P) == 25) ? 7 : (((P) == 26) ? 4 : (((P) == 27) ? 5 : 6 ))))))))))))))))))) + + +// --- Arduino Uno --- +#elif (defined(ARDUINO_AVR_UNO) || \ +defined(ARDUINO_AVR_DUEMILANOVE) || \ +defined(__AVR_ATmega328__) || \ +defined(__AVR_ATmega328P__) || \ +defined(__AVR_ATmega328PB__)) + + + +#if defined(__AVR_ATmega328PB__) +#define __digitalPinToPortReg(P) \ +(((P) >= 0 && (P) <= 7) ? &PORTD : (((P) >= 8 && (P) <= 13) ? &PORTB : (((P) >= 14 && (P) <= 19) ? &PORTC : &PORTE))) +#define __digitalPinToDDRReg(P) \ +(((P) >= 0 && (P) <= 7) ? &DDRD : (((P) >= 8 && (P) <= 13) ? &DDRB : (((P) >= 14 && (P) <= 19) ? &DDRC : &DDRE))) +#define __digitalPinToPINReg(P) \ +(((P) >= 0 && (P) <= 7) ? &PIND : (((P) >= 8 && (P) <= 13) ? &PINB : (((P) >= 14 && (P) <= 19) ? &PINC : &PINE))) +#define __digitalPinToBit(P) \ +(((P) >= 0 && (P) <= 7) ? (P) : (((P) >= 8 && (P) <= 13) ? (P) - 8 : (((P) >= 14 && (P) <= 19) ? (P) - 14 : (((P) >= 20 && (P) <= 21) ? (P) - 18 : (P) - 22)))) +#else +#define __digitalPinToPortReg(P) \ +(((P) >= 0 && (P) <= 7) ? &PORTD : (((P) >= 8 && (P) <= 13) ? &PORTB : &PORTC)) +#define __digitalPinToDDRReg(P) \ +(((P) >= 0 && (P) <= 7) ? &DDRD : (((P) >= 8 && (P) <= 13) ? &DDRB : &DDRC)) +#define __digitalPinToPINReg(P) \ +(((P) >= 0 && (P) <= 7) ? &PIND : (((P) >= 8 && (P) <= 13) ? &PINB : &PINC)) +#define __digitalPinToBit(P) \ +(((P) >= 0 && (P) <= 7) ? (P) : (((P) >= 8 && (P) <= 13) ? (P) - 8 : (P) - 14)) +#endif + + +#endif + +#if defined(AVR) +static byte ft_o,ft_p,ft_q,ft_r,ft_s,ft_t,ft_u,ft_v,ft_w,ft_x, ft_y, ft_z; +#define fastTouchRead(pin) \ +( digitalWrite(pin, LOW), \ +pinMode(pin, OUTPUT), \ +delay(1), \ +pinMode(pin, INPUT), \ +/* disable interrupts */ \ +BIT_SET(*__digitalPinToPortReg(pin), __digitalPinToBit(pin)), \ +ft_o = *__digitalPinToPINReg(pin), \ +ft_p = *__digitalPinToPINReg(pin), \ +ft_q = *__digitalPinToPINReg(pin), \ +ft_r = *__digitalPinToPINReg(pin), \ +ft_s = *__digitalPinToPINReg(pin), \ +ft_t = *__digitalPinToPINReg(pin), \ +ft_u = *__digitalPinToPINReg(pin), \ +ft_v = *__digitalPinToPINReg(pin), \ +ft_w = *__digitalPinToPINReg(pin), \ +ft_x = *__digitalPinToPINReg(pin), \ +ft_y = *__digitalPinToPINReg(pin), \ +ft_z = *__digitalPinToPINReg(pin), \ +/* enable interrupts */ \ +!(ft_p & (1<< __digitalPinToBit(pin))) + !(ft_q & (1<< __digitalPinToBit(pin))) + \ +!(ft_r & (1<< __digitalPinToBit(pin))) + !(ft_s & (1<< __digitalPinToBit(pin))) + \ +!(ft_t & (1<< __digitalPinToBit(pin)))+ !(ft_u & (1<< __digitalPinToBit(pin)))+ \ +!(ft_v & (1<< __digitalPinToBit(pin)))+ !(ft_w & (1<< __digitalPinToBit(pin)))+ \ +!(ft_x & (1<< __digitalPinToBit(pin)))+ !(ft_y & (1<< __digitalPinToBit(pin)))+ \ +!(ft_z & (1<< __digitalPinToBit(pin))) ) +#elif defined(_SAMD21_) + +static volatile uint32_t ft_o,ft_p,ft_q,ft_r,ft_s,ft_t,ft_u,ft_v,ft_w,ft_x, ft_y, ft_z; +static volatile uint32_t ft_xo,ft_xp,ft_xq,ft_xr,ft_xs,ft_xt,ft_xu,ft_xv,ft_xw,ft_xx, ft_xy, ft_xz; +#define fastTouchRead(pin) \ +( pinMode(pin, OUTPUT), \ +digitalWrite(pin, LOW), \ +delay(1), \ +pinMode(pin, INPUT_PULLUP), \ +/* disable interrupts */ \ +ft_p = PORT->Group[g_APinDescription[pin].ulPort].IN.reg, \ +ft_q = PORT->Group[g_APinDescription[pin].ulPort].IN.reg, \ +ft_r = PORT->Group[g_APinDescription[pin].ulPort].IN.reg, \ +ft_s = PORT->Group[g_APinDescription[pin].ulPort].IN.reg, \ +ft_t = PORT->Group[g_APinDescription[pin].ulPort].IN.reg, \ +ft_u = PORT->Group[g_APinDescription[pin].ulPort].IN.reg, \ +ft_v = PORT->Group[g_APinDescription[pin].ulPort].IN.reg, \ +ft_w = PORT->Group[g_APinDescription[pin].ulPort].IN.reg, \ +ft_x = PORT->Group[g_APinDescription[pin].ulPort].IN.reg, \ +ft_y = PORT->Group[g_APinDescription[pin].ulPort].IN.reg, \ +ft_z = PORT->Group[g_APinDescription[pin].ulPort].IN.reg, \ +ft_xo = PORT->Group[g_APinDescription[pin].ulPort].IN.reg, \ +ft_xp = PORT->Group[g_APinDescription[pin].ulPort].IN.reg, \ +ft_xq = PORT->Group[g_APinDescription[pin].ulPort].IN.reg, \ +ft_xr = PORT->Group[g_APinDescription[pin].ulPort].IN.reg, \ +ft_xs = PORT->Group[g_APinDescription[pin].ulPort].IN.reg, \ +ft_xt = PORT->Group[g_APinDescription[pin].ulPort].IN.reg, \ +ft_xu = PORT->Group[g_APinDescription[pin].ulPort].IN.reg, \ +ft_xv = PORT->Group[g_APinDescription[pin].ulPort].IN.reg, \ +ft_xw = PORT->Group[g_APinDescription[pin].ulPort].IN.reg, \ +ft_xx = PORT->Group[g_APinDescription[pin].ulPort].IN.reg, \ +ft_xy = PORT->Group[g_APinDescription[pin].ulPort].IN.reg, \ +ft_xz = PORT->Group[g_APinDescription[pin].ulPort].IN.reg, \ +/* enable interrupts */ \ +!(ft_p & (1ul << g_APinDescription[pin].ulPin)) + !(ft_q & (1ul << g_APinDescription[pin].ulPin)) + \ +!(ft_r & (1ul << g_APinDescription[pin].ulPin)) + !(ft_s & (1ul << g_APinDescription[pin].ulPin)) + \ +!(ft_t & (1ul << g_APinDescription[pin].ulPin)) + !(ft_u & (1ul << g_APinDescription[pin].ulPin)) + \ +!(ft_v & (1ul << g_APinDescription[pin].ulPin)) + !(ft_w & (1ul << g_APinDescription[pin].ulPin)) + \ +!(ft_x & (1ul << g_APinDescription[pin].ulPin)) + !(ft_y & (1ul << g_APinDescription[pin].ulPin)) + \ +!(ft_z & (1ul << g_APinDescription[pin].ulPin)) + \ +!(ft_xo & (1ul << g_APinDescription[pin].ulPin)) + \ +!(ft_xp & (1ul << g_APinDescription[pin].ulPin)) + !(ft_xq & (1ul << g_APinDescription[pin].ulPin)) + \ +!(ft_xr & (1ul << g_APinDescription[pin].ulPin)) + !(ft_xs & (1ul << g_APinDescription[pin].ulPin)) + \ +!(ft_xt & (1ul << g_APinDescription[pin].ulPin)) + !(ft_xu & (1ul << g_APinDescription[pin].ulPin)) + \ +!(ft_xv & (1ul << g_APinDescription[pin].ulPin)) + !(ft_xw & (1ul << g_APinDescription[pin].ulPin)) + \ +!(ft_xx & (1ul << g_APinDescription[pin].ulPin)) + !(ft_xy & (1ul << g_APinDescription[pin].ulPin)) + \ +!(ft_xz & (1ul << g_APinDescription[pin].ulPin)) \ +) + +#else +int fastTouchRead( int ); +extern int fastTouchMax(void); +#endif +#endif /* FastTouch_h */ diff --git a/sketch_42line/sketch_42line.ino b/sketch_42line/sketch_42line.ino new file mode 100644 index 0000000..3a73ff2 --- /dev/null +++ b/sketch_42line/sketch_42line.ino @@ -0,0 +1,377 @@ +#include +#include +#include +#include + +/*----------------------- + * TOUCH + ------------------------*/ + +static const int PIN_A = 1; // white +static const int PIN_B = 3; // red +static const int PIN_C = 5; // black +static const int PIN_D = 16; // green +static const int PIN_E = 17; // yellow +static const int PIN_F = 22; // blue -> orange -> yellow + +static int cutoff = 20; + +SENSOR_t s_A(PIN_A, cutoff); +SENSOR_t s_B(PIN_B, cutoff); +SENSOR_t s_C(PIN_C, cutoff); +SENSOR_t s_D(PIN_D, cutoff); +SENSOR_t s_E(PIN_E, cutoff); +SENSOR_t s_F(PIN_F, cutoff); + +static int READ_DELAY = 150; + +///forward declare + +void synth_toggle(bool p, int pin); + +/*----------------------- + * WORDS + ------------------------*/ + +static E_WORDS voice_A_words[] = {E1, E2, L0, L1, L2}; +static E_WORDS voice_B_words[] = {E3, L3}; +static E_WORDS voice_C_words[] = {E4, E5, E6, L4, L5, L6}; +static E_WORDS voice_D_words[] = {E7, E8, E9, L7, L8, L9, L10}; +static E_WORDS voice_E_words[] = {E10, E11, E12, E13, L11, L12}; + +static int MAX_WORD = 4; + +/*----------------------- + * AUDIO + ------------------------*/ +// Use these with the Teensy 4 Audio Shield +#define SDCARD_CS_PIN 10 +#define SDCARD_MOSI_PIN 11 +#define SDCARD_SCK_PIN 13 +#define SDCARD_SCK_PIN 13 + + +AudioOutputI2S audioOutput; +AudioControlSGTL5000 sgtl5000_1; + +// WAV + +AudioPlaySdWav wav_A; +AudioPlaySdWav wav_B; +AudioPlaySdWav wav_C; +AudioPlaySdWav wav_D; +AudioPlaySdWav wav_E; +AudioPlaySdWav wav_F; + +WAVPLAY_t wavplay_A(PIN_A, &wav_A, EA, LA, voice_A_words, 5, synth_toggle); +WAVPLAY_t wavplay_B(PIN_B, &wav_B, EB, LB, voice_B_words, 2, synth_toggle); +WAVPLAY_t wavplay_C(PIN_C, &wav_C, EC, LC, voice_C_words, 6, synth_toggle); +WAVPLAY_t wavplay_D(PIN_D, &wav_D, ED, LD, voice_D_words, 7, synth_toggle); +WAVPLAY_t wavplay_E(PIN_E, &wav_E, EE, LE, voice_E_words, 6, synth_toggle); + +AudioMixer4 wav_mixer1; +AudioMixer4 wav_mixer2; + +AudioConnection patchCordA1(wav_A, 0, wav_mixer1, 0); +AudioConnection patchCordA2(wav_A, 1, wav_mixer2, 0); +AudioConnection patchCordB1(wav_B, 0, wav_mixer1, 1); +AudioConnection patchCordB2(wav_B, 1, wav_mixer2, 1); +AudioConnection patchCordC1(wav_C, 0, wav_mixer1, 2); +AudioConnection patchCordC2(wav_C, 1, wav_mixer2, 2); +AudioConnection patchCordD1(wav_D, 0, wav_mixer1, 3); +AudioConnection patchCordD2(wav_D, 1, wav_mixer2, 3); + +// SYNTH + +float freq = 300; +DETUNE_t synth(freq); + +AudioMixer4 synth_mixer; + +AudioConnection patchCord1(synth.sine3, 0, synth_mixer, 2); +AudioConnection patchCord2(synth.sine2, 0, synth_mixer, 1); +AudioConnection patchCord3(synth.sine1, 0, synth_mixer, 0); + +// MIX + +AudioMixer4 main_mixer_L; +AudioMixer4 main_mixer_R; + +AudioConnection patchCord12(synth_mixer, 0, main_mixer_L, 1); +AudioConnection patchCord13(synth_mixer, 0, main_mixer_R, 1); +AudioConnection patchCord14(wav_mixer1, 0, main_mixer_L, 0); +AudioConnection patchCord15(wav_mixer2, 0, main_mixer_R, 0); + +//!!!!-----!!! + +AudioConnection patchCordE1(wav_E, 0, main_mixer_L, 2); +AudioConnection patchCordE2(wav_E, 1, main_mixer_R, 2); +AudioConnection patchCordF1(wav_F, 0, main_mixer_L, 3); +AudioConnection patchCordF2(wav_F, 1, main_mixer_R, 3); + +//!!!!-----!!! + +AudioConnection patchCord16(main_mixer_R, 0, audioOutput, 1); +AudioConnection patchCord17(main_mixer_L, 0, audioOutput, 0); + +/*----------------------- + * STATES + ------------------------*/ + +SENSOR_t* synth_sensor = NULL; +int synth_PIN = -1; +bool gain_up = false; + +float synth_gain_v = 0; +float synth_gain_max = 0.7; +float synth_gain_interval_ms = 1500; +float synth_gain_increments_ms = 0.01; +long synth_last_increment = 0; + +bool sensor_touch[6] = {false, false, false, false, false, false}; + +void synth_toggle(bool p, int pin) { + if(synth_PIN == pin && !p) { + gain_up = false; + synth_gain(0); + synth_sensor = NULL; + synth_PIN = -1; + } else if(p && synth_PIN < 0) { + synth_PIN = pin; + if(pin == PIN_A) synth_sensor = &s_A; + else if(pin == PIN_B) synth_sensor = &s_B; + else if(pin == PIN_C) synth_sensor = &s_C; + else if(pin == PIN_D) synth_sensor = &s_D; + else if(pin == PIN_E) synth_sensor = &s_E; + else if(pin == PIN_F) synth_sensor = &s_F; + gain_up = true; + synth_gain(0.5); + } +} + +void random_wav(AudioPlaySdWav* wav, E_WORDS* e_words) { + int w = (int)random(0, MAX_WORD); + wav->play(words[e_words[w]]); +} + +/*----------------------- + * CALLBACK + ------------------------*/ + +void toggle_signal_cb(bool p, int pin) { + + SENSOR_t* sensor = NULL; + + switch(pin) { + case PIN_A: + if(p) wavplay_A.play(); + else wavplay_A.stop(); + sensor = &s_A; + sensor_touch[0] = p; + break; + case PIN_B: + if(p) wavplay_B.play(); + else wavplay_B.stop(); + sensor = &s_B; + sensor_touch[1] = p; + break; + case PIN_C: + if(p) wavplay_C.play(); + else wavplay_C.stop(); + sensor = &s_C; + sensor_touch[2] = p; + break; + case PIN_D: + if(p) wavplay_D.play(); + else wavplay_D.stop(); + sensor = &s_D; + sensor_touch[3] = p; + break; + case PIN_E: + if(p) wavplay_E.play(); + else wavplay_E.stop(); + sensor = &s_E; + sensor_touch[4] = p; + break; + case PIN_F: + if(p) wavplay_B.play(); + else wavplay_B.stop(); + sensor = &s_F; + sensor_touch[5] = p; + break; + } + + // state_synth(p, pin, sensor); + +} + +/*----------------------- + * SETUPS + ------------------------*/ + + +void setup() { + Serial.begin(57600); + + setup_audio(); + + setup_sensors(); + + synth_gain(0); + wav_gain(0.75); +} + +void setup_sensors() { + // baselines + s_A.baseline(50, 50); + s_B.baseline(50, 50); + s_C.baseline(50, 50); + s_D.baseline(50, 50); + s_E.baseline(50, 50); + s_F.baseline(50, 50); + + // callbacks + s_A.plug_toggle_cb(toggle_signal_cb); + s_B.plug_toggle_cb(toggle_signal_cb); + s_C.plug_toggle_cb(toggle_signal_cb); + s_D.plug_toggle_cb(toggle_signal_cb); + s_E.plug_toggle_cb(toggle_signal_cb); + s_F.plug_toggle_cb(toggle_signal_cb); +} + +void setup_audio() { + AudioMemory(8); + sgtl5000_1.enable(); + sgtl5000_1.volume(0.5); + SPI.setMOSI(SDCARD_MOSI_PIN); + SPI.setSCK(SDCARD_SCK_PIN); + if (!(SD.begin(SDCARD_CS_PIN))) { + while (1) { + Serial.println("Unable to access the SD card"); + delay(1000); + } + } +} + +/*----------------------- + * LOOP + ------------------------*/ + +void loop() { + + s_A.update(); + s_B.update(); + s_C.update(); + s_D.update(); + s_E.update(); + s_F.update(); + +// float synth_gain_max = 0.5; +// float synth_gain_interval_ms = 1500; +// float synth_gain_increments_ms = synth_gain_max / 1500; +// long synth_last_increment = -1; + + if(synth_PIN > 0) { + int d = synth_sensor->map_range_raw(0, freq); + synth.set_detune(d); + + // if(gain_up && synth_gain_v < synth_gain_max) { + // synth_gain_v += synth_gain_increments_ms; + // if(synth_gain_v > synth_gain_max) + // synth_gain_v = synth_gain_max; + // synth_gain(synth_gain_v); + + // } else if(!gain_up && synth_gain_v > 0) { + // synth_gain_v -= synth_gain_increments_ms; + // if(synth_gain_v < 0) { + // synth_gain_v = 0; + // synth_sensor = NULL; + // synth_PIN = -1; + // } + // synth_gain(synth_gain_v); + // } + } + + if(sensor_touch[0]) wavplay_A.update(); + if(sensor_touch[1]) wavplay_B.update(); + if(sensor_touch[2]) wavplay_C.update(); + if(sensor_touch[3]) wavplay_D.update(); + if(sensor_touch[4]) wavplay_E.update(); + if(sensor_touch[5]) wavplay_B.update(); + + serial_plot_range(0, 100); + // serial_plot(); +// serial_plot_base(); +// serial_plot_range(0, 100); + + delay(READ_DELAY); + +} + +/*----------------------- + * GAIN FUNCS + ------------------------*/ + +void synth_gain(float g){ + synth_mixer.gain(0, g); + synth_mixer.gain(1, g); + synth_mixer.gain(2, g); +} + +void wav_gain(float g){ + wav_mixer1.gain(0, g); + wav_mixer1.gain(1, g); + wav_mixer1.gain(2, g); + wav_mixer1.gain(3, g); + + wav_mixer2.gain(0, g); + wav_mixer2.gain(1, g); + wav_mixer2.gain(2, g); + wav_mixer2.gain(3, g); + + // shoudl add wav_e + f but whatever +} + +/*----------------------- + * PLOT FUNCS + ------------------------*/ + +void serial_plot_range(int min_v, int max_v) { + Serial.print(s_A.map_range(min_v, max_v)); Serial.print(" "); + Serial.print(s_B.map_range(min_v, max_v)); Serial.print(" "); + Serial.print(s_C.map_range(min_v, max_v)); Serial.print(" "); + Serial.print(s_D.map_range(min_v, max_v)); Serial.print(" "); + Serial.print(s_E.map_range(min_v, max_v)); Serial.print(" "); + Serial.print(s_F.map_range(min_v, max_v)); Serial.print(" "); + Serial.println(""); +} + +void serial_plot_base(){ + Serial.print(s_A.base); Serial.print(" "); + Serial.print(s_B.base); Serial.print(" "); + Serial.print(s_C.base); Serial.print(" "); + Serial.print(s_D.base); Serial.print(" "); + Serial.print(s_E.base); Serial.print(" "); + Serial.print(s_F.base); Serial.print(" "); + Serial.println(""); +} + +void serial_plot() { + Serial.print(s_A.v); Serial.print(" "); + Serial.print(s_B.v); Serial.print(" "); + Serial.print(s_C.v); Serial.print(" "); + Serial.print(s_D.v); Serial.print(" "); + Serial.print(s_E.v); Serial.print(" "); + Serial.print(s_F.v); Serial.print(" "); + Serial.println(""); +} + +void serial_plot_dv() { + Serial.print(s_A.dv); Serial.print(" "); + Serial.print(s_B.dv); Serial.print(" "); + Serial.print(s_C.dv); Serial.print(" "); + Serial.print(s_D.dv); Serial.print(" "); + Serial.print(s_E.dv); Serial.print(" "); + Serial.print(s_F.dv); Serial.print(" "); + Serial.println(""); +}