jeśli chcesz nagrywać z interfejsem MIDI przez Javę (javax.sound.midi. *), to bardzo łatwo. To nie jest kod do skopiowania i wklejenia, ale powinien pomóc Ci w rozpoczęciu programowania własnego rejestratora MIDI, co jest całkiem proste.
Pierwszym krokiem jest zdefiniowanie urządzenia wejściowego i wyjściowego MidiDevice. Najpierw musisz znaleźć listę możliwości IO i stworzyć GUI, w którym możesz wybrać urządzenie wejściowe i wyjściowe do nagrywania i odtwarzania MIDI.
Info[] infos = MidiSystem.getMidiDeviceInfo();
for(int i=0;i<infos.length;i++)
{
System.out.println(infos[i].getName() + " - " + infos[i].getDescription());
}
Istnieje lista urządzeń MIDI. Następnie wybierz urządzenie MIDI, na przykład, aby wybrać indeksy w tablicy informacji.
MidiDevice inputDevice = MidiSystem.getMidiDevice(infos[x]);
MidiDevice outputDevice = MidiSystem.getMidiDevice(infos[y]);
Należy również określić niektóre globale: sekwenser, nadajnik i odbiornik.
Sequencer sequencer = MidiSystem.getSequencer();
Transmitter transmitter;
Receiver receiver;
Teraz jest przycisk nagrywania, którego chcesz użyć.
// Open a connection to your input device
inputDevice.open();
// Open a connection to the default sequencer (as specified by MidiSystem)
sequencer.open();
// Get the transmitter class from your input device
transmitter = inputDevice.getTransmitter();
// Get the receiver class from your sequencer
receiver = sequencer.getReceiver();
// Bind the transmitter to the receiver so the receiver gets input from the transmitter
transmitter.setReceiver(receiver);
// Create a new sequence
Sequence seq = new Sequence(Sequence.PPQ, 24);
// And of course a track to record the input on
Track currentTrack = seq.createTrack();
// Do some sequencer settings
sequencer.setSequence(seq);
sequencer.setTickPosition(0);
sequencer.recordEnable(currentTrack, -1);
// And start recording
sequencer.startRecording();
Strzeż, ten kod może rzucić MidiUnavailableExceptions i należy zadzwonić bliskie metod na wszystkich już otwarty w finally rzeczy.
Ale to tylko sedno tego, jak powinien wyglądać kod. Zapisuje wszystko do sekwencji seq
, jak tylko wywołasz metodę sequencer.startRecording()
.
Następnie należy zatrzymać nagrywanie i zapisać sekwencję jako plik MIDI lub wykonać odtwarzanie. Na przykład może to być kod po naciśnięciu przycisku Zatrzymaj nagrywanie lub coś podobnego.
// Stop recording
if(sequencer.isRecording())
{
// Tell sequencer to stop recording
sequencer.stopRecording();
// Retrieve the sequence containing the stuff you played on the MIDI instrument
Sequence tmp = sequencer.getSequence();
// Save to file
MidiSystem.write(tmp, 0, new File("MyMidiFile.mid"));
}
Również klasa Track (sekwencja może mieć wiele ścieżek) zawiera rzeczywiste dane wejściowe, do których można uzyskać łatwy dostęp za pomocą metody get. Klasa Track składa się z MidiEvents.Na przykład tor jest:
MidiEvent 0: The C key is pressed
MidiEvent 1: The D key is pressed
MidiEvent 2: The C key of MidiEvent 0 is released
MidiEvent 3: The sustain pedal is pressed
etc...
I każdy MidiEvent ma pewien znacznik czasu, który jest wyrażony w MIDI kleszcze, więc można łatwo zmienić tempo, zwiększając lub zmniejszając liczbę kleszczy na sekundę.
Najtrudniejszym problemem jest to, że MidiEvents są wyrażone w kodzie bajtowym, w związku z tym będziesz musiał użyć arkusza z kodem referencyjnym, który wskaże, jaki bajt reprezentuje jakie działanie. To powinno zacząć od tego: http://www.onicos.com/staff/iz/formats/midi-event.html
Czy możesz również podać kod do korzystania z klasy Track? Dzięki. –
@AliSharabiani Możesz zobaczyć 'Track' jako' List '. Nie ma o wiele więcej, [zobacz także ten dokument Oracle Java na javax.sound.midi.Track] (https://docs.oracle.com/javase/7/docs/api/javax/sound/midi/Track. html). –
Yeti