Visualizzazione dei risultati da 1 a 2 su 2

Discussione: MIDI e Java

  1. #1

    MIDI e Java

    Buongiorno.
    Ho un problema con MIDI in Java:

    Classe JSynth (main class) costruisce il GUI e inizializza due classi:
    Oscillator1 e Oscillator2 ( classi in cui sono settati i parametri di un programma sintetizzatore di onde sonore).
    Io ho legato in main class alle istanze Oscillator1 e Oscillator2 con KeyListener dei tasti della tastiera alle note che produrrà l'oscillatore 1 e 2 contemporaneamente (per avere un synth a 2 oscillatori). La funzione richiede solo il numero della nota midi (tipo 96 per il LA centrale).

    Passo seguente: vorrei prendere le note da una tastiera midi usb.
    Ho la seguente classe:

    codice:
    package jsynth;
    
    import java.util.List;
    import javax.sound.midi.*;
    
    public class MidiHandler {
    
        public MidiHandler() {
            MidiDevice device;
            MidiDevice.Info[] infos = MidiSystem.getMidiDeviceInfo();
            for (int i = 0; i < infos.length; i++) {
                try {
                    device = MidiSystem.getMidiDevice(infos[i]);
                    //does the device have any transmitters?
                    //if it does, add it to the device list
                    System.out.println(infos[i]);
                    //get all transmitters
                    List<Transmitter> transmitters = device.getTransmitters();
                    //and for each transmitter
                    for (int j = 0; j < transmitters.size(); j++) {
                        //create a new receiver
                        transmitters.get(j).setReceiver(
                                //using my own MidiInputReceiver
                                new MidiInputReceiver(device.getDeviceInfo().toString()));
                    }                  Transmitter trans = device.getTransmitter();
                    trans.setReceiver(new MidiInputReceiver(device.getDeviceInfo().toString()));
                    //open each device
                    device.open();
                    //if code gets this far without throwing an exception
                    //print a success message
                    System.out.println(device.getDeviceInfo() + " Was Opened");
                } catch (MidiUnavailableException e) {
                }
            }
        }
    }
    e la seconda:

    codice:
    package jsynth;
    
    import javax.sound.midi.MidiMessage;
    import javax.sound.midi.Receiver;
    
    public class MidiInputReceiver implements Receiver {
    
        private static final int REFERENCE_NOTE_NUMBER = 69;
        private static final int REFERENCE_NOTE_FREQ = 440;
        private static final int NOTES_PER_OCTAVE = 12;
    
        public MidiInputReceiver(String name) {
            this.name = name;
        }
    
        @Override
        public void send(MidiMessage msg, long timeStamp) {
            byte[] b = msg.getMessage();
            String chan = bits(b[0]);
            String note = bits(b[1]);
            String vel = bits(b[2]);
            int message = convertBits(chan);
            int note1 = convertBits(note);
            int vel1 = convertBits(vel);
            System.out.println(note1 + " " + vel1);
        }
    
        public String bits(byte b) {
            String bits = "";
            for (int bit = 7; bit >= 0; --bit) {
                bits = bits + ((b >>> bit) & 1);
            }
            return bits;
        }
    
        public int convertBits(String bits) {
            int res = 0;
            int size = bits.length();
            for (int i = size - 1; i >= 0; i--) {
                if (bits.charAt(i) == '1') {
                    res += 1 << (size - i - 1);
                }
            }
            return res;
        }
    
        @Override
        public void close() {
        }
        public String name;
        double freq;
    }
    Ho istanziato la prima classe in main class e infatti quando lancio il programma vedo la lista delle devices e vedo le note che premo (da system.out.println), con note e velocity.
    Per passare la nota premuta alla main class basta aggiungere getNote() { return note; } alla seconda classe e recuperare la nota da una istanza della seconda classe in main class..
    MA come faccio partire la nota quando la premo??
    Per ora quando la premo mi passa solo la nota alla main class.
    Help Plz...

    Franz

    PS Scusate per il codice monolinea... lo ho copiato e pastato da netbeans...

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320

    Re: MIDI e Java

    Originariamente inviato da arefranz
    PS Scusate per il codice monolinea... lo ho copiato e pastato da netbeans...
    Non c'entra da dove lo copi, ma dove lo incolli.
    NON devi usare il tasto CODE del forum.
    Devi scrivere a mano il tag (nel corpo del messaggio del forum), incollare il codice (sempre nel corpo del messaggio), quindi chiudere a mano il tag:

    [CODE]
    incolli il tuo codice
    [/CODE]

    Il pulsante "CODE" serve, appunto, ad incollare una sola riga di codice.
    Per tutto il resto, il tag va aperto e chiuso a mano, incollandovi dentro il codice.

    Provo a sistemarlo io.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.