[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