Difference between revisions of "SuperMario Contest"

From Hackerspace ACKspace
Jump to: navigation, search
(added category, removed html markup)
 
(5 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 : hard-disk
+
*eagle00789 : [[Super Mario on floppy-drive|Floppy Drive(s)]]
* Brainguy   : Artificially Intelligent midi system
+
*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 &lt;Tone.h&gt;
 +
 
 +
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 &gt;= '0' &amp;&amp; n &lt;= '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 &gt; 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 &gt;= 3 &amp;&amp; num &lt;=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);
}