Frage

Ich überlege, einen Audio-Syntesizer in Java zu schreiben, und frage mich, ob jemand Ratschläge oder gute Ressourcen zum Schreiben eines solchen Programms hat.Ich suche Informationen zur Erzeugung roher Schallwellen, wie man sie in eine nutzbare Form ausgibt (Wiedergabe über Lautsprecher) sowie allgemeine Theorie zu diesem Thema.Danke Leute.

War es hilfreich?

Lösung

  1. Bei diesem Problem geht es im Wesentlichen um die Zuordnung von Funktionen zu Zahlenfeldern.Eine Sprache, die erstklassige Funktionen unterstützt, wäre hier sehr nützlich.

  2. Kassehttp://www.harmony-central.com/Computer/Programming Undhttp://www.developer.com/java/other/article.php/3071021 für einige Java-bezogene Informationen.

  3. Wenn Sie die Grundkonzepte der Kodierung von Tondaten nicht kennen, dann lesen Sie http://en.wikipedia.org/wiki/Sampling_rate

  4. Das kanonische WAVE-Format ist sehr einfach http://www.lightlink.com/tjweber/StripWav/Canon.html.Ein Header (erste 44 Bytes) + die Wave-Daten.Sie benötigen keine Bibliothek, um das zu implementieren.

In C/C++ würde die entsprechende Datenstruktur etwa so aussehen:

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;

Bei Java bin ich mir nicht sicher.Ich denke, Sie müssen „struct“ durch „class“ und „void* data“ durch „char[] data“ oder „short[] data“ oder „int[] data“ ersetzen, entsprechend der Anzahl der Bits pro Probe, wie im Feld bipsa definiert.

Um es mit Daten zu füllen, würden Sie in C/C++ so etwas verwenden:

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
}

Auch hier bin ich mir bei Java nicht sicher, aber die Konvertierung sollte unkompliziert sein, wenn Sie den Void-Pointer in ein Array konvertieren, das der Bitrate entspricht.

Dann schreiben Sie einfach die gesamte Struktur in eine Datei, um eine abspielbare Wave-Datei zu erhalten.

Andere Tipps

Kasse Frinika.Es handelt sich um eine voll ausgestattete Musik-Workstation, die in Java (Open Source) implementiert ist.Mithilfe der API können Sie Midi-Events über den Synthesizer ausführen, die Rohtonausgabe lesen und in eine WAV-Datei schreiben (siehe Link zum Quellcode unten).

Weitere Informationen:

Während meines Studiums beschäftigte sich mein Dissertationsprojekt mit der Entwicklung eines Java-basierten modularen Synthesizers, und die Universität, an der ich studierte, hielt es für angebracht, meinen Bericht öffentlich zugänglich zu machen:

Ein softwarebasierter modularer Synthesizer in Java

Ich weiß nicht, ob das hilft, aber wenn Sie MIDI für irgendetwas verwenden können, sollten Sie es ausprobieren JFuge.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top