Ciao a tutti!
mi sto cimentando in un programma che mi serve per creare array di bit...mi serve per un progetto che sto sviluppando per i Pic Micro (microcontrollori della Microchip).
Vi spiego cosa devo fare: devo aprire un file wav, ottenere la parte dati (in cui è descritta la forma d'onda) e creare un array in cui sono contenuti i valori numerici di tale onda.
La parte dell'array per il momento lasciamola perdere...a me interessa intanto fare i due passaggi iniziali tramite un programma scritto in C++. Dico in C++ perché la struttura dati che rappresenta un file wav so crearla
A livello pratico, uso questa struttura dati scritta in C++ per rappresentare il file wav:
struct T_RiffHeader {
uint8_t id[4]; // Identificativo
uint32_t size; // Bytes rimanenti alla fine del file
uint8_t format[4]; // Secondo identificativo
};
/* Fmt Chunk */
struct T_FmtChunk {
uint8_t id[4]; // Identificativo
uint32_t size; // Bytes rimanenti alla fine del blocco
uint16_t format; // Formato ( 1 = PCM )
uint16_t channels; // Numero dei canali ( 1 = Mono, 2 = Stereo )
uint32_t rate; // Frequenza di campionamento ( 44100 Hz, 8000 Hz, etc )
uint32_t bytes_per_second; // Numero di bytes riprodotti al secondo
uint16_t block_align; // Allineamento del blocco
uint16_t bits_per_sample; // Bits utilizzati per il campionamento ( 8 bit, 16 bit, etc )
};
/* Data Chunk */
template < typename SampleSize, // Tipo utilizzato per il campionamento
unsigned int samples > // Numero di campioni
struct T_DataChunk {
uint8_t id[4]; // Identificativo
uint32_t size; // Bytes rimanenti alla fine del blocco
SampleSize data[samples]; // Vettore contenente i "campioni"
};
/* Struttura di un file WAV */
template < typename SampleSize, // Tipo utilizzato per il campionamento
unsigned int samples > // Numero di campioni
struct T_WAV {
T_RiffHeader riff_header; // Riff Header
T_FmtChunk fmt_chunk; // Fmt Chunk
T_DataChunk< SampleSize, samples > data_chunk; // Data Chunk
};
int
main() {
/* Informazioni della nuova traccia */
enum {
TIME = 5, // Durata della traccia (secondi)
FMT_SIZE = 16, // Dimensione dell'Fmt Chunk
CHANNELS = 1, // Numero dei canali
SAMPLE_RATE = 8000, // Frequenza di campionamento (Hz)
BITS_PER_SAMPLE = 8, // Bits per campione
BLOCK_ALIGN = CHANNELS * BITS_PER_SAMPLE / 8, // Allineamento del blocco
BYTES_PER_SECOND = SAMPLE_RATE * BLOCK_ALIGN, // Frequenza di campionamento in Hz
SAMPLES = CHANNELS * SAMPLE_RATE * TIME, // Numero di campioni richiesti per la durata scelta
};
sapete dirmi come scrivere un programma che apre il file wav e che acquisisca la parte "dati" del file? Perché saprei solo come creare un file wav usando questa struttura dati, ma fare l'inverso (cioè a partire da un file wav ottenere i valori dell'onda) non lo so.
Spero di non aver scritto brutte cose e attendo copiose risposte