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...