Introduction: DIY Chewie Monsta Looper (Based on Ed Sheeran's)
So I had heard of Ed Sheeran for a few years now and never really paid him much attention. I liked some of this songs on the radio but thought he was just another pop artist until I say him perform "Shape of You" at the 2017 Grammys. I was blown away! I didn't really even like the song but to watch him perform it live by himself with his loop pedal was mesmerizing. I scoured the internet looking for info on this pedal and found that there wasn't much out there. I finally found an article saying that it was custom built by Ed and his guitar tech which disappointed me until I finally came across and Instructable by "edsutcliffe" ( https://www.instructables.com/id/DIY-Chewie-Monst... ) that had the "secret sauce" on exactly how it worked. I was excited and I got right to work. However, while working through the instructable I ran into several "gotchas" along the way which is why I wrote this instructable. edsutcliffe's page does a great job of describing the pieces and how they go together. My intention here is to fill in some of the gaps that drove me crazy and cost me hours if not days of time trying to solve problems. So while I'm not going to walk you through step by step how to build the loop pedal (most of which you can find on edsutcliffe's page), I'm going to walk you through the key integration issues that plagued me.
Attachments
Step 1: The Pedal
While seeming to be the most critical piece, the pedal itself is the easiest and most straight forward part of the project. My advice here is to start slow and build a rough mock up first and experiment with it. I found that until you actually start using it that its difficult to know what you want. You may think that three tracks are enough but after playing a bit you may find that you really would like a fourth track. Changing it later isn't the easiest thing to do. Even while I was building my second version of the pedal I went back and forth about adding a button for "UNDO" but decided against it. I later found that it we really be useful but I didn't leave enough space for it. I ended up having to take the "programmers" way out and multitask the CLEAR button. Now I have it so that a short press triggers UNDO and a long press triggers CLEAR.
Beyond that, the only other consideration here is whether you want to use pedals or foot switches. I went with foot switches initially just for cost but I recently built a second board using pedals and found them much easier to use.
There are lots of options on Amazon but the ones I used are below.
Step 2: Arduino
In the instructable, rather than telling you to just by a manufactured Arduino board it list each component and has you build your own. In my opinion this is ridiculous given that a mfg board cost ~$10 on the internet so do yourself a favor and just go with that.
https://www.amazon.com/Elegoo-EL-CB-001-ATmega328P...
Now down to my first "gotcha". One important item that isn't discussed anywhere is how to create the sketch (code) for the Arduino which is pretty critical since the buttons wont do anything without this. So Im providing my code for you to use. Again, Im not going to walk you through step by step how to program the Arduino. If you go to their homepage they have plenty of tutorials on how to do that. If you are savvy enough then feel free to edit it however works best for you.
The Basics
- The pedal has 8 buttons and 2 LEDs
- A button press sends a MIDI command message from the Arduino
- Buttons (While I'm describing each button's function, the Arduino code itself does nothing but send a MIDI command. the MIDI command must be tied to a script in Mobius which will be covered later)
- Buttons consist of two groups
- Global = Sends the same MIDI command regardless the mode
- Mode-based = Sends different MIDI command based on the mode
- MODE = this button changes the "mode" of the pedal (Record / Play / Volume Control)
Short press toggles between Record and Play mode
Long press (more than 1 sec) goes to Volume control mode.
- In REC mode = In RESET mode it will start the loop and close the loop on next press and go to Overdub mode. After that it toggles between Play and Overdub of the current track.
- In PLAY mode = Unmutes and restarts all tracks
- In REC mode = Applies "instant multiply" function to the current track.
- In PLAY mode = Mute and Pause all tracks
- In REC mode = In RESET mode it will start the loop and close the loop on next press and go to Play mode. After that it toggles between Play and Overdub of the selected track.
- In PLAY mode = Toggle between Mute and Play
- In Volume Control mode = Track 2 cycles through the tracks, Track 1 reduces the output level (volume) of the current track by 5, Track 3 increases the output level of the current track by 5.
- RESET = applies "Global Reset" function
- CLEAR
- Short press (<1000ms) applies "UNDO" function to the current track
- Long press (>=1000ms) applies "CLEAR" function to the current track
- REC LED = Red, on when in Record mode.
- VOL LED = Blue, on when in Volume Control mode.
- REC/PLAY = pin 3
- RESET = pin 4
- X/STOP = pin 5
- CLEAR = pin 6
- TRACK 1 = pin 7
- TRACK 2 = pin 8
- TRACK 3 = pin 9
- MODE = pin 10
- REC LED = pin 11
- VOL LED = pin 12
Note: A community friend, Claudio, made some enhancement to the sketch and shared it back with us. Thanks, Claudio!
Step 3: The MIDI Interface
This is an area I feel wasn't covered very clearly in the other instructable. Basically, as discussed in the Arduino section, the pedal and Arduino just outputs a MIDI command based on the button pressed. In order to be used you need to send the MIDI to the PC running Mobius. I found 3 ways to do this and it's dependent on the type of audio interface you buy (more to come).
- Option 1 - Depending on what audio interface you buy, some have built in MIDI in/out ports. If this is the case then you can just follow the instructable and pull out the serial channel on the Arduino and connect it to the MIDI In port. You will then be able to select this as your MIDI controller source later when you setup Mobius
- Option 2 - My audio interface didn't have a built in MIDI port so this presented a challenge. So I initially pulled out the serial channel as in option 1 and purchased a separate MIDI-to-USB adapter. While this did work, I found it to be clunky and unreliable. Plus I was frustrated because this would be a 3rd USB connection and my PC only had two. I could disconnect the cable to the Arduino which I was using for power and debugging but that meant I would need an external power supply for it.
- Option 3 - I didn't understand why I couldn't get the MIDI commands over the USB connection and have the same connection power the Arduino. I knew there must be a way. After a lot of internet searching I finally found a way by using two freeware apps.
- loopMIDI - Ironically named, this free apps enables you to create a "virtual" MIDI port on your PC. All you have to do is install it and define a virtual MIDI Out port and that's it. It will run automatically at boot up. https://www.tobias-erichsen.de/software/loopmidi.h...
Hairless MIDI - This program enables you to create a "serial bridge" so that you can map the serial COM port used to program your Arduino to the virtual MIDI port you just created with loopMIDI. And Whalla! You now only need a single USB connection from the PC to the Arduino. http://projectgus.github.io/hairless-midiserial/
NOTE: If you choose to use option 3 then you need to make sure that the Arduino code has the serial channel baud rate set to 38400 instead of the standard 31250 that MIDI uses.
// Set MIDI baud rate:
//Serial.begin(31250);
// Set baud rate to 38400 for Hairless MIDI
Serial.begin(38400)
Step 4: The Audio Interface
So this is probably the most important component that you will have to select. Since low cost was a key driver for me I looked for an inexpensive audio interface. I ended up settling on the BEHRINGER U-PHORIA UM2 (https://www.amazon.com/Behringer-UM2-BEHRINGER-U-P... ) because it was low cost and had 2 input channels and 2 output channels which is all I needed. There are lots of options out there but it could slightly change the Mobius setup later.
Please understand that you do get what you pay for. While the UM2 does a great job for its price, I occasionally run into issues such as a random "pop" sound if I overdub too many layers or sometime get static and have to reboot the interface. So if you are serious about performing with this pedal then spring for a higher quality audio interface.
I really thought this would be straight forward but this ended up being the hardest problem for me to solve and almost resulted in me abandoning the project. When you first plug it in to your PC, Windows will automatically install a driver and you think you are set, right? Wrong. After I first set it up and starting recording tracks I found that the latency was so bad (more than a second) that the pedal was basically unusable. I had to be doing something wrong. Again, after a ton of internet searching I found the problem. Windows will install a default MME driver for the audio interface. MME drivers are very high latency and not suitable for real-time recording. I had to go to the Behringer website and find the ASIO driver for my specific interface. ASIO drivers are specifically designs to minimize latency which is what you need here. After installing this driver the recording latency was not even detectable by the human ear. So the takeaway here is that whatever audio interface you use please make sure you get the ASIO driver from the manufacturer and save yourself the headache that I experienced.
Step 5: Mobius
Let's face it, without Mobius all we have so far is a MIDI controller pedal board. Mobius is a free software program created by Circular Labs (http://www.circularlabs.com/ ) that does all of the recording and looping. It's really an amazing program. That being said, the documentation from Circular Lab I found to be very lacking. After the install you get a window with 8 tracks and tons of buttons, meters, and counter. It took me a while to figure out how to navigate the GUI and configure it for me needs. Fortunately I found a youtube video posted by edsutcliffe that walks you through the configuration step by step.
After that, the only part of the setup that I had trouble with was mapping a certain input channel to a certain track. In the video, they are using a 4 channel interface and each channel shows up independently in Mobius. The UM2 interface that I used actually uses a single stereo channel and utilizes the right and left channels independently. So I only see 1 "channel" in mobius but I can map a single channel by moving the "Pan" setting all the way to the left or to the right. So I have track 1 and 2 with pan set all the way to the right so that only channel 2 (instrument) gets recorded. Then for track 3 I left pan in the middle so that I can record either the mic or the guitar on it. If I want to only record the mic then I would pan all the way to the left channel.
******ALTERNATIVE******
If you want to try an alternative to mobius then check out my instructable below that details how I wrote my own looping software using Python.
Step 6: Mobius Scripts and MIDI Bindings
The final piece of the puzzle is the Mobius scripts and MIDI bindings. Even though I'm very familiar for computer programming, I found the Mobius scripting language to be a little confusing and not well documented. It took me a long time and a lot of tweaking to get them the way a wanted but in the end they work for what I need. The steps for binding the scripts to MIDI commands in Mobius are described in detail in the youtube video in step 5.
Well that's it. Hopefully these tips will help you out with your build and you will be able to avoid the frustrations that I ran into.
Attachments
Step 7: Version 1.5
So after using my pedal for almost two years I decided that I wanted to make a slight change to how it worked. I ran into some cases where the "PLAY ALL" feature made things cumbersome. Often I would have a track muted and I want to stop all the track and just restart the two tracks there were playing. With the current operation, all three tracks would restart and I'd quickly have to mute the unwanted track. Unfortunately, I was not able to find a good way to do this in Mobius. In order to accomplish this I had to do it inside the Arduino code. Remember that the pedal and Arduino code were pretty much "dumb". It only sent a MIDI command when a pedal was pressed and the Mobius scripts did all the rest. With this change, I basically moved all of the playback intelligence into the Arduino code and track the states of each individual track. So this ended up being almost a complete rewrite of the Arduino code. I even ended up building a small debug pedal board to develop and test the new code. If you are interested in my new method then read on, otherwise the functions described above will work just fine.
In order to make the "PLAY ALL" work as I wanted I had to add a new state to each track with I call "ARM". Before, when in PLAY mode, pressing the track pedal would toggle between MUTE and PLAY. Now, a pedal press will go from PLAY to MUTE but then toggle between ARM and MUTE. A track will not be unmuted until its in ARM state and then the PLAY pedal is pressed. When the STOP pedal is pressed, all tracks in PLAY are put in ARM and only they will be restarted when PLAY is pressed. The problem is that there is no indication in Mobius relative to the ARM state. So to solve this I added a tri-color LED to each track where MUTE is off, PLAY is green, REC/OVERDUB is red, and ARM is amber.
Now I made a "bone-head" mistake while doing this. My Arduino UNO didn't have enough digital I/O to drive the new LEDs so I upgraded to the Arduino Mega (https://www.amazon.com/gp/product/B01H4ZLZLQ/ref=ppx_yo_dt_b_asin_title_o00_s00?ie=UTF8&psc=1). So the code posted uses the pin layout for it instead of the UNO. I later realized that I could have moved 6 of the pedals to the analog inputs and then use the digitals to drive the LEDs. My code can easily be modified to work this way and if there is enough interest I will even do it myself and post it. However, the Mega is only about $5 more than the UNO and gives you 32 more I/O so I don't think its a big deal.
The last thing I want to talk about are the track LEDs themselves. I used these from Amazon (https://www.amazon.com/gp/product/B077XBMJFZ/ref=ppx_yo_dt_b_asin_title_o00_s00?ie=UTF8&psc=1). I called them "tri-color" LEDs but if you search for them they will be under "bi-color". This is because they only contain two LEDs, a green and red. However by turning them both on at the same time you get amber. Also keep in mind that since they are "common anode" and that you apply 5V to the common pin and have to connect the Arduino pin to the cathode. This makes the LEDs "active low" so they will be off when the Arduino pin is high and on when it's low. If you buy different LEDs that aren't common anode then the Arduino code wont work as written but can easily be adapted. Lastly, I spent a far amount of time tweaking the resistor values until I as able to get the color amber that I wanted. Green is brighter than red so I to use a 1K ohm resistor to reduce its brightness. Another option is to connect the LEDs to the PWM digital channels and control the brightness the analogWrite(pin, value) function.
FYI - apparently Instructables.com does not allow users to upload .zip files anymore so I put all the scripts and aurduino code in github. Please access it here.
https://github.com/mjoseph81/loop_pedal_public
Well, I hope you enjoyed this instructable. Let me know if you have any questions and happy looping.
121 Comments
Question 25 days ago
Hi Matt. Thanks for this awesome project. I've been planning to make one of this loop station. I can put together the hardware myself. Also I want to add a 4th track but I have zero knowledge in programming. Is there a way you can upload a 4 track version of the code? Ill be using a sonnit looper software for this to make things a bit easier i think.
Answer 23 days ago
To be clear, you are only looking for the arduino part to support 4 tracks? I can probably modify it, but I have no way to test it.
Reply 23 days ago
Yes. just the latest arduino code.It's fine if you cant test it. I'll try to figure out the rest myself.
Reply 20 days ago
Here, this should work for 4 tracks.
https://github.com/mjoseph81/loop_pedal_public/blob/master/looper_pedal_midi_v1.4.1.ino
Reply 18 days ago
Thank you for this Matt.
6 weeks ago
Hi everyone! If you like this project then check out my new instructable that details my customer Looper software I wrote using python (Py Looper)
https://www.instructables.com/Py-Looper/
Question 4 months ago
Is there anyway i can edit this to make it 4 tracks?
Answer 2 months ago
Yes, You just have to edit the Arduino code for one more track and add one more pedal, of course. Not very hard but there are several things to change.
3 months ago
Dear all,
I invite you to download the new version of Mobius that you can find here!
https://github.com/ClaudioCas/mobius/releases
Happy Looping!
Reply 3 months ago
ClaudioCas, thanks for posting this! I have a few questions though. Is looks like its just the source code and needs compiled. I tried compiling it in windows with msys2 but Im getting a make error "make[1]: *** No rule to make target '/nologo'. Stop." Can you provide some instructions on how to build it? Can it be built in linux instead of windows?
thanks,
Matt
Reply 3 months ago
Hi Matt,
you can find the binaries in the release section in the right column.
https://github.com/ClaudioCas/mobius/releases
Unfortunately Jeff wrote the GUI completely low-level without using any external libraries. He made an abstraction on the Graphics Window, then made the Windows and Mac implementation, so I guess to make a Linux version you need to implement a custom version. More
Question 5 months ago
Hi!
I found this Instructable a few days ago, but it was too much for me. Now I have been building my Mobius-Pedal for awhile - and this is just what I needed!
1) I changed my Arduino-code to ver 1.3
2) I uploaded your scripts
These are working, but I don't understand how to make it work. Your Youtube-video maybe would have been the key to understand, but it's private so I can't see it.
Any help for MIDI-bindings, please :D
Answer 5 months ago
Got it working - the Mode-button did not work and because of that nothing was working.
Reply 4 months ago
How do you map all the scripts did you figure it out?
Reply 3 months ago
I do remember that it was really confusing. It makes sense, when you have the board connected and you try all buttons in different modess. So, when in Play mode, Track1 sends certain code and when you press the board/arduino to Record-mode, the Track1 sends different code. That was confusing, yes.
I'm here now because I'm wondering how to have the beat going on (Track3 on my system) and Track 1&2 change Loop1<>Loop2 and even Loop3 to have Verse, Chorus, Bridge -kind of system.
Btw. I have spmething not as in this tiutorial: "Into Play mode" and "Into Record mode" on one button. I have also "Record Play Record" on one button but not the "Next track" at all.
Have to check
1 year ago
i am wondering how i can ad an led to the undo/clear button. im new to coding and need some help. i want a red led to light up when i press the undo button then switch off when the midi comand has been sent, and i want a blue led to light up when the clear comand is sent then switch off. how can i write that code? i have tried to write the setup code but got stuck on the acual code. i wil post the code in the reply if anyone feels like helping.
would this code work ?
//Logic for CLEAR button
if (btnEval[1] == 0 && retriggerTimeExpired(btnLastPressTime[1])){
//handle short press
if(btnEval[1] != priorBtnEval[1]){
sendCmd(1, undo_cmd, 127);
btnLastPressTime[1] = millis();
digitalWrite (undo_red_led, LOW);
//handle long press
}else if((millis() - clearLongPress) >= longPressTime){
sendCmd(1, clear_cmd, 127);
clearLongPress = millis();
digitalWrite (clear_blue_led, LOW);
digitalWrite (undo_red_led, HIGH);
}
}else{
//reset last time clear was pressed
clearLongPress = millis();
digitalWrite (clear_blue_led, HIGH);
digitalWrite (undo_red_led, HIGH);
}
the full code will be in a reply
Reply 1 year ago
Hi, so I modified the v1.5 code to drive the 2 LEDs like you asked however I don't have my rig put together at the moment to be able to test it. So you can give it a try if you want but I can't guarantee it will work.
v.1.5.1 sketch in link below
https://github.com/mjoseph81/loop_pedal_public/blo...
Reply 1 year ago
you are the man. can comfirm it works. neede to change the "low" to "high" and the on time to 1200. thx man
Reply 1 year ago
Glad to hear it. Happy looping!
Reply 1 year ago
constint buttonPin = 3; // the number of the pushbutton pin
constint ledPin = LED_BUILTIN; // the number of the LED pin
constint led_on_time = 2000; //time in ms that the LED stays on
// variables will change:
int buttonState = 0; // variable for reading the pushbutton status
unsignedlong led_time = 0; //time led is turned on
voidsetup(){
// put your setup code here, to run once:
pinMode(LED_BUILTIN, OUTPUT);
pinMode(buttonPin, INPUT_PULLUP);
}
voidloop(){
// put your main code here, to run repeatedly:
// read the state of the pushbutton value:
buttonState = digitalRead(buttonPin);
// check if the pushbutton is pressed. If it is, the buttonState is LOW:
if(buttonState == LOW){
// turn LED on:
digitalWrite(ledPin, HIGH);
led_time = millis();
}else{
if(millis() - led_time >= led_on_time) //once button is not pressed check for ON duration to expire
{
// turn LED off:
digitalWrite(ledPin, LOW);
}
}
}