Read Knobs in Python

Time to try things out! Fire up your Pi 400 and then launch a Python editor such as Thonny or Mu.

Copy the code below, paste it into your Python editor, and then run the code by pressing the "play" button.

#!/usr/bin/env python

import time
import board

import adafruit_pcf8591.pcf8591 as PCF
from adafruit_pcf8591.analog_in import AnalogIn

i2c = board.I2C()
pcf = PCF.PCF8591(i2c)

pcf_in_0 = AnalogIn(pcf, PCF.A0)
pcf_in_1 = AnalogIn(pcf, PCF.A1)
pcf_in_2 = AnalogIn(pcf, PCF.A2)
pcf_in_3 = AnalogIn(pcf, PCF.A3)


while True:
    a_val = pcf_in_0.value
    print((a_val))

    b_val = pcf_in_1.value
    print(b_val)
    
    c_val = pcf_in_2.value
    print((c_val))

    d_val = pcf_in_3.value
    print(d_val)
    

    time.sleep(0.1)

Turn the knobs and you'll see the four values changing, from 0 to 65,535.

Python Knobs OSC Code

Copy the code shown below and paste it into a new empty document in Thonny or Mu. You can save it as code.py and then run it.

This will cause the knob readings to send out OSC messages. Next, we'll create Sonic-Pi code to read the messages and play music!

# SPDX-FileCopyrightText: 2021 John Park for Adafruit Industries
# SPDX-License-Identifier: MIT

#!/usr/bin/env python

import time
import board
from adafruit_simplemath import map_range
import adafruit_pcf8591.pcf8591 as PCF
from adafruit_pcf8591.analog_in import AnalogIn
from pythonosc import udp_client


sender = udp_client.SimpleUDPClient("127.0.0.1", 4560)
sender.send_message("/trigger/prophet", [43, 110, 1, 0.7])

i2c = board.I2C()
pcf = PCF.PCF8591(i2c)

pcf_in_0 = AnalogIn(pcf, PCF.A0)
pcf_in_1 = AnalogIn(pcf, PCF.A1)
pcf_in_2 = AnalogIn(pcf, PCF.A2)
pcf_in_3 = AnalogIn(pcf, PCF.A3)

try:
    while True:
        osc_0_val = int(255 - (pcf_in_0.value / 256))  # convert values to useful ranges
        osc_1_val = int(255 - (pcf_in_1.value / 256))
        osc_2_val = int(255 - (pcf_in_2.value / 256))
        osc_3_val = int(255 - (pcf_in_3.value / 256))

        osc_note_val = int(
            map_range(osc_0_val, 0, 255, 43, 58)
        )  # map values to relevant ranges
        osc_cutoff_val = int(map_range(osc_1_val, 0, 255, 30, 110))
        osc_sustain_val = map_range(osc_2_val, 0, 255, 0.2, 2)
        osc_gain_val = map_range(osc_3_val, 0, 255, 0, 1.0)

        # print((osc_note_val, osc_cutoff_val, osc_sustain_val, osc_gain_val))  # for plotter
        sender.send_message(
            "/trigger/prophet",
            [osc_note_val, osc_cutoff_val, osc_sustain_val, osc_gain_val],
        )

        time.sleep(0.001)

except KeyboardInterrupt:
    print("done")

Sonic-Pi Script

Here's a Sonic-Pi script that will listen for the OSC values sent from the knob readings, and use those values to adjust the notes, filter cutoff, sustain, and gain.

Copy this and then paste it into a new buffer in Sonic-Pi.

live_loop :knob_patch do
  use_real_time
  a, b, c, d = sync "/osc*/trigger/prophet"
  synth :prophet, note: a, cutoff: b, sustain: c, amp: d
  sleep 0.25
  4.times do  # loop a short arpeggio
    a=a+2
    synth :prophet, note: a, cutoff: b, amp: d

    sleep 0.25

  end
end

This guide was first published on Apr 02, 2021. It was last updated on Apr 02, 2021.

This page (Use Knob Controller in Python) was last updated on Oct 15, 2021.

Text editor powered by tinymce.