ItsyBitsy M0 Synth | Sigma-6 Voice Module
Digital Sound Synthesizer based on SAMD21 Microcontroller

A DIY project by M.J. Bauer

sigma6 eurorack

Eurorack module (3U x 10HP) front and back views  (Photos courtesy of Jean-Pierre Meyer)

This project is a simple-to-build, low-cost digital mono-synth which I call the "ItsyBitsy M0 Sigma-6". The design is based on Adafruit's SAMD21 "ItsyBitsy M0 Express" micro-controller board. You can substitute a dirt-cheap compatible MCU board (RobotDyn 'SAMD21 M0-Mini' - available on AliExpress).

Don't be fooled by the simplicity of the hardware... the firmware implements a complex sound synthesizer comprising 6 oscillators, mixer, 3 envelope shapers, LFO with ramp, variable-gain attenuator (DCA), plus overdrive and reverberation effects. The firmware includes a diverse range of instrument sounds (presets). With two or more "Sigma-6" modules, you can play multi-part music using a MIDI sequencer.

Sound quality is excellent using a 12-bit DAC, 32kHz sample rate and 32-bit precision DSP computations. The tone-generator algorithm is immune to aliasing effects (except when overdrive is enabled). 

You can build a minimal version comprising little more than the SAMD21 MCU board and a MIDI input circuit, or a more elaborate version with a small control panel (OLED display, 2 buttons and a knob). 

The 'full-featured' build is a 3U rack-mount module with CV and GATE inputs to realize a pseudo-analogue "voice module". Several sigma-6 modules could be connected to a "master controller" board to make a respectable polyphonic synthesizer. (More about that later.)

The synth software is compiled using the Arduino IDE, so if you have C programming skills, you can easily modify and extend the (open-source) program to suit your own requirements.

Details of the 'Sigma 6' synthesizer concept, design and operation can be found in this PDF document... 

Sigma-6 Synth Design Notes

...

Examples of Sigma-6 Synth build options:
___



Properties
Option 1:
Minimal build
(board only)
Option 2:
Stand-alone box
(control panel)
Option 3:
Eurorack module
(CV inputs)
MIDI INYesYesYes
Control Panel
(OLED display,  etc)
NoYesYes
Analog (CV) inputsNoNoYes
ApplicationsExperimentation,
Polyphonic synth
Single or multi-
module system
Modular synth -
analog / hybrid

Note:  Polyphonic systems will require a "Master Controller" to decode MIDI messages from a polyphonic keyboard (or sequencer) and assign notes to respective Sigma-6 "voice modules". The Master Controller needs only a "low-end" 8-bit MCU, e.g. Arduino Nano, Pro Micro, etc.  (Details TBA.)
___


Sample Sound Clips

Play Sound Clip

'Promenade' (by JPM) - Produced using a MIDI sequencer app driving six Sigma-6 modules,
this clip demonstrates a few of the many different instrument sounds (presets) available.

'4Random' (by Jean-Pierre Meyer)

'Song 1'  (by JPM) - Sequence produced in 'CV Mode'

... more to follow shortly! ...

___


test rig

Development & test platform (right) coupled with DIY MIDI Tester/controller (left)

Hardware Design

Below is a schematic of the minimum practical build. The control panel (comprising OLED display, 2 buttons and 'data entry' pot) is optional, depending on your intended usage. 

SCHEM P1 V2

Hardware variants requiring analog (CV) inputs will need additional circuitry, as shown in part 2 of the schematic below. The PCB will have provision for the extra parts, of course.

chem p2

SAMD21 ADC inputs are 3.3V full-scale. The external CV inputs are scaled to accept a 0 to +5V signal range. The op-amp buffers ensure that the voltage at the ADC inputs cannot exceed +3.5V, or go negative. The LM2904 and LM358 have a common-mode input range 0 to +3.5V provided Vcc = +5V.  The op-amps also allow a high input resistance (50k ohm) at the external CV inputs and a low source resistance feeding into the ADC inputs, as required.

The GATE input is fed into a 555 timer IC which is not wired as a timer, but as a Schmitt Trigger to ensure glitch-free transitions. With Vcc = 5.0V, the upper input threshold (VH) is about 2.5V; the lower threshold (VL) about 1.25V, which is 5V logic compatible. The 555 "discharge" output is open-collector which makes a simple 5V to 3.3V level translator using a pull-up resistor.

