Subversion Repositories svn.mios

Rev

Rev 738 | Blame | Compare with Previous | Last modification | View Log | RSS feed

/*
 * @(#)SIDV2librarian.java  beta1   2008/01/21
 *
 * Copyright (C) 2008    Rutger Vlek (rutgervlek@hotmail.com)
 *
 * This application is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This application is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this application; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */


package org.midibox.sidedit;

import java.util.Vector;

import org.midibox.sidlibr.Patch;

public class EngineSpecs {
    // Control types:
    private static int rotary = 0;
    private static int button = 1;
    private static int simplebutton = 2;
    private static int slider = 3;
    private static int waveselect = 4;
    private static int lfoselect = 5;
    private static int combo = 6;

    public static Vector getEngine(Patch patch) {
        Vector engine = new Vector();
        if (patch.isEnsemble()) {
            engine.add(EnsembleSpecs.createENSSID(patch, 0)); // 1: Ensemble
            // settings for
            // SID1
            engine.add(EnsembleSpecs.createENSSID(patch, 64)); // 2: Ensemble
            // settings for
            // SID2
            engine.add(EnsembleSpecs.createENSSID(patch, 128)); // 3: Ensemble
            // settings for
            // SID3
            engine.add(EnsembleSpecs.createENSSID(patch, 192)); // 4: Ensemble
            // settings for
            // SID4
        } else {
            if (patch.getEngine() == patch.LEAD) {
                // Lead engine
                engine.add(createGlobal(patch, SIDSysexInfo.leadParams)); // 0:
                // Global
                // parameters
                engine.add(createExt(patch)); // 1: External parameters
                engine.add(createFilter(patch, 0)); // 2: Filter Left
                engine.add(createFilter(patch, 6)); // 3: Filter right
                engine.add(LeadSpecs.createMSTR(patch)); // 4: Master settings
                engine.add(createVoice(patch, 0)); // 5: Voice 1 Left
                engine.add(createVoice(patch, 16)); // 6: Voice 2 Left
                engine.add(createVoice(patch, 32)); // 7: Voice 3 Left
                engine.add(createVoice(patch, 48)); // 8: Voice 4 Right
                engine.add(createVoice(patch, 64)); // 9: Voice 5 Right
                engine.add(createVoice(patch, 80)); // 10: Voice 6 Right
                engine.add(LeadSpecs.createLFO(patch)); // 11: LFO's
                engine.add(LeadSpecs.createENV(patch, 0)); // 12: Envelope 1
                engine.add(LeadSpecs.createENV(patch, 16)); // 13: Envelope 2
                engine.add(LeadSpecs.createMOD(patch)); // 14: Modulation paths
                engine.add(LeadSpecs.createTRIG(patch)); // 15: Trigger matrix
                engine.add(LeadSpecs.createWT(patch)); // 16: Wavetable
                // sequencer
            } else if (patch.getEngine() == patch.BASSLINE) {
                // Bassline
                engine.add(createGlobal(patch, SIDSysexInfo.basslineParams));// 0:
                // Global
                // parameters
                engine.add(createExt(patch)); // 1: External parameters
                engine.add(createFilter(patch, 0)); // 2: Filter Left
                engine.add(createFilter(patch, 6)); // 3: Filter right
                engine.add(createVoice(patch, 0)); // 4: Left Oscillator
                engine.add(createVoice(patch, 80)); // 5: Right Oscillator
                engine.add(BasslineSpecs.createMSTRBOTH(patch));// 6: Right
                // Oscillator
                engine.add(BasslineSpecs.createMSTR(patch, 0)); // 7: Left
                // master set
                engine.add(BasslineSpecs.createMSTR(patch, 80));// 8: Right
                // master set
                engine.add(BasslineSpecs.createLFO(patch, 0)); // 9: Left LFO's
                engine.add(BasslineSpecs.createLFO(patch, 80)); // 10: Right
                // LFO's
                engine.add(BasslineSpecs.createENV(patch, 0)); // 11: Left
                // Envelope
                engine.add(BasslineSpecs.createENV(patch, 80)); // 12: Right
                // Envelope
                engine.add(BasslineSpecs.createSEQ(patch, 0)); // 13: Left
                // Sequencer
                engine.add(BasslineSpecs.createSEQ(patch, 80)); // 14: Right
                // Sequencer
                engine.add(BasslineSpecs.createSEQData(patch)); // 15: Sequencer
                // data
            } else if (patch.getEngine() == patch.DRUM) {
                // Drum
                engine.add(createGlobal(patch, SIDSysexInfo.drumParams)); // 0:
                // Global
                // parameters
                engine.add(createExt(patch)); // 1: External parameters
                engine.add(createFilter(patch, 0)); // 2: Filter Left
                engine.add(createFilter(patch, 6)); // 3: Filter right
                engine.add(DrumSpecs.createDrumInstr(patch)); // 4: Drum
                // Instruments
                engine.add(DrumSpecs.createSEQ(patch)); // 5: Sequencer
                engine.add(DrumSpecs.createSEQData(patch)); // 6: Sequencer data
            } else if (patch.getEngine() == patch.MULTI) {
                // Multi
                engine.add(createGlobal(patch, SIDSysexInfo.multiParams)); // 0:
                // Global
                // parameters
                engine.add(createExt(patch)); // 1: External parameters
                engine.add(createFilter(patch, 0)); // 2: Filter Left
                engine.add(createFilter(patch, 6)); // 3: Filter right
                engine.add(createVoice(patch, 0)); // 4: Inst.1 Voice
                engine.add(createVoice(patch, 48)); // 5: Inst.2 Voice
                engine.add(createVoice(patch, 96)); // 6: Inst.3 Voice
                engine.add(createVoice(patch, 144)); // 7: Inst.4 Voice
                engine.add(createVoice(patch, 192)); // 8: Inst.5 Voice
                engine.add(createVoice(patch, 240)); // 9: Inst.6 Voice
                engine.add(MultiSpecs.createInstrument(patch, 0)); // 10: Inst.1
                // Rest
                engine.add(MultiSpecs.createInstrument(patch, 48)); // 11:
                // Inst.2
                // Rest
                engine.add(MultiSpecs.createInstrument(patch, 96)); // 12:
                // Inst.3
                // Rest
                engine.add(MultiSpecs.createInstrument(patch, 144)); // 13:
                // Inst.4
                // Rest
                engine.add(MultiSpecs.createInstrument(patch, 192)); // 14:
                // Inst.5
                // Rest
                engine.add(MultiSpecs.createInstrument(patch, 240)); // 15:
                // Inst.6
                // Rest
                engine.add(MultiSpecs.createWTdata(patch)); // 16: Wavetable
                // data
            }
        }
        return engine;
    }

