Controlling servo motor for the damper of a Plate Reverb (a la EMT 140)

Dear people of the Arduino forum!

I am working on a project. I am building a plate reverb (music studio equipment: generating artificial hall). I want to make an EMT 140 style plate including the damper. Now I would like to control this damper using midi from Ableton. The research I did directed me to the Arduino concept.

With Arduino I would like to do this:

Convert the incoming midi signals to useful data for a servo motor:

For instance:

  • a midi message of 0 would turn the servo to 0 degrees
  • a midi message of 64 would turn the servo 90 degrees
  • a midi message of 127 would turn the servo 180 degrees
  • and of course all the steps in between.

Being able to program a certain midi channel / cc parameter number to which the arduino respons to

Questions I have for now:

  • When I open an Ableton set and lets say the midi plugin which I want to assign to the Arduino to is on 64, is it possible to make sure the servo motor rotates to that corresponding midi value automatically? This would be handy because its possible every project requires a different setting for the servo motor (Which means the damper would be in a different position and thus the plate would generate a different reverb length)

  • Which Arduino board do I need?

  • How do I proceed to make the code

I hope your guys can help me go in the right way and thanks in advance! Let me know if I need to give more info!

Any Arduino can do this, the Servo library can talk to the servo. The map() function can remap the midi
value to the angle value.

You'll need to find a suitable Midi library for parsing incoming packets and add code to recognise the relevant channel etc, and then basically do this:

  servo.write (map (midi_value, 0, 127, 0, 180));

By chance did you look up audio processors they are much smaller and weigh a lot less. They are available from about a buck for the chip to above $6000.00. There are a lot of rack mounted devices available in the $100 Range. I got this from Source Audio: Collider takes supremely high-end delay and reverb effects and offers them in a sleek and powerful design with massive processing muscle and clean functionality. The Collider features two completely independent 56-bit signal processors, essentially housing a high-powered reverb AND a high-powered delay pedal in a single box. This means that it is possible to create magnificent tones with any two-effect combination of delay/reverb, delay/delay, or reverb/reverb.

This extremely versatile pedal offers a long list of useful features, including analog dry through, stereo inputs and outputs, the option of true or buffered bypass, 8 user presets (or 128 with MIDI), full MIDI functionality, delay tap tempo, reverb hold (a.k.a. "freeze"), external expression capabilities, external preset switching capabilities and extra editing and signal routing options via the Neuro Desktop and Mobile App Editors.
I hope this helps.

MarkT:
Any Arduino can do this, the Servo library can talk to the servo. The map() function can remap the midi
value to the angle value.

You'll need to find a suitable Midi library for parsing incoming packets and add code to recognise the relevant channel etc, and then basically do this:

  servo.write (map (midi_value, 0, 127, 0, 180));

Thanks Mark. So basically the ARDUINO UNO REV3 would already work for this purpose?

gilshultz:
By chance did you look up audio processors they are much smaller and weigh a lot less. They are available from about a buck for the chip to above $6000.00. There are a lot of rack mounted devices available in the $100 Range. I got this from Source Audio: Collider takes supremely high-end delay and reverb effects and offers them in a sleek and powerful design with massive processing muscle and clean functionality. The Collider features two completely independent 56-bit signal processors, essentially housing a high-powered reverb AND a high-powered delay pedal in a single box. This means that it is possible to create magnificent tones with any two-effect combination of delay/reverb, delay/delay, or reverb/reverb.

This extremely versatile pedal offers a long list of useful features, including analog dry through, stereo inputs and outputs, the option of true or buffered bypass, 8 user presets (or 128 with MIDI), full MIDI functionality, delay tap tempo, reverb hold (a.k.a. "freeze"), external expression capabilities, external preset switching capabilities and extra editing and signal routing options via the Neuro Desktop and Mobile App Editors.
I hope this helps.

Looks super cool too! Will consider something like that as well. But I also love a classic plate. A real one has a lot of character and making a diy one is also cool to do :slight_smile:

There are a few google results for "arduino reverb plate"

And another

And to get the juices flowing :grinning:

I am a great believer in "roll your own" when possible.

