/** * ControllerSlider.java * * ControllerSlider is a class that generates a GUI JSlider, potentially for any Midi * controller number, with methods to interrogate it if it is the source of an external * ChangeListener. Internally, it looks after itself regarding updating the border * title to include the current reading. More public static final ints could be added * to make this class very widely applicable. * * It does not actually send any midi data - this should be done through the external * ChangeListener. * * Methods are: * getValue() int * getChan() int * getControllerNum() int * getControllerName() String * updateLabel() void * * Andy Murray 18/12/02 */ import java.awt.*; import java.applet.*; import javax.swing.*; import javax.swing.event.*; import javax.swing.border.*; class ControllerSlider extends JSlider implements ChangeListener { private int intChan, intController, //MIDI controller number intInitialVal, intMTS; //minor tick spacing private String strController; public static final int MOD_WHEEL = 1, VOL = 7, PAN = 10, REVERB = 75, CHORUS = 78; ; //constructor ControllerSlider(int chan, int TYPE, boolean showTicks) { super(JSlider.HORIZONTAL,0,128,0);//final tick not drawn if 127 used! intController=TYPE; switch (TYPE) { case MOD_WHEEL : strController="Mod"; intInitialVal=0; intMTS=1; break; case VOL : strController="Vol"; intInitialVal=100; intMTS=8; break; case PAN : strController="Pan"; intInitialVal=64; intMTS=8; break; case REVERB : strController="Rvb"; intInitialVal=40; intMTS=1; break; case CHORUS : strController="Chorus"; intInitialVal=0; intMTS=1; break; } setValue(intInitialVal); intChan = chan; setMajorTickSpacing(64); setMinorTickSpacing(intMTS); setPaintTicks(showTicks); TitledBorder tb = new TitledBorder(new EtchedBorder(),strController+" = "+intInitialVal); setBorder(tb); setBackground(Color.lightGray); addChangeListener(this); } /** * Internal listener to update title border reading */ public void stateChanged(ChangeEvent ce) { updateLabel(); } /** * Can also be called externally to make title reflect current value */ public void updateLabel() { int val = getValue(); TitledBorder tb = (TitledBorder)getBorder(); String title = tb.getTitle(); tb.setTitle(title.substring(0,title.indexOf('=')+2) + val); repaint(); } /** * Returns slider value */ public int getValue() { int val=super.getValue(); if (val>127) {val=127;} //correct for possible 128 value return val; } /** * Returns slider channel */ public int getChan() { return intChan; } /** * Returns controller number to be altered */ public int getControllerNum() { return intController; } /** * Returns abbreviated name (description) of controller */ public String getControllerName() { return strController; } }