package jmsltestsuite; import java.awt.Frame; import java.awt.GridLayout; import java.awt.event.*; import java.util.Enumeration; import java.util.Vector; import com.didkovsky.portview.*; import com.didkovsky.portview.awt.ViewFactoryAWT; import com.didkovsky.portview.swing.ViewFactorySwing; import com.softsynth.jmsl.*; import com.softsynth.jmsl.jsyn.JSynInsFromClassName; import com.softsynth.jmsl.jsyn.JSynMusicDevice; import com.softsynth.jmsl.score.*; import com.softsynth.jmsl.score.transforms.RestToggleTransform; import com.softsynth.jmsl.view.PVFrameAdapter; import com.softsynth.jmsl.view.PVPanelAdapter; import com.softsynth.jsyn.circuits.FilteredSawtoothBL; /** * Launch more than one score simultaneously. Nice! Do multi-tempo pieces, etc * * Also show how to add a keyboard shortcut to a custom NotePropertiesTransform (select notes and * hit the "r" key a couple of times ) * * @author Nick Didkovsky, March 21, 2002, (c) 2002 Nick Didkovsky, all rights reserved */ public class MultipleScoresDemo3 implements ActionListener { PVPanel panel; PVButton goButton; PVButton finishButton; PVButton playSectionButton; PVCheckbox loopCheckbox; Vector scores = new Vector(); public MultipleScoresDemo3() { panel = new PVPanelAdapter(); goButton = JMSL.getViewFactory().createButton("LAUNCH SCORES IN PARALLEL"); panel.add(goButton.getComponent()); playSectionButton = JMSL.getViewFactory().createButton("PLAY SECTION"); panel.add(playSectionButton.getComponent()); finishButton = JMSL.getViewFactory().createButton("FINISH"); panel.add(finishButton.getComponent()); panel.add((loopCheckbox = JMSL.getViewFactory().createCheckbox("Loop", false)).getComponent()); goButton.addActionListener(this); finishButton.addActionListener(this); playSectionButton.addActionListener(this); } public void addScore(Score score) { scores.addElement(score); } public PVPanel getPanel() { return panel; } public static Score generateSomeScore(double tempo) { Score score = new Score(1, 1024, 200); score.ownCanvas(); // !!! Orchestra orch = new Orchestra(); orch.addInstrument(new JSynInsFromClassName(8, FilteredSawtoothBL.class.getName())); score.setOrchestra(orch); Measure m = score.addMeasure(); m.setTempo(tempo); for (int i = 0; i < 17; i++) { score.addNote(0.5, JMSLRandom.choose(55.0, 72.0), 0.6, 0.4); } score.getScoreCollection().addPlayLurker(new PlayLurker() { public void notifyPlayLurker(double playTime, MusicJob list, int index) { System.out.println(list.getName() + " playing measure " + index); } }); return score; } public void actionPerformed(ActionEvent ev) { Object source = ev.getSource(); if (source == goButton) { double when = JMSL.now(); for (Enumeration e = scores.elements(); e.hasMoreElements();) { Score score = (Score) e.nextElement(); score.getControlPanel().setLoop(loopCheckbox.getState()); score.getControlPanel().launch(when, 0, score.size() - 1, false); } } if (source == finishButton) { for (Enumeration e = scores.elements(); e.hasMoreElements();) { Score score = (Score) e.nextElement(); score.getControlPanel().finish(); ScoreCollectionBehavior behavior = (ScoreCollectionBehavior) score.getScoreCollection().getBehavior();; int measureWhereFinished = behavior.getCurrentMeasureNumber(); System.out.println("Score " + score.getName() + " finished on measure " + measureWhereFinished); } } if (source == playSectionButton) { double when = JMSL.now(); for (Enumeration e = scores.elements(); e.hasMoreElements();) { Score score = (Score) e.nextElement(); score.getControlPanel().setLoop(loopCheckbox.getState()); score.getControlPanel().launchSection(when, false); } } } public static void main(String args[]) { // CRITICAL!!! Each new Score must own its own ScoreCanvas for rendering Score.useSharedCanvas(false); boolean useSwing = true; if (useSwing) { JMSL.setViewFactory(new ViewFactorySwing()); } else { JMSL.setViewFactory(new ViewFactoryAWT()); } PVFrame f = new PVFrameAdapter("Two different scores, two different tempi, play in parallel!"); f.setSize(1100, 600); f.setFrameLayout(new GridLayout(0, 1)); f.addWindowListener(new java.awt.event.WindowAdapter() { public void windowClosing(java.awt.event.WindowEvent e) { System.exit(0); } }); MusicDevice dev = JSynMusicDevice.instance(); dev.edit((Frame) (f.getComponent())); dev.open(); PVFrame f2 = new PVFrameAdapter("Score controls"); f2.setFrameLayout(new GridLayout(0, 3, 10, 10)); MultipleScoresDemo3 multiScoreLauncher = new MultipleScoresDemo3(); // create a new score for each tempo double[] tempi = { 60, 72, 55 }; for (int i = 0; i < tempi.length; i++) { Score score = MultipleScoresDemo3.generateSomeScore(tempi[i]); multiScoreLauncher.addScore(score); f.add(score.getScoreCanvas().getComponent()); f2.add(score.getOrchestra().getJMSLMixerContainer().getPanAmpControlPanel(1, 1, 0, 0)); } f2.add(multiScoreLauncher.getPanel().getComponent()); f.validate(); f2.pack(); f.setVisible(true); f2.setVisible(true); ScoreCommandCenter.addScoreCommand(new NotePropertiesTransformCommand(new RestToggleTransform()), KeyEvent.VK_R); } }