Under the hood is an Arduino Uno along with a SparkFun Spectrum Shield (for audio analysis). Both of these are probably a bit overkill given the way I'm implementing things. But, I'm more comfortable with software than hardware and I had an Arduino sitting idle on my desk.
The Arduino handles the logic for reading the values from the rotary encoder and analyzing the audio data for beat detection (TODO 😄). There are two libraries that I leaned on for this.
Third party libraries
- MSGEQ7 which makes it much easier to pull audio data from the MSGEQ7 chips which are part of the Spectrum Shield.
- Adafruit LED Backpack which handles all of the magic to display BPM value on the segment display.
- Protothreads library A library for manaing protothreads for Arduino.
The hardware for this is pretty simple to put together. However, I can nearly guarantee that the way I've done it is not the most efficient way. For example, the Spectrum Shield is a bit overkill and I could have use a singular MSGEQ7 IC. Equally, the Arduino itself is probably unnecessary for an actual electrical engineer. If you have suggestions, make a pull request 🙏. Within the hardware folder you'll find Fritzing schematic files (or consult the JPEG below).
Line-in (source) | Line-in | BPM | Sync | Mix |
---|---|---|---|---|
Input: This audio analyzed by the MSGEQ7 chips, passed through to the sync output, and merged with line-in input. | Input: is passed through and merged with source input. | Knob: Set BPM for sync output. Push to toggle whether sync output is active. | Output: A 5V PP signal for syncing analog devices to the given BPM. | Output: Merged audio (mono) signal of source and line-in inputs. |
Volume: Adjust the volume of the source input. | Volume: Adjust the volume of the line-in input. | Volume: Adjust the volume of the mix output. |
Schematic How to solder everything together.
Parts list The components for this project can be obtained through a few sources Arduino, Adafruit, Sparkfun, and DigiKey.
Qty | Part | Ref No. |
---|---|---|
1 | Arduino Uno | |
1 | Spectrum Shield | DEV-13116 |
1 | Enclosure 119.5mm x 94mm x 42mm | 1590BBSBK |
1 | Rotary Encoder switch and LED | PEL12D-4225S-S2024 |
1 | Transparent knob | COM-10597 |
3 | 10k Logarithmic Potentiometer | PDB181-K420K-103A2 |
3 | Volume knob | 1568-1606 |
3 | 1/4" (6.35mm) Stereo input jack | SC1317 |
1 | 4-Digit 7-Segment Display w/I2C Backpack | 1002 |
1 | 9V Connector | 36-232 |
1 | 50V 1A Diode (1N4001) | 641-1310-1 |
Enclosure
Of course you can use any enclosure you want, but I opted for a diecast aluminium (black) case. It's compact (119.5mm x 94mm x 42mm), but still has plenty of room for the Arduino and a 9-volt battery. I've created a base that sits inside the enclosure to keep the internal components in place. For mounting the 7 Segment display I've created a cowling to mask the terribly cut square hole.
Without Google I wouldn't have stumbled across the following sites, which were helpful in a number of ways.
- Electronoize Playshop: Dividers, Volume Controls, Mixers, Filters, Switches...
- Timer, Counter und Interrupts | heise Developer
- bildr » Rotary Encoder + Arduino
- How to "Multithread" an Arduino (Protothreading Tutorial)
- protothread, a powerfull library[sic]