[jmsl] Sequence Player

jmsl at music.columbia.edu jmsl at music.columbia.edu
Tue Apr 28 03:03:20 EDT 2009


I still can't make the player working. I'm not sure what would be the proper 
way to stop and move. Can someone run this program and see what the problem 
is? I'd really appreciate it.

Even though the gui appears to be disabled, you can still trigger them with 
shortcuts. Press A for a new shape, R to remove, P to play, N for next 
shape, and V for previous shape. Each MusicShape has two notes.

Everything seems to work, but I can't get it to move properly during the 
playback. I guess the failing part is move method.

Thanks,



chi




import java.awt.BorderLayout;


import java.awt.GridLayout;


import java.awt.event.ActionEvent;


import java.awt.event.ActionListener;


import java.awt.event.ItemEvent;


import java.awt.event.ItemListener;


import java.awt.event.KeyEvent;


import javax.swing.JApplet;


import javax.swing.JButton;


import javax.swing.JCheckBoxMenuItem;


import javax.swing.JFrame;


import javax.swing.JLabel;


import javax.swing.JMenuItem;


import javax.swing.JOptionPane;


import javax.swing.JPanel;


import javax.swing.KeyStroke;


import com.didkovsky.portview.swing.ViewFactorySwing;


import com.softsynth.jmsl.Composable;


import com.softsynth.jmsl.EventScheduler;


import com.softsynth.jmsl.JMSL;


import com.softsynth.jmsl.JMSLMixerContainer;


import com.softsynth.jmsl.JMSLRandom;


import com.softsynth.jmsl.MusicShape;


import com.softsynth.jmsl.Playable;


import com.softsynth.jmsl.SequentialCollection;


import com.softsynth.jmsl.midi.MidiIO_JavaSound;


import com.softsynth.jmsl.midi.MidiInstrument;




public class SequenceTest extends JApplet {




private JMSLMixerContainer mixer;


private MidiInstrument ins;


private MusicShape ms;


private SequentialCollection sequenceCol, nextCol;


private SequencePlayable sequencePlayable;


private JCheckBoxMenuItem sequencePlayCB;


private JButton position;


private int startedSequence;




public SequenceTest () {


super();


start();


}




public void start() {


synchronized (JMSL.class) {


initJMSL();


initMixer();


initInstrument();


buildCollection();


buildGUI();


}


}




public void stop() {


synchronized (JMSL.class) {


removeAll();


sequenceCol.finishAll();


try {sequenceCol.waitForDone();}


catch (InterruptedException e) {e.printStackTrace();}


mixer.stop();


JMSL.scheduler.stop();


JMSL.closeMusicDevices();


}


}




private void initJMSL() {


JMSL.setViewFactory(new ViewFactorySwing());


JMSL.scheduler = new EventScheduler();


JMSL.scheduler.start();


JMSL.clock.setAdvance(0.1);


JMSLRandom.randomize();


JMSL.midi = MidiIO_JavaSound.instance();


JMSL.midi.open();


}




private void initMixer() {


mixer = new JMSLMixerContainer();


mixer.start();


}




private void initInstrument() {


ins = new MidiInstrument(1,0);


mixer.addInstrument(ins);


mixer.panAmpChange(0, 0.5, 1.0);


}




private void buildCollection() {


sequenceCol = new SequentialCollection();


nextCol = new SequentialCollection();


nextCol.setRepeats(Integer.MAX_VALUE);


nextCol.addRepeatPlayable(sequencePlayable = new SequencePlayable());


}




private void buildGUI() {


setName("Random");


setSize(1280, 1024);


setLayout(new BorderLayout());




add(position = new JButton("" + (sequencePlayable.getCounter()+1) + "/" + 
sequenceCol.size()), BorderLayout.NORTH);


position.addActionListener(new ActionListener() {


public void actionPerformed(ActionEvent e) {


String str = JOptionPane.showInputDialog(null, "Enter a new position: ", 
"New Position", 1);


if (str == null) return;


int n = 0;


try {n = Integer.parseInt(str);


} catch (NumberFormatException error) {return;}


if (n >= 1 && n <= sequenceCol.size()) {


move(n-1);


}


}


});




JPanel p = new JPanel();


p.setLayout(new GridLayout(1,6));


p.setVisible(true);


add(p, BorderLayout.CENTER);


p.add(sequencePlayCB = new JCheckBoxMenuItem("Play Sequence"), 
BorderLayout.NORTH);


sequencePlayCB.setEnabled(false);


sequencePlayCB.setMnemonic(KeyEvent.VK_P);


sequencePlayCB.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_P, 0));


