[jmsl] visual metronome

jmsl at music.columbia.edu jmsl at music.columbia.edu
Mon Feb 20 17:37:59 EST 2006


Hi Mike

The easiest way to do this is subclass MusicJob, and give it a visual 
component into which it can draw or write.  Give it a huge repeat count 
and have its repeat() method return playtime + 1 to delay it one sec 
every repeat

In order to synch it with audio, it will need to be initially delayed by 
JMSL.clock.getAdvance() + JSynLatency (assuming you are using JSyn)
Use myMetronome.setStartDelay(thatValue) to delay its startup
Launch it in parallel with your other Composables

There is no way currently to programmatically get the latency in JSyn so 
you need to set it by hand.

Something like:

package gui;

import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import com.didkovsky.portview.PVFrame;
import com.didkovsky.portview.PVLabel;
import com.didkovsky.portview.swing.ViewFactorySwing;
import com.softsynth.jmsl.JMSL;
import com.softsynth.jmsl.MusicJob;

/**
 * @author Nick Didkovsky, (c) 2005 Nick Didkovsky, 
didkovn at mail.rockefeller.edu
 * 
 */
public class VisualMetronome extends MusicJob {

    private PVLabel label = JMSL.getViewFactory().createLabel("Metronome");
    private String[] tictoc = { "TIC", "TOC" };

    public PVLabel getLabel() {
        return label;
    }

    public double repeat(double playTime) {
        label.setText(tictoc[getRepeatCount() % tictoc.length]);
        return playTime + 1;
    }

    public static void main(String[] args) {
        JMSL.setViewFactory(new ViewFactorySwing());
        JMSL.clock.setAdvance(0.1);

        VisualMetronome visualMetronome = new VisualMetronome();
        visualMetronome.setRepeats(Integer.MAX_VALUE);

        PVFrame frame = JMSL.getViewFactory().createFrame();
        frame.add(visualMetronome.getLabel().getComponent());
        frame.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                JMSL.closeMusicDevices();
                System.exit(0);
            }
        });
        frame.setSize(300, 200);
        frame.setVisible(true);
        double jsynLatency = 0.1;
        visualMetronome.setStartDelay(JMSL.clock.getAdvance() + 
jsynLatency);
        visualMetronome.launch(JMSL.now());
    }
}

Thanks
Nick Didkovsky

jmsl at music.columbia.edu wrote:

> Now I am working on the electronic accompaniment to the new piece. I 
> want to
> script a visual metronome that runs in sync from the launched music 
> job that
> plays the electronics part. Before I waste a ton of time figuring how 
> to do
> it because I am not sure where to begin, I wanted to see if you have some
> code laying around for such a task, i.e. The visual metronome. Should 
> I be
> concerned about timing accuracy?
>
> Thanks,
>
> Mike
>
> _______________________________________________
> jmsl mailing list
> jmsl at music.columbia.edu
> http://music.columbia.edu/mailman/listinfo/jmsl



More information about the jmsl mailing list