A low-capacity I2C EEPROM (24LC08B) may be fitted for storage of persistent data, independent of the SAMD21 MCU which loses its marbles every time a firmware update is done. The EEPROM is optional -- User preferences, configuration parameters, CV1 calibration constant, etc, can be hard-coded into the firmware -
(see function "DefaultConfigData" in source file "ItsyBitsy_M0_synth.ino").

MIDI Input and MIDI Bus Scheme

There is a choice of MIDI IN circuit configurations. The opto-coupler (V1) is optional, but recommended for applications where only one Sigma-6 synth module will be connected to a MIDI controller. The MIDI IN circuit was designed with a view to connect multiple modules to a common MIDI bus. For these applications, the opto-coupler (V1) may be omitted. The common bus connection is pin2 of header P5 (and GND of course). Pull-up resistor R1 should be 1k ohm (marked 470 on PCB rev1).

The MIDI bus scheme requires a simple "MIDI distribution board" having a standard opto-isolated MIDI IN receiver circuit with an open-collector output, as shown in this schematic...

MIDI bu scheme

Note:  It is easily doable to modify one of your Sigma-6 modules to serve as the 'MIDI bus distribution' board. This module must have the 6N138 opto fitted. Diode D1 is omitted and pin6 of the 6N138 is wired to pin2 of the MIDI IN header (P5). The other modules in the system do not need the 6N138 opto fitted.

Low-cost SAMD21 MCU substitute

A cheap ATSAMD21 breakout board may be used instead of the Adafruit 'M0 Express' board. These are available on AliExpress using the name "SAMD21 M0-Mini", designed by 'RobotDyn'. Although the RobotDyn board is not physically compatible with the Adafruit 'IstyBitsy M0', all of the required I/O pins (and more) are accessible. This picture shows the signal pin assignments for the "SAMD21 M0-mini" board...

M0 mini pinout 


How to obtain a circuit board (bare PCB)

Project collaborator Jean-Pierre Meyer (in France) has designed circuit boards and other hardware to facilitate construction and interconnection of synth modules. There are PCB designs for six hardware variants, depending on your choice of MCU board and CV jack type, as in this table:


MCU board
Short PCB -
No CV Jacks
CV Jacks
P/N:  PJ301M
CV Jacks
P/N:  PJ301MB
Adafruit ItsyBitsy M0 ExpressPCB type 1APCB type 2APCB type 3A
RobotDyn SAMD21 M0 MiniPCB type 1RPCB type 2RPCB type 3R

Jack type PJ301M needs a wire link soldered from sleeve lug to GND pad on PCB. Jack type PJ301MB (or compatible type PJ301F) is better suited for PCB mount, but may be harder to obtain. If in doubt, opt for a PCB designed for jack type PJ301M (2A or 2R). This will accept most jack types.

This picture shows the board layout (type 2A) and front-panel decal for the eurorack module.

PCB comp sidePCB panel sidepanel decal

Gerber files to fabricate PCB type 2A (suits most TS jack types) are ready to download here
Gerber files to fabricate PCB type 2B (suits RobotDyn 'M0 mini' MCU) are ready to download here
Gerbers for the other PCB options are available on request. Send me an email inquiry indicating which PCB type you are interested in (specify 1A, 3A, 1R, 3R).

NB: It is not cost-effective to post boards overseas. It will cost you less to get your own boards fabricated in China (including postage). Surplus boards may be offered for sale in your country... Send email inquiry.

View/Download Parts List here

___
Construction notes:

Be sure to use a polarized pin header and plug for the 5V DC supply (P1). I recommend not to power the module from the MCU USB port, except for firmware updates, because USB "micro-B" sockets are not very robust. For stand-alone Sigma-6 modules, i.e. not in a rack, I recommend to use a USB "mini-B" socket wired to P1 on the PCB for 5V power input. USB "mini-B" breakout boards are available on AliExpress.

USB mini-B

Beware... there are variants of the 1.3 inch OLED display available. To match the PCB footprint (P3), choose a display type with 4 pins in the order: 1=VDD, 2=GND, 3=SCL, 4=SDA.

Pullup resistors R6, R7 (2k2, on SDA and SCL) are required for the I2C OLED display and EEPROM.

If your PCB uses the Adafruit 'ItsyBitsy M0 Express' MCU, be sure to fit the extra 2 I/O pins needed on the MCU board (digital '3' and '4' on the short edge) and fit a corresponding 2-way socket strip on the PCB.

If your PCB uses the RobotDyn 'SAMD21 M0-Mini' MCU, be sure to fit the extra 2 I/O pins required (MOSI and SCK), i.e. two centre pins (3 & 4) in the 6-pin 'ICSP' connector on the MCU board, and fit a corresponding 2-way socket strip on the PCB. (The other 4 pins in the ICSP connector are not needed.)