ballscrewbob:
There are a few google results for "arduino reverb plate"

And another

And to get the juices flowing :grinning:

I am a great believer in "roll your own" when possible.

haha yes agree. I want to share with you how far I already am:

DIY PLATE

That will need some serious damping.
Nice you have a fab-shop.

Not that well set up for my projects which tend to be much smaller and a different theme (more artsy)

yes, its basically a emt140 clone so including the same big damper I need to build :slight_smile:

HI All,

I just wanted to share something with you:

https://www.instagram.com/p/B92WfXDoOFO/

The plate is ALIVE! Is sounds gorgeous already :wink:

WOW just WOW !

I came up with the following. What do you guys think?

#include <Servo.h>

#include <MIDI.h>

// Define Servo
Servo myservo;
// Define Value
int val;

MIDI_CREATE_DEFAULT_INSTANCE();

 void setup()
 {
     MIDI.begin(MIDI_CHANNEL_OMNI);  // Listen to All Midi input
      // Connect servo to pin 9
  myservo.attach(9);
  // Start Serial communication
  Serial.begin(9600);
}

 void loop()
 {

     // Read all incoming midi
     MIDI.read();
     // Connect midi with the Value parameter
  val = MIDI.read();
  // Calculate Midi values (0-127) to servo angle
  val = map(val, 0, 127, 0, 180);
 
  // Start serial monitoring
  Serial.println(val);
  // Send servo angle
  myservo.write(val);
  // Delay for servo movement
  delay(50);
 }

MarkT:
Any Arduino can do this, the Servo library can talk to the servo. The map() function can remap the midi
value to the angle value.

You'll need to find a suitable Midi library for parsing incoming packets and add code to recognise the relevant channel etc, and then basically do this:

  servo.write (map (midi_value, 0, 127, 0, 180));

Hi Mark! I implemented your code in mine. (See my post before) If you have time, could you take a look at what I have if it would make sense? :slight_smile:

Hi All!

I got it working :slight_smile:

I found some code for cc messages on notes and volts by dave. This I modified and I got it working :slight_smile:

Here a little movie I made:

Please find my working code here:

/*
   Adjusted code for Controlling the damper of a plate reverb with midi CC by Robin Hunt
   Original code found on www.notesandvolts.com by Dave
*/

#include <MIDI.h>  // Add Midi Library

#include <Servo.h> // Add Servo Library

// Define Servo
Servo PlateDamperServo;

//Create an instance of the library with default name, serial port and settings
MIDI_CREATE_DEFAULT_INSTANCE();

void setup() {
  MIDI.begin(9); // Initialize the Midi Library.
  // OMNI sets it to listen to all channels.. MIDI.begin(9) would set it
  // to respond to notes on channel 9 only.
  MIDI.setHandleControlChange(MyCCFunction); 
  // This command tells the MIDI Library
  // the function you want to call when a Continuous Controller command
  // is received. In this case it's "MyCCFunction".
   PlateDamperServo.attach(3);
  // Attach the servo to pin 3 on the Arduino
}

void loop() { // Main loop
  MIDI.read(); // Continuously check if Midi data has been received.
}

// MyCCFunction is the function that will be called by the Midi Library
// when a Continuous Controller message is received.
// It will be passed bytes for Channel, Controller Number, and Value
// The following code checks if the controller number is on 27
// If it is, the servo receive PWM and will move corresponding to the Value byte
void MyCCFunction(byte channel, byte number, byte value) {
  switch (number) {
    case 27:
    PlateDamperServo.attach(3);
      PlateDamperServo.write (map (value, 0, 255, 90, 180));
      // Delay for servo movement
  delay(30);
   PlateDamperServo.detach();
   delay(5);
      break;
  }
}

Hi Robin,

I can tell you from experience (don't ask!) that it's best not to locate your plate in a bathroom - even if it's nice, quiet, and remote. The problem is obvious when your wife goes to the loo and the band hears her farting!

You brought back a happy memory - thanks :slight_smile:

Pauly

robinhunt:
Looks super cool too! Will consider something like that as well. But I also love a classic plate. A real one has a lot of character and making a diy one is also cool to do :slight_smile: