Difference between revisions of "SuperMario Contest"
(added source code) |
|||
| Line 4: | Line 4: | ||
|Description=SuperMario Geek Contest | |Description=SuperMario Geek Contest | ||
}} | }} | ||
| − | morely a project for the future, a SuperMario Geek contest | + | morely a project for the future, a SuperMario Geek contest Play the super mario theme on an highly unusual instrument like a hard-disk, a matrixprinter, Teslacoil, dishwasher or dieselengine |
| − | Play the super mario theme on an highly unusual instrument like | ||
| − | a hard-disk, a matrixprinter, Teslacoil, dishwasher or dieselengine | ||
| − | Due to current lack of inspiration i personaly whould startof with a teslacoil version. | + | Due to current lack of inspiration i personaly whould startof with a teslacoil version. |
| − | Please add youre name to the members list if you think this is a good idea. | + | Please add youre name to the members list if you think this is a good idea. also add your planned instrument below. |
| − | also add your planned instrument below. | ||
| − | * CoolePascal : TeslaCoil | + | *CoolePascal : TeslaCoil |
| − | * eagle00789 : hard-disk | + | *eagle00789 : hard-disk |
| − | * Brainguy | + | *Brainguy : Artificially Intelligent midi system |
| − | * [[User:Vicarious|Vicarious]] : Arduino Uno | + | *[[User:Vicarious|Vicarious]] : Arduino Uno |
| + | |||
| + | Put the code below on the Arduino. Connect a speaker to the Arduino. See [http://code.google.com/p/rogue-code/wiki/ToneLibraryDocumentation ToneLibraryDocumentation] for details. | ||
| + | <pre>// A fun sketch to demonstrate the use of the Tone library. | ||
| + | // To mix the output of the signals to output to a small speaker (i.e. 8 Ohms or higher), | ||
| + | // simply use 1K Ohm resistors from each output pin and tie them together at the speaker. | ||
| + | // Don't forget to connect the other side of the speaker to ground! | ||
| + | |||
| + | // You can get more RTTTL (RingTone Text Transfer Language) songs from | ||
| + | // http://code.google.com/p/rogue-code/wiki/ToneLibraryDocumentation | ||
| + | |||
| + | #include <Tone.h> | ||
| + | |||
| + | Tone tone1; | ||
| + | |||
| + | #define OCTAVE_OFFSET 0 | ||
| + | |||
| + | int notes[] = { 0, | ||
| + | NOTE_C4, NOTE_CS4, NOTE_D4, NOTE_DS4, NOTE_E4, NOTE_F4, NOTE_FS4, NOTE_G4, NOTE_GS4, NOTE_A4, NOTE_AS4, NOTE_B4, | ||
| + | NOTE_C5, NOTE_CS5, NOTE_D5, NOTE_DS5, NOTE_E5, NOTE_F5, NOTE_FS5, NOTE_G5, NOTE_GS5, NOTE_A5, NOTE_AS5, NOTE_B5, | ||
| + | NOTE_C6, NOTE_CS6, NOTE_D6, NOTE_DS6, NOTE_E6, NOTE_F6, NOTE_FS6, NOTE_G6, NOTE_GS6, NOTE_A6, NOTE_AS6, NOTE_B6, | ||
| + | NOTE_C7, NOTE_CS7, NOTE_D7, NOTE_DS7, NOTE_E7, NOTE_F7, NOTE_FS7, NOTE_G7, NOTE_GS7, NOTE_A7, NOTE_AS7, NOTE_B7 | ||
| + | }; | ||
| + | |||
| + | char *song = "smb:d=4,o=5,b=100:16e6,16e6,32p,8e6,16c6,8e6,8g6,8p,8g,8p,8c6,16p,8g,16p,8e,16p,8a,8b,16a#,8a,16g.,16e6,16g6,8a6,16f6,8g6,8e6,16c6,16d6,8b,16p,8c6,16p,8g,16p,8e,16p,8a,8b,16a#,8a,16g.,16e6,16g6,8a6,16f6,8g6,8e6,16c6,16d6,8b,8p,16g6,16f#6,16f6,16d#6,16p,16e6,16p,16g#,16a,16c6,16p,16a,16c6,16d6,8p,16g6,16f#6,16f6,16d#6,16p,16e6,16p,16c7,16p,16c7,16c7,p,16g6,16f#6,16f6,16d#6,16p,16e6,16p,16g#,16a,16c6,16p,16a,16c6,16d6,8p,16d#6,8p,16d6,8p,16c6"; | ||
| + | |||
| + | void setup(void) | ||
| + | { | ||
| + | Serial.begin(9600); | ||
| + | tone1.begin(13); | ||
| + | } | ||
| + | |||
| + | #define isdigit(n) (n >= '0' && n <= '9') | ||
| + | |||
| + | void play_rtttl(char *p) | ||
| + | { | ||
| + | // Absolutely no error checking in here | ||
| + | |||
| + | byte default_dur = 4; | ||
| + | byte default_oct = 6; | ||
| + | int bpm = 63; | ||
| + | int num; | ||
| + | long wholenote; | ||
| + | long duration; | ||
| + | byte note; | ||
| + | byte scale; | ||
| + | |||
| + | // format: d=N,o=N,b=NNN: | ||
| + | // find the start (skip name, etc) | ||
| + | |||
| + | while(*p != ':') p++; // ignore name | ||
| + | p++; // skip ':' | ||
| + | |||
| + | // get default duration | ||
| + | if(*p == 'd') | ||
| + | { | ||
| + | p++; p++; // skip "d=" | ||
| + | num = 0; | ||
| + | while(isdigit(*p)) | ||
| + | { | ||
| + | num = (num * 10) + (*p++ - '0'); | ||
| + | } | ||
| + | if(num > 0) default_dur = num; | ||
| + | p++; // skip comma | ||
| + | } | ||
| + | |||
| + | Serial.print("ddur: "); Serial.println(default_dur, 10); | ||
| + | |||
| + | // get default octave | ||
| + | if(*p == 'o') | ||
| + | { | ||
| + | p++; p++; // skip "o=" | ||
| + | num = *p++ - '0'; | ||
| + | if(num >= 3 && num <=7) default_oct = num; | ||
| + | p++; // skip comma | ||
| + | } | ||
| + | |||
| + | Serial.print("doct: "); Serial.println(default_oct, 10); | ||
| + | |||
| + | // get BPM | ||
| + | if(*p == 'b') | ||
| + | { | ||
| + | p++; p++; // skip "b=" | ||
| + | num = 0; | ||
| + | while(isdigit(*p)) | ||
| + | { | ||
| + | num = (num * 10) + (*p++ - '0'); | ||
| + | } | ||
| + | bpm = num; | ||
| + | p++; // skip colon | ||
| + | } | ||
| + | |||
| + | Serial.print("bpm: "); Serial.println(bpm, 10); | ||
| + | |||
| + | // BPM usually expresses the number of quarter notes per minute | ||
| + | wholenote = (60 * 1000L / bpm) * 4; // this is the time for whole note (in milliseconds) | ||
| + | |||
| + | Serial.print("wn: "); Serial.println(wholenote, 10); | ||
| + | |||
| + | |||
| + | // now begin note loop | ||
| + | while(*p) | ||
| + | { | ||
| + | // first, get note duration, if available | ||
| + | num = 0; | ||
| + | while(isdigit(*p)) | ||
| + | { | ||
| + | num = (num * 10) + (*p++ - '0'); | ||
| + | } | ||
| + | |||
| + | if(num) duration = wholenote / num; | ||
| + | else duration = wholenote / default_dur; // we will need to check if we are a dotted note after | ||
| + | |||
| + | // now get the note | ||
| + | note = 0; | ||
| + | |||
| + | switch(*p) | ||
| + | { | ||
| + | case 'c': | ||
| + | note = 1; | ||
| + | break; | ||
| + | case 'd': | ||
| + | note = 3; | ||
| + | break; | ||
| + | case 'e': | ||
| + | note = 5; | ||
| + | break; | ||
| + | case 'f': | ||
| + | note = 6; | ||
| + | break; | ||
| + | case 'g': | ||
| + | note = 8; | ||
| + | break; | ||
| + | case 'a': | ||
| + | note = 10; | ||
| + | break; | ||
| + | case 'b': | ||
| + | note = 12; | ||
| + | break; | ||
| + | case 'p': | ||
| + | default: | ||
| + | note = 0; | ||
| + | } | ||
| + | p++; | ||
| + | |||
| + | // now, get optional '#' sharp | ||
| + | if(*p == '#') | ||
| + | { | ||
| + | note++; | ||
| + | p++; | ||
| + | } | ||
| + | |||
| + | // now, get optional '.' dotted note | ||
| + | if(*p == '.') | ||
| + | { | ||
| + | duration += duration/2; | ||
| + | p++; | ||
| + | } | ||
| + | |||
| + | // now, get scale | ||
| + | if(isdigit(*p)) | ||
| + | { | ||
| + | scale = *p - '0'; | ||
| + | p++; | ||
| + | } | ||
| + | else | ||
| + | { | ||
| + | scale = default_oct; | ||
| + | } | ||
| + | |||
| + | scale += OCTAVE_OFFSET; | ||
| + | |||
| + | if(*p == ',') | ||
| + | p++; // skip comma for next note (or we may be at the end) | ||
| + | |||
| + | // now play the note | ||
| + | |||
| + | if(note) | ||
| + | { | ||
| + | Serial.print("Playing: "); | ||
| + | Serial.print(scale, 10); Serial.print(' '); | ||
| + | Serial.print(note, 10); Serial.print(" ("); | ||
| + | Serial.print(notes[(scale - 4) * 12 + note], 10); | ||
| + | Serial.print(") "); | ||
| + | Serial.println(duration, 10); | ||
| + | tone1.play(notes[(scale - 4) * 12 + note]); | ||
| + | delay(duration); | ||
| + | tone1.stop(); | ||
| + | } | ||
| + | else | ||
| + | { | ||
| + | Serial.print("Pausing: "); | ||
| + | Serial.println(duration, 10); | ||
| + | delay(duration); | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | |||
| + | void loop(void) | ||
| + | { | ||
| + | play_rtttl(song); | ||
| + | Serial.println("Done."); | ||
| + | while(1); | ||
| + | } | ||
| + | |||
| + | |||
| + | </pre> | ||
Revision as of 23:53, 15 September 2011
| Project: SuperMario Contest | |
|---|---|
| Featured: | |
| State | Stalled |
| Members | Coolepascal |
| GitHub | No GitHub project defined. Add your project here. |
| Description | SuperMario Geek Contest |
| Picture | |
| No project picture! Fill in form Picture or Upload a jpeg here | |
morely a project for the future, a SuperMario Geek contest Play the super mario theme on an highly unusual instrument like a hard-disk, a matrixprinter, Teslacoil, dishwasher or dieselengine
Due to current lack of inspiration i personaly whould startof with a teslacoil version.
Please add youre name to the members list if you think this is a good idea. also add your planned instrument below.
- CoolePascal : TeslaCoil
- eagle00789 : hard-disk
- Brainguy : Artificially Intelligent midi system
- Vicarious : Arduino Uno
Put the code below on the Arduino. Connect a speaker to the Arduino. See ToneLibraryDocumentation for details.
// A fun sketch to demonstrate the use of the Tone library.
// To mix the output of the signals to output to a small speaker (i.e. 8 Ohms or higher),
// simply use 1K Ohm resistors from each output pin and tie them together at the speaker.
// Don't forget to connect the other side of the speaker to ground!
// You can get more RTTTL (RingTone Text Transfer Language) songs from
// http://code.google.com/p/rogue-code/wiki/ToneLibraryDocumentation
#include <Tone.h>
Tone tone1;
#define OCTAVE_OFFSET 0
int notes[] = { 0,
NOTE_C4, NOTE_CS4, NOTE_D4, NOTE_DS4, NOTE_E4, NOTE_F4, NOTE_FS4, NOTE_G4, NOTE_GS4, NOTE_A4, NOTE_AS4, NOTE_B4,
NOTE_C5, NOTE_CS5, NOTE_D5, NOTE_DS5, NOTE_E5, NOTE_F5, NOTE_FS5, NOTE_G5, NOTE_GS5, NOTE_A5, NOTE_AS5, NOTE_B5,
NOTE_C6, NOTE_CS6, NOTE_D6, NOTE_DS6, NOTE_E6, NOTE_F6, NOTE_FS6, NOTE_G6, NOTE_GS6, NOTE_A6, NOTE_AS6, NOTE_B6,
NOTE_C7, NOTE_CS7, NOTE_D7, NOTE_DS7, NOTE_E7, NOTE_F7, NOTE_FS7, NOTE_G7, NOTE_GS7, NOTE_A7, NOTE_AS7, NOTE_B7
};
char *song = "smb:d=4,o=5,b=100:16e6,16e6,32p,8e6,16c6,8e6,8g6,8p,8g,8p,8c6,16p,8g,16p,8e,16p,8a,8b,16a#,8a,16g.,16e6,16g6,8a6,16f6,8g6,8e6,16c6,16d6,8b,16p,8c6,16p,8g,16p,8e,16p,8a,8b,16a#,8a,16g.,16e6,16g6,8a6,16f6,8g6,8e6,16c6,16d6,8b,8p,16g6,16f#6,16f6,16d#6,16p,16e6,16p,16g#,16a,16c6,16p,16a,16c6,16d6,8p,16g6,16f#6,16f6,16d#6,16p,16e6,16p,16c7,16p,16c7,16c7,p,16g6,16f#6,16f6,16d#6,16p,16e6,16p,16g#,16a,16c6,16p,16a,16c6,16d6,8p,16d#6,8p,16d6,8p,16c6";
void setup(void)
{
Serial.begin(9600);
tone1.begin(13);
}
#define isdigit(n) (n >= '0' && n <= '9')
void play_rtttl(char *p)
{
// Absolutely no error checking in here
byte default_dur = 4;
byte default_oct = 6;
int bpm = 63;
int num;
long wholenote;
long duration;
byte note;
byte scale;
// format: d=N,o=N,b=NNN:
// find the start (skip name, etc)
while(*p != ':') p++; // ignore name
p++; // skip ':'
// get default duration
if(*p == 'd')
{
p++; p++; // skip "d="
num = 0;
while(isdigit(*p))
{
num = (num * 10) + (*p++ - '0');
}
if(num > 0) default_dur = num;
p++; // skip comma
}
Serial.print("ddur: "); Serial.println(default_dur, 10);
// get default octave
if(*p == 'o')
{
p++; p++; // skip "o="
num = *p++ - '0';
if(num >= 3 && num <=7) default_oct = num;
p++; // skip comma
}
Serial.print("doct: "); Serial.println(default_oct, 10);
// get BPM
if(*p == 'b')
{
p++; p++; // skip "b="
num = 0;
while(isdigit(*p))
{
num = (num * 10) + (*p++ - '0');
}
bpm = num;
p++; // skip colon
}
Serial.print("bpm: "); Serial.println(bpm, 10);
// BPM usually expresses the number of quarter notes per minute
wholenote = (60 * 1000L / bpm) * 4; // this is the time for whole note (in milliseconds)
Serial.print("wn: "); Serial.println(wholenote, 10);
// now begin note loop
while(*p)
{
// first, get note duration, if available
num = 0;
while(isdigit(*p))
{
num = (num * 10) + (*p++ - '0');
}
if(num) duration = wholenote / num;
else duration = wholenote / default_dur; // we will need to check if we are a dotted note after
// now get the note
note = 0;
switch(*p)
{
case 'c':
note = 1;
break;
case 'd':
note = 3;
break;
case 'e':
note = 5;
break;
case 'f':
note = 6;
break;
case 'g':
note = 8;
break;
case 'a':
note = 10;
break;
case 'b':
note = 12;
break;
case 'p':
default:
note = 0;
}
p++;
// now, get optional '#' sharp
if(*p == '#')
{
note++;
p++;
}
// now, get optional '.' dotted note
if(*p == '.')
{
duration += duration/2;
p++;
}
// now, get scale
if(isdigit(*p))
{
scale = *p - '0';
p++;
}
else
{
scale = default_oct;
}
scale += OCTAVE_OFFSET;
if(*p == ',')
p++; // skip comma for next note (or we may be at the end)
// now play the note
if(note)
{
Serial.print("Playing: ");
Serial.print(scale, 10); Serial.print(' ');
Serial.print(note, 10); Serial.print(" (");
Serial.print(notes[(scale - 4) * 12 + note], 10);
Serial.print(") ");
Serial.println(duration, 10);
tone1.play(notes[(scale - 4) * 12 + note]);
delay(duration);
tone1.stop();
}
else
{
Serial.print("Pausing: ");
Serial.println(duration, 10);
delay(duration);
}
}
}
void loop(void)
{
play_rtttl(song);
Serial.println("Done.");
while(1);
}