Teddy Bear mp3

sven1977:
Aber mit Bascom konnte ich das mit dem Interrupt machen, der im 44100 Mhz die Daten auf den analogen Pin schaufelt.

Wow, 44100 Mhz! Also über 44 Gigahertz zaubert Bascom aus einem einfachen Controller!

Mit solchen Super-Fähigkeiten wie Dein BASCOM kann ARDUINO natürlich überhaupt nicht mithalten!
:wink:

Anyway, weil das hier ein ARDUINO und kein BASCOM-Forum ist, poste ich dann hier mal zum Testen ein bischen was zum Töne machen für eines der schlappen ARDUINO-Boards, die bei 44100 Mhz nicht mithalten können.

Ohne SD-Karte.
Ohne Library.
Nur die tone()-Funktion von Arduino.

// Arduino-Code zum Abspielen von Melodien
// ueber Kopfhoerer oder Kleinlautsprecher per PWM
// frei nach "Tuerklingel von M. Baudisch 12/2008"

// Benoetigte Bauteile: 
// 1. Arduino-Board
// 2. Kleinstlautsprecher 8 Ohm
// 3. Elektrolytkondensator 1 ... 100 uF (Mikrofarad)
// Reihenschaltung vom LAUTSPRECHERPIN am Board, Kondensator, Lautsprecher zu Ground
// Achtung: Elektrolytkondensator immer polrichtig anschließen!
// Pluspolseite des Kondensators zum Ausgangspin am Board
// Minuspolseite des Kondensators zur GND-Seite
// Falls kein Kondensator zur Hand, ggf. 100 KOhm Widerstand verwenden
// (mit Widerstand statt Kondensator ist die Lautstaerke aber deutlich geringer)
// Alternative Beschaltung: 
// Statt eines Lautsprechers Anschluss am Line-In Eingang eines Verstaerkers

#define LAUTSPRECHERPIN 9

uint16_t ton[]=
{
262, // c 	 Timerwerte fuer die enspr. Tonhoehen in Hz
277, //cis
294, //d
311, //dis
330, //e
349, //f
370, //fis
392, //g
416, //gis
440, //a
466, //b
495, //h
524, //c'
554, //cis'
588, //d'
622, //dis'
660, //e'
698, //f'
740, //fis'
784, //g'
831, //gis'
880, //a'
929, //b'
992, //h'
1050, //c''
1106, //cis''
1179, //d''
1244, //dis''
1316, //e'
1397, //f''
1562, //g'' auf position von fis'' verschoben
};

uint8_t zeit[] =  // Notenlaengen
// beim Abspielen werden die Notenlaengen mit einem Faktor
// multipliziert, um die Notenlaenge im Millisekunden zu erhalten
{
2, //1/32 Note
3, //1/32. dito punktiert
4, //1/16 Note
6, //1/16. dite punktiert
8, //1/8 Achtelnote
12,//1/8.
16,//1/4 Viertelnote
24,//1/4.
};

//Format Lied :
//1. Byte: speed 2 schnell, 3..5 normal
//2. Byte - n Byte Noten

//Aufbau eines Notenbytes:

//Bit
// 7  6  5  4  3  2  1  0
// |__|__|  |__|__|__|__|_Tonhoehe ( 1..31 (C..G'') incl. aller Halbtonschritte
//    |                                             ausser 31: G'' statt FIS''
//    |                                     wenn 0, kein Ton sondern Pause
//    |
//    |___________________________________________Tonlaenge
//
//                                                7: 1/4.
//                                                6: 1/4
//                                                5: 1/8.
//                                                4: 1/8
//                                                3: 1/16.
//                                                2: 1/16
//                                                1: 1/32.
//                                                0: 1/32
//




void playTeddy(byte *lied, byte anzNoten)
// Parameter *lied ==> Bytepointer auf die Noten des Lieds
// Parameter anzNoten ==> Anzahl der Noten im Lied
{
  byte lspeed=0;
  byte dauer;
  byte hoehe;
  byte note ;
  byte i;
  lspeed= pgm_read_byte(lied); // im ersten Byte die Abspielgeschwindigkeit lesen
//  Serial.print("Speed: ");Serial.print(lspeed);Serial.println();
//  Serial.print("Anzahl Noten: ");Serial.print(anzNoten);Serial.println();
  for (i=1;i<anzNoten;i++)
  {
    note=pgm_read_byte(lied+i); //Note holen
//    Serial.println(note);
    hoehe=note & 0x1f; //Tonhöhe ausmaskieren (5 Bit)
    dauer= zeit[(note >> 5)]; // 5 Bit nach rechts schieben und Zeit holen
    if (hoehe) //wenn keine Pause 
    {
       tone(LAUTSPRECHERPIN,ton[hoehe-1]);
       delay(int(dauer)*int(lspeed)*int(25));
       noTone(LAUTSPRECHERPIN);
       delay(25);
    }
    else
     delay(dauer);
  }    
  noTone(LAUTSPRECHERPIN);
}


