[jmsl] Playing Through An External Midi Device

jmsl at music.columbia.edu jmsl at music.columbia.edu
Wed Apr 15 10:40:36 EDT 2009


when you call ...
JMSL.midi.edit(new java.awt.Frame());
... it opens a dialog window with a two Choice lists, showing all 
devices. You choose the one you want. If you click Test Midi Output 
button then it'll play a repetitive melody to the selected device. Then 
click Stop.

thanks
Nick

jmsl at music.columbia.edu wrote:
> 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
>>
>
> _______________________________________________
> jmsl mailing list
> jmsl at music.columbia.edu
> http://music.columbia.edu/mailman/listinfo/jmsl


More information about the jmsl mailing list