Java Sound API - Changer d'instrument

Fermé
Guillaume - 30 mai 2010 à 16:25
lambdav Messages postés 2 Date d'inscription lundi 23 avril 2007 Statut Membre Dernière intervention 30 août 2011 - 30 août 2011 à 01:51
Bonjour,

Je suis en train de réaliser un projet en Java utilisant le Java Sound API pour générer des notes de musique en MIDI. J'arrive à générer les notes comme je le désire, cependant j'ai du mal à changer l'instrument qui les joues.
Je génère mes notes à l'aide d'une fonction que j'ai trouvée sur internet et personnalisée un petit peu. La voici :

    public Note(int note1, int note2, int intensite, int vitesse) throws MidiUnavailableException {

        this.vitesse = vitesse;
        this.intensite = intensite;

        System.out.println("Note vitesse : " + vitesse);
        System.out.println("Note intensité : "  + intensite);

        // initialisation midi : on déclare et on ouvre un synthétiseur
        synthesizer = MidiSystem.getSynthesizer();
        synthesizer.open();

        // utilisation de la banque de sons par défault
        soundBank = synthesizer.getDefaultSoundbank();
        // obtention d'une liste des instruments contenus dans cette banque de sons
        instruments = soundBank.getInstruments();

        // obtention des canaux MIDI contrôlés par ce synthétiseur
        channels = synthesizer.getChannels();
       
        /* on choisit le premier instrument de la liste, c'est-à-dire le piano, et on l'affecte sur le premier canal. */ 
        synthesizer.loadInstrument(instruments[0]);
           
        for(int i = 0; i< instruments.length ; i++){
            System.out.println(i + "  " +instruments[i]);
        }
        
       channels[0].programChange(0);
        // la note est ensuite jouée
        /* paramètres : le canal, le numéro de la note jouée, la velocité (la vitesse à laquelle on a pressée la touche ;), et enfin la durée (à remplacer par des threads) */
        //playNote(channels[0], note1,  10, 1000);
    }


Le son reste celui d'un piano quoi que je fasse.
Normalement je devrais pouvoir changer d'instruments en modifiant l'indice de mon tableau instruments[] dans la fonction loadInstrument. Mais rien ne se passe.

Quand j'affiche le contenu de mon tableau instruments[], j'obtiens des résultats sous cette forme (je ne sais pas si ça peut aider).

Instrument Piano (bank 0 program 0)
Instrument Bright Piano (bank 0 program 1)
Instrument Electric Grand (bank 0 program 2)
Instrument Honky Tonk Piano (bank 0 program 3)
Instrument Electric Piano 1 (bank 0 program 4)
Instrument Electric Piano 2 (bank 0 program 5)


Quelqu'un saurait-il comment faire pour pouvoir changer d'instruments?

A voir également:

2 réponses

Personne?
0
lambdav Messages postés 2 Date d'inscription lundi 23 avril 2007 Statut Membre Dernière intervention 30 août 2011
30 août 2011 à 01:51
Un peu tard mais voici le code pour changer d'instrument :

MidiChannel[] channels = synth.getChannels();
synth.loadInstrument( instrument );
Patch p = instrument.getPatch();
int bank = p.getBank(), program = p.getProgram();
program |= (bank&1)<<7; bank >>>= 1; // correction d'un bug Java
channels[channel].programChange(bank, program);
0