ESP8266 - WAV abspielen

Hallo!
Ich habe ein neues Problem: Ich möchte eine WAV-Datei von einer µSD-Karte abspielen. Über einen Pin soll dann mit einer PWM-Rate von 200 kHz die Datei abgespielt werden. Nur will das nicht so, wie ich es will. Ich habe damit angefangen, mich bei Wikipedia schlau zu machen. Da habe ich herausgefunden, dass es die Daten erst nach einem “data” in der Datei kommen, dass das höherwertige byte nach dem niederwertigen kommt und dass links vor rechts kommt, was aber bei Mono-Dateien egal sein dürfte. Meine Datei hat eine Abtastrate von 22050 Hz und ist 16-bit-mono. Das hat mich zu folgendem Programm veranlasst:

#include <SD.h>

File file;
void setup() {
  Serial.begin(1000000);
  Serial.println();
  Serial.println();
  Serial.print("SD ... ");
  while(!SD.begin(SS)){
    yield();
  }
  Serial.println("OK");
  analogWriteFreq(200000);
  file = SD.open("shades.wav", FILE_READ);
  char ch[4];
  while(true){
    for(byte i = 3;i > 0;i--){
      ch[i] = ch[i - 1];
    }
    ch[0] = file.read();
    if(ch[3] == 'd' && 
       ch[2] == 'a' && 
       ch[1] == 't' && 
       ch[0] == 'a'){
      Serial.println("habs");
      Serial.println(file.position());
      break;
    }
    for(byte i = 0;i < 4;i++){
      Serial.write(ch[3 - i]);
    }
    Serial.println();
    delay(50);
  }
}

void loop() {
  uint16_t buffer[1024];
  file.read((byte*)buffer, 2048);
  //Serial.println("1");
  for(uint16_t i = 1;i < 1024;i++){
    byte j = buffer[i] >> 8;
    buffer[i] <<= 8;
    buffer[i] |= j;
  }
  //Serial.println("2");
  for(uint16_t i = 1;i < 1024;i++){
    analogWrite(16, map(buffer[i], -64, 63, 0, 1));
    Serial.println(buffer[i]);
    delayMicroseconds(1000000 / 22050);
  }
}

Ich habe das Musikstück “Shades” von Chris Hülsbeck auf einer SD-Karte gespeichert. Die Datenübertragung zum seriellen Monitor / Plotter erfolgt mit 1000000 Baud, da die Datei auch an den Plotter geschickt werden soll. Und das, was beim Plotter ankommt, ist auf keinen Fall “Shades”. Das Stück beginnt mit einer Rechteck-Wellenform, ich bekomme nur Zacken von oben (~30000) bis unten (~-30000) angezeigt. Braucht ihr mehr Infos, um mir helfen zu können? Ich würde mich auch über einen Link zu einer guten Lib freuen.

Hallo,

sie sind auch als signed gespeichert, also von −32.768 bis +32.767 bei 16Bit. Wenn Du da PWM-Werte drauds berechnen willst, mußt Du also auch noch 32.768 zum Wert addieren, Dein PWM-Wert ist ja unsignet 0...x

Lib beim ESP8266 wäre z.B. die ESP8266Audio, die macht da aber intern nur eine selobstgebaute Ausgabe über einen Pin, klang für mich zu schlecht. Ich hänge da normalerweise einen I2S DAC (UDA1334A) dran oder den MAX98357A, da hat man dann auch CD-Qualität, zumindest wenn die im File so vorhanden ist.
Leider nicht ganz so billig die I2S-Module.

Gruß aus Berlin
Michael

amithlon:
Wenn Du da PWM-Werte drauds berechnen willst, mußt Du also auch noch 32.768 zum Wert addieren, Dein PWM-Wert ist ja unsignet 0...x

Das wird mit map erledigt. Außerdem geht es mir gerade nicht um die Ausgabe am Pin, sondern darum, dass der Plotter realistische Werte empfängt. Jetzt gerade kommt nur rauschen.
Ich brauche keine CD-Qualität, aber es sollte so sein, dass sich Sprache verständlich ausgeben lässt. Die Sprache dürfte hinterher in Summe mindestens 10 Minuten lang gehen, SPIFFS ist also keine Option.