X-Git-Url: https://git.piment-noir.org/?p=SugarCubes.git;a=blobdiff_plain;f=_Presets.pde;h=91598ac2078e04dff0f2805575ddd77bd96bfee2;hp=f1855c63aa4f2c4c57eaba9f2030cc9b802ca108;hb=8f4e6c99775f2724edf3cec488860eb68b06491c;hpb=1f974cbc418e3c35bb6010e1d7e566a9af63ff48 diff --git a/_Presets.pde b/_Presets.pde index f1855c6..91598ac 100644 --- a/_Presets.pde +++ b/_Presets.pde @@ -1,22 +1,77 @@ interface PresetListener { - public void onPresetLoaded(Preset preset); - public void onPresetDirty(Preset preset); - public void onPresetStored(Preset preset); - public void onPresetUnloaded(); + public void onPresetSelected(LXDeck deck, Preset preset); + public void onPresetStored(LXDeck deck, Preset preset); + public void onPresetDirty(LXDeck deck, Preset preset); } -class PresetManager implements LXParameter.Listener { +class PresetManager { public static final int NUM_PRESETS = 8; public static final String FILENAME = "data/presets.txt"; public static final String DELIMITER = "\t"; + class DeckState implements LXParameterListener { + + final LXDeck deck; + LXPattern selectedPattern = null; + Preset selectedPreset = null; + boolean isDirty = false; + + DeckState(LXDeck deck) { + this.deck = deck; + deck.addListener(new LXDeck.AbstractListener() { + public void patternDidChange(LXDeck deck, LXPattern pattern) { + if (selectedPattern != pattern) { + onDirty(); + } + } + }); + } + + private void onSelect(Preset preset, LXPattern pattern) { + if ((selectedPattern != pattern) && (selectedPattern != null)) { + for (LXParameter p : selectedPattern.getParameters()) { + ((LXListenableParameter) p).removeListener(this); + } + } + selectedPreset = preset; + selectedPattern = pattern; + isDirty = false; + for (LXParameter p : pattern.getParameters()) { + ((LXListenableParameter) p).addListener(this); + } + for (PresetListener listener : listeners) { + listener.onPresetSelected(deck, preset); + } + } + + private void onStore(Preset preset, LXPattern pattern) { + selectedPreset = preset; + selectedPattern = pattern; + isDirty = false; + for (PresetListener listener : listeners) { + listener.onPresetStored(deck, preset); + } + } + + private void onDirty() { + if (selectedPreset != null) { + isDirty = true; + for (PresetListener listener : listeners) { + listener.onPresetDirty(deck, selectedPreset); + } + } + } + + public void onParameterChanged(LXParameter parameter) { + onDirty(); + } + } + + private final DeckState[] deckState = new DeckState[lx.engine.getDecks().size()]; private final Preset[] presets = new Preset[NUM_PRESETS]; private final List listeners = new ArrayList(); - private Preset loadedPreset = null; - private LXPattern loadedPattern = null; - PresetManager() { for (int i = 0; i < presets.length; ++i) { presets[i] = new Preset(this, i); @@ -33,74 +88,39 @@ class PresetManager implements LXParameter.Listener { } } } - for (Engine.Deck deck : lx.engine.getDecks()) { - deck.addListener(new Engine.AbstractListener() { - public void patternDidChange(Engine.Deck deck, LXPattern pattern) { - if (midiEngine.getFocusedDeck() == deck) { - if (pattern != loadedPattern) { - onPresetDirty(); - } - } - } - }); + for (LXDeck deck : lx.engine.getDecks()) { + deckState[deck.index] = new DeckState(deck); } } - public void setMidiEngine(MidiEngine midiEngine) { - midiEngine.addListener(new MidiEngineListener() { - public void onFocusedDeck(int deckIndex) { - loadedPreset = null; - for (PresetListener listener : listeners) { - listener.onPresetUnloaded(); - } - } - }); - } - public void addListener(PresetListener listener) { listeners.add(listener); } - - public void select(int index) { - presets[index].select(); + + public void select(LXDeck deck, int index) { + presets[index].select(deck); } - public void store(int index) { - presets[index].store(midiEngine.getFocusedPattern()); - for (PresetListener listener : listeners) { - listener.onPresetStored(presets[index]); - } - select(index); + public void store(LXDeck deck, int index) { + presets[index].store(deck); } - public void onPresetLoaded(Preset preset, LXPattern pattern) { - if (loadedPattern != pattern) { - if (loadedPattern != null) { - for (LXParameter p : loadedPattern.getParameters()) { - ((LXListenableParameter) p).removeListener(this); - } - } - } - for (PresetListener listener : listeners) { - listener.onPresetLoaded(preset); - } - loadedPreset = preset; - loadedPattern = pattern; - for (LXParameter p : loadedPattern.getParameters()) { - ((LXListenableParameter) p).addListener(this); - } + public void dirty(LXDeck deck) { + deckState[deck.index].onDirty(); } - private void onPresetDirty() { - for (PresetListener listener : listeners) { - listener.onPresetDirty(loadedPreset); - } + public void dirty(LXPattern pattern) { + dirty(pattern.getDeck()); } - - public void onParameterChanged(LXParameter p) { - onPresetDirty(); + + public void onStore(LXDeck deck, Preset preset, LXPattern pattern) { + deckState[deck.index].onStore(preset, pattern); } + public void onSelect(LXDeck deck, Preset preset, LXPattern pattern) { + deckState[deck.index].onSelect(preset, pattern); + } + public void write() { String[] lines = new String[NUM_PRESETS]; int i = 0; @@ -152,18 +172,27 @@ class Preset { return val; } - public void store(LXPattern pattern) { - className = null; - parameters.clear(); + public void store(LXDeck deck) { + LXPattern pattern = deck.getActivePattern(); className = pattern.getClass().getName(); + parameters.clear(); for (LXParameter p : pattern.getParameters()) { parameters.put(p.getLabel(), p.getValuef()); } + if (pattern instanceof DPat) { + DPat dpattern = (DPat) pattern; + for (DBool bool : dpattern.bools) { + parameters.put(bool.tag, bool.b ? 1.f : 0.f); + } + for (Pick pick : dpattern.picks) { + parameters.put(pick.tag, pick.CurRow + pick.CurCol/100.f); + } + } manager.write(); + manager.onStore(deck, this, pattern); } - public void select() { - Engine.Deck deck = midiEngine.getFocusedDeck(); + public void select(LXDeck deck) { for (LXPattern pattern : deck.getPatterns()) { if (pattern.getClass().getName().equals(className)) { for (String pLabel : parameters.keySet()) { @@ -172,12 +201,29 @@ class Preset { p.setValue(parameters.get(pLabel)); } } + if (pattern instanceof DPat) { + DPat dpattern = (DPat) pattern; + for (DBool bool : dpattern.bools) { + if (bool.tag.equals(pLabel)) { + bool.set(bool.row, bool.col, parameters.get(pLabel) > 0); + } + } + for (Pick pick : dpattern.picks) { + if (pick.tag.equals(pLabel)) { + float f = parameters.get(pLabel); + pick.set((int) floor(f), (int) round((f%1)*100.)); + } + } + } } deck.goPattern(pattern); - manager.onPresetLoaded(this, pattern); + if (pattern instanceof DPat) { + ((DPat)pattern).updateLights(); + } + manager.onSelect(deck, this, pattern); break; } - } + } } }