// Ein paar wenige kurze Melodien, 
// um RAM-Speicher zu sparen als "PROGMEM"-Variablen deklariert
byte lied_1[] PROGMEM={3,13,82,22,82,13,76,148,18,81,20,81,13,74,146,13,82,22,82,13,76,148,18,81,13,79,17,210};
byte lied_2[] PROGMEM={2,10,8,202,202,8,6,3,5,194,0,163,192,10,8,202,202,101,102,98,195};
byte lied_3[] PROGMEM={4,65,65,3,6,5,3,72,72,8,10,5,6,67,67,3,6,5,3,1,12,10,8,6,5,3,129};
byte lied_4[] PROGMEM={3,5,106,5,113,10,78,12,14,74,69,74,83,81,14,15,177,0,5,74,83,81,14,15,81,12,14,74,69,74,14,15,108,10,138};
byte lied_5[] PROGMEM={4,100,3,1,3,4,8,107,10,8,10,11,15,178,64,102,5,3,5,6,10,109,12,10,12,13,17,180,128};
byte lied_6[] PROGMEM={3,70,6,6,70,6,6,6,6,6,6,6,10,1,1,70,6,6,70,6,6,6,6,6,6,3,1,64,70,6,6,70,6,6,6,6,6,6,6,10,64,173,74,13,10,6,64,128};
byte lied_7[] PROGMEM={2,8,74,8,69,77,74,168,8,10,8,10,72,77,172,64,6,72,6,67,76,74,168,8,10,8,10,72,74,165};
byte lied_8[] PROGMEM={2,1,1,65,1,1,65,1,1,6,72,74,0,1,1,65,1,1,65,10,10,8,69,65,0,1,1,65,1,1,65,1,1,6,72,74,0,6,10,77,13,13,13,11,10,8,6,106,6};
byte lied_9[] PROGMEM={3,81,17,17,17,17,17,81,74,77,81,79,15,15,15,15,15,15,8,0,76,79,81,17,17,17,17,17,17,19,20,22,0,84,81,15,12,0,74,0,74};
byte lied_10[] PROGMEM={5,6,8,8,6,72,0,8,6,8,10,8,6,5,6,6,5,70,0,6,5,6,8,6,69,0,3,5,5,3,69,0,3,5,6,5,3,0,139};

void setup() {
  Serial.begin(9600); // Serielle Schnittstelle initialisieren
}

void loop() 
{
  // Spielt die 10 kurzen Melodien in Endlosschleife
  playTeddy(lied_1,sizeof(lied_1));
  delay(2000); // Kurze Pause nach der Melodie
  playTeddy(lied_2,sizeof(lied_2));
  delay(2000); // Kurze Pause nach der Melodie
  playTeddy(lied_3,sizeof(lied_3));
  delay(2000); // Kurze Pause nach der Melodie
  playTeddy(lied_4,sizeof(lied_4));
  delay(2000); // Kurze Pause nach der Melodie
  playTeddy(lied_5,sizeof(lied_5));
  delay(2000); // Kurze Pause nach der Melodie
  playTeddy(lied_6,sizeof(lied_6));
  delay(2000); // Kurze Pause nach der Melodie
  playTeddy(lied_7,sizeof(lied_7));
  delay(2000); // Kurze Pause nach der Melodie
  playTeddy(lied_8,sizeof(lied_8));
  delay(2000); // Kurze Pause nach der Melodie
  playTeddy(lied_9,sizeof(lied_9));
  delay(2000); // Kurze Pause nach der Melodie
  playTeddy(lied_10,sizeof(lied_10));
  delay(2000); // Kurze Pause nach der Melodie
}

Damit ihr Euren Lautsprecher wenigstens mal etwas testen könnt, bevor ihr anfangt, etwas mit der SD-Karte zu machen.