[jmsl] QuarterTone MidiScoreInstrument save problem

jmsl at music.columbia.edu jmsl at music.columbia.edu
Tue Jan 8 01:53:58 EST 2008


Hi Peter

I encounter no errors running this from Eclipse, nor saving the score 
manually using the JMSL Score menu, nor loading it back using the JMSL 
Score menu. So you are right it is a problem with paths...

Are you running it from Eclipse or are you executing 
run_jmsl_score.command under OSX, then loading the score using the JMSL 
Score menu?

If the latter, then you can add your instrument's .class file to the 
classpath one of two ways, without altering the run_jmsl_score.command file:
1) Put it in a jar file and put the jar file in the JMSL_v103/lib 
directory (the lib directory is scanned for jars)
...OR...
2) make the folder hierarchy 
com/petermcculloch/megalo/QuarterToneTwoChannelMidiInstrument.class and 
move that into jmsl_plugins. (the jmsl_plugins folder is added to the 
classpath)

I think the jmsl_plugins folder is a better place for it because then it 
will show up in JMSL Score's hierarchical instrument plug-in menu

Let me know if this works for you!

Thanks
Nick


jmsl at music.columbia.edu wrote:
> Thanks Nick,
>
> I've made the changes, but I'm still getting the following error on 
> save.  I've tried putting the classfile into the nested folders in the 
> lib folder where jmsl.jar lives, but it doesn't find it either.  I 
> also added two test classloaders in the main method, one using 
> Class.classForName() and one using JMSLClassLoader.load.  The first 
> one works fine, but the second one gives me a ClassNotFoundException.  
> Do I need to add the class to JMSL's path?
>
> thanks,
> Peter McCulloch
>
>
> Save instrument
> java.lang.ClassNotFoundException: 
> com/petermcculloch/megalo/QuarterToneTwoChannelMidiInstrument
>     at java.lang.Class.forName0(Native Method)
>     at java.lang.Class.forName(Class.java:164)
>     at com.softsynth.jmsl.util.JMSLClassLoader.load(JMSLClassLoader.java)
>     at 
> com.softsynth.jmsl.util.BeanInspector.setClassName(BeanInspector.java)
>     at com.softsynth.jmsl.util.SimpleXMLSaver.<init>(SimpleXMLSaver.java)
>     at com.softsynth.jmsl.score.ScoreFrame.handleSaveIns(ScoreFrame.java)
>     at 
> com.softsynth.jmsl.score.ScoreFrame.actionPerformed(ScoreFrame.java)
>     at java.awt.MenuItem.processActionEvent(MenuItem.java:597)
>     at java.awt.MenuItem.processEvent(MenuItem.java:556)
>     at java.awt.MenuComponent.dispatchEventImpl(MenuComponent.java:298)
>     at java.awt.MenuComponent.dispatchEvent(MenuComponent.java:286)
>     at java.awt.EventQueue.dispatchEvent(EventQueue.java:466)
>     at 
> java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:269) 
>
>     at 
> java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:190) 
>
>     at 
> java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:184)
>     at 
> java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:176)
>     at java.awt.EventDispatchThread.run(EventDispatchThread.java:110)
> JMSLClassLoader, Class.forName( 
> com.petermcculloch.megalo.QuarterToneTwoChannelMidiInstrument) failed, 
> trying System classloader
>
>
> Here's the code:
>
> package com.petermcculloch.megalo;
>
> import java.awt.event.WindowAdapter;
> import java.awt.event.WindowEvent;
>
> import com.softsynth.jmsl.DimensionNameSpace;
> import com.softsynth.jmsl.Interpreter;
> import com.softsynth.jmsl.JMSL;
> import com.softsynth.jmsl.MusicDevice;
> import com.softsynth.jmsl.midi.MidiIO;
> import com.softsynth.jmsl.midi.MidiInstrument;
> import com.softsynth.jmsl.score.Note;
> import com.softsynth.jmsl.score.NoteFactory;
> import com.softsynth.jmsl.score.Score;
> import com.softsynth.jmsl.score.ScoreFrame;
> import com.softsynth.jmsl.score.midi.MidiScoreInstrument;
> import com.softsynth.jmsl.util.AttributeBuildable;
> import com.softsynth.jmsl.util.JMSLClassLoader;
>
> public class QuarterToneTwoChannelMidiInstrument extends 
> MidiScoreInstrument implements
>         AttributeBuildable {
>
>     private static final MidiIO MIDI = JMSL.midi;
>     MidiInstrument ins1, ins2;
>
>     public QuarterToneTwoChannelMidiInstrument() {
>         this(1);
>     }
>
>     public QuarterToneTwoChannelMidiInstrument(int channel1) {
>         super(channel1);
>         ins1 = new MidiInstrument(channel1);
>         ins2 = new MidiInstrument(channel1 + 1);
>     }
>
>     /**
>      *
>      */
>     public void buildFromAttributes() {
>         System.out.println("Got here, buildFromAttributes()");
>         super.buildFromAttributes();
>         MIDI.bendPitch(getChannel(), MidiIO.PITCH_BEND_CENTER);
>         MIDI.bendPitch(getChannel2(), MidiIO.PITCH_BEND_CENTER + 2048);
>         System.out.println("Pitch Bend " + MIDI.PITCH_BEND + 
> "\t\tPitch Bend Center"
>                 + MIDI.PITCH_BEND_CENTER);
>         // Set both channels to full volume
>         MIDI.control(getChannel(), MIDI.MIDI_VOLUME_CONTROL_INDEX, 127);
>         MIDI.control(getChannel2(), MIDI.MIDI_VOLUME_CONTROL_INDEX, 127);
>
>     }
>
>     @Override
>     public String getName() {
>         return "Quarter-Tone MIDI Instrument (2 Ch.)";
>     }
>
>     @Override
>     public double play(double playtime, double timestretch, double[] 
> dim) {
>         double pitch = dim[1];
>         double roundedPitch = Math.round(pitch * 2) * 0.5;
>         double[] scaledVelDim = dim;
>         scaledVelDim[2] = dim[2] * 127.;
>
>         if (roundedPitch - Math.floor(roundedPitch) == 0) {
>             return ins1.play(playtime, timestretch, scaledVelDim);
>         } else {
>             return ins2.play(playtime, timestretch, scaledVelDim);
>         }
>     }
>
>     @Override
>     public int getProgram() {
>         return ins1.getProgram();
>     }
>
>     @Override
>     public void setProgram(int program) {
>         ins1.setProgram(program);
>         ins2.setProgram(program);
>     }
>
>     @Override
>     public Interpreter getInterpreter() {
>         return ins1.getInterpreter();
>     }
>
>     @Override
>     public void setInterpreter(Interpreter interpreter) {
>         if ((ins1 != null) && (ins2 != null)) {
>             ins1.setInterpreter(interpreter);
>             ins2.setInterpreter(interpreter);
>         }
>         super.setInterpreter(interpreter);
>     }
>
>     @Override
>     public DimensionNameSpace getDimensionNameSpace() {
>         return ins1.getDimensionNameSpace();
>     }
>
>     @Override
>     public void setDimensionNameSpace(DimensionNameSpace dns) {
>         if ((ins1 != null) && (ins2 != null)) {
>             ins1.setDimensionNameSpace(dns);
>             ins2.setDimensionNameSpace(dns);
>         }
>         super.setDimensionNameSpace(dns);
>     }
>
>     @Override
>     public double update(double playtime, double timestretch, double[] 
> dim) {
>         double pitch = dim[1];
>         double roundedPitch = Math.round(pitch * 2) * 0.5;
>         double[] scaledVelDim = dim;
>         scaledVelDim[2] = dim[2] * 127.;
>
>         if (roundedPitch - Math.floor(roundedPitch) == 0) {
>             return ins1.update(playtime, timestretch, scaledVelDim);
>         } else {
>             return ins2.update(playtime, timestretch, scaledVelDim);
>         }
>     }
>
>     public MidiInstrument getIns1() {
>         return ins1;
>     }
>
>     public void setIns1(MidiInstrument ins1) {
>         this.ins1 = ins1;
>     }
>
>     public MidiInstrument getIns2() {
>         return ins2;
>     }
>
>     public void setIns2(MidiInstrument ins2) {
>         this.ins2 = ins2;
>     }
>
>     @Override
>     public double getTransposition() {
>         return ins1.getTransposition();
>     }
>
>     @Override
>     public void setTransposition(double transposition) {
>         ins1.setTransposition(transposition);
>         ins2.setTransposition(transposition);
>     }
>
>     @Override
>     public int getNumOutputs() {
>         return 2;
>     }
>
>     @Override
>     public int getChannel() {
>         return ins1.getChannel();
>     }
>
>     @Override
>     public void setChannel(int channel) {
>         ins1.setChannel(channel);
>         if (channel + 1 == 10) {
>             ins2.setChannel(11);
>         } else {
>             ins2.setChannel(channel + 1);
>         }
>     }
>
>     public int getChannel2() {
>         if (ins1.getChannel() + 1 != 10) {
>             return ins1.getChannel() + 1;
>         } else {
>             return 11;
>         }
>     }
>
>     @Override
>     public double close(double time) throws InterruptedException {
>         ins1.close(time);
>         return ins2.close(time);
>     }
>
>     @Override
>     public double open(double time) throws InterruptedException {
>         ins1.open(time);
>         return ins2.open(time);
>     }
>
>     @Override
>     public Object getOutput() {
>         return ins1.getOutput();
>     }
>
>     @Override
>     public Object getOutput(int outNum) {
>         System.out.println("******OutNumber:\t" + outNum);
>         if (outNum == 0) {
>             return ins1.getOutput();
>         } else {
>             return ins2.getOutput();
>         }
>     }
>
>     @Override
>     public void setMusicDevice(MusicDevice device) {
>         super.setMusicDevice(device);
>         if ((ins1 != null) && (ins2 != null)) {
>             ins1.setMusicDevice(device);
>             ins2.setMusicDevice(device);
>         }
>     }
>
>     @Override
>     public void setMixerClassName(String mixerClassName) {
>         if ((ins1 != null) && (ins2 != null)) {
>             ins1.setMixerClassName(mixerClassName);
>             ins2.setMixerClassName(mixerClassName);
>         }
>         super.setMixerClassName(mixerClassName);
>     }
>
>     public static void main(String args[]) {
>         // plays a quarter-tone scale, and then a chord to demonstrate 
> playback.
>
>         ScoreFrame frame = new ScoreFrame();
>
>         Score score = new Score(1);
>         score.addMeasures(10, 3, 4);
>
>         for (double x = 0.; x < 12.; x = x + 0.5) {
>             // System.out.println(x + 60.);
>             Note n = NoteFactory.makeNote(0.25, x + 60., 1, 0.25);
>             score.addNote(n);
>             if (x % 2. != 1.5) {
>                 n.setBeamedOut(true);
>             }
>         }
>
>         for (int i = 0; i < 6; i++) {
>             Note n = NoteFactory.makeNote(0.5, 60., 1., 0.5);
>             score.addNote(n);
>             n.addInterval(64.);
>             n.addInterval(67);
>             n.addInterval(72.5);
>             if (i % 4 != 1) {
>                 n.setBeamedOut(true);
>             }
>
>         }
>
>         frame.addScore(score);
>
>         QuarterToneTwoChannelMidiInstrument dc = new 
> QuarterToneTwoChannelMidiInstrument();
>         dc.setChannel(1);
>         dc.getMusicDevice().open();
>         dc.buildFromAttributes();
>
>         frame.addInstrument(dc);
>
>         // This works fine!
>         try {
>             Class testClass = 
> Class.forName(QuarterToneTwoChannelMidiInstrument.class
>                     .getCanonicalName());
>         } catch (ClassNotFoundException e1) {
>             System.out.println("Error with System class loader");
>             e1.printStackTrace();
>         }
>
>         try {
>             Class testClass2 = 
> JMSLClassLoader.load(QuarterToneTwoChannelMidiInstrument.class
>                     .getCanonicalName());
>         } catch (ClassNotFoundException e1) {
>             System.out.println("Error with JMSLClassLoader");
>             e1.printStackTrace();
>         }
>
>         frame.addWindowListener(new WindowAdapter() {
>             public void windowClosing(WindowEvent e) {
>                 JMSL.closeMusicDevices(); // be nice!
>                 System.exit(0);
>             }
>         });
>
>         frame.pack();
>         frame.setVisible(true);
>
>     }
>
> }
>
> _______________________________________________
> jmsl mailing list
> jmsl at music.columbia.edu
> http://music.columbia.edu/mailman/listinfo/jmsl


More information about the jmsl mailing list