created new center example

This commit is contained in:
Jakob Bak 2013-01-25 11:13:57 +01:00
parent 769578fcf7
commit 0f8eb0f54d
13 changed files with 47 additions and 527 deletions

View File

@ -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);
}

View File

@ -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();
}

View File

@ -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

View File

@ -1,34 +0,0 @@
// This needs to be in all sketches at the moment
#include <stdint.h>
// 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 <Music.h>
#include <Midi.h>
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();
}

View File

@ -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 <stdint.h>
#include <Music.h>
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;
}

View File

@ -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

View File

@ -1,19 +0,0 @@
// This needs to be in all sketches at the moment
#include <stdint.h>
// 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 <Music.h>
void setup() {
// We initialise the sound engine by calling Music.init() which outputs a tone
Music.init();
}
void loop() {
}

View File

@ -1,33 +0,0 @@
// This needs to be in all sketches at the moment
#include <stdint.h>
// 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 <Music.h>
#include <Midi.h>
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();
}

View File

@ -1,50 +0,0 @@
// This needs to be in all sketches at the moment
#include <stdint.h>
// 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 <Music.h>
// 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;
}
}

View File

@ -1,64 +0,0 @@
// This needs to be in all sketches at the moment
#include <stdint.h>
// 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 <Music.h>
// 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;
}
}

View File

@ -1,62 +0,0 @@
// This needs to be in all sketches at the moment
#include <stdint.h>
// 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 <Music.h>
// 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;
}
}

View File

@ -1,62 +0,0 @@
// This needs to be in all sketches at the moment
#include <stdint.h>
// 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 <Music.h>
// 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;
}
}

View File

@ -1,68 +0,0 @@
// This needs to be in all sketches at the moment
#include <stdint.h>
// 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 <Music.h>
// 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;
}
}