2009-09-28 30 views

Odpowiedz

4

Tak, interfejs API JavaSound może być używany do odczytu danych MIDI z urządzenia MIDI.

JFugue to Java API do programowania muzyki, który wykorzystuje interfejs API JavaSound i może pomóc w uproszczeniu interakcji z JavaSound. W JFugue 5.x, przykładowy kod do przechwytywania 10 sekund danych MIDI z urządzenia MIDI jest następujący:

MidiDevice device = /* specify a MIDI device */ 
MusicTransmitterToSequence transmitter = new MusicTransmitterToSequence(device); 
transmitter.listenForMillis(10000); 
Sequence music = transmitter.getSequence(); 

można również uruchomić i zatrzymać słuchania urządzenia:

MidiDevice device = /* specify a MIDI device */ 
MusicTransmitterToSequence transmitter = new MusicTransmitterToSequence(device); 
transmitter.startListening(); 
// Do stuff 
transmitter.stopListening(); 
Sequence music = transmitter.getSequence(); 
13

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

+0

Czy możesz również podać kod do korzystania z klasy Track? Dzięki. –

+1

@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