[jmsl] Exporting to Midi

jmsl at music.columbia.edu jmsl at music.columbia.edu
Tue Apr 14 00:06:07 EDT 2009


I can verify that using the non realtime musicClock works for the 
purposes of playing a collection in hyperspeed mode, and logging to a 
MIDI file. 
Here is a complete working example. After the Midi init dialog, this 
will run instantly, make no sound, and write a MIDI file to 
logs/testMidiFile2.MID
The key ideas are:
1) turn midi logging on
2) turn midi quiet
3) use non-real-time clock
4) add "stop playable" to the top level composable that will write the 
midi file.
4) launch your composable (in this case a musicshape)
Thanks,
Nick Didkovsky

package jmsltestsuite;

import java.awt.Frame;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;

import com.didkovsky.portview.PVFrame;
import com.softsynth.jmsl.*;
import com.softsynth.jmsl.midi.MidiIO_JavaSound;
import com.softsynth.jmsl.midi.MidiInstrument;
import com.softsynth.jmsl.view.MusicShapeEditor;
import com.softsynth.jmsl.view.PVFrameAdapter;

/**
 * Set JMSL.midi to MidiIO_JavaSound and play some Midi melodies
 *
 * MOD 4/14/09: adding non-real-time example, which plays the MusicShape 
with MIDI logging on, Midi quiet, and non real time music clock
 *
 * @author Nick Didkovsky
 */

public class JavaSoundMidiTest {

    public static void main(String args[]) {

        boolean NON_REAL_TIME = true;

        PVFrame myFrame = new PVFrameAdapter();

        MusicDevice dev = MidiIO_JavaSound.instance();

        try {
            // in case this machine does not have a soundbank in jre, 
load one from url
            JMSL.setIsApplet(true); // flag to use url if soundbank not 
found. If you know where a
            // soundbank is on your machine, comment this isApplet() 
line out and use the file
            // version instead ((MidiIO_JavaSound) 
dev).setSoundbankFile(File f);
            URL soundbankURL = new 
URL("http://www.algomusic.com/javasound/soundbank.gm");
            ((MidiIO_JavaSound) dev).setSoundbankURL(soundbankURL);
        } catch (MalformedURLException e1) {
            e1.printStackTrace();
        }

        dev.edit((Frame) myFrame.getComponent());
        dev.open();

        JMSL.clock.setAdvance(0.1);
        MusicShape s = new MusicShape(4);
        s.add(0.5, 64, 100, 2.0);
        s.add(0.5, 66, 90, 2.5);
        s.add(0.25, 69, 80, 1.5);
        s.add(0.25, 72, 70, 0.25);
        s.add(0.25, 75, 100, 2.0);

        s.setInstrument(new MidiInstrument(1)); // Midi ins on channel 1

        s.setRepeats(10);

        if (NON_REAL_TIME) {
            JMSL.clock = new NonRealTimeMusicClock();
            JMSL.midi.setQuiet(true);
            JMSL.midi.setMidiLogging(true);

            s.addStopPlayable(new Playable() {
                public double play(double playTime, Composable parent) 
throws InterruptedException {
                    JMSL.midi.setMidiLogging(false);
                    try {
                        JMSL.midi.writeMidiFile("logs/testMidiFile2.MID");
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    return playTime;
                }
            });
        }

        if (!NON_REAL_TIME) {
           
            MusicShapeEditor se = new MusicShapeEditor();
            se.addMusicShape(s);

            myFrame.add(se.getComponent());
            myFrame.pack();
            // f.setSize(320, 200);
            myFrame.addWindowListener(new WindowAdapter() {
                public void windowClosing(WindowEvent e) {
                    JMSL.midi.close();
                    System.exit(0);
                }
            });
            myFrame.setVisible(true);
        }
       
        s.launch(JMSL.now());
    }

}



jmsl at music.columbia.edu wrote:
> try this (untested!)
> After you turn on midi logging...
>
>        oldClock = JMSL.clock;
>        JMSL.clock = new NonRealTimeMusicClock();
>        double launchTime = JMSL.now();
>        noteLurker.setLaunchTime(launchTime);
>        col.launch(launchTime);
>
> // add a Playable to col's stopplayables, so that you are notified 
> when the col finishes, when that Playable is notifies, do this:
> JMSL.clock = oldClock;
>
> Nick
> jmsl at music.columbia.edu wrote:
>> I'm trying to develop both midi (only export for compatibility) as 
>> well as xml (export and import for editing).
>> Is there way to export the entire sequential collection to midi 
>> (ByteArray), so I can pass it to php in non-realtime, instead of 
>> saving it to file?
>> Thanks,
>>
>> Chi
>> ----- Original Message ----- From: <jmsl at music.columbia.edu>
>> To: <jmsl at music.columbia.edu>
>> Sent: Saturday, April 11, 2009 2:39 PM
>> Subject: Re: [jmsl] Exporting to Midi
>>
>>
>>> I am not sure what your design intent is...
>>> Do you want to offer a sequencer in an applet, with the ability to 
>>> edit and save music to the server?  Do you want to be able to load 
>>> music from the server back into the sequencer for further editing? 
>>> If so, then don't save it as a midi file, save the hierarchy and 
>>> data as I described earlier.
>>> Thanks
>>> Nick
>>>
>>>
>>> jmsl at music.columbia.edu wrote:
>>>> It's just an alternative to xml. If I go for xml route, I would 
>>>> need to make a player.
>>>> If I go for midi route, I could just embed midi file inn html, but 
>>>> I need to find out the way to export the entire sequence into midi 
>>>> like MidiLoggerRealTimeTest preferably without the rendering time.
>>>> Which one do you think is easier? Thanks.
>>>>
>>>> Chi
>>>> ----- Original Message ----- From: <jmsl at music.columbia.edu>
>>>> To: <jmsl at music.columbia.edu>
>>>> Sent: Saturday, April 11, 2009 10:41 AM
>>>> Subject: Re: [jmsl] Exporting to Midi
>>>>
>>>>
>>>>> Is your goal really to create a MidiFile or is this is a 
>>>>> followup/alternative to your previous posting (ie a way to 
>>>>> save/load a piece)?
>>>>> Thanks
>>>>> Nick
>>>>>
>>>>> jmsl at music.columbia.edu wrote:
>>>>>> I've checked out the example MidiLoggerNonRealTimeTest from 
>>>>>> jmsltestsuite. Is there way to export all the data from 
>>>>>> sequential collection which contains parallel collections which 
>>>>>> contains music shapes to midi in non-realtime? The example seems 
>>>>>> to feed one midi message at a time to the logger.
>>>>>> If that's the only way, I'd probably need to figure out which 
>>>>>> notes play at the same time from different music shapes from 
>>>>>> different parallel collections and calculate note on and off time 
>>>>>> which might be too much work. MidiLoggerRealTimeTest sounds very 
>>>>>> simple, but users have to wait to hear the whole thing to render 
>>>>>> into midi. If you have a good solution, please let me know.
>>>>>> How can I make JMSL to play through an external midi device (not 
>>>>>> soundbank) without MidiShare? I know timing might be sloppy, but 
>>>>>> can I still do it?
>>>>>> Thanks,
>>>>>>
>>>>>> Chi
>>>>>> _______________________________________________
>>>>>> 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