    private static Vector createGlobal(Patch patch, String[] engineParams) {
        Vector globalControl = new Vector();

        globalControl.add(new SIDSysexParameterControl(combo,
                SIDSysexInfo.sidRestrict, 0, patch, 17, 0, 2, "SID type",
                "SID chip type to be used"));
        globalControl.add(new SIDSysexParameterControl(combo,
                SIDSysexInfo.monoStereo, 0, patch, 17, 3, 1, "Stereo",
                "To be used in stereo"));
        globalControl.add(new SIDSysexParameterControl(combo,
                SIDSysexInfo.caps, 0, patch, 17, 4, 4, "Filter caps",
                "Type of filter capacitors to be used"));
        globalControl.add(new SIDSysexParameterControl(button, null, 0, patch,
                18, 0, 1, "ABW", "Workaround for the SID's ADSR-bug"));
        globalControl.add(new SIDSysexParameterControl(rotary, null, 0, patch,
                82, 0, 7, "Volume"));

        for (int c = 0; c < 8; c++) {
            globalControl.add(new SIDSysexParameterControl(combo, engineParams,
                    0, patch, 24 + (5 * c), 0, 8, "Assign 1",
                    "Assign this control to a parameter"));
            globalControl.add(new SIDSysexParameterControl(combo, engineParams,
                    0, patch, 25 + (5 * c), 0, 8, "Assign 2",
                    "Assign this control to a parameter"));
            globalControl.add(new SIDSysexParameterControl(rotary, null, 0,
                    patch, 26 + (5 * c), 0, 8, "Init.", "Initial value"));
            globalControl.add(new SIDSysexParameterControl(rotary, null, 0,
                    patch, 27 + (5 * c), 0, 8, "Min.", "Minimum value"));
            globalControl.add(new SIDSysexParameterControl(rotary, null, 0,
                    patch, 28 + (5 * c), 0, 8, "Max.", "Maximum value"));
        }

        return globalControl;
    }

