[jmsl] Exporting to Midi
jmsl at music.columbia.edu
jmsl at music.columbia.edu
Tue Apr 14 09:06:33 EDT 2009
I see MidiLogger.writeMidiFile() uses MIDIFileOutput, which is a class
was written by Phil Burk.
MIDIFileOutput extends RandomAccessFile which supports a seek() method
that lets you sort of jump around the file as you are writing it. This
is necessary so that after writing a track you can "rewind" to the track
header, write the length of the track into the track header, then seek()
forward to the end of track again for continued writing of output.
I don't know offhand if there would be a simple way to either make a
virtual RandomAccessFile in memory that you could write to, or create a
subclass of RandomAccessFile that supports writing to a
DataOutputStream... maybe there's a trivial solution but I don't see it
at this moment.
Maybe someone can chime in?
Thanks
Nick
jmsl at music.columbia.edu wrote:
> That's very cool! How can I write the midi file into DataOutputStream
> so I can post it to php?
> I don't see any method to write to an OutputStream in JMSL.midi.
> Can I somehow redirect JMSL.midi.writeMidiFile()?
> Thanks,
>
> chi
> ----- Original Message ----- From: <jmsl at music.columbia.edu>
> To: <jmsl at music.columbia.edu>
> Sent: Tuesday, April 14, 2009 12:06 AM
> Subject: Re: [jmsl] Exporting to Midi
>
>
>> 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
>> _______________________________________________
>> 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