[jmsl] QuarterTone MidiScoreInstrument save problem

jmsl at music.columbia.edu jmsl at music.columbia.edu
Tue Jan 8 00:46:54 EST 2008


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);

	}

}



More information about the jmsl mailing list