diff --git a/examples/trellism4_wavefile_synth/notes/sawtooth/A3.wav b/examples/trellism4_wavefile_synth/notes/sawtooth/A3.wav new file mode 100644 index 0000000..9f0db7e Binary files /dev/null and b/examples/trellism4_wavefile_synth/notes/sawtooth/A3.wav differ diff --git a/examples/trellism4_wavefile_synth/notes/sawtooth/A4.wav b/examples/trellism4_wavefile_synth/notes/sawtooth/A4.wav new file mode 100644 index 0000000..37b9434 Binary files /dev/null and b/examples/trellism4_wavefile_synth/notes/sawtooth/A4.wav differ diff --git a/examples/trellism4_wavefile_synth/notes/sawtooth/A5.wav b/examples/trellism4_wavefile_synth/notes/sawtooth/A5.wav new file mode 100644 index 0000000..e2cdc90 Binary files /dev/null and b/examples/trellism4_wavefile_synth/notes/sawtooth/A5.wav differ diff --git a/examples/trellism4_wavefile_synth/notes/sawtooth/B3.wav b/examples/trellism4_wavefile_synth/notes/sawtooth/B3.wav new file mode 100644 index 0000000..721cc5f Binary files /dev/null and b/examples/trellism4_wavefile_synth/notes/sawtooth/B3.wav differ diff --git a/examples/trellism4_wavefile_synth/notes/sawtooth/B4.wav b/examples/trellism4_wavefile_synth/notes/sawtooth/B4.wav new file mode 100644 index 0000000..79b0cb9 Binary files /dev/null and b/examples/trellism4_wavefile_synth/notes/sawtooth/B4.wav differ diff --git a/examples/trellism4_wavefile_synth/notes/sawtooth/B5.wav b/examples/trellism4_wavefile_synth/notes/sawtooth/B5.wav new file mode 100644 index 0000000..d39ddef Binary files /dev/null and b/examples/trellism4_wavefile_synth/notes/sawtooth/B5.wav differ diff --git a/examples/trellism4_wavefile_synth/notes/sawtooth/C3.wav b/examples/trellism4_wavefile_synth/notes/sawtooth/C3.wav new file mode 100644 index 0000000..a819942 Binary files /dev/null and b/examples/trellism4_wavefile_synth/notes/sawtooth/C3.wav differ diff --git a/examples/trellism4_wavefile_synth/notes/sawtooth/C4.wav b/examples/trellism4_wavefile_synth/notes/sawtooth/C4.wav new file mode 100644 index 0000000..8ac3810 Binary files /dev/null and b/examples/trellism4_wavefile_synth/notes/sawtooth/C4.wav differ diff --git a/examples/trellism4_wavefile_synth/notes/sawtooth/C5.wav b/examples/trellism4_wavefile_synth/notes/sawtooth/C5.wav new file mode 100644 index 0000000..dd02ae0 Binary files /dev/null and b/examples/trellism4_wavefile_synth/notes/sawtooth/C5.wav differ diff --git a/examples/trellism4_wavefile_synth/notes/sawtooth/D3.wav b/examples/trellism4_wavefile_synth/notes/sawtooth/D3.wav new file mode 100644 index 0000000..3ed2924 Binary files /dev/null and b/examples/trellism4_wavefile_synth/notes/sawtooth/D3.wav differ diff --git a/examples/trellism4_wavefile_synth/notes/sawtooth/D4.wav b/examples/trellism4_wavefile_synth/notes/sawtooth/D4.wav new file mode 100644 index 0000000..ff28948 Binary files /dev/null and b/examples/trellism4_wavefile_synth/notes/sawtooth/D4.wav differ diff --git a/examples/trellism4_wavefile_synth/notes/sawtooth/D5.wav b/examples/trellism4_wavefile_synth/notes/sawtooth/D5.wav new file mode 100644 index 0000000..c012e74 Binary files /dev/null and b/examples/trellism4_wavefile_synth/notes/sawtooth/D5.wav differ diff --git a/examples/trellism4_wavefile_synth/notes/sawtooth/E3.wav b/examples/trellism4_wavefile_synth/notes/sawtooth/E3.wav new file mode 100644 index 0000000..0f1de0c Binary files /dev/null and b/examples/trellism4_wavefile_synth/notes/sawtooth/E3.wav differ diff --git a/examples/trellism4_wavefile_synth/notes/sawtooth/E4.wav b/examples/trellism4_wavefile_synth/notes/sawtooth/E4.wav new file mode 100644 index 0000000..09b749b Binary files /dev/null and b/examples/trellism4_wavefile_synth/notes/sawtooth/E4.wav differ diff --git a/examples/trellism4_wavefile_synth/notes/sawtooth/E5.wav b/examples/trellism4_wavefile_synth/notes/sawtooth/E5.wav new file mode 100644 index 0000000..c60d6be Binary files /dev/null and b/examples/trellism4_wavefile_synth/notes/sawtooth/E5.wav differ diff --git a/examples/trellism4_wavefile_synth/notes/sawtooth/F3.wav b/examples/trellism4_wavefile_synth/notes/sawtooth/F3.wav new file mode 100644 index 0000000..d1f78b6 Binary files /dev/null and b/examples/trellism4_wavefile_synth/notes/sawtooth/F3.wav differ diff --git a/examples/trellism4_wavefile_synth/notes/sawtooth/F4.wav b/examples/trellism4_wavefile_synth/notes/sawtooth/F4.wav new file mode 100644 index 0000000..da646b7 Binary files /dev/null and b/examples/trellism4_wavefile_synth/notes/sawtooth/F4.wav differ diff --git a/examples/trellism4_wavefile_synth/notes/sawtooth/F5.wav b/examples/trellism4_wavefile_synth/notes/sawtooth/F5.wav new file mode 100644 index 0000000..a27b77e Binary files /dev/null and b/examples/trellism4_wavefile_synth/notes/sawtooth/F5.wav differ diff --git a/examples/trellism4_wavefile_synth/notes/sawtooth/G3.wav b/examples/trellism4_wavefile_synth/notes/sawtooth/G3.wav new file mode 100644 index 0000000..8e0700e Binary files /dev/null and b/examples/trellism4_wavefile_synth/notes/sawtooth/G3.wav differ diff --git a/examples/trellism4_wavefile_synth/notes/sawtooth/G4.wav b/examples/trellism4_wavefile_synth/notes/sawtooth/G4.wav new file mode 100644 index 0000000..1d03d9c Binary files /dev/null and b/examples/trellism4_wavefile_synth/notes/sawtooth/G4.wav differ diff --git a/examples/trellism4_wavefile_synth/notes/sawtooth/G5.wav b/examples/trellism4_wavefile_synth/notes/sawtooth/G5.wav new file mode 100644 index 0000000..45b6605 Binary files /dev/null and b/examples/trellism4_wavefile_synth/notes/sawtooth/G5.wav differ diff --git a/examples/trellism4_wavefile_synth/notes/sine/A3.wav b/examples/trellism4_wavefile_synth/notes/sine/A3.wav new file mode 100644 index 0000000..f053837 Binary files /dev/null and b/examples/trellism4_wavefile_synth/notes/sine/A3.wav differ diff --git a/examples/trellism4_wavefile_synth/notes/sine/A4.wav b/examples/trellism4_wavefile_synth/notes/sine/A4.wav new file mode 100644 index 0000000..950bf17 Binary files /dev/null and b/examples/trellism4_wavefile_synth/notes/sine/A4.wav differ diff --git a/examples/trellism4_wavefile_synth/notes/sine/A5.wav b/examples/trellism4_wavefile_synth/notes/sine/A5.wav new file mode 100644 index 0000000..17a0c0d Binary files /dev/null and b/examples/trellism4_wavefile_synth/notes/sine/A5.wav differ diff --git a/examples/trellism4_wavefile_synth/notes/sine/B3.wav b/examples/trellism4_wavefile_synth/notes/sine/B3.wav new file mode 100644 index 0000000..08aadd1 Binary files /dev/null and b/examples/trellism4_wavefile_synth/notes/sine/B3.wav differ diff --git a/examples/trellism4_wavefile_synth/notes/sine/B4.wav b/examples/trellism4_wavefile_synth/notes/sine/B4.wav new file mode 100644 index 0000000..072a380 Binary files /dev/null and b/examples/trellism4_wavefile_synth/notes/sine/B4.wav differ diff --git a/examples/trellism4_wavefile_synth/notes/sine/B5.wav b/examples/trellism4_wavefile_synth/notes/sine/B5.wav new file mode 100644 index 0000000..0d70397 Binary files /dev/null and b/examples/trellism4_wavefile_synth/notes/sine/B5.wav differ diff --git a/examples/trellism4_wavefile_synth/notes/sine/C3.wav b/examples/trellism4_wavefile_synth/notes/sine/C3.wav new file mode 100644 index 0000000..595cdda Binary files /dev/null and b/examples/trellism4_wavefile_synth/notes/sine/C3.wav differ diff --git a/examples/trellism4_wavefile_synth/notes/sine/C4.wav b/examples/trellism4_wavefile_synth/notes/sine/C4.wav new file mode 100644 index 0000000..258abf7 Binary files /dev/null and b/examples/trellism4_wavefile_synth/notes/sine/C4.wav differ diff --git a/examples/trellism4_wavefile_synth/notes/sine/C5.wav b/examples/trellism4_wavefile_synth/notes/sine/C5.wav new file mode 100644 index 0000000..0b33ef8 Binary files /dev/null and b/examples/trellism4_wavefile_synth/notes/sine/C5.wav differ diff --git a/examples/trellism4_wavefile_synth/notes/sine/D3.wav b/examples/trellism4_wavefile_synth/notes/sine/D3.wav new file mode 100644 index 0000000..9f6f4fb Binary files /dev/null and b/examples/trellism4_wavefile_synth/notes/sine/D3.wav differ diff --git a/examples/trellism4_wavefile_synth/notes/sine/D4.wav b/examples/trellism4_wavefile_synth/notes/sine/D4.wav new file mode 100644 index 0000000..9d089c6 Binary files /dev/null and b/examples/trellism4_wavefile_synth/notes/sine/D4.wav differ diff --git a/examples/trellism4_wavefile_synth/notes/sine/D5.wav b/examples/trellism4_wavefile_synth/notes/sine/D5.wav new file mode 100644 index 0000000..78c7ff9 Binary files /dev/null and b/examples/trellism4_wavefile_synth/notes/sine/D5.wav differ diff --git a/examples/trellism4_wavefile_synth/notes/sine/E3.wav b/examples/trellism4_wavefile_synth/notes/sine/E3.wav new file mode 100644 index 0000000..c30be9c Binary files /dev/null and b/examples/trellism4_wavefile_synth/notes/sine/E3.wav differ diff --git a/examples/trellism4_wavefile_synth/notes/sine/E4.wav b/examples/trellism4_wavefile_synth/notes/sine/E4.wav new file mode 100644 index 0000000..8aad500 Binary files /dev/null and b/examples/trellism4_wavefile_synth/notes/sine/E4.wav differ diff --git a/examples/trellism4_wavefile_synth/notes/sine/E5.wav b/examples/trellism4_wavefile_synth/notes/sine/E5.wav new file mode 100644 index 0000000..3ede843 Binary files /dev/null and b/examples/trellism4_wavefile_synth/notes/sine/E5.wav differ diff --git a/examples/trellism4_wavefile_synth/notes/sine/F3.wav b/examples/trellism4_wavefile_synth/notes/sine/F3.wav new file mode 100644 index 0000000..b45df19 Binary files /dev/null and b/examples/trellism4_wavefile_synth/notes/sine/F3.wav differ diff --git a/examples/trellism4_wavefile_synth/notes/sine/F4.wav b/examples/trellism4_wavefile_synth/notes/sine/F4.wav new file mode 100644 index 0000000..54dcc68 Binary files /dev/null and b/examples/trellism4_wavefile_synth/notes/sine/F4.wav differ diff --git a/examples/trellism4_wavefile_synth/notes/sine/F5.wav b/examples/trellism4_wavefile_synth/notes/sine/F5.wav new file mode 100644 index 0000000..9e74e93 Binary files /dev/null and b/examples/trellism4_wavefile_synth/notes/sine/F5.wav differ diff --git a/examples/trellism4_wavefile_synth/notes/sine/G3.wav b/examples/trellism4_wavefile_synth/notes/sine/G3.wav new file mode 100644 index 0000000..ce1241a Binary files /dev/null and b/examples/trellism4_wavefile_synth/notes/sine/G3.wav differ diff --git a/examples/trellism4_wavefile_synth/notes/sine/G4.wav b/examples/trellism4_wavefile_synth/notes/sine/G4.wav new file mode 100644 index 0000000..b359189 Binary files /dev/null and b/examples/trellism4_wavefile_synth/notes/sine/G4.wav differ diff --git a/examples/trellism4_wavefile_synth/notes/sine/G5.wav b/examples/trellism4_wavefile_synth/notes/sine/G5.wav new file mode 100644 index 0000000..06728dc Binary files /dev/null and b/examples/trellism4_wavefile_synth/notes/sine/G5.wav differ diff --git a/examples/trellism4_wavefile_synth/notes/square/A3.wav b/examples/trellism4_wavefile_synth/notes/square/A3.wav new file mode 100644 index 0000000..4e1fcb8 Binary files /dev/null and b/examples/trellism4_wavefile_synth/notes/square/A3.wav differ diff --git a/examples/trellism4_wavefile_synth/notes/square/A4.wav b/examples/trellism4_wavefile_synth/notes/square/A4.wav new file mode 100644 index 0000000..c21212f Binary files /dev/null and b/examples/trellism4_wavefile_synth/notes/square/A4.wav differ diff --git a/examples/trellism4_wavefile_synth/notes/square/A5.wav b/examples/trellism4_wavefile_synth/notes/square/A5.wav new file mode 100644 index 0000000..21c9806 Binary files /dev/null and b/examples/trellism4_wavefile_synth/notes/square/A5.wav differ diff --git a/examples/trellism4_wavefile_synth/notes/square/B3.wav b/examples/trellism4_wavefile_synth/notes/square/B3.wav new file mode 100644 index 0000000..8c1c5fc Binary files /dev/null and b/examples/trellism4_wavefile_synth/notes/square/B3.wav differ diff --git a/examples/trellism4_wavefile_synth/notes/square/B4.wav b/examples/trellism4_wavefile_synth/notes/square/B4.wav new file mode 100644 index 0000000..ba24e3a Binary files /dev/null and b/examples/trellism4_wavefile_synth/notes/square/B4.wav differ diff --git a/examples/trellism4_wavefile_synth/notes/square/B5.wav b/examples/trellism4_wavefile_synth/notes/square/B5.wav new file mode 100644 index 0000000..0091a94 Binary files /dev/null and b/examples/trellism4_wavefile_synth/notes/square/B5.wav differ diff --git a/examples/trellism4_wavefile_synth/notes/square/C3.wav b/examples/trellism4_wavefile_synth/notes/square/C3.wav new file mode 100644 index 0000000..cac0809 Binary files /dev/null and b/examples/trellism4_wavefile_synth/notes/square/C3.wav differ diff --git a/examples/trellism4_wavefile_synth/notes/square/C4.wav b/examples/trellism4_wavefile_synth/notes/square/C4.wav new file mode 100644 index 0000000..cda67fd Binary files /dev/null and b/examples/trellism4_wavefile_synth/notes/square/C4.wav differ diff --git a/examples/trellism4_wavefile_synth/notes/square/C5.wav b/examples/trellism4_wavefile_synth/notes/square/C5.wav new file mode 100644 index 0000000..2162cde Binary files /dev/null and b/examples/trellism4_wavefile_synth/notes/square/C5.wav differ diff --git a/examples/trellism4_wavefile_synth/notes/square/D3.wav b/examples/trellism4_wavefile_synth/notes/square/D3.wav new file mode 100644 index 0000000..e3ed4c8 Binary files /dev/null and b/examples/trellism4_wavefile_synth/notes/square/D3.wav differ diff --git a/examples/trellism4_wavefile_synth/notes/square/D4.wav b/examples/trellism4_wavefile_synth/notes/square/D4.wav new file mode 100644 index 0000000..2b08835 Binary files /dev/null and b/examples/trellism4_wavefile_synth/notes/square/D4.wav differ diff --git a/examples/trellism4_wavefile_synth/notes/square/D5.wav b/examples/trellism4_wavefile_synth/notes/square/D5.wav new file mode 100644 index 0000000..4f78db7 Binary files /dev/null and b/examples/trellism4_wavefile_synth/notes/square/D5.wav differ diff --git a/examples/trellism4_wavefile_synth/notes/square/E3.wav b/examples/trellism4_wavefile_synth/notes/square/E3.wav new file mode 100644 index 0000000..df3507c Binary files /dev/null and b/examples/trellism4_wavefile_synth/notes/square/E3.wav differ diff --git a/examples/trellism4_wavefile_synth/notes/square/E4.wav b/examples/trellism4_wavefile_synth/notes/square/E4.wav new file mode 100644 index 0000000..9a034f8 Binary files /dev/null and b/examples/trellism4_wavefile_synth/notes/square/E4.wav differ diff --git a/examples/trellism4_wavefile_synth/notes/square/E5.wav b/examples/trellism4_wavefile_synth/notes/square/E5.wav new file mode 100644 index 0000000..b2c762b Binary files /dev/null and b/examples/trellism4_wavefile_synth/notes/square/E5.wav differ diff --git a/examples/trellism4_wavefile_synth/notes/square/F3.wav b/examples/trellism4_wavefile_synth/notes/square/F3.wav new file mode 100644 index 0000000..5901e40 Binary files /dev/null and b/examples/trellism4_wavefile_synth/notes/square/F3.wav differ diff --git a/examples/trellism4_wavefile_synth/notes/square/F4.wav b/examples/trellism4_wavefile_synth/notes/square/F4.wav new file mode 100644 index 0000000..b88608e Binary files /dev/null and b/examples/trellism4_wavefile_synth/notes/square/F4.wav differ diff --git a/examples/trellism4_wavefile_synth/notes/square/F5.wav b/examples/trellism4_wavefile_synth/notes/square/F5.wav new file mode 100644 index 0000000..2d35a5e Binary files /dev/null and b/examples/trellism4_wavefile_synth/notes/square/F5.wav differ diff --git a/examples/trellism4_wavefile_synth/notes/square/G3.wav b/examples/trellism4_wavefile_synth/notes/square/G3.wav new file mode 100644 index 0000000..8154d0e Binary files /dev/null and b/examples/trellism4_wavefile_synth/notes/square/G3.wav differ diff --git a/examples/trellism4_wavefile_synth/notes/square/G4.wav b/examples/trellism4_wavefile_synth/notes/square/G4.wav new file mode 100644 index 0000000..a1d4812 Binary files /dev/null and b/examples/trellism4_wavefile_synth/notes/square/G4.wav differ diff --git a/examples/trellism4_wavefile_synth/notes/square/G5.wav b/examples/trellism4_wavefile_synth/notes/square/G5.wav new file mode 100644 index 0000000..d93d6dd Binary files /dev/null and b/examples/trellism4_wavefile_synth/notes/square/G5.wav differ diff --git a/examples/trellism4_wavefile_synth/notes/triangle/A3.wav b/examples/trellism4_wavefile_synth/notes/triangle/A3.wav new file mode 100644 index 0000000..430bbf9 Binary files /dev/null and b/examples/trellism4_wavefile_synth/notes/triangle/A3.wav differ diff --git a/examples/trellism4_wavefile_synth/notes/triangle/A4.wav b/examples/trellism4_wavefile_synth/notes/triangle/A4.wav new file mode 100644 index 0000000..5c082dd Binary files /dev/null and b/examples/trellism4_wavefile_synth/notes/triangle/A4.wav differ diff --git a/examples/trellism4_wavefile_synth/notes/triangle/A5.wav b/examples/trellism4_wavefile_synth/notes/triangle/A5.wav new file mode 100644 index 0000000..af538b6 Binary files /dev/null and b/examples/trellism4_wavefile_synth/notes/triangle/A5.wav differ diff --git a/examples/trellism4_wavefile_synth/notes/triangle/B3.wav b/examples/trellism4_wavefile_synth/notes/triangle/B3.wav new file mode 100644 index 0000000..73e9aa5 Binary files /dev/null and b/examples/trellism4_wavefile_synth/notes/triangle/B3.wav differ diff --git a/examples/trellism4_wavefile_synth/notes/triangle/B4.wav b/examples/trellism4_wavefile_synth/notes/triangle/B4.wav new file mode 100644 index 0000000..5daf690 Binary files /dev/null and b/examples/trellism4_wavefile_synth/notes/triangle/B4.wav differ diff --git a/examples/trellism4_wavefile_synth/notes/triangle/B5.wav b/examples/trellism4_wavefile_synth/notes/triangle/B5.wav new file mode 100644 index 0000000..15e8ccc Binary files /dev/null and b/examples/trellism4_wavefile_synth/notes/triangle/B5.wav differ diff --git a/examples/trellism4_wavefile_synth/notes/triangle/C3.wav b/examples/trellism4_wavefile_synth/notes/triangle/C3.wav new file mode 100644 index 0000000..4a500ca Binary files /dev/null and b/examples/trellism4_wavefile_synth/notes/triangle/C3.wav differ diff --git a/examples/trellism4_wavefile_synth/notes/triangle/C4.wav b/examples/trellism4_wavefile_synth/notes/triangle/C4.wav new file mode 100644 index 0000000..50d8d30 Binary files /dev/null and b/examples/trellism4_wavefile_synth/notes/triangle/C4.wav differ diff --git a/examples/trellism4_wavefile_synth/notes/triangle/C5.wav b/examples/trellism4_wavefile_synth/notes/triangle/C5.wav new file mode 100644 index 0000000..d5db000 Binary files /dev/null and b/examples/trellism4_wavefile_synth/notes/triangle/C5.wav differ diff --git a/examples/trellism4_wavefile_synth/notes/triangle/D3.wav b/examples/trellism4_wavefile_synth/notes/triangle/D3.wav new file mode 100644 index 0000000..6be3378 Binary files /dev/null and b/examples/trellism4_wavefile_synth/notes/triangle/D3.wav differ diff --git a/examples/trellism4_wavefile_synth/notes/triangle/D4.wav b/examples/trellism4_wavefile_synth/notes/triangle/D4.wav new file mode 100644 index 0000000..c52128a Binary files /dev/null and b/examples/trellism4_wavefile_synth/notes/triangle/D4.wav differ diff --git a/examples/trellism4_wavefile_synth/notes/triangle/D5.wav b/examples/trellism4_wavefile_synth/notes/triangle/D5.wav new file mode 100644 index 0000000..d6c5cab Binary files /dev/null and b/examples/trellism4_wavefile_synth/notes/triangle/D5.wav differ diff --git a/examples/trellism4_wavefile_synth/notes/triangle/E3.wav b/examples/trellism4_wavefile_synth/notes/triangle/E3.wav new file mode 100644 index 0000000..1698432 Binary files /dev/null and b/examples/trellism4_wavefile_synth/notes/triangle/E3.wav differ diff --git a/examples/trellism4_wavefile_synth/notes/triangle/E4.wav b/examples/trellism4_wavefile_synth/notes/triangle/E4.wav new file mode 100644 index 0000000..5191a86 Binary files /dev/null and b/examples/trellism4_wavefile_synth/notes/triangle/E4.wav differ diff --git a/examples/trellism4_wavefile_synth/notes/triangle/E5.wav b/examples/trellism4_wavefile_synth/notes/triangle/E5.wav new file mode 100644 index 0000000..216b7b8 Binary files /dev/null and b/examples/trellism4_wavefile_synth/notes/triangle/E5.wav differ diff --git a/examples/trellism4_wavefile_synth/notes/triangle/F3.wav b/examples/trellism4_wavefile_synth/notes/triangle/F3.wav new file mode 100644 index 0000000..4730aaf Binary files /dev/null and b/examples/trellism4_wavefile_synth/notes/triangle/F3.wav differ diff --git a/examples/trellism4_wavefile_synth/notes/triangle/F4.wav b/examples/trellism4_wavefile_synth/notes/triangle/F4.wav new file mode 100644 index 0000000..c623891 Binary files /dev/null and b/examples/trellism4_wavefile_synth/notes/triangle/F4.wav differ diff --git a/examples/trellism4_wavefile_synth/notes/triangle/F5.wav b/examples/trellism4_wavefile_synth/notes/triangle/F5.wav new file mode 100644 index 0000000..e1f30bb Binary files /dev/null and b/examples/trellism4_wavefile_synth/notes/triangle/F5.wav differ diff --git a/examples/trellism4_wavefile_synth/notes/triangle/G3.wav b/examples/trellism4_wavefile_synth/notes/triangle/G3.wav new file mode 100644 index 0000000..7b19a24 Binary files /dev/null and b/examples/trellism4_wavefile_synth/notes/triangle/G3.wav differ diff --git a/examples/trellism4_wavefile_synth/notes/triangle/G4.wav b/examples/trellism4_wavefile_synth/notes/triangle/G4.wav new file mode 100644 index 0000000..5ecde1c Binary files /dev/null and b/examples/trellism4_wavefile_synth/notes/triangle/G4.wav differ diff --git a/examples/trellism4_wavefile_synth/notes/triangle/G5.wav b/examples/trellism4_wavefile_synth/notes/triangle/G5.wav new file mode 100644 index 0000000..e7b3f0c Binary files /dev/null and b/examples/trellism4_wavefile_synth/notes/triangle/G5.wav differ diff --git a/examples/trellism4_wavefile_synth/trellism4_wavefile_synth.py b/examples/trellism4_wavefile_synth/trellism4_wavefile_synth.py new file mode 100644 index 0000000..dc9a354 --- /dev/null +++ b/examples/trellism4_wavefile_synth/trellism4_wavefile_synth.py @@ -0,0 +1,109 @@ +""" +This synthesizer is loaded with wave files for 3 octaves of notes each in 4 different waveforms. +It uses Mixer to play up to 7 notes at once. +Play notes with the rainbow buttons. Change waveform types ith the white buttons in the last column. +""" +import board +from audiocore import WaveFile +from audioio import AudioOut +from audiomixer import Mixer +import adafruit_trellism4 + +# trellis helper object +trellis = adafruit_trellism4.TrellisM4Express() +# low brightness on the neopixles +trellis.pixels.brightness = 0.05 +# each musical note letter +note_letters = ['C', 'D', 'E', 'F', 'G', 'A', 'B'] +# colors of the rainbow +colors = [ + (255, 0, 0), (255, 127, 0), (255, 255, 0), + (0, 255, 0), (0, 0, 255), (56, 43, 105), (139, 0, 255)] + +# dictionary holding note string to wave file value. +# e.g. {... "sined4": audioio.WaveFile(open("notes/sine/d4.wav")), ...} +notes = {} + +# list of all waveform types +WAVE_TYPES = ["sine", "square", "sawtooth", "triangle"] + +# current waveform type. Will get changed from the last column +current_wave_type = "sine" + +# load the notes dictionary +for wave_type in WAVE_TYPES: + for octave in range(3, 6): # [3,4,5] + for note_letter in note_letters: + # note with octave e.g. a4 + cur_note = "{}{}".format(note_letter, octave) + # add wave file to dictionary + key = "{}{}".format(wave_type, cur_note) + notes[key] = WaveFile( + open("notes/{}/{}.wav".format(wave_type, cur_note), "rb")) + +# main audio object +audio = AudioOut(left_channel=board.A0, right_channel=board.A1) +# mixer to allow pylyphonic playback +mixer = Mixer( + voice_count=8, sample_rate=8000, + channel_count=2, bits_per_sample=16, + samples_signed=True) + +audio.play(mixer) + +# turn on the rainbow lights +for i, color in enumerate(colors): + trellis.pixels[i, 0] = color + trellis.pixels[i, 1] = color + trellis.pixels[i, 2] = color + +# list of keys pressed on the previous iteration +prev_pressed = [] + +# voice recycling variables +available_voices = [1, 2, 3, 4, 5, 6, 7] +# key to voice dictionary e.g. {... (1,2):4, (1,3):3, ...} +used_voices = {} + +# waveform selector in the last column +# default to index 0 sine +trellis.pixels[7, 0] = (255, 255, 255) +while True: + cur_keys = trellis.pressed_keys + # if the keys are different from previous iteration + if cur_keys != prev_pressed: + # loop over currently pressed keys + for key in cur_keys: + # if it's a note key. First 7 columns. + if key[0] < len(note_letters): + # if we aren't already playing this note and we have available voice + if key not in used_voices.keys() and available_voices: + # build not string + note_for_key = "{}{}".format(note_letters[key[0]], key[1]+3) + note_to_play = "{}{}".format(current_wave_type, note_for_key) + # if the note exists in the notes dictionary + if note_to_play in notes: + # get an available voice + voice_to_use = available_voices.pop() + used_voices[key] = voice_to_use + # play the note + mixer.play(notes[note_to_play], voice=voice_to_use, loop=True) + else: # last column + current_wave_type = WAVE_TYPES[key[1]] + # turn off all last column pixels + for y_pixel in range(0, 4): + trellis.pixels[7, y_pixel] = (0, 0, 0) + # turn on selected + trellis.pixels[7, key[1]] = (255, 255, 255) + if mixer.playing: + # loop over each note that is playing + for key in used_voices: + # if the key is no longer down + if key not in cur_keys: + # stop playing + mixer.stop_voice(used_voices[key]) + # recycle voice + available_voices.append(used_voices[key]) + used_voices.pop(key, None) + # update variable for next iteration + prev_pressed = cur_keys