code.py
 1  # SPDX-FileCopyrightText: 2022 Liz Clark for Adafruit Industries
 2  # SPDX-License-Identifier: MIT
 3  
 4  import board
 5  import simpleio
 6  import adafruit_mcp4725
 7  import usb_midi
 8  import adafruit_midi
 9  from digitalio import DigitalInOut, Direction
10  from adafruit_midi.note_off import NoteOff
11  from adafruit_midi.note_on import NoteOn
12  from volts import volts
13  
14  #  midi channel setup
15  midi_in_channel = 1
16  midi_out_channel = 1
17  
18  #  USB midi setup
19  midi = adafruit_midi.MIDI(
20      midi_in=usb_midi.ports[0], in_channel=0, midi_out=usb_midi.ports[1], out_channel=0
21  )
22  
23  # gate output pin
24  gate = DigitalInOut(board.A1)
25  gate.direction = Direction.OUTPUT
26  
27  #  i2c setup
28  i2c = board.I2C()
29  #  dac setup over i2c
30  dac = adafruit_mcp4725.MCP4725(i2c)
31  
32  #  dac raw value (12 bit)
33  dac.raw_value = 4095
34  
35  #  array for midi note numbers
36  midi_notes = []
37  #  array for 12 bit 1v/oct values
38  pitches = []
39  
40  #  function to map 1v/oct voltages to 12 bit values
41  #  these values are added to the pitches[] array
42  def map_volts(n, volt, vref, bits):
43      n = simpleio.map_range(volt, 0, vref, 0, bits)
44      pitches.append(n)
45  
46  #  brings values from volts.py into individual arrays
47  for v in volts:
48      #  map_volts function to map 1v/oct values to 12 bit
49      #  and append to pitches[]
50      map_volts(v['label'], v['1vOct'], 5, 4095)
51      #  append midi note numbers to midi_notes[] array
52      midi_notes.append(v['midi'])
53  
54  while True:
55      #  read incoming midi messages
56      msg = midi.receive()
57      #  if a midi msg comes in...
58      if msg is not None:
59          #  if it's noteoff...
60          if isinstance(msg, NoteOff):
61              #  send 0 volts on dac
62              dac.raw_value = 0
63              #  turn off gate pin
64              gate.value = False
65          #  if it's noteon...
66          if isinstance(msg, NoteOn):
67              #  compare incoming note number to midi_notes[]
68              z = midi_notes.index(msg.note)
69              #  limit note range to defined notes in volts.py
70              if msg.note < 36:
71                  msg.note = 36
72              if msg.note > 96:
73                  msg.note = 96
74              #  send corresponding 1v/oct value
75              dac.raw_value = int(pitches[z])
76              #  turn on gate pin
77              gate.value = True