DIY Ondes Martenot MIDI Controller

Reader Mitsushi Abe let us know about this fantastic DIY project – an Ondes Martenot MIDI Controller.

Abe, who describes himself as “an amateur geek living in Tokyo”, loves to make DIY instruments. He used an Arduino to control the Korg Legacy Collection Mono/Poly software synth.

At the end of this video, he plays Saint-Saens’ The Swan on the Ondes Martenot MIDI Controller.

More details (in Japanese) at his site. Part 1 2 3

10 thoughts on “DIY Ondes Martenot MIDI Controller

  1. Outstanding. The guy not only built the instrument, which is impressive enough, but he’s also invested the time required to play it well. That’s a two-fer. I prefer the sound of a Martenot to that of a Theremin. Its very subjective, but the former sounds more like the player is digging in, somehow. Three thumbs up for building it, playing it well and showing its easy integration with the modern world. I’m sure I’m not the only one who can envision a commercial version of this being well-embraced.

  2. Wonderful!! It sounds fantastic,and the build quality is superb.I love the way you made it
    tidy,yet still allowed the guts to be visible.absolutely exquisite!! Well done,old boy!!

  3. if i’m calculating it correctly, the 10bit ADC on the arduino when covering 4 octaves would mean that there is only 20 steps per semitone. that also assumes zero noise on the ADC, if there’s even 1 bit of noise, that goes down to 10 steps per semitone. that seems quite big, and I’m surprised that the pitch is so smooth in the video.. is there any smoothing going on here in software? maybe a very very slight amount of portamento/glide being dialed in on the softsynth?

  4. i wOULD lOVE tO tALK tO tHIS mAN i WANT TO BUILD tHIS INSTURMENT hOW cOULD i gET a RECENT sCHEMATIC aND A cODE tHAT wORKS wITH uno tHANKS dAVE

  5. here it is:-) mitsushi

    ////////////////////////////////////////////////////////////
    // Ondes Martenot MIDI controller for Arduino UNO v0.0 (plus cutoff version)
    // Mitsushi “Galliano” Abe 2012
    // http://gam.boo.jp/blog
    ////////////////////////////////////////////////////////////
    // Connect the Pressure sensor to A0, the Switch to D7 and the Hemipod to A1
    // Connect Mac>>USB-MIDI(IN)>>Arduino
    ////////////////////////////////////////////////////////////

    #include

    #define SWITCH 7
    int PITCH_RANGE = 24;
    #define PITCHINPUT 1 // Connect the Hemipod to A1
    int CUTOFF = 2; // Connect the pod to A2
    int sensorPin = 0; // the Pressure sensor connected to A0
    int sensorValue1;
    int sensorValue2;
    int midiValue = 0; // Volume Value
    int old_midiValue;
    int cutoffValue = 0; // Cutoff Value
    int old_cutoffValue;
    int midiCh = 1;
    int cc = 7; // Main Volume for MIDI Control change
    int notecounter = 0; // Counter used to avoid refrainig note on
    int val = 0;
    int MIDI_ROOT_NOTE = 60; //C4
    byte lowerBits; // Pitchbend value LSB
    byte upperBits; // Pitchbend value MSB
    int iCounter = 0; // Counter used to reduce the sample rate
    byte noteOnToggle = HIGH; // Used to hold the state of the beam
    float MIDIPITCHSCALE = 0.03815;

    void SendMIDI(char cmd, char data1, char data2)
    {
    Serial.write(byte(cmd));
    Serial.write(byte(data1));
    Serial.write(byte(data2));
    }

    void control(){

    val = digitalRead(SWITCH);

    if(val == HIGH)
    {

    notecounter = notecounter + 1;
    if(notecounter == 1)
    {
    SendMIDI(0x90, MIDI_ROOT_NOTE, 127); // Send the root note
    }

    }
    else
    {
    // NOTE OFF
    SendMIDI(0x80, MIDI_ROOT_NOTE, 127); // Silence the note
    notecounter = 0; // Reset the counter
    }

    }

    void volume(){

    sensorValue1 = analogRead(sensorPin);
    midiValue = sensorValue1 / 7.6;
    if(midiValue>127){midiValue=127;}

    if(midiValue != old_midiValue)
    {
    SendMIDI(0xB0, cc, midiValue); //
    }

    old_midiValue = midiValue;

    }

    void cutoff(){

    sensorValue2 = analogRead(2);
    cutoffValue = map(sensorValue2, 0, 1023, 0, 127);
    if(cutoffValue>127){cutoffValue=127;}

    if(cutoffValue != old_cutoffValue)
    {
    MIDI.sendControlChange(74,cutoffValue,midiCh); // 74 is the number of CUTOFF for KORG
    }
    old_cutoffValue = cutoffValue;

    }

    void ProcessAnalogValue(byte i)
    {
    // get a value for the GP sensor on pin i
    float _x = Z(i);

    // 0 – 16383 is the full 14 bit pitchbend range
    int _converted = (int)((_x-294)/ MIDIPITCHSCALE);

    // Convert this 14 bit range value to LSB and MSB bytes
    lowerBits = (byte)(_converted & 0x7F);
    _converted >>= 7;
    upperBits = (byte)(_converted & 0x7F);

    // Now output the message
    SendMIDI(0xe0, lowerBits, upperBits);

    }

    float Z(byte pin)
    {
    int tmp;
    int data = 0;
    int summary = 0; // summary of input data
    int h;

    // get average data from analogpin0
    for(h=0;h<20;h++){
    data = analogRead(pin);
    summary = summary + data;
    }
    tmp = summary/20;
    return (float)tmp;
    }

    void setup(){

    MIDI.begin(1);
    Serial.begin(31250); // Set MIDI baud rate:

    SendMIDI(0xB0, 0x65, 0);
    SendMIDI(0xB0, 0x64, 0);
    SendMIDI(0xB0, 0x06, PITCH_RANGE); // Set pitchbend range

    pinMode(SWITCH, INPUT);

    }

    void loop(){

    volume();
    cutoff();
    control();
    ProcessAnalogValue(PITCHINPUT);
    delay(1);

    }

  6. I would make this arrangement but the scheme is not sufficiently clear and complete it someone could send me the diagram
    thanking you in advance
    and to continue the expresssion is more significant with this system or rubbon ?
    excuse me my English is not very good 🙁
    Thank you

Leave a Reply

Your email address will not be published. Required fields are marked *