Arduino library to play MOD, WAV, FLAC, MIDI, RTTTL, MP3, and AAC files on I2S DACs or with a software emulated delta-sigma DAC on the ESP8266 and ESP32
GNU General Public License v3.0
2.01k
stars
432
forks
source link
Live sine wave generator and play with PlayWAVFromFunction? #524
I would like to play a sine wave and its kind of working in the example PlayWAVFromFunction.
In the example a 8sec sinewave got generated.
I want to do the sinewave in loop and change the frequency later on.
But I dont got any sound with ConsumeSample.
I thought that my idea to convert the float to int was wrong. So I tried an file with values for sine wave. With no luck again.
Somebody are able to tell me if its possible?
`#include
include "AudioFileSourceFunction.h"
include "AudioOutputI2S.h"
float hz = 440.f;
// pre-defined function can also be used to generate the wave
float sine_wave(const float time) {
float v = sin(TWO_PI hz time); // C
//v = fmod(time, 0.5f); // change linear
v = 0.3; // scale
return v;
};
Dear all,
I found the discussion about ConsumeSample and found the sine_wave function in PlayWAVFromFunction example pointed out in this issue:
https://github.com/earlephilhower/ESP8266Audio/issues/390
I would like to play a sine wave and its kind of working in the example PlayWAVFromFunction. In the example a 8sec sinewave got generated. I want to do the sinewave in loop and change the frequency later on. But I dont got any sound with ConsumeSample.
I thought that my idea to convert the float to int was wrong. So I tried an file with values for sine wave. With no luck again. Somebody are able to tell me if its possible?
`#include
include "AudioFileSourceFunction.h"
include "AudioOutputI2S.h"
float hz = 440.f;
// pre-defined function can also be used to generate the wave float sine_wave(const float time) { float v = sin(TWO_PI hz time); // C //v = fmod(time, 0.5f); // change linear v = 0.3; // scale return v; };
AudioFileSourceFunction file; AudioOutputI2S out;
void setup() { Serial.begin(115200); delay(1000);
out = new AudioOutputI2S(); out->SetGain(0.5); }
void loop() { uint16_t temp = (uint32_t)sine_wave<< 16; int16_t stereo[2] = {temp,temp}; bool flag=out->ConsumeSample(stereo); }`
`#include
include "AudioFileSourcePROGMEM.h"
include "AudioGeneratorMOD.h"
include "AudioOutputI2S.h"
ifdef ESP32
else
endif
int16_t sine[256] = { 0x0000, 0x0324, 0x0647, 0x096a, 0x0c8b, 0x0fab, 0x12c8, 0x15e2, 0x18f8, 0x1c0b, 0x1f19, 0x2223, 0x2528, 0x2826, 0x2b1f, 0x2e11, 0x30fb, 0x33de, 0x36ba, 0x398c, 0x3c56, 0x3f17, 0x41ce, 0x447a, 0x471c, 0x49b4, 0x4c3f, 0x4ebf, 0x5133, 0x539b, 0x55f5, 0x5842, 0x5a82, 0x5cb4, 0x5ed7, 0x60ec, 0x62f2, 0x64e8, 0x66cf, 0x68a6, 0x6a6d, 0x6c24, 0x6dca, 0x6f5f, 0x70e2, 0x7255, 0x73b5, 0x7504, 0x7641, 0x776c, 0x7884, 0x798a, 0x7a7d, 0x7b5d, 0x7c29, 0x7ce3, 0x7d8a, 0x7e1d, 0x7e9d, 0x7f09, 0x7f62, 0x7fa7, 0x7fd8, 0x7ff6, 0x7fff, 0x7ff6, 0x7fd8, 0x7fa7, 0x7f62, 0x7f09, 0x7e9d, 0x7e1d, 0x7d8a, 0x7ce3, 0x7c29, 0x7b5d, 0x7a7d, 0x798a, 0x7884, 0x776c, 0x7641, 0x7504, 0x73b5, 0x7255, 0x70e2, 0x6f5f, 0x6dca, 0x6c24, 0x6a6d, 0x68a6, 0x66cf, 0x64e8, 0x62f2, 0x60ec, 0x5ed7, 0x5cb4, 0x5a82, 0x5842, 0x55f5, 0x539b, 0x5133, 0x4ebf, 0x4c3f, 0x49b4, 0x471c, 0x447a, 0x41ce, 0x3f17, 0x3c56, 0x398c, 0x36ba, 0x33de, 0x30fb, 0x2e11, 0x2b1f, 0x2826, 0x2528, 0x2223, 0x1f19, 0x1c0b, 0x18f8, 0x15e2, 0x12c8, 0x0fab, 0x0c8b, 0x096a, 0x0647, 0x0324, 0x0000, 0xfcdc, 0xf9b9, 0xf696, 0xf375, 0xf055, 0xed38, 0xea1e, 0xe708, 0xe3f5, 0xe0e7, 0xdddd, 0xdad8, 0xd7da, 0xd4e1, 0xd1ef, 0xcf05, 0xcc22, 0xc946, 0xc674, 0xc3aa, 0xc0e9, 0xbe32, 0xbb86, 0xb8e4, 0xb64c, 0xb3c1, 0xb141, 0xaecd, 0xac65, 0xaa0b, 0xa7be, 0xa57e, 0xa34c, 0xa129, 0x9f14, 0x9d0e, 0x9b18, 0x9931, 0x975a, 0x9593, 0x93dc, 0x9236, 0x90a1, 0x8f1e, 0x8dab, 0x8c4b, 0x8afc, 0x89bf, 0x8894, 0x877c, 0x8676, 0x8583, 0x84a3, 0x83d7, 0x831d, 0x8276, 0x81e3, 0x8163, 0x80f7, 0x809e, 0x8059, 0x8028, 0x800a, 0x8000, 0x800a, 0x8028, 0x8059, 0x809e, 0x80f7, 0x8163, 0x81e3, 0x8276, 0x831d, 0x83d7, 0x84a3, 0x8583, 0x8676, 0x877c, 0x8894, 0x89bf, 0x8afc, 0x8c4b, 0x8dab, 0x8f1e, 0x90a1, 0x9236, 0x93dc, 0x9593, 0x975a, 0x9931, 0x9b18, 0x9d0e, 0x9f14, 0xa129, 0xa34c, 0xa57e, 0xa7be, 0xaa0b, 0xac65, 0xaecd, 0xb141, 0xb3c1, 0xb64c, 0xb8e4, 0xbb86, 0xbe32, 0xc0e9, 0xc3aa, 0xc674, 0xc946, 0xcc22, 0xcf05, 0xd1ef, 0xd4e1, 0xd7da, 0xdad8, 0xdddd, 0xe0e7, 0xe3f5, 0xe708, 0xea1e, 0xed38, 0xf055, 0xf375, 0xf696, 0xf9b9, 0xfcdc };
AudioOutputI2S *out; uint32_t i2sACC; uint8_t i2sCNT=32; uint16_t DAC=0x8000; uint16_t err;
void writeDAC(uint16_t DAC) { for (uint8_t i=0;i<32;i++) { i2sACC=i2sACC<<1; if(DAC >= err) { i2sACC|=1; err += 0xFFFF-DAC; } else { err -= DAC; } } int16_t stereo[2] = {i2sACC,i2sACC}; bool flag=out->ConsumeSample(stereo); } void setup() { WiFi.mode(WIFI_OFF); //WiFi.forceSleepBegin(); Serial.begin(115200); delay(1000);
audioLogger = &Serial; file = new AudioFileSourcePROGMEM( sine, sizeof(sine) ); out = new AudioOutputI2S();
} uint8_t phase; void loop() { writeDAC(0x8000+sine[phase++]);
} `