Difference between revisions of "250a Homemade Digital Musical Instrument"

From CCRMA Wiki
Jump to: navigation, search
(Learning More)
 
(30 intermediate revisions by the same user not shown)
Line 1: Line 1:
<font size=5>Homemade Digital Musical Instrument</font><br>
 
 
Demo at the 159th Meeting of the Acoustical Society of America
 
Demo at the 159th Meeting of the Acoustical Society of America
 
For the Session Homemade Musical Instruments for Teaching Acoustics
 
For the Session Homemade Musical Instruments for Teaching Acoustics
 +
 +
by [http://ccrma.stanford.edu/~eberdahl Edgar Berdahl] and [http://www-cdr.stanford.edu/~wendyju/ Wendy Ju]
 +
 +
'''This page can be reached on the WWW at [http://ccrma.stanford.edu/wiki/250a_Homemade_Digital_Musical_Instrument http://ccrma.stanford.edu/wiki/250a_Homemade_Digital_Musical_Instrument]'''
 +
 +
== Setup ==
 +
Very broadly, a PID setup allows computers to react progammatically to events in the physical world.  Actions, events and states are detected by sensor circuits, which convey signals to an embedded microcontroller, which in turn addresses a computer program. The computer program can then respond by producing sound and graphics, or it can pass commands back to an embedded processor, which can effect action, sound, or display through the use of electronics.
 +
 +
[[Image: diagram1.png]]
 +
 +
For this tutorial, we will be using breadboards and [http://www.arduino.cc/en/Main/ArduinoBoardNano Arduino Nanos] running [http://firmata.org/wiki/Main_Page Firmata], as platforms for the sensor circuit and embedded microcontroller, respectively. On your computer, you will be using MAX/MSP or PD, graphical programming environments that use a patch-programming model and enable sound synthesis.
 +
 +
[[Image: diagram3.png]]
 +
  
  
Line 13: Line 26:
  
 
[[Image:Lab2-2.jpg]]
 
[[Image:Lab2-2.jpg]]
 +
 +
  
 
== Install Firmata onto your Arduino Nano ==
 
== Install Firmata onto your Arduino Nano ==
Line 24: Line 39:
 
* Upload the Firmata firmware to your Arduino Nano using upload button, the fourth square button from the left (the one with the sideways arrow).
 
* Upload the Firmata firmware to your Arduino Nano using upload button, the fourth square button from the left (the one with the sideways arrow).
 
* Close the Arduino program. (This is important because it frees up the USB serial port so that Max/MSP or PD can talk to the Arduino board next.)
 
* Close the Arduino program. (This is important because it frees up the USB serial port so that Max/MSP or PD can talk to the Arduino board next.)
 +
 +
  
 
== Install Pure Data Onto Your Computer ==
 
== Install Pure Data Onto Your Computer ==
  
Install [http://puredata.info/downloads Pure Data Extended] onto your computer.
+
Install [http://puredata.info/downloads Pure Data Extended] (Pd) onto your computer.
 
* Do NOT install the vanilla version of Pd!
 
* Do NOT install the vanilla version of Pd!
 +
* Mess around with Pd a little bit to get a feel for it.  Go through some of the tutorials in the Help|Brower menu.
 
* In order to use the bowed string instrument synthesizer called Bowed~, you will need to install [https://ccrma.stanford.edu/wiki/Stk2pd Stk2pd], which ports the Synthesis Toolkit to Pd.
 
* In order to use the bowed string instrument synthesizer called Bowed~, you will need to install [https://ccrma.stanford.edu/wiki/Stk2pd Stk2pd], which ports the Synthesis Toolkit to Pd.
 +
* Search your hard disk for the file ''Bowed~-help.pd'' and open it.  Experiment with what it is like to employ a physical model to synthesize sound.
  
== Buttons, Switches and LEDs ==
 
  
* Build the circuit that is detailed in the following figures. Use components and jumpers to construct your circuits on the solderless bread-board.
 
  
[[Image:Breadboard.png]]
+
== Wire Up Some Switches To Your Board  ==
  
* Here's how to wire a simple 2-resistor circuit on the solderless bread-board (for example R1 = 10K, R2 = 10K):
+
Here is the schematic for each switch.  Closing the switch pulls the input to the Arduino to 0V; otherwise, if the switch is open, the voltage is about 5V.
  
[[Image:Jumper.png]]
+
[[Image: switch.png]]
 
+
What will A0 read?
+
 
+
(How do you know what resistor you have? Use the [http://www.dannyg.com/examples/res2/resistor.htm resistor calculator]!)
+
 
+
 
+
=== Build the Button and LED Circuit ===
+
We'll start our tutorial with three simple light circuits.
+
 
+
* In the first one, the LED is permanently on.
+
* In the second, the LED only lights up when a button is pressed and a circuit is completed.
+
* In the third example, we'll replace the manual switch with an Arduino pin (set to output mode), so we can control the LED from our program.
+
 
+
[[Image:3Buttons.gif]]
+
 
+
==== Power a LED (always on) ====
+
 
+
[[Image:Lab2-3.jpg]]
+
 
+
Build the following circuit on your breadboard. Use a 220Ohm resistor (red red brown gold).
+
 
+
Because the LED is a diode, it has a set voltage drop across the leads; exceeding this causes heat to build up and the LED to fail prematurely. So! It is always important to have a resistor in series with the LED.
+
 
+
Also, another consequence of the LED being a diode is that it has directionality. The longer lead, the anode, should be connected towards power; the shorter, cathode, should be connected towards ground. (In the photo, the longer lead has a bent "knee.")
+
 
+
==== Make a light switch ====
+
 
+
Next, we'll insert a switch into the circuit. The momentary switches in your kit are "normal open", meaning that the circuit is interrupted in the idle state, when the switch is not pressed. Pressing the switch closes the circuit until you let go again.
+
 
+
[[Image:Lab2-4.jpg]]
+
 
+
Use a multimeter to see what happens to the voltage on either side of the LED when you press the switch.
+
 
+
==== Toggling LED with PD or Max ====
+
 
+
[[Image:Lab2-5.jpg]]
+
 
+
In the third example, we'll replace the manual switch with an Arduino pin (set to output mode), so we can control the LED from our program. The safe way to do this is to let the Arduino pin sink current - if we toggle the pin low, it acts as ground and current flows through the resistor and the LED as it did in the previous examples. When we take the pin high, to 5V, there is no potential difference and no current flows - the LED stays off.
+
 
+
* In the ArduinoLab patch, press the "toggling LED with software" button in the upper right to preset the outputs properly. The patch expects you to connect the LED to digital pin 2 (D2).
+
 
+
 
+
Optional: Try changing your patch so the light stays on when you press the mouse button, and stays off when you press it again. After that, change your patch so the light blinks on/off. Then, have your patch button switch the light between on and blinking.
+
 
+
=== Sensing buttons in software  ===
+
 
+
We've used code to trigger output - what about the other direction, sensing physical input in code? Just as easy. Here is a simple switch circuit:
+
 
+
[[Image: switch.png]] [[Image: Lab2-6.jpg]]
+
 
   
 
   
When the switch is open, the Arduino pin (set to input mode) is pulled to 5V - in software, we'll read Arduino.HIGH. When the switch is closed, the voltage at the Arduino pin falls to 0V - in software, we'll read Arduino.LOW. The pull-up resistor is used to limit the current going through the circuit. In software, we can check the value of the pin and switch between graphics accordingly.
+
Take each of the switches that you see here,
  
* In the ArduinoLab patch, press the "sensing buttons in software" button to preset the outputs properly. The patch expects you to connect the switch to digital pin 4 (D4).
+
[[Image: Switchuncut.jpg]]
  
=== Fading LEDs (optional) ===
+
and cut off the extra lead as shown to make it easier to mount into the protoboard.
  
What about those "breathing" LEDs on Mac Powerbooks? The fading from bright to dim and back is done using pulse-width modulation (PWM). In essence, the LED is toggled on and off rapidly, say 1000 times a second, faster than your eye can follow. The percentage of time the LED is on (the duty) controls the perceived brightness. To control an LED using PWM, you'll have to connect it to one of the pins that support PWM output - 9, 10 or 11 on the Arduino. Then write a patch that cycles the PWM values.
+
[[Image: Switchcut.jpg]]
  
* In the ArduinoLab patch, press the "Fading LEDs" button to preset the outputs properly. The patch expects you to connect the LED to digital pins 9-11 (D9-11).
 
* In your Arduino Kit, you have a RGB LED which has four leads (it's white when not lit); it's basically like 3 LEDs sharing the same ground. Use PWM and this [[http://blog.ncode.ca/?p=38 pin out information]] to make the LED cycle through a rainbow of colors.
 
  
[[Image: Lab2-7.jpg]]
 
  
== Using Analog Sensors ==
+
Wire up the first switch as shown below with the middle pin placed in row 42 and the end pin in row 41:
  
Now we will work with the continuous input values provided by analog sensors - potentiometers, accelerometers, distance rangers, etc.
+
[[Image: Oneswitch.jpg]]
  
=== Make a Light Dimmer ===
+
Connect a 220 Ohm (red-red-brown) resistor between row 42 and the supply voltage 5V (the red rail).  Also connect row 42 to row 58, which connects to pin A2 of the Arduino.  Finally connect row 41 to ground (0V).
  
In this example we'll build a light dimmer: a knob connected to a light so that when you turn the knob, the light increases or decreases in brightness. We'll use a potentiometer. The potentiometer has three terminals - the resistance between the first and the third terminal is constant (10k Ohms in our case). The resistance between terminals 1 and 2 (and between 2 and 3) varies as you turn the shaft of the potentiometer. If you apply 5V to terminal 1, connect terminal 3 to Ground, you will get a continuously varying voltage at terminal 2 as you turn the shaft (Why that is the case will become clearer once you've learned about voltage dividers further below).
 
  
* Connect the middle pin of the potentiometer to analog input 0, the other two to +5V and ground.
+
Connect up the other switches in the same fashion to the analog input pins A3, A4, and A5 of the Arduino:
* Through a 220Ohm resistor, connect an LED to pin 9(anode or long side to resistor, cathode to pin 9) 
+
*  In the ArduinoLab patch, press the "Light Dimmer" button to preset the outputs properly. The patch expects you to connect the LED to digital pin 9 (D9) and the potentiometer to analog pin 0 (A0). Use the PWM controls under output controls in the ArduinoLab patch to control the lightness and dimness of the LED.
+
  
 +
[[Image: Fourswitches.jpg]]
  
 +
Open up the file ''arduino-test.pd'' in Pd to check that the switches work.  You will have to go into the subpatch
 +
'''pd old analog/digital controls''' in order to enable ananlog inputs A2-A5.  (We could have used digital inputs instead since we only care if the switches are on or off, but the wiring was more convenient this way.)
  
  
  
[[Image: Lab2-8.jpg]]
+
== Wire Up The Force-Sensing Resistive Strip ==
 
+
* Optional: hook up two LEDs, one red one green. as you turn in one direction, red gets brighter; in the other, green gets brighter. In the middle, both are off.
+
 
+
=== Drawing a graph of analog input ===
+
Let's understand better what the values are that we are reading from the analog input. To do so, we will use a slider graph to show how the analog values are changing in time.
+
 
+
Leave the potentiometer part of your circuit, you may take off the LED part if you want to. Use A0 or A1 to graph the analog input in the ArduinoLab patch.
+
 
+
 
+
=== Thresholding with a Range Sensor (optional) ===
+
 
+
Thresholding is the process of turning continuous data into a discrete yes/no decision.
+
 
+
To learn about thresholding, we'll connect the IR range sensor. The circuit is trivial: just connect red to 5V, black to ground, and yellow to analog input A0.
+
 
+
Take a look at the data the sensor returns with sensor_graph_02 - when the field of view of the sensor is clear (no obstacle - point it at the ceiling), it returns a low voltage. Move your hand high over the sensor, then start lowering it - you should see the output voltage rise, until you are about 4" away. The sensor has a range of operation of 4"-30".
+
   
+
Let's do something useful with that data. Imagine a smart cookie jar that reminds you not to snack in between meals. We could put an IR ranger into the lid. Whenever a hand comes too close, our program could play a warning sound or flash a warning light. Write a patch to manage this!
+
 
+
=== Tilt control with an Accelerometer ===
+
In this example, we'll simulate the motion of a ball on a tilting plane in software and control the tilt through a sensor. Think of it as a first step to build your own electronic game of Labyrinth. The right sensor to use is an accelerometer. Accelerometers can report on both static and dynamic acceleration -- think of static acceleration as the angle the accelerometer is held with respect to the ground (the acceleration measured here is due to gravity). Dynamic acceleration occurs when you shake the sensor.
+
  
[[Image:Lab2-9.jpg]]
+
For more info on more common force-sensing resistors and other sensors, see [https://ccrma.stanford.edu/wiki/Sensors#Force_Sensing_Resistors this page].  Here we have the circuit for [http://www.sparkfun.com/commerce/product_info.php?products_id=8679 SoftPot] force sensing resistive strip and we show how it corresponds to the package.  It has three terminals like a normal potentiometer, but there is an additional (variable) resistor connected to the center terminal.
  
The accelerometer in your kit is a 3-axis, +-2g sensor (1g is the acceleration due to gravity). It comes with 0.1" header pins that fit into the breadboard. The connections you need to make are VCC to the 3V3 pin on the Arduino (it will be in row 62), GND to ground, and X, Y, and Z to the first three analog input pins on the Arduino board. You can ignore the ST (self test) pin.
+
[[Image: Softpot.jpg]]
  
[[Image:accel_on_board.jpg]]
 
  
Push the accelerometer into the breadboard and make the connections as shown:
+
We connect it up to the Arduino using a special circuit so that it can be employed for both measuring position and pressure.  When the Arduino's digital pin D5 is set to output HIGH, corresponding to about 5V, and when D6 is set to input, so it presents a high impedance, the circuit measures position like a normal potentiometer circuit.  On the other hand, if D6 is set to output HIGH, corresponding to about 5V, and D5 is set to LOW (0V), then the circuit approximately measures pressure.
  
Now, get a feel for the data the accelerometer provides. Use the Light Dimmer presets, which will track analog values on A0 and A1. Then pick up the Arduino+accelerometer board and tilt it in various directions. Start by holding it so that the accelerometer board is parallel to the ground. Find in which direction the X reading increases and decreases; do the same for the Y reading.  Are the labels on the accelerometer board correct?
+
[[Image: Softpotcircuit.jpg]]
  
=== Voltage Dividers ===
+
The final circuit is shown below.  A white wire connects the Softpot's center terminal to the Arduino's analog input A0 pin at row 60.  This row is also connected to the ground (0V) rail by way of a 100kOhm (yellow-black-brown) resistor, and it connects to D6 by way of row 57 on the opposite side of the Arduino board with a 1kOhm (brown-red-black) resistor.  The Arduino's D5 pin at row 56 connects to the leftmost terminal of the Softpot via a black wire running underneath the board (not shown).  Finally, the rightmost terminal of the Softpot connects to the ground (0V) rail by way of a short blue wire.
  
In your kit, the potentiometer, IR distance ranger, and accelerometer are especially easy to work with since they directly output a changing voltage that can be read by one of Arduino's analog input pins.
+
[[Image: Finalcircuit.jpg]]
  
  
Other sensors don't give you a varying output voltage per se, but instead change their resistance. Examples in your kit are the force sensitive resistor (FSR) and the bend or flex sensor. It is easy to get a changing voltage based on a changing resistance through a voltage divider circuit(Wikipedia page). The idea is that you put two resistors in series between power and ground: one that changes resistance (your sensor), and one of a known, fixed resistance. At the point in between the two resistors, you can measure how much the voltage has dropped through the first resistor. This value changes as the ratio of resistances between variable and fixed resistors change. More formally:
+
== Run The Program  ==
 +
Download [http://ccrma.stanford.edu/courses/250a/labs/extra/violin-demo.zip violin-demo.zip] and extract its contents. '''*violin-demo.pd''' is the main patch.  Open it in Pd.  You will find that it is a version of '''Arduino-test.pd''' that has been adapted to control the '''Bowed~''' STK object.  A compiled version of Bowed~ is included for Mac only in case you had any problems installing Stk2Pd.  If the Pd patch does not choose the correct port to communicate with the Arduino, choose different serial port #'s until the Pd window says that it is connected to a tty usbserial device.
  
[[Image:res_divider.png]]
+
To help make it more clear what is happening, open the '''handle-switching''' subpatch.  Every 50ms it switches back and forth between the two sensing modes described above for the Softpot.  The sensed position is shown with the horizontal slider, and the sensed position is shown with the vertical slider.  These raw inputs are passed out of this subpatch into another subpatch called '''pd synth-sound'''.
  
* potentiometer:
+
[[Image: Handleswitching.jpg]]
  
[[Image:Pot.png]]
+
Enjoy playing the instrument!  If you don't like the note mappings, change the contents of '''pd handle-buttons''', or go on to create your very own homemade, digital musical instrument!
  
* force-sensitive resistor (FSR):
 
  
[[Image:FSR.png]]
+
== How To Play It  ==
  
Try both circuits.   Test the resistance range of your sensor. If you want 2.5 volts to be the middle, make the comparison resistor (33k in the diagram) the "average" value of the FSR's resistance. Test this with a multimeter.
+
[[Image: Lefthand.jpg]] [[Image: Righthand.jpg]] [[Image: Bothhands.jpg]]
  
* Bend Sensor
+
I don't know why I was in the holiday spirit, but anyway here are two sound examples:
[[Image:Bend_sensor.png]]
+
  
 +
[http://ccrma.stanford.edu/courses/250a/labs/extra/violin1.wav violin1.wav]
  
 +
[http://ccrma.stanford.edu/courses/250a/labs/extra/violin2.wav violin2.wav]
  
== Putting it all Together ==
 
  
* Create a patch to make sounds based on button and sensor values from the Arduino. You can try to adapt your patches from Lab 1, or come up with a new patch.  
+
== Learning More ==
 +
Come take our [https://ccrma.stanford.edu/workshops/new-music-controllers-nmc New Music Controllers] workshop!  For information about where to find additional parts, please see our [http://ccrma.stanford.edu/wiki/MaxLab#Supplies parts list].
  
* Try to make a simple musical interaction. Think about music -
 
** does it have dynamics?
 
** can you turn the sound off?
 
** can it be expressive?
 
  
<center>[[250a 2009]]</center>
+
<center>[[250a 2010]]</center>
 
[[Category:250a]][[Category:PID]]
 
[[Category:250a]][[Category:PID]]

Latest revision as of 20:09, 16 April 2010

Demo at the 159th Meeting of the Acoustical Society of America For the Session Homemade Musical Instruments for Teaching Acoustics

by Edgar Berdahl and Wendy Ju

This page can be reached on the WWW at http://ccrma.stanford.edu/wiki/250a_Homemade_Digital_Musical_Instrument

Setup

Very broadly, a PID setup allows computers to react progammatically to events in the physical world. Actions, events and states are detected by sensor circuits, which convey signals to an embedded microcontroller, which in turn addresses a computer program. The computer program can then respond by producing sound and graphics, or it can pass commands back to an embedded processor, which can effect action, sound, or display through the use of electronics.

Diagram1.png

For this tutorial, we will be using breadboards and Arduino Nanos running Firmata, as platforms for the sensor circuit and embedded microcontroller, respectively. On your computer, you will be using MAX/MSP or PD, graphical programming environments that use a patch-programming model and enable sound synthesis.

Diagram3.png


Mount your Arduino Nano on your breadboard

We will be powering the Nano and the breadboard with current from the USB port, which is good for up to 500mA of 5 V±5%-- probably enough for most input circuits, although not enough if you plan to run a lot of LEDs or motors.

  • The Nano should sit at the bottom of the breadboard, so that the pins lie in rows 49-64 on either side.
  • Using jumper wires, connect the row 52 pin (GND) on the left side of the Nano to the blue ground (GND) rail.
  • Connect the row 52 pin (+5V) on the right side of the Nano to the red Power rail.
  • Use jumper wires to connect the power and GND rails on the left side of the breadboard to the right.

Lab2-2.jpg


Install Firmata onto your Arduino Nano

  • Install the Arduino software
    • Unarchive the file, and move it to your applications folder.
    • Install the FTDI driver that comes with the Arduino software so that your computer will recognize the Arduino when it is plugged into the USB port.
  • Open the Arduino software.
  • Download the newest version of Pduino, unarchive it, and use the Arduino software program to open StandardFirmata.pde, which lies inside the folder Firmata-2.1:Firmata:examples:StandardFirmata.
  • Connect your Arduino Nano to your computer using a USB cable.
  • Use Tools->Board and Tools->Serial Port to select the Arduino Nano (Atmega 328) and USBserial tty port, then hit the Play button to verify and compile the program.
  • Upload the Firmata firmware to your Arduino Nano using upload button, the fourth square button from the left (the one with the sideways arrow).
  • Close the Arduino program. (This is important because it frees up the USB serial port so that Max/MSP or PD can talk to the Arduino board next.)


Install Pure Data Onto Your Computer

Install Pure Data Extended (Pd) onto your computer.

  • Do NOT install the vanilla version of Pd!
  • Mess around with Pd a little bit to get a feel for it. Go through some of the tutorials in the Help|Brower menu.
  • In order to use the bowed string instrument synthesizer called Bowed~, you will need to install Stk2pd, which ports the Synthesis Toolkit to Pd.
  • Search your hard disk for the file Bowed~-help.pd and open it. Experiment with what it is like to employ a physical model to synthesize sound.


Wire Up Some Switches To Your Board

Here is the schematic for each switch. Closing the switch pulls the input to the Arduino to 0V; otherwise, if the switch is open, the voltage is about 5V.

Switch.png

Take each of the switches that you see here,

Switchuncut.jpg

and cut off the extra lead as shown to make it easier to mount into the protoboard.

Switchcut.jpg


Wire up the first switch as shown below with the middle pin placed in row 42 and the end pin in row 41:

Oneswitch.jpg

Connect a 220 Ohm (red-red-brown) resistor between row 42 and the supply voltage 5V (the red rail). Also connect row 42 to row 58, which connects to pin A2 of the Arduino. Finally connect row 41 to ground (0V).


Connect up the other switches in the same fashion to the analog input pins A3, A4, and A5 of the Arduino:

Fourswitches.jpg

Open up the file arduino-test.pd in Pd to check that the switches work. You will have to go into the subpatch pd old analog/digital controls in order to enable ananlog inputs A2-A5. (We could have used digital inputs instead since we only care if the switches are on or off, but the wiring was more convenient this way.)


Wire Up The Force-Sensing Resistive Strip

For more info on more common force-sensing resistors and other sensors, see this page. Here we have the circuit for SoftPot force sensing resistive strip and we show how it corresponds to the package. It has three terminals like a normal potentiometer, but there is an additional (variable) resistor connected to the center terminal.

Softpot.jpg


We connect it up to the Arduino using a special circuit so that it can be employed for both measuring position and pressure. When the Arduino's digital pin D5 is set to output HIGH, corresponding to about 5V, and when D6 is set to input, so it presents a high impedance, the circuit measures position like a normal potentiometer circuit. On the other hand, if D6 is set to output HIGH, corresponding to about 5V, and D5 is set to LOW (0V), then the circuit approximately measures pressure.

Softpotcircuit.jpg

The final circuit is shown below. A white wire connects the Softpot's center terminal to the Arduino's analog input A0 pin at row 60. This row is also connected to the ground (0V) rail by way of a 100kOhm (yellow-black-brown) resistor, and it connects to D6 by way of row 57 on the opposite side of the Arduino board with a 1kOhm (brown-red-black) resistor. The Arduino's D5 pin at row 56 connects to the leftmost terminal of the Softpot via a black wire running underneath the board (not shown). Finally, the rightmost terminal of the Softpot connects to the ground (0V) rail by way of a short blue wire.

Finalcircuit.jpg


Run The Program

Download violin-demo.zip and extract its contents. *violin-demo.pd is the main patch. Open it in Pd. You will find that it is a version of Arduino-test.pd that has been adapted to control the Bowed~ STK object. A compiled version of Bowed~ is included for Mac only in case you had any problems installing Stk2Pd. If the Pd patch does not choose the correct port to communicate with the Arduino, choose different serial port #'s until the Pd window says that it is connected to a tty usbserial device.

To help make it more clear what is happening, open the handle-switching subpatch. Every 50ms it switches back and forth between the two sensing modes described above for the Softpot. The sensed position is shown with the horizontal slider, and the sensed position is shown with the vertical slider. These raw inputs are passed out of this subpatch into another subpatch called pd synth-sound.

Handleswitching.jpg

Enjoy playing the instrument! If you don't like the note mappings, change the contents of pd handle-buttons, or go on to create your very own homemade, digital musical instrument!


How To Play It

Lefthand.jpg Righthand.jpg Bothhands.jpg

I don't know why I was in the holiday spirit, but anyway here are two sound examples:

violin1.wav

violin2.wav


Learning More

Come take our New Music Controllers workshop! For information about where to find additional parts, please see our parts list.


250a 2010