Difference between revisions of "SuperMario Contest"
Coolepascal (talk | contribs) |
(added category, removed html markup) |
||
(10 intermediate revisions by 5 users not shown) | |||
Line 1: | Line 1: | ||
{{Project | {{Project | ||
− | |State= | + | |State=Stalled |
|Members=Coolepascal | |Members=Coolepascal | ||
|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 : [[Super Mario on floppy-drive|Floppy Drive(s)]] | ||
+ | *Brainguy : Artificially Intelligent midi system | ||
+ | *[[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> | ||
+ | |||
+ | [[Category:Arduino]] | ||
+ | [[Category:Challenge]] |
Latest revision as of 11:21, 4 November 2015
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 : Floppy Drive(s)
- 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); }