diff --git a/.fseventsd/no_log b/.fseventsd/no_log new file mode 100644 index 0000000..e69de29 diff --git a/.metadata_never_index b/.metadata_never_index new file mode 100644 index 0000000..e69de29 diff --git a/boot_out.txt b/boot_out.txt new file mode 100644 index 0000000..1b756ac --- /dev/null +++ b/boot_out.txt @@ -0,0 +1 @@ +Adafruit CircuitPython 6.2.0-rc.0 on 2021-04-01; Raspberry Pi Pico with rp2040 diff --git a/code.py b/code.py new file mode 100644 index 0000000..049c3dc --- /dev/null +++ b/code.py @@ -0,0 +1,158 @@ +import time +import board +import busio + +import adafruit_ssd1306 + +from adafruit_bus_device.i2c_device import I2CDevice +import adafruit_dotstar + +import usb_midi +import adafruit_midi + +from adafruit_midi.control_change import ControlChange +from adafruit_midi.note_off import NoteOff +from adafruit_midi.note_on import NoteOn + +from digitalio import DigitalInOut, Direction, Pull + +cs = DigitalInOut(board.GP17) +cs.direction = Direction.OUTPUT +cs.value = 0 + +p = DigitalInOut(board.GP6) +p.direction = Direction.OUTPUT +p.value = 1 + +num_butts = 0x10 + +lights = adafruit_dotstar.DotStar( + board.GP18, board.GP19, num_butts, brightness=0.1, auto_write=True +) + +i2c = busio.I2C(board.GP5, board.GP4) +keypad = I2CDevice(i2c, 0x20) +midi = adafruit_midi.MIDI(midi_out=usb_midi.ports[1], out_channel=0) + +oled_height = 32 +oled_width = 128 +oled = adafruit_ssd1306.SSD1306_I2C(oled_width, oled_height, i2c) +oled.fill(0) +oled.show() + + +class LFO_STATE: + off = 0 + slow = 1 + fast = 2 + + +# todo make Lfo class that keeps all this info together +# possibly extend from Pad class +num_lfos = 8 +lfo_states = [LFO_STATE.off] * num_lfos +lfo_values = [0.0] * num_lfos +lfo_dirs = [1] * num_lfos + + +def lfo_line(lfo_num, lfo_val): + line_height = oled_height // num_lfos + # TODO consider removing gap + oled.fill_rect( + 0, + lfo_num * line_height, + int(lfo_val * oled_width), + line_height - 1, + 1, + ) + + +held = [False] * 16 +mode = 0 +tick = 0 + + +lfo_incs = {LFO_STATE.off: 0, LFO_STATE.slow: 0.01, LFO_STATE.fast: 0.1} + + +bpm_mode = False +bpm = 128 + + +def read_butts(): + pressed = [0] * 16 + with keypad: + keypad.write(bytes([0x0])) + result = bytearray(2) + keypad.readinto(result) + b = result[0] | result[1] << 8 + + for i in range(0x0, len(pressed)): + if not (1 << i) & b: + pressed[i] = 1 + else: + pressed[i] = 0 + return pressed + + +def inc_lfo(idx, state): + val = lfo_values[idx] + inc = lfo_incs[state] + dire = lfo_dirs[idx] + lfo_values[idx] += inc * dire + if val >= 1.0: + lfo_dirs[idx] = -1 + elif val <= 0: + lfo_dirs[idx] = 1 + + +while True: + # todo use bpm + time.sleep(0.01) + oled.fill(0) + # todo set bpm mode (press B then type a number then press F to select. press B again to cancel) + # todo set channel mode (press C, type number to set midi channel, then F to select. press B to cancel) + # in bpm and channel mode: numbers should be white, B should be red and F should be green + # todo teaching mode (hold F, disables LFO, lets you teach cc to machine) + # todo set limits mode (press A, press a control, press a number and then select start (0-A) and end (0-A)) + + for idx, state in enumerate(lfo_states): + inc_lfo(idx, state) + val = lfo_values[idx] + if val < 0: + val = 0 + if val > 1: + val = 1 + col_offset = int(128 * val) + if state == LFO_STATE.off: + lights[idx] = (0, 0, 0) + elif state == LFO_STATE.slow: + lights[idx] = (255, col_offset, 0) + elif state == LFO_STATE.fast: + lights[idx] = (0, col_offset, 255) + + if state != LFO_STATE.off: + midi.send(ControlChange(idx, int(val * 127))) + + lfo_line(idx, val) + + for idx, pressed in enumerate(read_butts()): + if pressed and not held[idx]: + if idx <= num_lfos: + if lfo_states[idx] == LFO_STATE.off: + lfo_states[idx] = LFO_STATE.slow + elif lfo_states[idx] == LFO_STATE.slow: + lfo_states[idx] = LFO_STATE.fast + elif lfo_states[idx] == LFO_STATE.fast: + lfo_states[idx] = LFO_STATE.off + pass + # todo initiate BPM mode (so this is holding B and typing a number) + held[idx] = True + elif pressed and held[idx]: + # todo BPM mode (take another number) + pass + elif not pressed and held[idx]: + # todo BPM mode (set bpm) + held[idx] = False + oled.show() + lights.show() diff --git a/font5x8.bin b/font5x8.bin new file mode 100644 index 0000000..9a0563b Binary files /dev/null and b/font5x8.bin differ diff --git a/lib/adafruit_bus_device/__init__.py b/lib/adafruit_bus_device/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/lib/adafruit_bus_device/i2c_device.mpy b/lib/adafruit_bus_device/i2c_device.mpy new file mode 100644 index 0000000..b8fff50 Binary files /dev/null and b/lib/adafruit_bus_device/i2c_device.mpy differ diff --git a/lib/adafruit_bus_device/spi_device.mpy b/lib/adafruit_bus_device/spi_device.mpy new file mode 100644 index 0000000..e7e77ee Binary files /dev/null and b/lib/adafruit_bus_device/spi_device.mpy differ diff --git a/lib/adafruit_dotstar.mpy b/lib/adafruit_dotstar.mpy new file mode 100644 index 0000000..696e977 Binary files /dev/null and b/lib/adafruit_dotstar.mpy differ diff --git a/lib/adafruit_framebuf.mpy b/lib/adafruit_framebuf.mpy new file mode 100644 index 0000000..c21eff8 Binary files /dev/null and b/lib/adafruit_framebuf.mpy differ diff --git a/lib/adafruit_midi/__init__.mpy b/lib/adafruit_midi/__init__.mpy new file mode 100644 index 0000000..141f9b2 Binary files /dev/null and b/lib/adafruit_midi/__init__.mpy differ diff --git a/lib/adafruit_midi/channel_pressure.mpy b/lib/adafruit_midi/channel_pressure.mpy new file mode 100644 index 0000000..65bf297 Binary files /dev/null and b/lib/adafruit_midi/channel_pressure.mpy differ diff --git a/lib/adafruit_midi/control_change.mpy b/lib/adafruit_midi/control_change.mpy new file mode 100644 index 0000000..bbd7d1e Binary files /dev/null and b/lib/adafruit_midi/control_change.mpy differ diff --git a/lib/adafruit_midi/control_change_values.mpy b/lib/adafruit_midi/control_change_values.mpy new file mode 100644 index 0000000..a65081c Binary files /dev/null and b/lib/adafruit_midi/control_change_values.mpy differ diff --git a/lib/adafruit_midi/midi_continue.mpy b/lib/adafruit_midi/midi_continue.mpy new file mode 100644 index 0000000..f283ae3 Binary files /dev/null and b/lib/adafruit_midi/midi_continue.mpy differ diff --git a/lib/adafruit_midi/midi_message.mpy b/lib/adafruit_midi/midi_message.mpy new file mode 100644 index 0000000..2317df8 Binary files /dev/null and b/lib/adafruit_midi/midi_message.mpy differ diff --git a/lib/adafruit_midi/mtc_quarter_frame.mpy b/lib/adafruit_midi/mtc_quarter_frame.mpy new file mode 100644 index 0000000..17504cd Binary files /dev/null and b/lib/adafruit_midi/mtc_quarter_frame.mpy differ diff --git a/lib/adafruit_midi/note_off.mpy b/lib/adafruit_midi/note_off.mpy new file mode 100644 index 0000000..1d8669c Binary files /dev/null and b/lib/adafruit_midi/note_off.mpy differ diff --git a/lib/adafruit_midi/note_on.mpy b/lib/adafruit_midi/note_on.mpy new file mode 100644 index 0000000..7d5a5ee Binary files /dev/null and b/lib/adafruit_midi/note_on.mpy differ diff --git a/lib/adafruit_midi/pitch_bend.mpy b/lib/adafruit_midi/pitch_bend.mpy new file mode 100644 index 0000000..4d651da Binary files /dev/null and b/lib/adafruit_midi/pitch_bend.mpy differ diff --git a/lib/adafruit_midi/polyphonic_key_pressure.mpy b/lib/adafruit_midi/polyphonic_key_pressure.mpy new file mode 100644 index 0000000..ca4b6fb Binary files /dev/null and b/lib/adafruit_midi/polyphonic_key_pressure.mpy differ diff --git a/lib/adafruit_midi/program_change.mpy b/lib/adafruit_midi/program_change.mpy new file mode 100644 index 0000000..b4a0c99 Binary files /dev/null and b/lib/adafruit_midi/program_change.mpy differ diff --git a/lib/adafruit_midi/start.mpy b/lib/adafruit_midi/start.mpy new file mode 100644 index 0000000..289b357 Binary files /dev/null and b/lib/adafruit_midi/start.mpy differ diff --git a/lib/adafruit_midi/stop.mpy b/lib/adafruit_midi/stop.mpy new file mode 100644 index 0000000..1c6e458 Binary files /dev/null and b/lib/adafruit_midi/stop.mpy differ diff --git a/lib/adafruit_midi/system_exclusive.mpy b/lib/adafruit_midi/system_exclusive.mpy new file mode 100644 index 0000000..049950d Binary files /dev/null and b/lib/adafruit_midi/system_exclusive.mpy differ diff --git a/lib/adafruit_midi/timing_clock.mpy b/lib/adafruit_midi/timing_clock.mpy new file mode 100644 index 0000000..3b31223 Binary files /dev/null and b/lib/adafruit_midi/timing_clock.mpy differ diff --git a/lib/adafruit_ssd1306.mpy b/lib/adafruit_ssd1306.mpy new file mode 100644 index 0000000..46e53b3 Binary files /dev/null and b/lib/adafruit_ssd1306.mpy differ diff --git a/lib/font5x8.bin b/lib/font5x8.bin new file mode 100644 index 0000000..9a0563b Binary files /dev/null and b/lib/font5x8.bin differ