[jmsl] Exporting to Midi

jmsl at music.columbia.edu jmsl at music.columbia.edu
Tue Apr 14 09:24:41 EDT 2009


I have no idea how the class is implemented, but JavaSound has its own 
method to output midi through FileWriter or OutputStream. This is what Java 
Sound Programmer Guide says:
The write methods of a MidiFileWriter subclass perform the encoding of the 
data in a given Sequence into the correct data format for the requested type 
of MIDI file, writing the coded stream to either a file or an output stream:
abstract int write(Sequence in, int fileType,
                   java.io.File out)
abstract int write(Sequence in, int fileType,
                   java.io.OutputStream out)

Can JMSL utilize this somehow? Thanks,

Chi
----- Original Message ----- 
From: <jmsl at music.columbia.edu>
To: <jmsl at music.columbia.edu>
Sent: Tuesday, April 14, 2009 9:06 AM
Subject: Re: [jmsl] Exporting to Midi


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



More information about the jmsl mailing list