Acquisizione parte dati di file wav

di il
1 risposte

Acquisizione parte dati di file wav

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

1 Risposte

  • Re: Acquisizione parte dati di file wav

    Ho trovato questo codice sorgente di quello che volevo fare io
    se a qualcuno interessasse, lo pubblico qui:
    
    //////////////////////////////////////////////////////////////////////////////
    // wav2c.cpp                                                                //
    //////////////////////////////////////////////////////////////////////////////
    
    //////////////////////////////////////////////////////////////////////////////
    // includes                                                                 //
    //////////////////////////////////////////////////////////////////////////////
    #include <stdio.h>
    #include <string.h>
    
    //////////////////////////////////////////////////////////////////////////////
    // main                                                                     //
    //////////////////////////////////////////////////////////////////////////////
    int main(int argc, char *argv[])
    {
    	printf("wav2c v1.00 by Dark Fader / BlackThunder\n");
    	if (argc < 2) { printf("Syntax: %s <input.wav>\n", argv[0]); return -1; }
    	char buf[1024], *s = buf;
    	strcpy(s, argv[1]);
    	char *p = strstr(s, ".wav");
    	if (!p) { printf("Please specify a 8KHz, 8-bit wav file!\n"); return -1; }
    	
    	FILE *fi = fopen(s, "rb");
    	if (!fi) { printf("Could not open input file!\n"); return -1; }
    	strcpy(p, ".c");
    	FILE *fo = fopen(s, "wt");
    	if (!fo) { printf("Could not open output file!\n"); return -1; }
    
    	fseek(fi, 0x28, SEEK_SET);
    	p = strrchr(s, '\\'); if (p) s = p+1;
    	p = strrchr(s, '/'); if (p) s = p+1;
    	p = strrchr(s, '.'); if (p) *p = 0;
    	fprintf(fo, "const unsigned char %s[] =\n{", s);
    	
    	int l=0;
    	while (1)
    	{
    		if (l++ % 100 == 0) { fprintf(fo, "\n\t"); }
    		int a = fgetc(fi); if (a == EOF) break;
    		fprintf(fo, "%d,", a);
    	}
    
    	fprintf(fo, "\n};\n");	
    
    	fclose(fi);
    	fclose(fo);
    	return 0;
    }
    
Devi accedere o registrarti per scrivere nel forum
1 risposte