    private static Vector createVoice(Patch patch, int offset) {
        Vector voiceControl = new Vector();
        // Single voice
        voiceControl.add(new SIDSysexParameterControl(combo,
                SIDSysexInfo.porta, 0, patch, 96 + offset, 0, 2, "Portamento",
                "Portamento type"));
        voiceControl.add(new SIDSysexParameterControl(button, null, 0, patch,
                96 + offset, 2, 1, "GAE", "Gate Always Enabled"));
        voiceControl.add(new SIDSysexParameterControl(waveselect, null, 0,
                patch, 97 + offset, 0, 8, "Waveform", "Select a waveform"));
        voiceControl.add(new SIDSysexParameterControl(slider, null, 0, patch,
                98 + offset, 4, 4, "Attack", "SID's DCA Attack rate"));
        voiceControl.add(new SIDSysexParameterControl(slider, null, 0, patch,
                98 + offset, 0, 4, "Decay", "SID's DCA Decay rate"));
        voiceControl.add(new SIDSysexParameterControl(slider, null, 0, patch,
                99 + offset, 4, 4, "Sustain", "SID's DCA Sustain level"));
        voiceControl.add(new SIDSysexParameterControl(slider, null, 0, patch,
                99 + offset, 0, 4, "Release", "SID's DCA Release rate"));
        voiceControl.add(new SIDSysexParameterControl(rotary, null, 0, patch,
                100 + offset, 0, 12, "Pulse Width", "Pulse Width"));
        voiceControl.add(new SIDSysexParameterControl(rotary, null, 0, patch,
                102 + offset, 0, 8, "Accent", "Bassline Accent")); // SwinSID
        // Phase...
        voiceControl.add(new SIDSysexParameterControl(slider, null, 0, patch,
                103 + offset, 0, 8, "Delay", "DCA Envelope delay"));
        voiceControl.add(new SIDSysexParameterControl(rotary, null, -64, patch,
                104 + offset, 0, 7, "Transpose"));
        voiceControl.add(new SIDSysexParameterControl(rotary, null, -128,
                patch, 105 + offset, 0, 8, "Finetune"));
        voiceControl.add(new SIDSysexParameterControl(rotary, null, 0, patch,
                106 + offset, 0, 7, "Pitchrange", "Range of the Pitch Bender"));
        voiceControl.add(new SIDSysexParameterControl(rotary, null, 0, patch,
                107 + offset, 0, 8, "Porta. Rate", "Portamento speed"));
        // Arpeggiator
        voiceControl.add(new SIDSysexParameterControl(button, null, 0, patch,
                108 + offset, 0, 1, "Arp On/Off",
                "Enables/disables the arpeggiator"));
        voiceControl.add(new SIDSysexParameterControl(combo,
                SIDSysexInfo.direction, 0, patch, 108 + offset, 1, 3,
                "Direction", "Direction of the arpeggio"));
        voiceControl.add(new SIDSysexParameterControl(button, null, 0, patch,
                108 + offset, 4, 1, "Sorted", "Sort notes"));
        voiceControl.add(new SIDSysexParameterControl(button, null, 0, patch,
                108 + offset, 5, 1, "Hold", "Hold the last arpeggio"));
        voiceControl
                .add(new SIDSysexParameterControl(button, null, 0, patch,
                        108 + offset, 6, 1, "Key Sync",
                        "Synchronize with key presses"));
        voiceControl.add(new SIDSysexParameterControl(button, null, 0, patch,
                108 + offset, 7, 1, "Constant Cycle",
                "Constant arpeggiator cycle"));
        voiceControl.add(new SIDSysexParameterControl(rotary, createDividers(),
                0, patch, 109 + offset, 0, 6, "Speed Divider",
                "Speed divider (sets the tempo)"));
        voiceControl.add(new SIDSysexParameterControl(button, null, 0, patch,
                109 + offset, 6, 1, "Easy Chord")); // 21
        voiceControl.add(new SIDSysexParameterControl(button, null, 0, patch,
                109 + offset, 7, 1, "Oneshot")); // 22
        voiceControl
                .add(new SIDSysexParameterControl(rotary, createGatelength(),
                        0, patch, 110 + offset, 0, 5, "Gatelength")); // 23
        voiceControl.add(new SIDSysexParameterControl(rotary, null, 1, patch,
                110 + offset, 5, 3, "Octave Range")); // 24
        // SwinSID
        voiceControl.add(new SIDSysexParameterControl(rotary, null, 0, patch,
                111 + offset, 0, 4, "Waveform OSC2",
                "Waveform of second oscillator"));
        voiceControl.add(new SIDSysexParameterControl(button, null, 0, patch,
                111 + offset, 4, 1, "Enable OSC2", "Enable second oscillator"));
        voiceControl.add(new SIDSysexParameterControl(button, null, 0, patch,
                111 + offset, 5, 1, "x2 pitch", "scale pitch"));
        voiceControl.add(new SIDSysexParameterControl(button, null, 0, patch,
                111 + offset, 6, 1, "Rev. Waveform", "Reverse Waveform"));
        voiceControl.add(new SIDSysexParameterControl(rotary, null, 0, patch,
                102 + offset, 0, 8, "Phase"));
        return voiceControl;
    }

