2009-09-28 13 views
7

मुझे एक जावा प्रोजेक्ट मिला है जिसने कंप्यूटर से जुड़े पियानो से an old C++ dll to receive MIDI data का उपयोग किया है।जावा मिडी - पियानो से डेटा प्राप्त करना?

अब जावा में एमआईडीआई उपकरणों के लिए अंतर्निहित समर्थन है, मैं विरासत सी ++ डीएल से छुटकारा पाना चाहता हूं और केवल शुद्ध जावा का उपयोग करना चाहता हूं। क्या जावा कंप्यूटर से जुड़े पियानो से डेटा प्राप्त करने का समर्थन करता है? मैंने Google के उदाहरणों के लिए Google की खोज नहीं की है।

उत्तर

4

हां, जावासाउंड एपीआई मिडी डिवाइस से MIDI डेटा पढ़ने के लिए उपयोग किया जा सकता है।

JFugue जावा प्रोग्रामिंग के लिए जावा एपीआई है जो जावासाउंड एपीआई का उपयोग करता है, और जावासाउंड के साथ आपकी बातचीत को सरल बनाने में मदद कर सकता है।

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

तुम भी शुरू करने और एक डिवाइस को सुन बंद कर सकते हैं:

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

आप तो JFugue 5.x में, नमूना कोड के रूप में इस मिडी डेटा के 10 सेकंड पर कब्जा करने से एक MIDI डिवाइस है जावा द्वारा केवल MIDI एपीआई के साथ रिकॉर्ड करना चाहते हैं (javax.sound.midi। *) यह बहुत आसानी से किया जाता है। यह कॉपी और पेस्ट करने के लिए कोड नहीं है, लेकिन यह आपको अपने स्वयं के एमआईडीआई रिकॉर्डर प्रोग्रामिंग शुरू करने में मदद कर सकता है, जो वास्तव में काफी आसान है।

पहला चरण आपके इनपुट और आउटपुट मिडीडिवाइस को परिभाषित करना है। तो सबसे पहले आपको आईओ संभावनाओं की एक सूची मिलनी होगी और एक जीयूआई बनाना होगा जिसमें आप अपनी एमआईडीआई रिकॉर्डिंग और प्लेबैक के लिए इनपुट और आउटपुट डिवाइस का चयन कर सकते हैं।

Info[] infos = MidiSystem.getMidiDeviceInfo(); 
for(int i=0;i<infos.length;i++) 
{ 
    System.out.println(infos[i].getName() + " - " + infos[i].getDescription()); 
} 

तो आपके MIDI डिवाइस की एक सूची है। इसके बाद आप मिडी डिवाइस का चयन करना चाहते हैं, उदाहरण के लिए आप इंफोस सरणी में इंडेक्स चुनना चाहते हैं।

MidiDevice inputDevice = MidiSystem.getMidiDevice(infos[x]); 
MidiDevice outputDevice = MidiSystem.getMidiDevice(infos[y]); 

आप कुछ ग्लोबल्स भी निर्दिष्ट करना चाहेंगे: अनुक्रमक, ट्रांसमीटर और रिसीवर।

Sequencer sequencer = MidiSystem.getSequencer(); 
Transmitter transmitter; 
Receiver receiver; 

अब एक रिकॉर्ड बटन है जिसे आप उपयोग करना चाहते हैं।

// 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(); 

खबरदार, इस कोड MidiUnavailableExceptions फेंक सकता है और आप सभी चीजें आप एक अंत में बयान में खोल दिया है पर पास तरीकों फोन करना चाहिए।

लेकिन यह कोड की तरह दिखने का मूल केंद्र है। जैसे ही आप विधि sequencer.startRecording() पर कॉल करते हैं, यह सब कुछ अनुक्रम seq पर रिकॉर्ड करता है।

फिर आप रिकॉर्डिंग को रोकना चाहते हैं, और अनुक्रम को MIDI के रूप में फ़ाइल में सहेजने में सक्षम हो सकते हैं, या प्लेबैक कर सकते हैं। उदाहरण के लिए जब आप स्टॉप रिकॉर्ड बटन या कुछ दबाते हैं तो यह कोड हो सकता है।

// 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")); 
} 

इसके अलावा रास्ते का वर्ग (एक दृश्य एकाधिक पटरियों हो सकता है) वास्तविक इनपुट डेटा, आप आसानी से एक प्राप्त विधि करके पहुंच सकते हैं शामिल हैं। ट्रैक वर्ग में मिडीइवेंट्स शामिल हैं।उदाहरण के लिए ट्रैक है:

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

और हर MidiEvent एक निश्चित टाइमस्टैम्प, जो मिडी Ticks में व्यक्त किया है, इस प्रकार आप आसानी से बढ़ रही है या प्रति सेकंड टिक की संख्या को कम करके गति बदल सकते हैं।

यहां सबसे कठिन समस्या यह है कि मिडीइवेंट बाइट कोड में व्यक्त किए जाते हैं, इस प्रकार आपको संदर्भ बाइट कोड शीट का उपयोग करना होगा जो आपको बताता है कि बाइट किस क्रिया का प्रतिनिधित्व करता है। यह आपको इसके साथ शुरू करना चाहिए: http://www.onicos.com/staff/iz/formats/midi-event.html

+0

क्या आप ट्रैक क्लास का उपयोग करने के लिए कोड भी प्रदान कर सकते हैं? धन्यवाद। –

+1

@AliSharabiani आप 'ट्रैक' को 'सूची ' के रूप में देख सकते हैं। इसके लिए और भी कुछ नहीं है, [jraax.sound.midi.Track] पर यह ओरेकल जावा दस्तावेज़ भी देखें (https://docs.oracle.com/javase/7/docs/api/javax/sound/midi/Track। एचटीएमएल)। – Yeti

संबंधित मुद्दे