Magnetic Resonator Guitar (MR.G)

From Lofaro Lab Wiki
Jump to: navigation, search


The Magnetic Resonator Guitar (MR.G) was inspired by Drexel's Magnetic Resonator Piano. Much like the Magnetic Resonator Piano, MR.G is a hybrid acoustic-electric instrument. While the sound is processed electronically, the music the guitar produces is entirely acoustic. There are no speakers, with the only amplification being in connection to the electromagnetic actuation.

The aim of this project is to expand the musical capacity of the guitar. Over the past few decades, artists have been employing digital techniques to create new forms of music. Some instruments have been modified precisely for this purpose. For example, the keyboard introduced techno to the piano. Our goal is to provide a similar alteration to the guitar, as it is one of the most popular instruments. The difference here is that we seek to preserve the traditional acoustic sound alongside the new techno version. The following is a step by step guide to creating a device that can be attached to an acoustic guitar. It will allow users to add digital sound effects, play songs through resonation, or simply play the guitar as originally intended. We hope this expansion will give musicians more creative freedom. It is provided in an open source format to encourage both professionals and hobbyists to enjoy MR. G.


The basic idea of MR.G is the use of resonant frequencies to excite guitar strings. All objects have a frequency at which they vibrate, known as the resonant frequency. If a wave form (it may be sound, electromagnetic, etc.) of that frequency hits an object, it will begin to resonate. In this case, that frequency is the note at which each string is tuned.

The chosen signal for for this project is electromagnetic. The initial sound wave enters through either a microphone or from the Raspberry Pi. It is then amplified and sent out to the strings, which result in the vibration. The sound produced is similar to that of a violin as opposed to the traditional plucking.



PCB Design

If you wish to use the PCB developed for this project, the necessary Gerber files can be found at the end of this report.

If you wish to create your own version of the board, we recommend either Fritzing or KiCAD software.

Parts list

to populate PCB
1K = R1,R6,R14
2.2K = R2
10K = R4,R5,R13
22K = R9,R10,R11
100K = R3,R7
220K = R12
1M = R8
0.1uF (Tantalum) = C2,C4
0.1uF (Mylar) = C5,C6,C10,C12
0.33uF (Tantalum) = C1,C3
1.0uF (Tantalum) = C7
10uF (Electrolytic) = C8
100uF (Electrolytic) = C9
1000uF (Electrolytic) = C11
Voltage Regulators
78M16 or 78M15 = VR1
78M12A = VR2
TLC37M4CN = U1
LM1875T = U2


For Audio processing on the Raspberry Pi please see AudioStatic's Low-Latency Audio on RasPi tutorial

For handling the guitar's signal we used a Python library called PYO. Shown below we have all the code we have used on for producing various effects.

All coding files can be found at

Simple PYO Server

The following code will instantiate a pyo server on the Raspberry Pi and output a Sine wave. Please note that you must be using X11forwarding in order for this to function. Also, if you're running this in IDLE, you do not need to include s.gui(). However, if you're running this code from terminal you will need to append s.gui() to all of your PYO code. If s.gui() is not at the end of the code, when it is being run in terminal, the code will finish being executed before it has actually had time to send any information to your computer for processing.

 from pyo import *
 s = Server().boot()
 a = Sine(freq=440,phase=0,mul=0.1,add=0).out()

Frequency Tracker

The following code will sample the audio input of your computer and output the corresponding frequency of the input signal, by using the Yin Algorithm [1].

 from pyo import *
 s = Server(duplex=1).boot()
 a = Input(0,1,0)
 fq = Yin(a,tolerance=0.2,winsize=1024,mul=1,add=0)
 wave = Sine(freq=fq,phase=0,mul=1,add=0).out()


The following code incorporates several synthesis operations and techniques. This code uses LFOs, which stand for low frequency oscillator. Basically, they are used for creating rhythm and they typically oscillate below 30Hz (more information may be found in this wiki article: [2]).

This first example uses the PYO function Noise as an input, just so you may test this out on your computer and hear how the effect sounds.

 from pyo import *
 s = Server().boot()
 fade = Fader(fadein=.1,mul=0.7).play()
 a = Noise(mul=.25,add=0)
 lf1 = Sine(freq=[.1,.15],mul=100,add=250)
 lf2 = Sine(freq=[.18,.15],mul=.4,add=1.5)
 b = Phaser(a,freq=lf1,spread=lf2,q=1,num=20,mul=.5).out(0)

Now, to make the previous code accept the guitar input. All you have to do is change out the following line:

 a = Noise(mul=.25,add=0)


 a = Input(chnl=0,mul=1,add=0)

Now your code should look like this:

 from pyo import *
 s = Server().boot()
 fade = Fader(fadein=.1,mul=0.7).play()
 a = Input(chnl=0,mul=1,add=0)
 lf1 = Sine(freq=[.1,.15],mul=100,add=250)
 lf2 = Sine(freq=[.18,.15],mul=.4,add=1.5)
 b = Phaser(a,freq=lf1,spread=lf2,q=1,num=20,mul=.5).out(0)


The following code samples the input audio using the Yin algorithm and outputs to a sawtooth waveform.

 from pyo import *
 s = Server().boot()
 a = Input(0,1,0)
 yin = Yin(a,tolerance=0.2,minfreq=60,maxfreq=1500,cutoff=1500,winsize=1024,mul=1,add=0)
 wave = SuperSaw(freq=yin,detune=0.5,bal=0.7,mul=1,add=0).out()


The following code sets up the touchpad interface.

Initialize necessary parameters.
 import pygame, sys, os, time
 from pygame.locals import *
 from evdev import InputDevice, list_devices
 devices = map(InputDevice, list_devices())
 for dev in devices:
   if == "ADS7843 Touchscreen":
      eventX = dev.fn
 print eventX
 os.environ["SDL_FBDEV"] = "/dev/fb1"
 os.environ["SDL_MOUSEDRV"] = "TSLIB"
 os.environ["SDL_MOUSEDEV"] = eventX
Define background colors.
 BLACK = (  0,   0,   0)
 WHITE = (255, 255, 255)
 RED   = (255,   0,   0)
 GREEN = (  0, 255,   0)
 BLUE  = (  0,   0, 255)
 CYAN  = (  0, 255, 255)
 MAGENTA=(255,   0, 255)
 YELLOW =(255, 255,   0)
Enable display.
 allSprites = pygame.sprite.Group(circle)
 screen = pygame.display.set_mode((480,320), 0, 32)
Define custom cursor.
 class Circle(pygame.sprite.Sprite):
   def __init__(self):
       self.image = pygame.Surface((20,20))
       self.rect = self.image.get_rect()
   def update(self): = pygame.mouse.get_pos()
Set logo as background.
 logo = pygame.image.load(os.path.join('MRG Logo.png'))
 logo = pygame.transform.scale(logo,(480,320))
 logo = logo.convert()   
 screen.blit(logo, (0, 0))
Enable custom cursor.
 allSprites = pygame.sprite.Group(circle)
Determine and update location of cursor.
 running = True
 while running: # run the game loop
   for event in pygame.event.get():
       if event.type == QUIT:
           running = False
       if event.type == KEYDOWN and event.key == K_ESCAPE:
           running = False


Mounting Concepts.png


PCB Gerber Files

TinkerCAD Mounting Concepts