There is no provision for R18 & R19 on early revisions of the PCB. If you intend to use CV control mode, ensure that a 10k and 47k resistor are wired as shown on the schematic. The PCB track from the GATE input jack to U4 (NE555) pins 2 & 6 can be cut right where it joins onto the jack pad.
...

Front Panel Decal

Panel artwork can be created using Windows Paint, Paint-Shop-Pro, or another image editor. My usual method is to print the decal image on paper, cover it with transparent adhesive film (e.g. bookbinding film), cut holes for knobs, buttons, sockets, etc, then glue it onto the front panel.

Sample decal designs are included in the attached Zip folder... download here. The decals in the PDF file will print actual size on A4 size paper. A blank template is also included for you to design your own panel artwork, in case you don't like the style or colour schemes of the samples. The template image resolution is 300dpi. This should print actual size if you specify 300dpi in your printer setup.

Gerber files are available to make Eurorack front panels fabricated as a PCB. The photo at the top of the page shows the rack panel design. Send me an email inquiry if you want a copy of the Gerber pack.
.A 


Control Panel - User Interface

The control panel allows selection of presets, of course, and setting of configuration parameters, plus adjustment of some patch parameters. The selected preset determines the basic sound characterstics.

It is not feasible to allow all (42) patch parameters to be adjustable with such a simple user-interface... two buttons and a knob! However, the ability to adjust parameters for the amplitude envelope, LFO frequency, vibrato depth, etc, from the front panel, provides essential variability of instrument characteristics.

UI screens

User Guide

You don't need one... the control panel is very intuitive to use!

(But send me an email inquiry if you find anything in the UI utterly incomprehensible!)

Default Configuration

Default values for configuration parameters are assigned if the EEPROM contents are erased or corrupted, or if there is no EEPROM fitted.  In any case, you can customize the firmware to suit your own preferences. Edit the code in function "DefaultConfigData" in source file "ItsyBitsy_M0_synth.ino".  Example:

sshot

Whenever your synth is powered up, the display will present a "Start-up" screen with an option to default the configuration.  Press Button [B] within 3 seconds from start-up to invoke this function.

...


MIDI Implementation 

The ItsyBitsy M0 Synth recognises MIDI messages: Note-On (with Velocity), Note-Off, Program Change (= Preset select), Pitch-bend, plus Control Change messages summarized in the table below:

