جافا ميدي - الحصول على بيانات من البيانو؟

StackOverflow https://stackoverflow.com/questions/1485307

  •  18-09-2019
  •  | 
  •  

سؤال

لقد ورث مشروع جافا المستخدمة قديم C ++ DLL لتلقي بيانات MIDI من البيانو متصل بالكمبيوتر.

الآن بعد أن قامت Java بدعم مدمج لأجهزة MIDI، أريد أن أتخلص من Legacy C ++ DLL واستخدم Java فقط. هل يدعم Java استلام البيانات من البيانو متصل بالكمبيوتر؟ لقد بحثت Google للأمثلة دون جدوى.

هل كانت مفيدة؟

المحلول

نعم، يمكن استخدام API JavaSound لقراءة بيانات MIDI من جهاز MIDI.

JFugue. هو api api java for music يستخدم api javaSound، ويمكن أن يساعد في تبسيط التفاعل الخاص بك مع JavaSound. في JFugue 5.x، نموذج التعليمات البرمجية لالتقاط 10 ثوان من بيانات MIDI من جهاز MIDI كما يلي:

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

نصائح أخرى

إذا كنت تريد التسجيل مع API MIDI فقط بواسطة Java (javax.sound.midi. *) يتم ذلك بسهولة شديدة. هذا ليس رمز لنسخ ولصق، ولكن يجب أن يساعدك في البدء في برمجة مسجل MIDI الخاص بك، وهو سهل للغاية بالفعل.

الخطوة الأولى هي تحديد مدخلاتك وإخراج Mididevice. لذا، سيتعين عليك أولا العثور على قائمة بإمكانيات IO وجعل واجهة المستخدم الرسومية يمكنك من خلالها تحديد جهاز الإدخال والإخراج لتسجيل MIDI وتشغيله.

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

لذلك هناك قائمة بأجهزة MIDI الخاصة بك. التالي تريد تحديد جهاز MIDI، على سبيل المثال، يمكنك اختيار الفهارس في صفيف INFOS.

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

حذار, ، يمكن لهذا الرمز رمي MIDIUNAVAILABRECTECTECTISTICATIONATIONATIONATIONATIONATIONATIONATIONATIONATIONATIONATIONATIONATIONATESTIONATESTICATESTICATE ويجب عليك استدعاء الأساليب الوثيقة على جميع الأشياء التي فتحتها في بيان أخيرا.

ولكن هذا هو جوهر ما يجب أن يبدو عليه الكود. يسجل كل شيء إلى التسلسل seq بمجرد استدعاء الطريقة sequencer.startRecording().

ثم ترغب في إيقاف التسجيل، وتكون قادرا على حفظ التسلسل باسم 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...

وكلم تشرف طابع زمني معين، والذي يتم التعبير عنه في القراد MIDI، وبالتالي يمكنك تغيير الإيقاع بسهولة عن طريق زيادة عدد القراد في الثانية أو خفضها بسهولة.

أصعب مشكلة هنا هي أن القادمين يتم التعبير عنها في كود البايت، وبالتالي سيتعين عليك استخدام ورقة رمز بايت مرجعية تخبرك ما يمثل البايت ما الإجراء. يجب أن تدخرك هذا مع ذلك: http://www.onicos.com/staff/IZ/Formats/MIDI-Event.html.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top