kopia lustrzana https://github.com/jameshball/osci-render
Add basis for MIDI - Communicator, Listener, and Note
rodzic
ad08fc1dab
commit
8c581293e9
|
@ -0,0 +1,71 @@
|
|||
package sh.ball.audio.midi;// Java program showing the implementation of a simple record
|
||||
|
||||
import javax.sound.midi.*;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class MidiCommunicator implements Runnable {
|
||||
|
||||
private final List<MidiDevice> devices = new ArrayList<>();
|
||||
private final List<MidiListener> listeners = new ArrayList<>();
|
||||
|
||||
public static void main(String[] args) {
|
||||
MidiCommunicator communicator = new MidiCommunicator();
|
||||
communicator.run();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
MidiDevice.Info[] infos = MidiSystem.getMidiDeviceInfo();
|
||||
for (MidiDevice.Info info : infos) {
|
||||
try {
|
||||
MidiDevice device = MidiSystem.getMidiDevice(info);
|
||||
List<Transmitter> transmitters = device.getTransmitters();
|
||||
|
||||
transmitters.forEach(t -> t.setReceiver(
|
||||
new MidiInputReceiver(this)
|
||||
));
|
||||
|
||||
Transmitter trans = device.getTransmitter();
|
||||
trans.setReceiver(new MidiInputReceiver(this));
|
||||
|
||||
device.open();
|
||||
devices.add(device);
|
||||
System.out.println(device.getDeviceInfo() + " Was Opened");
|
||||
|
||||
|
||||
} catch (MidiUnavailableException ignored) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void addListener(MidiListener listener) {
|
||||
listeners.add(listener);
|
||||
}
|
||||
|
||||
private void notifyListeners(int status, MidiNote note, int pressure) {
|
||||
for (MidiListener listener : listeners) {
|
||||
listener.sendMidiMessage(status, note, pressure);
|
||||
}
|
||||
System.out.println(status);
|
||||
System.out.println(note);
|
||||
System.out.println(pressure);
|
||||
}
|
||||
|
||||
public void stop() {
|
||||
devices.forEach(MidiDevice::close);
|
||||
}
|
||||
|
||||
private record MidiInputReceiver(
|
||||
MidiCommunicator communicator) implements Receiver {
|
||||
|
||||
public void send(MidiMessage message, long timeStamp) {
|
||||
byte[] rawMessage = message.getMessage();
|
||||
communicator.notifyListeners(message.getStatus(), new MidiNote(rawMessage[1]), rawMessage[2]);
|
||||
}
|
||||
|
||||
public void close() {
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,6 @@
|
|||
package sh.ball.audio.midi;
|
||||
|
||||
public interface MidiListener {
|
||||
|
||||
void sendMidiMessage(int status, MidiNote note, int pressure);
|
||||
}
|
|
@ -0,0 +1,41 @@
|
|||
package sh.ball.audio.midi;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
public class MidiNote {
|
||||
|
||||
private static final String[] NOTE_NAMES = {"C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B"};
|
||||
|
||||
private final String name;
|
||||
private final int key;
|
||||
private final int octave;
|
||||
|
||||
public MidiNote(int key) {
|
||||
this.key = key;
|
||||
this.octave = (key / 12)-1;
|
||||
int note = key % 12;
|
||||
this.name = NOTE_NAMES[note];
|
||||
}
|
||||
|
||||
public int getKey() {
|
||||
return key;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (this == o) return true;
|
||||
if (o == null || getClass() != o.getClass()) return false;
|
||||
MidiNote midiNote = (MidiNote) o;
|
||||
return key == midiNote.key && octave == midiNote.octave && name.equals(midiNote.name);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hash(name, key, octave);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "Note -> " + this.name + this.octave + " key=" + this.key;
|
||||
}
|
||||
}
|
Ładowanie…
Reference in New Issue