Domanda

Sto cercando di scrivere un sintetizzatore audio in Java e mi chiedevo se qualcuno avesse qualche consiglio o buone risorse per scrivere un programma del genere.Sto cercando informazioni sulla generazione di onde sonore grezze, su come riprodurle in una forma utilizzabile (riproduzione tramite altoparlanti), nonché teoria generale sull'argomento.Grazie ragazzi.

È stato utile?

Soluzione

  1. Questo problema riguarda fondamentalmente la mappatura delle funzioni su matrici di numeri.Un linguaggio che supporti funzioni di prima classe sarebbe davvero utile in questo caso.

  2. Guardarehttp://www.harmony-central.com/Computer/Programming Ehttp://www.developer.com/java/other/article.php/3071021 per alcune informazioni relative a Java.

  3. Se non conosci i concetti di base della codifica dei dati audio, leggi http://en.wikipedia.org/wiki/Sampling_rate

  4. Il formato WAVE canonico è molto semplice, vedi http://www.lightlink.com/tjweber/StripWav/Canon.html.Un'intestazione (primi 44 byte) + i dati wave.Non hai bisogno di alcuna libreria per implementarlo.

In C/C++, la struttura dati corrispondente sarebbe simile a questa:

typedef struct _WAVstruct
{
    char headertag[4];
    unsigned int remnantlength;
    char fileid[4];

    char fmtchunktag[4];
    unsigned int fmtlength;
    unsigned short fmttag;
    unsigned short channels;
    unsigned int samplerate;
    unsigned int bypse;
    unsigned short ba;
    unsigned short bipsa;

    char datatag[4];
    unsigned int datalength;

    void* data; //<--- that's where the raw sound-data goes
}* WAVstruct;

Non sono sicuro di Java.Immagino che dovrai sostituire "struct" con "class" e "void* data" con "char[] data" o "short[] data" o "int[] data", corrispondente al numero di bit per campione, come definito nel campo bipsa.

Per riempirlo con i dati, dovresti usare qualcosa del genere in C/C++:

int data2WAVstruct(unsigned short channels, unsigned short bipsa, unsigned int samplerate, unsigned int datalength, void* data, WAVstruct result)
{
    result->headertag[0] = 'R';
    result->headertag[1] = 'I';
    result->headertag[2] = 'F';
    result->headertag[3] = 'F';
    result->remnantlength = 44 + datalength - 8;
    result->fileid[0] = 'W';
    result->fileid[1] = 'A';
    result->fileid[2] = 'V';
    result->fileid[3] = 'E';

    result->fmtchunktag[0] = 'f';
    result->fmtchunktag[1] = 'm'; 
    result->fmtchunktag[2] = 't';
    result->fmtchunktag[3] = ' ';
    result->fmtlength = 0x00000010;
    result->fmttag = 1;
    result->channels = channels;
    result->samplerate = samplerate;
    result->bipsa = bipsa;
    result->ba = channels*bipsa / 8;
    result->bypse = samplerate*result->ba;

    result->datatag[0] = 'd';
    result->datatag[1] = 'a';
    result->datatag[2] = 't';
    result->datatag[3] = 'a';
    result->datalength = datalength;

    result->data = data; // <--- that's were the data comes in

    return 0; // an error code, not implemented, yet ...; in Java: return result
}

Ancora una volta, non sono sicuro di Java, ma la conversione dovrebbe essere semplice se converti il ​​puntatore void in un array corrispondente al bitrate.

Quindi scrivi semplicemente l'intera struttura in un file per ottenere un file wave riproducibile.

Altri suggerimenti

Guardare Frinika.È una workstation musicale completa implementata in Java (open source).Utilizzando l'API, puoi eseguire eventi midi attraverso il sintetizzatore, leggere l'output audio grezzo e scriverlo in un file WAV (vedi il collegamento al codice sorgente di seguito).

Informazioni aggiuntive:

Mentre studiavo per la laurea, il mio progetto di tesi prevedeva la creazione di un sintetizzatore modulare basato su Java e l'Università presso la quale ho studiato ha ritenuto opportuno rendere il mio rapporto disponibile al pubblico:

Un sintetizzatore modulare basato su software in Java

Non so se questo aiuta, ma se puoi usare il MIDI per qualsiasi cosa, dovresti dare un'occhiata JFuge.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top