CC #MIDI Standard UsageItsyBitsy M0 / Sigma-6 Synth Usage
01Modulation Control (MSB)Modulation  - High-order byte
33Modulation Control (LSB)Modulation  - Low-order byte (optional)
02Breath Pressure (MSB)Expression (alt. 1) - High-order byte
07Channel Volume (MSB)Expression (alt. 2) - High-order byte
11Expression Control (MSB)Expression (alt. 3) - High-order byte
34Breath Pressure (LSB)Expression (alt. 1) - Low-order byte (optional)
39Channel Volume (LSB)Expression (alt. 2) - Low-order byte (optional)
43Expression Control (LSB)Expression (alt. 3) - Low-order byte (optional)
38Data entry (LSB)Registered parameter data value (0 ~ 127)  [Note 5]
70Sound Controller 1Mixer output gain x10  (1 ~ 100, unit = 0.1)
71Sound Controller 2Ampld Limiter Level  (5 ~ 95 %)
72Sound Controller 3ENV Release Time  (1 ~ 100, unit = 100 ms)
73Sound Controller 4ENV Attack Time  (1 ~ 100, unit = 10 ms)
74Sound Controller 5ENV Hold Time  (0 ~ 100, unit = 100 ms)  [Note 1]
75Sound Controller 6ENV Decay Time  (1 ~ 100, unit = 100 ms)
76Sound Controller 7ENV Sustain Level  (0 ~ 100 %, log scale)
77Sound Controller 8LFO Frequency  (1 ~ 50 Hz)
78Sound Controller 9LFO Ramp Time  (0 ~ 100, unit = 100ms)
79Sound Controller 10LFO FM (Vibrato) Depth  (0 ~ 120, unit = 5 cents)
85UndefinedPitch CV base note (MIDI note #, 12 ~ 60)
86UndefinedAudio amplitude control mode (0 ~ 3)  [Note 2]
87UndefinedVibrato control mode (0 ~ 3)  [Note 3]
88 UndefinedPitch-bend control mode (0 ~ 3)  [Note 4]
89UndefinedReverberation Level (0 ~ 100 %)
100Registered parameter LSBSelect a "registered parameter"  [Note 5]
120All Sound OffAll Notes Off + All Sound Off
123All Notes OffAll Notes Off + All Sound Off

Note 1:  If Hold Time = 0, the Decay segment is bypassed; i.e. Attack is followed by Sustain.

Note 2:  0 = Use Patch parameter;  1 = Fixed (full-scale);  2 = ENV x Velocity;  3 = Expression

Note 3:  0 = Vibrato Off;  1 = MIDI Modulation (CC1);  2 = CV4 AUX-IN signal;  3 = Automatic (ramp)

Note 4:  0 = Pitch-bend disabled;  1 = MIDI Pitch-bend msg;  2 = CV1 PITCH signal

Note 5:  Registered param 01 = Master Tune (fine tune).  Follow with CC38 (Data entry) message.
            Data entry value is Master Tune in cents, offset by 64; i.e. zero is represented by 64.
            Example:  To set Master Tune to +10 cents, CC38 data value is (64 + 10) = 74.

Most of the synth parameters settable by MIDI CC messages (70 ~ 89) are also settable using the control panel. Configuration parameters set by CC85 thru CC89 are stored in EEPROM (where fitted) and hence are persistent across power-downs. Parameters set by CC70 thru CC79 are active patch parameters. These settings will default to values defined by the preset patch, whenever a preset is selected.

MIDI channel selection ... DIP-switch settings:

0000 = Omni *0001 = chan 10010 = chan 20011 = chan 3
0100 = chan 40101 = chan 50110 = chan 60111 = chan 7
1000 = chan 81001 = chan 91010 = chan 101011 = chan 11
1100 = chan 121101 = chan 131110 = chan 141111 = chan 15

[ Legend:  0 = On (closed);  1 = Off (open) ]

* The module responds to valid messages addressed to the selected MIDI IN channel and, if MIDI mode is set to 'Omni' (switches set to 0000), it will respond to all messages received, regardless of which channel(s) the messages are addressed to. The module also responds to valid messages addressed to channel 16, regardless of the DIP switch setting, so that the host controller can transmit a "broadcast" message to all modules on the MIDI network simultaneously.

NB: Restart the device (reset MCU) after changing MIDI channel or CV mode jumper settings.
...


Analog (CV) Control Mode

The Sigma-6 "Voice Module" can be configured to operate either as a voltage-controlled or MIDI-controlled device. The control mode is initialized at power-on/reset according to jumper JP1 setting. To select CV mode at start-up, place a jumper link on header JP1. Thereafter, the software switches the mode automatically...
Whenever a MIDI 'Note-On' message is received, the control mode switches to MIDI. Conversely, if the GATE signal is asserted (low to high transition), then the mode switches back to CV.

In CV mode, oscillator frequency is set by the CV1 (PITCH) input voltage, which covers a 5-octave range. The pitch corresponding to zero volts is set by a configuration parameter 'Pitch CV Base Note', which can be modified by a MIDI message (CC85) or using the control panel. The default setting, note #36 (C2), is hard-coded in the firmware... see function "DefaultConfigData" in source file "ItsyBitsy_M0_synth.ino".

Audio output amplitude can be controlled dynamically, either by the synth envelope shaper (ENV1) or by CV3 (EXPRN) if using an external signal. If using CV3 to control expression, set configuration parameter 'Ampld Control Mode' to "Expression" (3). There is also an option which allows CV3 to serve as a "Velocity" signal with 'Ampld Control Mode' set to "ENV1*Velo" (2). With this option enabled, the CV3 input signal is sampled when the GATE input goes High. Any change in CV3 thereafter, i.e. while the note is playing, will have no effect on the audio level because it is controlled only by the envelope shaper.

The GATE signal (5V logic) controls all internal envelope shapers: the Amplitude Envelope (ENV1), "Contour" and "Transient" Envelope (ENV2). The envelope generators enter the 'Attack' phase on the GATE signal rising edge (Low to High). They enter the 'Release' phase on the GATE signal falling edge (High to Low). Refer to the "Sigma-6 Design Notes" document for details of the Contour Envelope function.

There is an option to "quantize" the CV1 (pitch) input signal so that the oscillator (fundamental) frequency is set to the nearest semitone on the chromatic scale. This may be useful if the external control voltage source is not already tuned to a musical scale, or if it is not well calibrated. Various analog sequencers and random note generators (using sample-and-hold techniques) may fall into this category. Of course, you may prefer not to have the oscillator pitch quantized, in which case turn off the 'quantize' option! This parameter can be set via the Control Panel and/or you can edit the default setting in the firmware.

Max. frequency of signal fed into CV1 input

Frequency modulation of the synth oscillators can be achieved by adding an AC component to the signal applied to CV1. The AC component (if any) should be band-limited (low-pass filtered) with a cut-off frequency around 250Hz; otherwise aliasing artefacts (unwanted audio frequencies) could occur.

CV1 Input Calibration

Assuming the module starts up in CV control mode, the 'Start-up' screen will present an option to calibrate the CV1 input.  Press Button [A] within 3 seconds from start-up to invoke this function.

Apply a stable DC voltage source to the CV1 input. You can use a battery (3 ~ 4.5V), or use the internal +3.3V line, or a voltage-divider on the +5V supply to obtain a voltage in the range 3 ~ 4.5V. Measure the voltage applied to the CV1 input jack using an accurate voltmeter. Call this "actual_input_mV". You could use a 3½ digit DMM (full-scale 3.999V) if the voltage source is less than 4V, but these are rarely better than 0.5% accurate on DC volts. Preferably, use a 4½ digit DMM with DC accuracy 0.1% or better.

Wait a few seonds for the CV1 voltage indicated on the display to stabilize. Call this "adc_reading_mV". The ADC reading assumes CV1 input full-scale is 5100mV, based on the voltage-divider (18k + 33k) and ADC reference voltage (3.3V). Calculate the actual (calibrated) full-scale value using this formula...

full_scale_mV = 5100 × actual_input_mV ÷ adc_reading_mV

Enter this value (rounded to the nearest integer) in the function "DefaultConfigData", replacing the existing default value (5100) as in this example:

g_Config.CV1_FullScale_mV = 5073;

Compile and upload the firmware to your synth board.

Restart the module and default the configuration... (see section "Default Configuration", above).
Your Sigma-6 Voice Module is now calibrated.

Note: Firmware v1.6 (and later versions) will show both an 'Uncalibrated" reading and an "Adjusted" reading. The uncalibrated value is "adc_reading_mV" to put in the formula above. After the calibration procedure is done, the adjusted reading should be equal to the voltage source measured at the CV1 input (±5 mV).
...


Firmware  Installation

Download and install the latest version of Arduino IDE and follow the instructions here:

Arduino IDE Setup

Regardless of the board type connected, Adafruit or Robotdyn, select "Adafruit ItsyBitsy M0 Express".
(Don't choose "Arduino Zero" or any other Arduino board!)

To build the ItsyBitsy M0 synth firmware, you also need to install a "fast timer" library in the Arduino IDE.
Follow instructions under the heading "Install" in the "READ_ME" file here:

Fast Timer Library for SAMD21

Sigma-6 Synth software repository

Steps to build and "upload" the firmware:

  • Download the Sigma-6 source files from the GitHUb repository (link above).
  • Create a project folder in your computer local drive named "ItsyBitsy_M0_synth".
  • Copy the downloaded source files into the project folder.
  • Double-click on the file "ItsyBitsy_M0_synth.ino" -- this should open Arduino IDE and load
    all source files into the editor window. (Alternatively, open Arduino IDE first, then open the
    source file
    "ItsyBitsy_M0_synth.ino".)
  • Make any required changes to the source code to suit your preferences.*
  • Compile the code and upload the firmware to your Sigma-6 module(s).^

* If you are using the RobotDyn 'SAMD21-M0-Mini' board, edit the #define on line 13 in the header file "M0-synth-def.h". (The Robo M0-Mini board is not fully I/O compatible with the Adafruit M0.)

^ Sometimes it is necessary to retry an upload more than once, or to select (again) the board COM port, and/or to "double click" the MCU reset button to enter the bootloader. This is "normal" for Arduino!
..


Thanks for taking an interest in this project. Feel free to send comments and queries. 
...

See MJB's Index Page
for other DIY projects that might be of interest to you!
___

Disclaimer: The 'ItsyBitsy M0 Sigma-6 Synth' is not a commercial product. The hardware design and software source code are in the public domain. The design may be replicated by suitably skilled electronics hobbyists. Detailed step-by-step instructions  are not provided. The information published here may be used as a basis on which to design your own customized device. The author accepts no responsibility for any adverse consequences to makers attempting to replicate projects described on this website. There is no plan to sell fully-assembled modules, or a complete kit of parts. However, Gerber files for PCB fabrication will be made available. Also, bare (unpopulated) circuit boards may be offered for sale at cost price.

Send email inquiries, comments, suggestions, etc, to...

link to email address

Last update: 29-MAR-2025

___