Add basis for MIDI - Communicator, Listener, and Note

pull/35/head
James Ball 2021-07-13 20:46:48 +01:00
rodzic ad08fc1dab
commit 8c581293e9
3 zmienionych plików z 118 dodań i 0 usunięć

Wyświetl plik

@ -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() {
}
}
}

Wyświetl plik

@ -0,0 +1,6 @@
package sh.ball.audio.midi;
public interface MidiListener {
void sendMidiMessage(int status, MidiNote note, int pressure);
}

Wyświetl plik

@ -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;
}
}