Question

Je cherche à écrire un synthétiseur audio en Java et je me demandais si quelqu'un avait des conseils ou de bonnes ressources pour écrire un tel programme.Je recherche des informations sur la génération d'ondes sonores brutes, sur la façon de les produire sous une forme utilisable (lecture sur des haut-parleurs), ainsi que sur la théorie générale sur le sujet.Merci les gars.

Était-ce utile?

La solution

  1. Ce problème concerne essentiellement le mappage de fonctions sur des tableaux de nombres.Un langage prenant en charge des fonctions de première classe serait ici très utile.

  2. Vérifierhttp://www.harmony-central.com/Computer/Programming ethttp://www.developer.com/java/other/article.php/3071021 pour quelques informations liées à Java.

  3. Si vous ne connaissez pas les concepts de base de l'encodage des données sonores, lisez http://en.wikipedia.org/wiki/Sampling_rate

  4. Le format canonique WAVE est très simple, voir http://www.lightlink.com/tjweber/StripWav/Canon.html.Un en-tête (44 premiers octets) + les données d'onde.Vous n'avez besoin d'aucune bibliothèque pour implémenter cela.

En C/C++, la structure de données correspondante ressemblerait à ceci :

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;

Je ne suis pas sûr de Java.Je suppose que vous devrez remplacer "struct" par "class" et "void* data" par "char[] data" ou "short[] data" ou "int[] data", correspondant au nombre de bits par échantillon, tel que défini dans le champ bipsa.

Pour le remplir de données, vous utiliseriez quelque chose comme ça en 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
}

Encore une fois, je ne suis pas sûr de Java mais la conversion devrait être simple si vous convertissez le pointeur vide en un tableau correspondant au débit binaire.

Ensuite, écrivez simplement la structure entière dans un fichier pour obtenir un fichier wave lisible.

Autres conseils

Vérifier Frinika.Il s'agit d'une station de travail musicale complète implémentée en Java (open source).À l'aide de l'API, vous pouvez exécuter des événements midi via le synthétiseur, lire la sortie sonore brute et l'écrire dans un fichier WAV (voir le lien du code source ci-dessous).

Informations Complémentaires:

Pendant mes études, mon projet de thèse portait sur la création d'un synthétiseur modulaire basé sur Java, et l'université dans laquelle j'ai étudié a jugé bon de rendre mon rapport accessible au public :

Un synthétiseur modulaire basé sur logiciel en Java

Je ne sais pas si cela aide, mais si vous pouvez utiliser le MIDI pour quoi que ce soit, vous devriez vérifier JFuge.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top