Difference between revisions of "SuperMario Contest"
|  (added category, removed html markup) | |||
| (6 intermediate revisions by 3 users not shown) | |||
| 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 :  | + | *eagle00789 : [[Super Mario on floppy-drive|Floppy Drive(s)]]  | 
| − | * Brainguy  | + | *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);
}
