code.py
1 # SPDX-FileCopyrightText: 2022 Liz Clark for Adafruit Industries 2 # SPDX-License-Identifier: MIT 3 4 import time 5 import adafruit_ble 6 import touchio 7 import board 8 import adafruit_midi 9 import adafruit_ble_midi 10 from adafruit_ble.advertising.standard import ProvideServicesAdvertisement 11 from adafruit_midi.note_on import NoteOn 12 from adafruit_midi.note_off import NoteOff 13 14 # CLUE cap touch setup 15 c_touch = touchio.TouchIn(board.D0) 16 f_touch = touchio.TouchIn(board.D1) 17 g_touch = touchio.TouchIn(board.D2) 18 19 # array of touch pads 20 pads = [c_touch, f_touch, g_touch] 21 22 # BLE MIDI setup 23 midi_service = adafruit_ble_midi.MIDIService() 24 advertisement = ProvideServicesAdvertisement(midi_service) 25 26 ble = adafruit_ble.BLERadio() 27 if ble.connected: 28 for c in ble.connections: 29 c.disconnect() 30 31 # midi setup 32 midi = adafruit_midi.MIDI(midi_out=midi_service, out_channel=0) 33 34 print("advertising") 35 ble.start_advertising(advertisement) 36 37 # MIDI note numbers for C, F and G major triads 38 c_triad = (60, 64, 67) 39 f_triad = (65, 69, 72) 40 g_triad = (67, 71, 74) 41 42 # array of triads 43 triads = [c_triad, f_triad, g_triad] 44 45 # touch debounce states 46 c_pressed = False 47 f_pressed = False 48 g_pressed = False 49 50 # array of debounce states 51 triad_states = [c_pressed, f_pressed, g_pressed] 52 53 # beginning triad 54 active_triad = c_triad 55 # variable for triad index 56 z = 0 57 58 while True: 59 # BLE connection 60 print("Waiting for connection") 61 while not ble.connected: 62 pass 63 print("Connected") 64 time.sleep(1.0) 65 66 # while BLE is connected... 67 while ble.connected: 68 # iterate through the touch inputs 69 for i in range(3): 70 inputs = pads[i] 71 # if a touch input is detected... 72 if inputs.value and triad_states[i] is False: 73 # debounce state activated 74 triad_states[i] = True 75 # update triad 76 active_triad = triads[i] 77 print(active_triad) 78 # after touch input... 79 if not inputs.value and triad_states[i] is True: 80 # reset debounce state 81 triad_states[i] = False 82 # send triad arpeggios out with half second delay 83 midi.send(NoteOn(active_triad[z])) 84 time.sleep(0.5) 85 midi.send(NoteOff(active_triad[z])) 86 time.sleep(0.5) 87 # increase index by 1 88 z += 1 89 # reset index at end of triad 90 if z > 2: 91 z = 0 92 93 # BLE connection 94 print("Disconnected") 95 print() 96 ble.start_advertising(advertisement)