/ Laser_Harp / laser_harp_two_voice.py
laser_harp_two_voice.py
  1  # SPDX-FileCopyrightText: 2022 Liz Clark for Adafruit Industries
  2  #
  3  # SPDX-License-Identifier: MIT
  4  import board
  5  import busio
  6  import simpleio
  7  import adafruit_vl53l4cd
  8  import adafruit_midi
  9  from adafruit_midi.note_off import NoteOff
 10  from adafruit_midi.note_on import NoteOn
 11  from adafruit_midi.program_change import ProgramChange
 12  #  uncomment if using volume CC message in the loop
 13  #  from adafruit_midi.control_change import ControlChange
 14  from adafruit_midi.pitch_bend import PitchBend
 15  import adafruit_tca9548a
 16  
 17  # Create I2C bus as normal
 18  i2c = board.I2C()  # uses board.SCL and board.SDA
 19  
 20  # Create the TCA9548A object and give it the I2C bus
 21  tca = adafruit_tca9548a.TCA9548A(i2c)
 22  
 23  tof_0 = adafruit_vl53l4cd.VL53L4CD(tca[0])
 24  tof_1 = adafruit_vl53l4cd.VL53L4CD(tca[1])
 25  tof_2 = adafruit_vl53l4cd.VL53L4CD(tca[2])
 26  tof_3 = adafruit_vl53l4cd.VL53L4CD(tca[3])
 27  tof_4 = adafruit_vl53l4cd.VL53L4CD(tca[4])
 28  tof_5 = adafruit_vl53l4cd.VL53L4CD(tca[5])
 29  tof_6 = adafruit_vl53l4cd.VL53L4CD(tca[6])
 30  tof_7 = adafruit_vl53l4cd.VL53L4CD(tca[7])
 31  
 32  flights = [tof_0, tof_1, tof_2, tof_3, tof_4, tof_5, tof_6, tof_7]
 33  
 34  for flight in flights:
 35      flight.inter_measurement = 0
 36      flight.timing_budget = 50
 37      flight.start_ranging()
 38  
 39  #  midi uart setup for music maker featherwing
 40  uart = busio.UART(board.TX, board.RX, baudrate=31250)
 41  
 42  midi_in_channel = 1
 43  midi_out_channel = 1
 44  #  midi setup
 45  #  UART is setup as the input
 46  midi = adafruit_midi.MIDI(
 47      midi_in=uart,
 48      midi_out=uart,
 49      in_channel=(midi_in_channel - 1),
 50      out_channel=(midi_out_channel - 1),
 51      debug=False,
 52  )
 53  
 54  flight_height = 150
 55  
 56  pluck_0 = False
 57  pluck_1 = False
 58  pluck_2 = False
 59  pluck_3 = False
 60  pluck_4 = False
 61  pluck_5 = False
 62  pluck_6 = False
 63  pluck_7 = False
 64  
 65  plucks = [pluck_0, pluck_1, pluck_2, pluck_3, pluck_4, pluck_5, pluck_6, pluck_7]
 66  
 67  low_notes = [28, 32, 35, 36, 40, 43, 47, 48]
 68  high_notes = [52, 55, 59, 60, 64, 67, 71, 72]
 69  
 70  heights = [0, 0, 0, 0, 0, 0, 0]
 71  
 72  bend_sense = 5
 73  vel = 120
 74  
 75  while True:
 76      for f in range(8):
 77          while not flights[f].data_ready:
 78              pass
 79          flights[f].clear_interrupt()
 80          if flights[f].distance != 0.0:
 81              if int(flights[f].distance) < flight_height:
 82                  if int(flights[f].distance) < 30 and not plucks[f]:
 83                      bass = ProgramChange(81)
 84                      vel = round(simpleio.map_range(flights[f].distance, 0, 30, 127, 75))
 85                      bend_sense = 5
 86                      velocity = int(vel)
 87                      #  send midi message
 88                      midi.send([bass, NoteOn(low_notes[f], velocity)])
 89                      plucks[f] = True
 90                      heights[f] = int(flights[f].distance)
 91                  if (int(flights[f].distance) > 40) and not plucks[f]:
 92                      lead = ProgramChange(54)
 93                      vel = round(simpleio.map_range(flights[f].distance, 30, flight_height, 127, 75))
 94                      bend_sense = 10
 95                      velocity = int(vel)
 96                      #  send midi message
 97                      midi.send([lead, NoteOn(high_notes[f], velocity)])
 98                      plucks[f] = True
 99                      heights[f] = int(flights[f].distance)
100              #  this section affects pitchbend OR volume control_change while you are playing a note
101              #  comment/uncomment lines to change effect affected
102              if abs(int(flights[f].distance) - heights[f]) > bend_sense and plucks[f]:
103                  bend_up = round(simpleio.map_range(flights[f].distance, heights[f], flight_height,
104                                                                          8192, 16383))
105                  bend_down = round(simpleio.map_range(flights[f].distance, heights[f], 0,
106                                                                            8192, 0))
107                  '''vol_up = round(simpleio.map_range(flights[f].distance, heights[f], flight_height,
108                                                                            velocity, 0))
109                  vol_down = round(simpleio.map_range(flights[f].distance, heights[f], 0,
110                                                                           velocity, 127))'''
111                  if int(flights[f].distance) > heights[f]:
112                      pitchUp = PitchBend(int(bend_up))
113                      midi.send(pitchUp)
114                      #  volume = ControlChange(7, int(vol_down))
115                      #  midi.send(volume)
116                      print("bend up!")
117                  if int(flights[f].distance) < heights[f]:
118                      pitchDown = PitchBend(int(bend_down))
119                      midi.send(pitchDown)
120                      #  volume = ControlChange(7, int(vol_up))
121                      #  midi.send(volume)
122                      print("bend down!")
123              #  send note off message
124              if int(flights[f].distance) > flight_height and plucks[f]:
125                  plucks[f] = False
126                  midi.send(NoteOff(low_notes[f], velocity))
127                  midi.send(NoteOff(high_notes[f], velocity))