Septillion schreef op zaterdag 19 juni 2021 @ 10:31:
@
Atmoz
code:
1
2
| size_t filesize = soundFile.size();
unsigned char TestSound[filesize + 1]; |
Dat kan niet in C. De size van de array moet bekend zijn tijdens compiler tijd. Daar filesize nog niet bekend is zal dit niet werken Denk dat er alleen een pointer voor de array wordt aangemaakt maar niet de array ruimte. Ofwel, je gaat zitten lezen is het onbekende.
Thanks!
Dat is interessante informatie en klinkt nu "redelijk logisch"

Nou, dat valt als ik eerlijk ben nog wel wat tegen
Ik heb namelijk al flink wat uren (verdeeld over meerdere dagen) zitten zoeken.
Wat ik vooral tegen kom is hoe je échte WAV-files (of zelfs MP3-files) kunt afspelen.
Maar dat werkt niet met de hardware die ik gebruik: alleen de interne DAC en een klein versterkertje.
Ik heb letterlijk nog
nergens iets kunnen vinden hoe ze -
tijdens runtime- "WAV-data" in deze vorm uit een file van SPIFFS halen, en meegeven aan de muziek-classe.
Inmiddels is het alleen nog maar erger geworden
Ik ben even (omdat het me te veel boven de pet begon te gaan) afgestapt van het WAV-idee, en wil nu (om te beginnen) gewoon wat "notes" af spelen.
Dat gaat met dezelfde library (
XTronical_XT_DAC_Audio). Maar daar loop ik vervolgens weer tegen een nieuw probleem aan:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
| // Playing a simple melody using the XTronical DAC Audio library
// Demonstrates use of the music score object
// See www.xtronical.com for write ups on sound and for hardware required
#include "MusicDefinitions.h"
#include "XT_DAC_Audio.h"
// Data for the melody. Note followed by optional change in playing length in 1/4 beats. See documentation for more details
int8_t PROGMEM TwinkleTwinkle[] = {
NOTE_C5,NOTE_C5,NOTE_G5,NOTE_G5,NOTE_A5,NOTE_A5,NOTE_G5,BEAT_2,
NOTE_F5,NOTE_F5,NOTE_E5,NOTE_E5,NOTE_D5,NOTE_D5,NOTE_C5,BEAT_2,
NOTE_G5,NOTE_G5,NOTE_F5,NOTE_F5,NOTE_E5,NOTE_E5,NOTE_D5,BEAT_2,
NOTE_G5,NOTE_G5,NOTE_F5,NOTE_F5,NOTE_E5,NOTE_E5,NOTE_D5,BEAT_2,
NOTE_C5,NOTE_C5,NOTE_G5,NOTE_G5,NOTE_A5,NOTE_A5,NOTE_G5,BEAT_2,
NOTE_F5,NOTE_F5,NOTE_E5,NOTE_E5,NOTE_D5,NOTE_D5,NOTE_C5,BEAT_4,
NOTE_SILENCE,BEAT_5,SCORE_END
};
XT_DAC_Audio_Class DacAudio(25,0); // Create the main player class object. Use GPIO 25 (DAC pin) and timer 0
XT_MusicScore_Class Music(TwinkleTwinkle,TEMPO_ALLEGRO,INSTRUMENT_PIANO); // Music score object, handles tunes. Pass Music Data,Tempo, Instrument
// You can just pass the music data and the rest will default to... well.... default values!
void setup() {
DacAudio.Play(&Music);
}
void loop() {
DacAudio.FillBuffer(); // This needs only be in your main loop once, suggest here at the top.
// put whatever code you want here that you would normally have on your loop
} |
Ik moet schijnbaar dat
XT_MusicScore_Class Music(TwinkleTwinkle,TEMPO_ALLEGRO,INSTRUMENT_PIANO); aanroepen vóór de
setup()
Maar het probleem daarbij is dat ik de data die ik wil afspelen (
TwinkleTwinkle[]) straks pas "weet" in een functie verderop.
In bovenstaande voorbeeld werkt het wel omdat daar de data al bekend is, maar hoe kan ik nu deze data (die noten) pas meegeven in mijn eigen functie?
Dat moet toch gewoon mogelijk zijn, right?