diff --git a/software/apps/Motion/Center_with_2_oscillators/Center_with_2_oscillators.ino b/software/apps/Motion/Center_with_2_oscillators/Center_with_2_oscillators.ino new file mode 100644 index 0000000..27aa14e --- /dev/null +++ b/software/apps/Motion/Center_with_2_oscillators/Center_with_2_oscillators.ino @@ -0,0 +1,44 @@ +//Center +//uses a variable force (pwm duty) +//If it feels like a mountain - pushing away from center, then +//reverse the motor leads +//or for a quick fix in the code: change if(f < 0) to if (f > 0) + +#include "Motor.h" +#include "Music.h" + +int posA, posB; // position from analogRead +int forceA, forceB; // computed from pos and k +int kA = 2; // spring constant +int kB = 2; // spring constant +//int duty; // pwm duty for Timer1 (range 0 - 1023) 10-bit resolution + +void setup() +{ + MotorA.init(); + Music.init(); + Music.setWaveform(0); // only works with 8bit waveforms +} + +void loop() +{ + + posA = analogRead(A0); + posB = analogRead(A3); + + Music.setFrequency1(posA); + Music.setFrequency2(posB); + + forceA = - kA * (512 - posA); + forceB = kB * (512 - posB); + //duty = abs(force); + //duty = min(512, duty); + + MotorA.torque(forceA); + MotorB.torque(forceB); + + //if(force < 0) MotorA.direction(FORWARD); + //else MotorA.direction(BACKWARD); + +} + diff --git a/software/lib/MMM/Music.cpp b/software/lib/MMM/Music.cpp index edb0b02..c40d0b7 100644 --- a/software/lib/MMM/Music.cpp +++ b/software/lib/MMM/Music.cpp @@ -48,9 +48,9 @@ ISR(TIMER2_COMPA_vect) { // timer 2 is audio interrupt timer OCR2A = 127; // don't change this -// Music.synthInterrupt8bit(); + Music.synthInterrupt8bit(); - Music.synthInterrupt12bitSine(); +// Music.synthInterrupt12bitSine(); } diff --git a/software/lib/MMM/Music.h b/software/lib/MMM/Music.h index e3d5701..f5798b6 100644 --- a/software/lib/MMM/Music.h +++ b/software/lib/MMM/Music.h @@ -31,7 +31,7 @@ // SHOULD BE 1, 2 or 3 // //////////////////////////////////// -#define NUM_OSCILLATORS 1 +#define NUM_OSCILLATORS 2 // current sample rate is 15625 as defined in the init() section diff --git a/software/lib/MMM/examples/Music/Basic_MIDI/Basic_MIDI.ino b/software/lib/MMM/examples/Music/Basic_MIDI/Basic_MIDI.ino deleted file mode 100644 index 8594fa3..0000000 --- a/software/lib/MMM/examples/Music/Basic_MIDI/Basic_MIDI.ino +++ /dev/null @@ -1,34 +0,0 @@ -// This needs to be in all sketches at the moment -#include - -// The Music and Midi objects are automatically instantiated when the header file is included. -// Make calls to the Music and Midi objects with "Music.function(args)" and "Midi.function(args)" -// You still need to call Music.init() and Midi.init() in the setup() function below. - -#include -#include - -void setup() { - - // We initialise the sound engine by calling Music.init() which outputs a tone - Music.init(); - - // We initialize the MIDI engine by calling Midi.init() - Midi.init(); - - // Choosing the sine wave oscillator. - Music.setWaveform(3); - - // Enabling envelope, otherwise the synth would just play constant tones. - //Music.enableEnvelope(); - -} - -void loop() { - - // The MIDI must be used with the external - // "IAC2CFO.pde" Processing sketch. - Midi.checkMidi(); - -} - diff --git a/software/lib/MMM/examples/Music/Circuit_bending/Circuit_bending.ino b/software/lib/MMM/examples/Music/Circuit_bending/Circuit_bending.ino deleted file mode 100644 index 87c3054..0000000 --- a/software/lib/MMM/examples/Music/Circuit_bending/Circuit_bending.ino +++ /dev/null @@ -1,44 +0,0 @@ -////////////////////////////////////////////////////////// -// CIRCUIT BENDING -// This came about by accident. -// Upload the code to your board, plug into loud speakers -// and touch the bare pins to make some awesome noise :D -////////////////////////////////////////////////////////// - -#include -#include - - -float s; -float frequency = 220.0; -float detune = 0.01; -float bend = 0.0; - -void setup(){ - - Serial.begin(9600); - - Music.init(); - - Music.setSaw(); - Music.setDetune(detune); - Music.setFrequency(220); - -} - -void loop() { - - s = analogRead(0); - bend = mapFloat(s, 0.0, 1023.0, -2.0, 2.0); - Music.pitchBend(bend); - frequency = Music.getNoteFrequency(48); - //Serial.println(frequency); - //delay(100); - -} - -float mapFloat(float x, float in_min, float in_max, float out_min, float out_max) -{ - return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; -} - diff --git a/software/lib/MMM/examples/Music/MUSIC_LIBRARY_DOCUMENTATION/MUSIC_LIBRARY_DOCUMENTATION.ino b/software/lib/MMM/examples/Music/MUSIC_LIBRARY_DOCUMENTATION/MUSIC_LIBRARY_DOCUMENTATION.ino deleted file mode 100644 index 3f46436..0000000 --- a/software/lib/MMM/examples/Music/MUSIC_LIBRARY_DOCUMENTATION/MUSIC_LIBRARY_DOCUMENTATION.ino +++ /dev/null @@ -1,88 +0,0 @@ -///////////////////////////////////////////////////////////////////////// -// DON'T TRY TO RUN THIS SKETCH, IT IS FOR DOCUMENTATION PURPOSES ONLY // -///////////////////////////////////////////////////////////////////////// - -// These are the music functions that are available for you to use in you sketches. -// You can see examples of how some of them are used (the most basic ones) in the -// Apps folder that downloaded with the MM library. - -// In the following you can see the variable type that the function takes as an argument (float, uint8_t or uint16_t) -// The weirdly looking "uint16_t" and "uint8_t" is just unsigned 16 and 8 bit integers. So instead of having -// both negative and positive values, they only have positive values from 0 - 255 (8bit) and 0 - 65535 (16bit). -// If you copy a function from here to your arduino sketch, just change the word "float", "uint8_t", etc into the -// variable name that you uses in your sketch. - - -// INITIALIZER -// Use this to start the synth engine. It defaults to a sine tone at 110Hz, no envelope and no detune. -Music.init(); - - -// FREQUENCY AND DETUNE FUNCTIONS -// Use these functions to set the frequency and detune parameters of the synth. -Music.setFrequency(float); // Set frequencies of all oscillators at once. Does _not_ affect detune. -Music.setFrequency1(float); // Set frequency of individual oscillators. -Music.setFrequency2(float); // -Music.setFrequency3(float); // -Music.setDetune(float); // Set the detune of all oscillators at once. Does _not_ affect the base frequencies. -Music.setDetune2(float); // Set the detune of oscillator 2 and 3 individually (oscillator 1 stays fixed) -Music.setDetune3(float); -Music.pitchBend(float); // This function detunes the pitch without affecting the detune parameters' individual - // 'spread'. Takes a float. - - -// WAVEFORM FUNCTIONS -// Switch between the different waveforms for the oscillators. It sets all of them at once. -Music.setSine(); -Music.setSaw(); -Music.setSquare(); - - -// GAIN FUNCTIONS -// Set the gain of the oscillators all at once or individually. You can send either floats or uint16_t to the -// function and it figures out to use the correct function automagically :) -Music.setGain(float); // 0.0 - 1.0 -Music.setGain1(float); // 0.0 - 1.0 -Music.setGain2(float); // 0.0 - 1.0 -Music.setGain3(float); // 0.0 - 1.0 -// using floats in your own calculations can be heavy on the processor, so there is the option of passing 16bit integers -// instead, since this is what it gets converted to anyway internally in the sound engine. -Music.setGain(uint16_t value); // 0 - 65535 -Music.setGain1(uint16_t value); // 0 - 65535 -Music.setGain2(uint16_t value); // 0 - 65535 -Music.setGain3(uint16_t value); // 0 - 65535 - - -// NOTE FUNCTIONS -// These functions triggers a note to be played. The noteOff() functions turns the note off again. -// They come both with note and velocity information (for noteOn). If you don't know what that is, -// just use the ones with the least arguments. -// To get a proper note sound call Music.enableEnvelopes() [see below] before calling the noteOn function. -// You just have to do that once in the setup for example. -Music.noteOn(uint8_t note, uint8_t vel); // 0 - 127 -Music.noteOn(uint8_t note); // 0 - 127 -Music.noteOff(uint8_t note); // 0 - 127 -Music.noteOff(); -// This function returns the frequency of a MIDI note number sent to it. -Music.getNoteFrequency(uint8_t); // 0 - 127 - - -// ENVELOPE FUNCTIONS -// These functions enables and sets the parameters of the internal envelope which creates dynamics for the notes -// being played. You can read about ADSR envelopes here: http://en.wikipedia.org/wiki/Synthesizer#ADSR_envelope -// When using the envelope you can only hear sound when you are triggering the notes with the note functions. In order -// to get dynamics without triggering the note object you must have the envelope turned off, for example using -// the Music.disableEnvelope() function [already set by default in the init() function]. You can then control the -// dynamics of the sound with the overall or individual setGain() functions. -Music.enableEnvelope(); -Music.disableEnvelope(); -// Setting the parameters for the envelope you send an 8bit number between 0 and 127 to the functions below. 0 is a very fast -// rise or decay in sound, whereas 127 is very long. Sustain is the sound level where 0 is silent and 127 is full gain. -// You must experiment with what suits your musical taste :) -// These parameters can of course be adjusted during the physics code for interesting results, but be aware that when -// using the sine wave oscillator (which is more processor intensive) the sound can hang or have glitches if you alter -// these parameters too quickly or set them at extremes. Try it out. -Music.setAttack(uint8_t att); // 0 - 127 -Music.setDecay(uint8_t dec); // 0 - 127 -Music.setSustain(uint8_t sus); // 0 - 127 -Music.setRelease(uint8_t rel); // 0 - 127 diff --git a/software/lib/MMM/examples/Music/Minimal/Minimal.ino b/software/lib/MMM/examples/Music/Minimal/Minimal.ino deleted file mode 100644 index 9eae6a3..0000000 --- a/software/lib/MMM/examples/Music/Minimal/Minimal.ino +++ /dev/null @@ -1,19 +0,0 @@ - -// This needs to be in all sketches at the moment -#include - -// The Music and Midi objects are automatically instantiated when the header file is included. -// Make calls to the Music and Midi objects with "Music.function(args)" and "Midi.function(args)" -// You still need to call Music.init() and Midi.init() in the setup() function below. -#include - -void setup() { - // We initialise the sound engine by calling Music.init() which outputs a tone - Music.init(); - -} - -void loop() { - -} - diff --git a/software/lib/MMM/examples/Music/Minimal_test/Minimal_test.ino b/software/lib/MMM/examples/Music/Minimal_test/Minimal_test.ino deleted file mode 100644 index 52ceecf..0000000 --- a/software/lib/MMM/examples/Music/Minimal_test/Minimal_test.ino +++ /dev/null @@ -1,33 +0,0 @@ - -// This needs to be in all sketches at the moment -#include - -// The Music and Midi objects are automatically instantiated when the header file is included. -// Make calls to the Music and Midi objects with "Music.function(args)" and "Midi.function(args)" -// You still need to call Music.init() and Midi.init() in the setup() function below. -#include -#include - -uint8_t i = 0; - -void setup() { - // We initialise the sound engine by calling Music.init() which outputs a tone - Music.init(); - Music.setFrequency(110); - Music.setGain1(1.0f); - Music.setGain2(1.0f); - Music.setGain3(1.0f); - Music.setWaveform1(0); - Music.setWaveform2(0); - Music.setWaveform3(0); - //Music.setDetune2(0.0015478); - //Music.setDetune3(-0.0012894); - -} - -void loop() { - - Midi.checkMidi(); - -} - diff --git a/software/lib/MMM/examples/Music/Repeating_note_with_envelope/Repeating_note_with_envelope.ino b/software/lib/MMM/examples/Music/Repeating_note_with_envelope/Repeating_note_with_envelope.ino deleted file mode 100644 index 6d49757..0000000 --- a/software/lib/MMM/examples/Music/Repeating_note_with_envelope/Repeating_note_with_envelope.ino +++ /dev/null @@ -1,50 +0,0 @@ - -// This needs to be in all sketches at the moment -#include - -// The Music and Midi objects are automatically instantiated when the header file is included. -// Make calls to the Music and Midi objects with "Music.function(args)" and "Midi.function(args)" -// You still need to call Music.init() and Midi.init() in the setup() function below. -#include - -// variables for this sketch -boolean noteIsOn = false; -int note = 48; - -long time = 0; -long lastTime = 0; -long beatTime = 1000; - - -void setup() { - - // We initialise the sound engine by calling Music.init() which outputs a tone - Music.init(); - - // enabling the envelope lets us define an gain envelope for the synth - // without having to specify it in our loop() or physics code. - Music.enableEnvelope(); - Music.setAttack(4); - Music.setDecay(64); - Music.setSustain(64); - Music.setRelease(64); - -} - -void loop() { - - // This short routine loops note over and over again - time = millis(); - if(time - lastTime > beatTime) { - if(!noteIsOn) { - Music.noteOn(note); - noteIsOn = true; - } else { - Music.noteOff(); - noteIsOn = false; - } - lastTime = time; - } - -} - diff --git a/software/lib/MMM/examples/Music/Spaghetti_tones/Spaghetti_tones.ino b/software/lib/MMM/examples/Music/Spaghetti_tones/Spaghetti_tones.ino deleted file mode 100644 index 9f3be8c..0000000 --- a/software/lib/MMM/examples/Music/Spaghetti_tones/Spaghetti_tones.ino +++ /dev/null @@ -1,64 +0,0 @@ - -// This needs to be in all sketches at the moment -#include - -// The Music and Midi objects are automatically instantiated when the header file is included. -// Make calls to the Music and Midi objects with "Music.function(args)" and "Midi.function(args)" -// You still need to call Music.init() and Midi.init() in the setup() function below. -#include - -// variables for this sketch -float gain = 1.0; -float c = 220; // center frequency -float f1 = 1; -float f2 = 1; -float f3 = 1; -float m1 = 1.0011; -float m2 = 1.0012; -float m3 = 1.0013; - - -void setup() { - - // We initialise the sound engine by calling Music.init() which outputs a tone - Music.init(); - - // Choosing the sine wave oscillator (optional since this is already the default). - Music.setWaveform(0); - - // Setting the initial frequency for all three oscillators. - Music.setFrequency(c); - - // Detuning the three oscillators slightly to create movement in the sound. - Music.setDetune(0.002); - -} - -void loop() { - - // This short routine creates a - - Music.setFrequency1(c*f1); - Music.setFrequency2(c*f2); - Music.setFrequency3(c*f3); - - f1 *= m1; - f2 *= m2; - f3 *= m3; - - if(f1 > 4.0) m1 = 0.9745; - if(f2 > 4.0) m2 = 0.9852; - if(f3 > 4.0) m3 = 0.9975; - - if(f1 < 0.25) m1 = 1.0754; - if(f2 < 0.25) m2 = 1.0573; - if(f3 < 0.25) m3 = 1.0386; - - if(millis() > 10000) { - Music.setGain(gain); - gain *= 0.999; - } - - -} - diff --git a/software/lib/MMM/examples/Music/Up_and_down/Up_and_down.ino b/software/lib/MMM/examples/Music/Up_and_down/Up_and_down.ino deleted file mode 100644 index 5bf6647..0000000 --- a/software/lib/MMM/examples/Music/Up_and_down/Up_and_down.ino +++ /dev/null @@ -1,62 +0,0 @@ - -// This needs to be in all sketches at the moment -#include - -// The Music and Midi objects are automatically instantiated when the header file is included. -// Make calls to the Music and Midi objects with "Music.function(args)" and "Midi.function(args)" -// You still need to call Music.init() and Midi.init() in the setup() function below. -#include - -// variables for this sketch -boolean noteIsOn = false; -int n = 0; -int dir = 1; -int rootNote = 48; -int note[] = {0,2,3,5,7,9,10,12,14}; - -long time = 0; -long lastTime = 0; -long beatTime = 100; - - -void setup() { - - // We initialise the sound engine by calling Music.init() which outputs a tone - Music.init(); - - // enabling the envelope lets us define an gain envelope for the synth - // without having to specify it in our loop() or physics code. - Music.enableEnvelope(); - Music.setAttack(4); - Music.setDecay(90); - Music.setSustain(64); - Music.setRelease(64); - -} - -void loop() { - - // This short routine loops note over and over again - time = millis(); - if(time - lastTime > beatTime) { - if(!noteIsOn) { - Music.noteOn(rootNote+note[n]); - noteIsOn = true; - n = n + dir; - if(n > 7) - { - dir = -1; - } - else if(n < 1) - { - dir = 1; - } - } else { - Music.noteOff(); - noteIsOn = false; - } - lastTime = time; - } - -} - diff --git a/software/lib/MMM/examples/Music/Up_and_down/sketch_jun26c/sketch_jun26c.ino b/software/lib/MMM/examples/Music/Up_and_down/sketch_jun26c/sketch_jun26c.ino deleted file mode 100644 index 12ba038..0000000 --- a/software/lib/MMM/examples/Music/Up_and_down/sketch_jun26c/sketch_jun26c.ino +++ /dev/null @@ -1,62 +0,0 @@ - -// This needs to be in all sketches at the moment -#include - -// The Music and Midi objects are automatically instantiated when the header file is included. -// Make calls to the Music and Midi objects with "Music.function(args)" and "Midi.function(args)" -// You still need to call Music.init() and Midi.init() in the setup() function below. -#include - -// variables for this sketch -boolean noteIsOn = false; -int n = 0; -int dir = 1; -int rootNote = 48; -int note[] = {0,2,3,5,7,9,10,12,14}; - -long time = 0; -long lastTime = 0; -long beatTime = 100; - - -void setup() { - - // We initialise the sound engine by calling Music.init() which outputs a tone - Music.init(); - - // enabling the envelope lets us define an gain envelope for the synth - // without having to specify it in our loop() or physics code. - Music.enableEnvelope(); - Music.setAttack(8); - Music.setDecay(70); - Music.setSustain(24); - Music.setRelease(90); - -} - -void loop() { - - // This short routine loops note over and over again - time = millis(); - if(time - lastTime > beatTime) { - if(!noteIsOn) { - Music.noteOn(rootNote+note[n]); - noteIsOn = true; - n = n + dir; - if(n > 7) - { - dir = -1; - } - else if(n < 1) - { - dir = 1; - } - } else { - Music.noteOff(); - noteIsOn = false; - } - lastTime = time; - } - -} - diff --git a/software/lib/MMM/examples/Music/Up_and_down__square/Up_and_down__square.ino b/software/lib/MMM/examples/Music/Up_and_down__square/Up_and_down__square.ino deleted file mode 100644 index b7c5a19..0000000 --- a/software/lib/MMM/examples/Music/Up_and_down__square/Up_and_down__square.ino +++ /dev/null @@ -1,68 +0,0 @@ - -// This needs to be in all sketches at the moment -#include - -// The Music and Midi objects are automatically instantiated when the header file is included. -// Make calls to the Music and Midi objects with "Music.function(args)" and "Midi.function(args)" -// You still need to call Music.init() and Midi.init() in the setup() function below. -#include - -// variables for this sketch -boolean noteIsOn = false; -int n = 0; -int dir = 1; -int rootNote = 26; -int note[] = {0,2,3,5,7,9,10,12,14}; - -long time = 0; -long lastTime = 0; -long beatTime = 80; - - -void setup() { - - // We initialise the sound engine by calling Music.init() which outputs a tone - Music.init(); - - // Choosing the square wave oscillator. - Music.setWaveform(1); - - // Detuning the three oscillators slightly to create movement in the sound. - Music.setDetune(0.008); - - // enabling the envelope lets us define an gain envelope for the synth - // without having to specify it in our loop() or physics code. - Music.enableEnvelope(); - Music.setAttack(8); - Music.setDecay(90); - Music.setSustain(48); - Music.setRelease(64); - -} - -void loop() { - - // This short routine loops note over and over again - time = millis(); - if(time - lastTime > beatTime) { - if(!noteIsOn) { - Music.noteOn(rootNote+note[n]); - noteIsOn = true; - n = n + dir; - if(n > 7) - { - dir = -1; - } - else if(n < 1) - { - dir = 1; - } - } else { - Music.noteOff(); - noteIsOn = false; - } - lastTime = time; - } - -} -