/* * Created by Nick on Nov 28, 2004 * */ package jmsltutorial; import java.awt.BorderLayout; import java.awt.Button; import java.awt.FlowLayout; import java.awt.Panel; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JFrame; import com.softsynth.jmsl.Composable; 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.jsyn2.JSynMusicDevice; import com.softsynth.jmsl.jsyn2.JSynUnitVoiceInstrument; import com.softsynth.jmsl.jsyn2.unitvoices.FilteredSawtoothBL; import com.softsynth.jmsl.score.Orchestra; import com.softsynth.jmsl.score.Score; import com.softsynth.jmsl.score.ScoreFrame; import com.softsynth.jmsl.score.SelectionBuffer; import com.softsynth.jmsl.score.transcribe.BeatDivisionSchemeList; import com.softsynth.jmsl.score.transcribe.ElementMissedException; import com.softsynth.jmsl.score.transcribe.SearchPathListExpansionException; import com.softsynth.jmsl.score.transcribe.Transcriber; import com.softsynth.jmsl.view.MusicShapeEditor; /** * Edit a MusicShape in the MusicShapeEditor, then transcribe it into a notated * Score. This uses a JSynUnitVoiceInstrument demonstrating that timbral * dimensions higher than dimension 3 are preserved during transcription. * * @author Nick Didkovsky, (c) 2004 All rights reserved, Email: * nick@didkovsky.com * */ public class TranscribeToot05 extends JFrame implements ActionListener { JSynUnitVoiceInstrument insForMusicShape; JSynUnitVoiceInstrument insForScore; JMSLMixerContainer mixer; MusicShapeEditor musicShapeEditor; MusicShape musicShape; Score score; ScoreFrame scoreFrame; Button startButton; Button stopButton; Button transcribeButton; Transcriber transcriber; public void init() { JMSLRandom.randomize(); } public void start() { initializeJMSL(); openMusicDevices(); buildMixer(); buildInstruments(); buildMusicShape(); buildMusicShapeEditor(); buildGUI(); scoreFrame = new ScoreFrame(); transcriber = new Transcriber(); pack(); setVisible(true); } private void initializeJMSL() { JMSL.clock.setAdvance(0.1); } private void openMusicDevices() { JSynMusicDevice dev = JSynMusicDevice.instance(); dev.open(); } private void buildInstruments() { insForMusicShape = new JSynUnitVoiceInstrument(8, FilteredSawtoothBL.class.getName()); insForScore = new JSynUnitVoiceInstrument(8, FilteredSawtoothBL.class.getName()); mixer.addInstrument(insForMusicShape); mixer.addInstrument(insForScore); } private void buildMixer() { mixer = new JMSLMixerContainer(); mixer.start(); } private void buildMusicShape() { musicShape = new MusicShape(insForMusicShape.getDimensionNameSpace()); musicShape.prefab(); musicShape.setInstrument(insForMusicShape); // cute trick to change state of buttons when musicShape finishes on its own musicShape.addStopPlayable(new Playable() { public double play(double playTime, Composable parent) throws InterruptedException { startButton.setEnabled(true); stopButton.setEnabled(false); return playTime; } }); } private void buildMusicShapeEditor() { musicShapeEditor = new MusicShapeEditor(); musicShapeEditor.addMusicShape(musicShape); } private void buildGUI() { setLayout(new BorderLayout()); Panel buttonPanel = new Panel(); buttonPanel.setLayout(new FlowLayout()); buttonPanel.add(startButton = new Button("Start")); buttonPanel.add(stopButton = new Button("Stop")); stopButton.setEnabled(false); buttonPanel.add(transcribeButton = new Button("Transcribe")); startButton.addActionListener(this); stopButton.addActionListener(this); transcribeButton.addActionListener(this); add(BorderLayout.SOUTH, buttonPanel); add(BorderLayout.NORTH, mixer.getPanAmpControlPanel()); add(BorderLayout.CENTER, musicShapeEditor.getComponent()); } public void stop() { musicShape.finish(); try { musicShape.waitForDone(); } catch (InterruptedException e) { } JMSL.scheduler.stop(); JMSL.closeMusicDevices(); scoreFrame.setVisible(false); scoreFrame.dispose(); Score.deleteCanvas(); SelectionBuffer.disposeEditFrame(); removeAll(); } private void transcribe() { BeatDivisionSchemeList.defaultSetup(); // protect the original MusicShape by cloning it MusicShape shapeToTranscribe = (MusicShape) musicShape.clone(); // convert durations to absolute times shapeToTranscribe.integrate(0); Orchestra orch = new Orchestra(); orch.addInstrument(insForScore); score = new Score(1, 800, 500); score.setOrchestra(orch); score.addMeasure(); transcriber.setScore(score); transcriber.setSourceMusicShape(shapeToTranscribe); score.rewind(); score.setCurrentStaffNumber(0); try { transcriber.transcribe(); } catch (SearchPathListExpansionException e) { e.printStackTrace(); } catch (ElementMissedException e) { e.printStackTrace(); } scoreFrame.addScore(score); scoreFrame.pack(); scoreFrame.setVisible(true); } public void actionPerformed(ActionEvent ev) { Object source = ev.getSource(); if (source == startButton) { startButton.setEnabled(false); stopButton.setEnabled(true); musicShape.launch(JMSL.now()); } if (source == stopButton) { startButton.setEnabled(true); stopButton.setEnabled(false); musicShape.finish(); } if (source == transcribeButton) { transcribe(); } } public static void main(String args[]) { TranscribeToot05 test = new TranscribeToot05(); test.init(); test.start(); } }