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)