sequencePlayCB.addItemListener(new ItemListener() {


public void itemStateChanged(ItemEvent e) {


if (sequencePlayCB.getState()) {


playSequence();


} else {


stopSequence();


}


}


});


JMenuItem mi;


p.add(mi = new JMenuItem("Previous Sequence"), BorderLayout.WEST);


mi.setMnemonic(KeyEvent.VK_V);


mi.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V, 0));


mi.addActionListener(new ActionListener() {


public void actionPerformed(ActionEvent e) {


prevSequence();


}


});




p.add(mi = new JMenuItem("Next Sequence"), BorderLayout.EAST);


mi.setMnemonic(KeyEvent.VK_N);


mi.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N, 0));


mi.addActionListener(new ActionListener() {


public void actionPerformed(ActionEvent e) {


nextSequence();


}


});




p.add(mi = new JMenuItem("Add Sequence"));


mi.setMnemonic(KeyEvent.VK_A);


mi.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_A, 0));


mi.addActionListener(new ActionListener() {


public void actionPerformed(ActionEvent e) {


addSequence();


}


});




p.add(mi = new JMenuItem("Remove Sequence"));


mi.setMnemonic(KeyEvent.VK_R);


mi.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_R, 0));


mi.addActionListener(new ActionListener() {


public void actionPerformed(ActionEvent e) {


removeSequence();


}


});






validate();


setVisible(true);




}




private void playSequence() {


if (sequenceCol.size() > 0) {


startedSequence = sequencePlayable.getCounter();


sequencePlayable.setPlaying(true);


nextCol.launch(JMSL.now(), null);


}


}




private void stopSequence() {


sequencePlayable.setPlaying(false);


nextCol.finishAll();


nextCol.removeAll();


sequencePlayable.setCounter(startedSequence);


updatePosition();


}




private void prevSequence() {

move(sequencePlayable.getCounter()-1);

}




private void nextSequence() {


move(sequencePlayable.getCounter()+1);


}




private void addSequence() {


sequencePlayCB.setEnabled(true);


ms = new MusicShape(ins.getDimensionNameSpace());


ms.useStandardDimensionNameSpace();


ms.setInstrument(ins);


ms.add(0.25, JMSLRandom.choose(47,80), 127, 0.25);


ms.add(0.75, JMSLRandom.choose(47,80), 127, 0.25);


sequenceCol.add(ms);


updatePosition();


}




private void removeSequence() {


if (sequenceCol.size() > 0) {


if (sequencePlayable.getCounter() >= sequenceCol.size()-1) 
sequencePlayable.setCounter(sequenceCol.size()-1);


sequenceCol.remove(sequencePlayable.getCounter());


}


}




private void updatePosition() {


position.setText("" + 
(sequencePlayable.getCounter()+1)+"/"+sequenceCol.size());


}




private void move(int n) {


if (n >= 0 && n<=sequenceCol.size()-1) {


if (sequencePlayable.isPlaying()) {


sequencePlayable.setPlaying(false);


nextCol.finishAll();


nextCol.removeAll();


sequencePlayable.setPlaying(true);


sequencePlayable.setCounter(n);


nextCol.launch(JMSL.now(), null);


}


else {


sequencePlayable.setCounter(n);


updatePosition();


}


}


}




public static void main(String[] args) {


JFrame frame = new JFrame("Sequence Test");


frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);


frame.setSize(1280, 1024);


frame.add(new SequenceTest());


frame.pack();


frame.validate();


frame.setVisible(true);


}




class SequencePlayable implements Playable {




private boolean playing;


private int counter;




public boolean isPlaying() {


return playing;


}




public void setPlaying(boolean playing) {


this.playing=playing;


}




public int getCounter() {


return counter;


}




public void setCounter(int counter) {


this.counter=counter;


}




public SequencePlayable() {


counter=0;


playing=false;


}




public double play(double playTime, Composable thing) throws 
InterruptedException {


if (counter < sequenceCol.size() && playing) {


System.out.println("trying " + counter + "/" + sequenceCol.size());


SequentialCollection col = (SequentialCollection)thing;


col.removeAll();


col.add(sequenceCol.get(counter));


updatePosition();


counter++;


}


else {


sequencePlayCB.setState(false);


}


if (counter >= sequenceCol.size()) {


playing=false;


}


System.out.println("Counter is at " + counter + "/" + sequenceCol.size());


return playTime;


}


}




}



More information about the jmsl mailing list