Build the "REMI Synth" (mk2)
Monophonic MIDI Sound Synthesizer designed for EWI's

A DIY Project by M.J. Bauer

This post describes the design of the "second generation" (mk2) REMI synth module.
For a general introduction to the project, see the page: "Introduction to the REMI".
Refresh this page in your browser to be sure you are viewing the latest update!

Synth mk2
REMI 'mk2' Synth Module prototype

Overview

The REMI Synth Module is a monophonic MIDI-controlled sound synthesizer designed primarily for use with electronic wind instument (EWI) MIDI controllers, in particular the REMI mk2 handset.

Provision of a standard 'MIDI IN' port allows the synth to be played by any MIDI controller, for example, a keyboard or another EWI with a standard MIDI output. Using a low-cost MIDI-USB adapter, the REMI synth can also be controlled by a computer running music software, for example a MIDI sequencer. 

Features

  • High quality audio output: >70dB dynamic range, 40kHz sample rate, 32-bit precision DSP
  • High accuracy oscillator pitch for musical application
  • Dual wave-table sound synthesis with mix-ratio modulation (morphing)
  • Classic MIDI-IN and MIDI-OUT connections (DIN-5/180)
  • Graphical user interface (2.5" monochrome LCD, 128x64 pixels)
  • Command-line interface (CLI) for setup and patching (using PC via USB-serial adapter)
  • Instrument presets (8) selectable from REMI handset or other MIDI input source
  • Audio line output to external amplifier (RCA phono skt)
  • Internal headhone amplifier with volume control (3.5mm jack)
  • The 'MIDI IN' socket supplies 5V DC to the REMI handset using 2 spare pins
  • User-programmable synth patches and wave-table creator (via CLI on PC terminal)
  • Audio DSP software library (C source code) for user development
  • Optional wireless communications using RF module
RH side panel
Right-hand side connector panel

Synthesizer Design

The REMI synthesizer is implemented almost entirely in software, requiring minimal circuitry outside of the PIC32 microcontroller - just a low-pass filter in the audio output circuit. To generate audio tones, the synth uses a dual "wave-table oscillator" algorithm offering a variety of waveforms which can range from very simple to rich and complex sounds, some resembling acoustic instruments. 

A PIC32MX340 processor clocked at 80MHz allows a sample rate of 40kHz with 11-bit precision of PWM audio output. Internal DSP computations use 32-bit fixed-point arithmetic resulting in high quality sound.

remi synth model (simplified)

For clarity, the diagram omits the LFO, envelope shapers and audio attenuator.
(This model is somewhat obsolete. An updated model for the mk2 synth will be posted later.)

The synth model comprises a pair of wave-table oscillators which use independent wave-tables. The two oscillator outputs are fed into a "mixer" which scales and adds the two signals in a variable ratio. The mix ratio can be fixed, or it can be varied in time as the note progresses. The mixer has its own dedicated envelope shaper to control the oscillator mix ratio. This capability is used to implement "waveform morphing", a technique used to vary the harmonic content of the sound with time. Waveform morphing can be used to realise a range of effects, beyond what is possible to achieve with filtering techniques.

The pitch of the secondary oscillator can be "detuned", i.e. increased or decreased relative to the primary oscillator. The "detune" factor is a patch parameter having units of "cents", so that the detune resolution is 1/100th of a semitone. If the detune factor is a fraction of a semitone, typically in the range 3 to 30 cents, and both oscillators are driven from wave-tables with similar harmonic content, the resulting effect is known as "Voix Celeste" (heavenly voice). This effect greatly enriches the soundscape possibilities of the synthesizer.

In addition to the two wave-table oscillators, a low-frequency oscillator (LFO) is provided. The LFO can be used to modulate the audio oscillator frequency to implement vibrato, or the LFO can be used to modulate the oscillator mix ratio. In the latter case, the mixer envelope output level determines the modulation depth.

An external analog filter of some sort is necessary to remove the 40kHz carrier frequency from the PWM audio output signal. The chosen filter is a 3rd-order low-pass circuit with a cut-off frequency of 10kHz and roll-off slope of -18dB per octave.

The amplitude (loudness) of the note-in-progress can be varied with time in a variety of ways depending on the instrument patch. A five-segment envelope shaper provides the classic "attack, peak-hold, decay, sustain, release" (AHDSR) amplitude profile. In addition to the envelope shaper, amplitude can be controlled by breath pressure or other MIDI IN Control Change messages.

The firmware includes several "pre-defined" synth patches providing a good variety of instrument sounds. Any pre-defined patch may be assigned to any of the 8 Presets via the user interface (GUI or CLI).

How the Synthesizer is Patched

The REMI synth can be programmed (patched) by the user to create a new sound, without needing to modify and re-compile the firmware. Instead of using knobs and switches like a "real" synthesizer, however, the REMI synth is patched by means of a set of numeric parameters... (see table below). A CLI command "patch" is provided for the purpose of setting patch parameter values. A user-created patch can be saved in non-volatile memory (EEPROM) for later recall. A stored "user patch" may also be assigned to any of the instrument Presets.

Table 1: REMI Synth Patch Parameters

Oscillators Mixer Noise & Filters Attenuator
OSC1 Wave-Table ID Mixer Control Mode Noise Level (%)
Amplitude Env Attack
OSC2 Wave-Table ID Mixer Env Start Level (%) Filter Freq./Offset Amplitude Env Peak Time
OSC2 Detune (cents)
Mixer Env Delay Time Filter Resonance Amplitude Env Decay Time
Pitch Bend Range (cents) Mixer Env Ramp Time Filter Control Mode Amplitude Env Sustain Level
LFO Frequency Mixer Env Hold Level (%)
Amplitude Env Release Time
Vibrato Depth (cents) Mixer LFO Bias Level (%)
Amplitude Control Mode
Vibrato Delay/Ramp Time

Two patch parameters specify which wave-tables out of a large selection will be used by the synth oscillators. The assigned wave-tables determine the waveforms and hence the harmonic content of the oscillator outputs. A "user patch" can specify any pre-compiled wave-table (stored in MCU program memory).

The firmware also provides a utility for users to create their own wave-tables. A CLI command "wav" is provided for this purpose. A user-created wave-table can be tested in a user patch. 

REMI makers who are prepared to re-compile the firmware can add their own patches and wave-tables, limited only by the amount of MCU flash program memory. CLI commands "patch" and "wav" include options to dump patch parameters and wave-table data (resp.) as C source code definitions.

Sample sound clips made with the REMI synthesizer

No post-processing effects were used in the recordings, except for a small amount of "concert hall" reverb to create a stereophonic image. More sample sound clips and a better quality demo video will be posted later!

Play Sound ClipRecorder (plain) Play Sound ClipRecorder with Celeste
Play Sound ClipOboe -- Hard Reed Play Sound ClipJazz Organ with Celeste

REMI demo video


Construction

There is enough information given here to allow experienced electronics hobbyists to replicate the REMI synth design. Detailed information such as step-by-step instructions, parts lists, etc, are not given in this post

Compared with the earler (mk1) prototype, the new PIC32 synth module is greatly simplified. It is based on a PIC32-MX340 proto board from Olimex (pictured below), priced at 19.95 (US$22 approx). The board has parts added for the MIDI IN and MIDI OUT interface circuits, plus PWM audio output circuitry, 5V regulator for the MIDI interface and LCD panel, and an IIC EEPROM to store synth configuration and preset parameters. 

A separate prototyping board may be added to carry a headphone amplifier with volume control.
[View synth schematic diagram]

The complete module incorporates a front-panel user interface (GUI) consisting of a low-cost monochrome graphic LCD panel and 6 push-buttons. The LCD module and key-switches are wired directly to I/O pads on the Olimex PIC32 board. This is the quickest and easiest wiring method. (See internal view below.)

PIC32 synth proto
Olimex PIC32MX prototype board with REMI add-ons (before wiring the LCD panel)

A suitable LCD panel is available from Sparkfun. Alternative modules are available at low cost from online suppliers, e.g. Ali-Express. This type of LCD module is also available with smaller overall dimensions and a smaller dot pitch (~0.4mm). There are many variants of the connector pinout, chip-select polarity, etc, so be sure to observe the datasheet of the display module you choose. It's probably best to use a module which has the signal names screen-printed on the PCB connector pads.

If using a display with the ST7920 chip, the VDD supply voltage must be dropped to about 4.5V (via a Schottky diode) to ensure logic-level compatibility with the PIC32 I/O signals (3.3V outputs, 5V tolerant inputs on Port-E). A firmware variant can be compiled to support the ST7920 LCD controller chip.

Internal view - lid off

The internal view above shows the LCD panel and push-button board wired to the PIC32 MCU board. Also shown are the MIDI sockets and volume control. The headphone amplifier had not been added when this photo was taken. A headphone amplifier will be mounted on the prototyping board (eventually).

Boards are mounted on plastic spacers or standoffs. The PIC32 MCU board and audio output board are mounted on the bottom panel of the box using 20mm x M3 machine screws (countersink heads). Standoffs for the LCD module and button board are glued to the inside of the lid (with 5-minute epoxy) so that screw heads are not visible on the outside.

The enclosure used for the prototype has plastic posts in each corner for the screws to hold the lid on. These posts prevented the PIC32 board from being mounted with the edge flush with the LH side of the box. The posts were cut (by drilling from the outside of the box) to allow the board to fit in place, allowing access to the "RS232" and DC power connectors. The 6-pin ICSP (programming) header was removed and replaced with a right-angle SIL-6 header, allowing access from the outside. The prototype was thus modified because of the many revisions that needed to be made to the firmware during development.

LH side view
Left side panel showing modified ICSP header protruding thru a cut-out

...


Firmware

The REMI synth firmware includes a command-line user interface (CLI), accessible via the "RS-232" serial port provided on the PIC32 board. The CLI was originally intended mainly for firmware development, diagnostic and testing purposes, but the CLI now provides equivalent functions for all operations performed by the front-panel GUI -- and much more. You'll need a USB/Serial adapter cable (~ $10) and a PC terminal emulator application (e.g. 'PuTTY').

The LCD panel and keypad are optional. The REMI can be operated using just the console CLI. This is like the "Command Prompt" in Windows, or the "Console Terminal" in Linux. User interaction is all text-based. The REMI CLI has commands to do everything, e.g. test, set up configuration options, set up instrument Preset parameters, synth patch operations, wave-table selection and creation, etc.

In contrast, the front-panel GUI can perform only a subset of the CLI functions -- it's main purpose is to change the instrument 'Preset' parameters, for example to select the synthesizer "patch" (and/or MIDI voice for external synth) assigned to each Preset. It is convenient to be able to do this without the need to connect a computer.

The firmware supports most LCD modules using the KS0107/KS0108 controller chipset. This is the preferred option, because the KS0108 MCU interface is much faster than the ST7920. Moreover, the KS0108 MCU interface signals are compatible with 3.3V logic, which means that the LCD module can be powered directly from the 5V supply rail. 

Extra features implemented in version 2:
  • More patches, wave-tables and modulation effects
  • Front panel GUI using 6 push-buttons (instead of 4x4 keypad in mk1)
  • Support for LCD modules using KS0107/KS0108 controller chipset 
  • MIDI IN messages (UART RX data) to control and play the synth
  • Support for REMI mk2 handset (MIDI system-exclusive messages)

Programming Tools

A PIC programming tool, e.g. Microchip PICkit-3, is required to install the synth application firmware.
Low-cost PICkit-3 clones are available from online suppliers via AliExpress, eBay, etc.

REMI firmware is built using Microchip PIC development tools - MPLAB.X IDE with XC32 and XC8 compilers - free to download from Microchip's website. If you intend to modify or extend the firmware, you will need these tools. Otherwise, you just need to install the PIC programmer application (IPE) on your computer.


Downloads & Links


Synth Module schematic

MIDI Implementation Chart

Firmware Development Kit
for REMI Synth Module
(Source code, MPLAB.X project files, etc)

Build the REMI Handset (mk2)

If you are interested in building a REMI synth module and/or EWI handset, or if you have enjoyed following the project here, kindly send me an email. Support is offerred to readers who wish to build a REMI or some other electronic music device. [MJB]

link to email address

Last update: 17-DEC-2019

MJB Resources for Embedded Firmware Development

___