/ MIDI_to_CV_Skull / code.py
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