[jmsl] Playing Through An External Midi Device
jmsl at music.columbia.edu
jmsl at music.columbia.edu
Wed Apr 15 10:27:55 EDT 2009
What's Midi Device Editor you mentioned in previous email? Is it component
gui that I can just grab from JMSL like MusicShapeEditor? Then I can just
put that in a dialog or something.
Thanks,
Chi
----- Original Message -----
From: <jmsl at music.columbia.edu>
To: <jmsl at music.columbia.edu>
Sent: Wednesday, April 15, 2009 10:16 AM
Subject: Re: [jmsl] Playing Through An External Midi Device
> Select the output device from jmsl like this:
>
> JMSL.midi.setOutDevice(3); // 3 is my presonus midi out device id
> JMSL.midi.open();
>
> Thanks
> Nick
>
> jmsl at music.columbia.edu wrote:
>> Thanks so much for the speedy update! How can I select the output device
>> from jmsl? I tried to look for Midi Device editor in javadoc, but
>> couldn't find it.
>>
>> Chi
>> ----- Original Message ----- From: <jmsl at music.columbia.edu>
>> To: <jmsl at music.columbia.edu>
>> Sent: Wednesday, April 15, 2009 1:48 AM
>> Subject: Re: [jmsl] Playing Through An External Midi Device
>>
>>
>>> Hi Chi
>>>
>>> I have a prerelease posted at http://www.algomusic.com/prerelease/
>>> This prerelease include MidiIO_JavaSound support of external output
>>> devices (not input devices yet)
>>> Thanks very much for your work on this! It helped me get this rolled
>>> into JMSL in a straightforward manner....
>>>
>>> Oddly, JavaSound's device indexes do not distinguish between input and
>>> output devices, so people that use the Midi Device editor will see the
>>> input list is the same as the output list, with all devices listed in
>>> each... I'll fix that later.
>>>
>>> Don't celebrate the timestamps too soon! Even though there is an
>>> argument for timestamps, none of the midi devices I have support the
>>> time stamp. I think it's there as a place holder. I understand the only
>>> way to get accurate MIDI from JavaSound is to use their Real Time
>>> Sequencer. Something to look at. But right now, this works OK: you can
>>> select the midi output device and JMSL.midi will send! For this
>>> prerelease MidiIO_JavaSound is the default midi device for JMSL. But
>>> right now if people want rhythmically accurate MIDI output, use
>>> MidiShare
>>>
>>> A summary of changes since last prerelease follows (note there's a bunch
>>> of music font stuff there, so if any of you have Sonata music font
>>> installed you'll see that JMSL Score looks quite different now!)
>>>
>>> Thanks,
>>> Nick Didkovsky
>>>
>>> JMSL PRERELEASE 20090414
>>> 12/13/08 Fixed bug in
>>> com.softsynth.jmsl.score.midi.WriteScoreMidiFile. Chord Intervals with
>>> Midi Velocities greater than 1 were being multiplied by 128, erroneously
>>> assuming they were amplitudes. Fixed, thanks Georg Hajdu
>>> 12/13/08 MIDIFileToMusicShape now taking absolute values of meta time
>>> signature data. Greg Wilder provided 2 MIDI files which included
>>> negative time signatures that crashed the midi file transcriber.
>>> 12/27/08 TiedNoteAccumulator sets hold time to accumulated duration.
>>> This fixes the problem Joel Mellin discovered when the transcriber
>>> extends long hold times with tied notes and lets them sustain the
>>> full hold time.
>>> 02/02/09 LilyPond export handles colored noteheads now. Thanks Joel
>>> Mellin for feature request. See jmsltestsuite.TwoTracksPerStaff
>>> 02/02/09 Notehead color attribute saved and loaded to/from score xml
>>> 02/02/09 Punos Music plug-in with text-only color chooser for
>>> Notehead Color. "NoteHeadColorTransform". Not a serious color chooser
>>> gui.
>>> 03/06/09 Music Font Rendering using Sonata font, major progress.
>>> noteheads, clefs, stems, expression marks, dynamics, time signatures
>>> 03/06/09 Bug fix: clicking on score canvas triggered two renders.
>>> Removed extra call to score.render()
>>> 04/06/09 ScoreFrame has support to use JavaSound MIDI, searches for
>>> soundbank.gm in classpath/javasound
>>> 04/06/09 run_jmsl_score scripts now include ../classes in classpath
>>> (so that javasound/soundbank.gm can be found)
>>> 04/8/09 MusicGlyphRenderers are per Score now, not static any more
>>> 04/14/09 Support for external MIDI devices in JavaSound MIDI (Thanks
>>> Chi!)
>>> 04/14/09 Default JMSL.midi is now MidiIO_JavaSound (no longer
>>> MidiShare)
>>>
>>>
>>>
>>> jmsl at music.columbia.edu wrote:
>>>> I'm glad it worked. It even supports time stamp, so it's time to ditch
>>>> MidiShare and move to applet! :) JavaSound seem to have bunch of other
>>>> stuff for midi (like writing midi file to OutputStream), so it might be
>>>> worth checking out the program guide when you get a chance.
>>>> How long do you think will take to implement external Midi device
>>>> support with JavaSound? Let me know when you release new jmsl update.
>>>> Thanks,
>>>>
>>>> Chi
>>>> ----- Original Message ----- From: <jmsl at music.columbia.edu>
>>>> To: <jmsl at music.columbia.edu>
>>>> Sent: Tuesday, April 14, 2009 10:43 PM
>>>> Subject: Re: [jmsl] Playing Through An External Midi Device
>>>>
>>>>
>>>>> OK! I can successfully send midi notes to an external piano module
>>>>> using this code. I tested it with two different MIDI interfaces:
>>>>> XSession and Presonus Firepod
>>>>> Works great!
>>>>> thanks
>>>>> Nick
>>>>>
>>>>>
>>>>> jmsl at music.columbia.edu wrote:
>>>>>> Run this and then select the device from the console. It'll play a
>>>>>> short note.
>>>>>> device.getMicrosecondPosition();
>>>>>> This method returns -1 if the device ignores time stamps. Otherwise,
>>>>>> it returns the device's current notion of time, which you as the
>>>>>> sender can use as an offset when determining the time stamps for
>>>>>> messages you subsequently send. For example, if you want to send a
>>>>>> message with a time stamp for five milliseconds in the future, you
>>>>>> can get the device's current position in microseconds, add 5000
>>>>>> microseconds, and use that as the time stamp. Keep in mind that the
>>>>>> MidiDevice's notion of time always places time zero at the time the
>>>>>> device was opened.
>>>>>>
>>>>>>
>>>>>> import java.io.BufferedReader;
>>>>>>
>>>>>> import java.io.IOException;
>>>>>>
>>>>>> import java.io.InputStreamReader;
>>>>>>
>>>>>> import javax.sound.midi.InvalidMidiDataException;
>>>>>>
>>>>>> import javax.sound.midi.MidiDevice;
>>>>>>
>>>>>> import javax.sound.midi.MidiSystem;
>>>>>>
>>>>>> import javax.sound.midi.MidiUnavailableException;
>>>>>>
>>>>>> import javax.sound.midi.ShortMessage;
>>>>>>
>>>>>>
>>>>>> public class Test {
>>>>>>
>>>>>> public static void main(String args[]) throws
>>>>>> InvalidMidiDataException, MidiUnavailableException, IOException {
>>>>>>
>>>>>>
>>>>>> MidiDevice.Info[] infos = MidiSystem.getMidiDeviceInfo();
>>>>>>
>>>>>> for (int i = 0; i < infos.length; i++) {
>>>>>>
>>>>>> System.out.println(i+": "+infos[i]);
>>>>>>
>>>>>> }
>>>>>>
>>>>>>
>>>>>> BufferedReader bf = new BufferedReader(new
>>>>>> InputStreamReader(System.in));
>>>>>>
>>>>>> System.out.println("Which device?");
>>>>>>
>>>>>> int n = 0;
>>>>>>
>>>>>> try {
>>>>>>
>>>>>> n = Integer.parseInt(bf.readLine());
>>>>>>
>>>>>> } catch (NumberFormatException e) {}
>>>>>>
>>>>>>
>>>>>> MidiDevice device = null;
>>>>>>
>>>>>> try {
>>>>>>
>>>>>> device = MidiSystem.getMidiDevice(infos[n]);
>>>>>>
>>>>>> } catch (MidiUnavailableException e) {}
>>>>>>
>>>>>> if (!(device.isOpen())) {
>>>>>>
>>>>>> try {
>>>>>>
>>>>>> device.open();
>>>>>>
>>>>>> } catch (MidiUnavailableException e) {
>>>>>>
>>>>>> // Handle or throw exception...
>>>>>>
>>>>>> }
>>>>>>
>>>>>> }
>>>>>>
>>>>>>
>>>>>> ShortMessage msg = new ShortMessage();
>>>>>>
>>>>>> msg.setMessage(ShortMessage.NOTE_ON, 0, 60, 93);
>>>>>>
>>>>>> long timeStamp = -1;
>>>>>>
>>>>>> javax.sound.midi.Receiver rcvr = device.getReceiver();
>>>>>>
>>>>>> rcvr.send(msg, timeStamp);
>>>>>>
>>>>>> System.exit(0);
>>>>>>
>>>>>> }
>>>>>>
>>>>>>
>>>>>> }
>>>>>>
>>>>>>
>>>>>>
>>>>>> ----- Original Message ----- From: <jmsl at music.columbia.edu>
>>>>>> To: <jmsl at music.columbia.edu>
>>>>>> Sent: Tuesday, April 14, 2009 11:50 AM
>>>>>> Subject: Re: [jmsl] Playing Through An External Midi Device
>>>>>>
>>>>>>
>>>>>>> Hi Chi
>>>>>>>
>>>>>>> Please help me out here, I don't have a lot of resources currently
>>>>>>> to work on this. If you can do the following in a few lines of pure
>>>>>>> Java (no JMSL at all), then I will implement it in JMSL's JavaSound
>>>>>>> support
>>>>>>>
>>>>>>> If someone already knows how to do this, please share it here.
>>>>>>>
>>>>>>> You already know how to enumerate through midi device info.
>>>>>>>
>>>>>>> You can create a MidiDevice using minfo like this:
>>>>>>> MidiDevice mdev = MidiSystem.getMidiDevice(infos[i]);
>>>>>>>
>>>>>>> Your challenge is to open the mdev you want, get the transmitter or
>>>>>>> receiver or whatever it is one needs to do to send a midi message
>>>>>>> out to it, and send it a simple MidiMessage like a noteon.
>>>>>>> I've tried it but cannot get a receiver or a transmitter for these
>>>>>>> midi devices, I just get nulls or exceptions. Something's missing
>>>>>>> and I don't know what it is.
>>>>>>>
>>>>>>> My code follows...
>>>>>>> MidiDevice.Info[] minfo= MidiSystem.getMidiDeviceInfo();
>>>>>>> for (int i = 0; i < minfo.length; i++) {
>>>>>>> MidiDevice mdev = MidiSystem.getMidiDevice(minfo[i]);
>>>>>>> String info = minfo[i].getDescription() + ", " +
>>>>>>> minfo[i].getName() + ", " +
>>>>>>> minfo[i].getVendor() + ", " +
>>>>>>> minfo[i].getVersion();
>>>>>>> System.out.println("\nDevice " + i + " = " + minfo[i]
>>>>>>> + " ... " + mdev.toString());
>>>>>>> System.out.println("CLASS: " + mdev.getClass());
>>>>>>> mdev.open();
>>>>>>> try {
>>>>>>> System.out.println("transmitter for this: " +
>>>>>>> mdev.getTransmitter());
>>>>>>> System.out.println("receiver for this : " +
>>>>>>> mdev.getReceiver());
>>>>>>> } catch (MidiUnavailableException e) {
>>>>>>> System.out.println("can't get transmitter or
>>>>>>> receiver for this");
>>>>>>> } mdev.close();
>>>>>>> }
>>>>>>>
>>>>>>> Thanks
>>>>>>> Nick
>>>>>>>
>>>>>>> jmsl at music.columbia.edu wrote:
>>>>>>>> How can I hookup JavaSound ports to JMSL? If I do this I can see
>>>>>>>> all the external midi devices I have on my computer.
>>>>>>>>
>>>>>>>> MidiDevice.Info[] infos = MidiSystem.getMidiDeviceInfo();
>>>>>>>> for (int i = 0; i < infos.length; i++) {
>>>>>>>> System.out.println(infos[i]);
>>>>>>>> }
>>>>>>>>
>>>>>>>> /*
>>>>>>>> Result:
>>>>>>>> USB Audio Device
>>>>>>>> Microsoft MIDI Mapper
>>>>>>>> USB Audio Device
>>>>>>>> SB X-Fi Synth A [BC00]
>>>>>>>> SB X-Fi Synth B [BC00]
>>>>>>>> Microsoft GS Wavetable SW Synth
>>>>>>>> Real Time Sequencer
>>>>>>>> Java Sound Synthesizer
>>>>>>>> */
>>>>>>>>
>>>>>>>> If I do this, I get an error.
>>>>>>>> JMSL.midi = MidiIO_JavaSound.instance();
>>>>>>>> String[] deviceNames = JMSL.midi.getOutputDeviceNames();
>>>>>>>> System.out.println("There are " + deviceNames.length + "midi
>>>>>>>> devices.");
>>>>>>>> for (int i=0; i<deviceNames.length; i++) {
>>>>>>>> System.out.println(deviceNames[i]);
>>>>>>>> }
>>>>>>>>
>>>>>>>> /*
>>>>>>>> Result:
>>>>>>>> There are 1midi devices.
>>>>>>>> Unimplemented
>>>>>>>> */
>>>>>>>>
>>>>>>>> _______________________________________________
>>>>>>>> jmsl mailing list
>>>>>>>> jmsl at music.columbia.edu
>>>>>>>> http://music.columbia.edu/mailman/listinfo/jmsl
>>>>>>> _______________________________________________
>>>>>>> jmsl mailing list
>>>>>>> jmsl at music.columbia.edu
>>>>>>> http://music.columbia.edu/mailman/listinfo/jmsl
>>>>>>>
>>>>>>
>>>>>> _______________________________________________
>>>>>> jmsl mailing list
>>>>>> jmsl at music.columbia.edu
>>>>>> http://music.columbia.edu/mailman/listinfo/jmsl
>>>>> _______________________________________________
>>>>> jmsl mailing list
>>>>> jmsl at music.columbia.edu
>>>>> http://music.columbia.edu/mailman/listinfo/jmsl
>>>>>
>>>>
>>>> _______________________________________________
>>>> jmsl mailing list
>>>> jmsl at music.columbia.edu
>>>> http://music.columbia.edu/mailman/listinfo/jmsl
>>> _______________________________________________
>>> jmsl mailing list
>>> jmsl at music.columbia.edu
>>> http://music.columbia.edu/mailman/listinfo/jmsl
>>>
>>
>> _______________________________________________
>> jmsl mailing list
>> jmsl at music.columbia.edu
>> http://music.columbia.edu/mailman/listinfo/jmsl
> _______________________________________________
> jmsl mailing list
> jmsl at music.columbia.edu
> http://music.columbia.edu/mailman/listinfo/jmsl
>
More information about the jmsl
mailing list