    private static Vector createFilter(Patch patch, int offset) {
        Vector filterControl = new Vector();
        filterControl.add(new SIDSysexParameterControl(rotary, null, 0, patch,
                85 + offset, 0, 12, "Cutoff", "Cutoff frequency"));
        filterControl.add(new SIDSysexParameterControl(rotary, null, 0, patch,
                87 + offset, 0, 8, "Resonance"));
        filterControl.add(new SIDSysexParameterControl(rotary, null, 0, patch,
                88 + offset, 0, 8, "Keytrack", "Key tracking"));
        filterControl.add(new SIDSysexParameterControl(button, null, 0, patch,
                84 + offset, 0, 1, "OSC1->Filt", "OSC1 routed through filter"));
        filterControl.add(new SIDSysexParameterControl(button, null, 0, patch,
                84 + offset, 1, 1, "OSC2->Filt", "OSC2 routed through filter"));
        filterControl.add(new SIDSysexParameterControl(button, null, 0, patch,
                84 + offset, 2, 1, "OSC3->Filt", "OSC3 routed through filter"));
        filterControl.add(new SIDSysexParameterControl(button, null, 0, patch,
                84 + offset, 3, 1, "EXT->Filter",
                "External input routed through filter"));
        filterControl.add(new SIDSysexParameterControl(button, null, 0, patch,
                84 + offset, 4, 1, "Low  Pass", "Low pass filter"));
        filterControl.add(new SIDSysexParameterControl(button, null, 0, patch,
                84 + offset, 5, 1, "Band Pass", "Band pass filter"));
        filterControl.add(new SIDSysexParameterControl(button, null, 0, patch,
                84 + offset, 6, 1, "High Pass", "High pass filter"));
        filterControl.add(new SIDSysexParameterControl(button, null, 0, patch,
                84 + offset, 7, 1, "OSC3 off", "Turn off oscillator 3"));
        filterControl.add(new SIDSysexParameterControl(button, null, 0, patch,
                86 + offset, 7, 1, "FIP", "Filter Interpolation"));
        return filterControl;
    }

    private static Vector createExt(Patch patch) {
        Vector extControl = new Vector();
        // External switches 1-8
        extControl.add(new SIDSysexParameterControl(button, null, 0, patch, 20,
                7, 1, "Switch 1", "External Switch 1"));
        extControl.add(new SIDSysexParameterControl(button, null, 0, patch, 20,
                6, 1, "Switch 2", "External Switch 2"));
        extControl.add(new SIDSysexParameterControl(button, null, 0, patch, 20,
                5, 1, "Switch 3", "External Switch 3"));
        extControl.add(new SIDSysexParameterControl(button, null, 0, patch, 20,
                4, 1, "Switch 4", "External Switch 4"));
        extControl.add(new SIDSysexParameterControl(button, null, 0, patch, 20,
                3, 1, "Switch 5", "External Switch 5"));
        extControl.add(new SIDSysexParameterControl(button, null, 0, patch, 20,
                2, 1, "Switch 6", "External Switch 6"));
        extControl.add(new SIDSysexParameterControl(button, null, 0, patch, 20,
                1, 1, "Switch 7", "External Switch 7"));
        extControl.add(new SIDSysexParameterControl(button, null, 0, patch, 20,
                0, 1, "Switch 8", "External Switch 8"));
        // External Parameter CV 1-8
        extControl.add(new SIDSysexParameterControl(rotary, null, 0, patch, 64,
                0, 16, "Ext.CV 1", "External Parameter CV 1"));
        extControl.add(new SIDSysexParameterControl(rotary, null, 0, patch, 66,
                0, 16, "Ext.CV 2", "External Parameter CV 2"));
        extControl.add(new SIDSysexParameterControl(rotary, null, 0, patch, 68,
                0, 16, "Ext.CV 3", "External Parameter CV 3"));
        extControl.add(new SIDSysexParameterControl(rotary, null, 0, patch, 70,
                0, 16, "Ext.CV 4", "External Parameter CV 4"));
        extControl.add(new SIDSysexParameterControl(rotary, null, 0, patch, 72,
                0, 16, "Ext.CV 5", "External Parameter CV 5"));
        extControl.add(new SIDSysexParameterControl(rotary, null, 0, patch, 74,
                0, 16, "Ext.CV 6", "External Parameter CV 6"));
        extControl.add(new SIDSysexParameterControl(rotary, null, 0, patch, 76,
                0, 16, "Ext.CV 7", "External Parameter CV 7"));
        extControl.add(new SIDSysexParameterControl(rotary, null, 0, patch, 78,
                0, 16, "Ext.CV 8", "External Parameter CV 8"));
        return extControl;
    }

    public static String[] createDividers() {
        String[] s = new String[64];
        for (int i = 0; i < s.length; i++) {
            s[i] = Integer.toString(i + 1);
        }
        return s;
    }

    public static String[] createGatelength() {
        String[] s = new String[32];
        for (int i = 0; i < s.length; i++) {
            s[i] = Integer.toString(i + 1);
        }
        return s;
    }

}