[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