/* * Created on February 7, 2007 * * Copyright (c) 2007 Jens Gulden * * http://www.frinika.com * * This file is part of Frinika. * * Frinika 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. * Frinika 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 Frinika; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ package com.frinika.sequencer.gui.menu.midi; import com.frinika.gui.AbstractDialog.MoreLessButtonListener; import com.frinika.gui.OptionsEditor; import com.frinika.sequencer.gui.SliderNumberEditable; import com.frinika.sequencer.gui.TimeSelector; import com.frinika.sequencer.midi.groovepattern.GroovePattern; import com.frinika.sequencer.midi.groovepattern.GroovePatternManager; import com.frinika.sequencer.midi.groovepattern.gui.GroovePatternManagerDialog; import java.util.Vector; import javax.swing.DefaultComboBoxModel; import javax.swing.JPanel; import javax.swing.SwingConstants; /** * GUI-component for setting options of a MidiQuantizeAction. * * (Created with NetBeans 5.5 gui-editor, see corresponding .form file.) * * @see MidiQuantizeAction * @author Jens Gulden */ class MidiQuantizeActionEditor extends JPanel implements OptionsEditor { private MidiQuantizeAction action; private int[] ticks; private MoreLessButtonListener moreLessButtonListener = null; private SliderNumberEditable intensitySlider; private SliderNumberEditable swingSlider; private SliderNumberEditable smudgeSlider; private SliderNumberEditable velocitySlider; /** Creates new form MidiQuantizeActionEditorPanel */ public MidiQuantizeActionEditor(MidiQuantizeAction action) { super(); this.action = action; initComponents(); intensitySlider = createSlider(); intensitySliderPanel.add(intensitySlider); swingSlider = createSlider(); swingSliderPanel.add(swingSlider); SliderNumberEditable slider = new SliderNumberEditable(50f, 0f, 100f, 1f, null, "%", SwingConstants.HORIZONTAL); slider.setMinorTickSpacing(5); slider.setMajorTickSpacing(25); slider.setPaintLabels(true); slider.setPaintTicks(true); slider.setPaintTrack(true); smudgeSlider = slider; smudgeSliderPanel.add(smudgeSlider); velocitySlider = createSlider(); velocitySliderPanel.add(velocitySlider); // TODO react on mnemonics for sliders (currently only displayed via labels) ticks = new int[TimeSelector.NOTE_LENGTH_FACTORS.length]; for (int i = 0; i < TimeSelector.NOTE_LENGTH_FACTORS.length; i++) { ticks[i] = (int)Math.round(action.getProjectFrame().getProjectContainer().getSequence().getResolution() * 4 * TimeSelector.NOTE_LENGTH_FACTORS[i]); } resolutionList.setListData(TimeSelector.NOTE_LENGTH_NAMES); } private static SliderNumberEditable createSlider() { SliderNumberEditable slider = new SliderNumberEditable(0f, -100f, 100f, 1f, null, "%", SwingConstants.HORIZONTAL); slider.setMinorTickSpacing(10); slider.setMajorTickSpacing(50); slider.setPaintLabels(true); slider.setPaintTicks(true); slider.setPaintTrack(true); //slider.setSnapToTicks(true); return slider; } public void update() { // gui to model action.q.interval = this.ticks[ resolutionList.getSelectedIndex() ]; action.q.intensity = (float)intensitySlider.getValue() / intensitySlider.getMaximum(); action.q.quantizeNoteStart = noteStartCheckBox.isSelected(); action.q.quantizeNoteLength = noteLengthCheckBox.isSelected(); action.q.swing = (float)swingSlider.getValue() / 100; boolean grooveQuantize = grooveQuantizeCheckBox.isSelected(); Object o = groovePatternComboBox.getSelectedItem(); if (grooveQuantize && (o instanceof GroovePattern)) { //&& (o != null) action.q.groovePattern = (GroovePattern)o; } else { action.q.groovePattern = null; } action.q.smudge = (float)smudgeSlider.getValue() / 100; action.q.velocity = (float)velocitySlider.getValue() / 100; } public void refresh() { // model to gui if (moreLessButtonListener == null) { // need to initialize after dialog is there moreLessButtonListener = action.getDialog().registerMoreLessButtonPanel(moreLessButton, morePanel); } int currentIndex = 4; for (int i = 0; i < TimeSelector.NOTE_LENGTH_FACTORS.length; i++) { if (ticks[i] == action.q.interval) { currentIndex = i; } } resolutionList.setSelectedIndex(currentIndex); resolutionList.ensureIndexIsVisible(currentIndex); intensitySlider.setValue((int)(100 * action.q.intensity)); noteStartCheckBox.setSelected(action.q.quantizeNoteStart); noteLengthCheckBox.setSelected(action.q.quantizeNoteLength); swingSlider.setValue((int)(100 * action.q.swing)); refreshGroovePatternComboBox(); grooveQuantizeCheckBox.setSelected( (action.q.groovePattern != null) ); groovePatternComboBox.setSelectedItem( action.q.groovePattern ); smudgeSlider.setValue((int)(100 * action.q.smudge)); velocitySlider.setValue((int)(100 * action.q.velocity)); grooveQuantizeCheckBoxStateChanged(null); } private void refreshGroovePatternComboBox() { GroovePatternManager gpm = GroovePatternManager.getInstance(); Vector items = new Vector(); // untyped: mixed String / GroovePattern items.add("- Presets -"); for (GroovePattern gp : gpm.getPresetGroovePatterns()) { items.add(gp); } items.add("- User Patterns -"); for (GroovePattern gp : gpm.getUserGroovePatterns()) { items.add(gp); } groovePatternComboBox.setModel(new DefaultComboBoxModel(items)); } private void openGroovePatternManagerDialog() { GroovePatternManagerDialog.showDialog(action.getProjectFrame()); refreshGroovePatternComboBox(); } /** This method is called from within the constructor to * initialize the form. * WARNING: Do NOT modify this code. The content of this method is * always regenerated by the Form Editor. */ // <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:initComponents private void initComponents() { java.awt.GridBagConstraints gridBagConstraints; jLabel1 = new javax.swing.JLabel(); jPanel1 = new javax.swing.JPanel(); resolutionListScrollPane = new javax.swing.JScrollPane(); resolutionList = new javax.swing.JList(); jLabel2 = new javax.swing.JLabel(); intensitySliderPanel = new javax.swing.JPanel(); jLabel3 = new javax.swing.JLabel(); noteStartCheckBox = new javax.swing.JCheckBox(); noteLengthCheckBox = new javax.swing.JCheckBox(); moreLessButton = new javax.swing.JButton(); morePanel = new javax.swing.JPanel(); jLabel4 = new javax.swing.JLabel(); swingSliderPanel = new javax.swing.JPanel(); grooveQuantizeCheckBox = new javax.swing.JCheckBox(); groovePatternComboBox = new javax.swing.JComboBox(); groovePatternManagerButton = new javax.swing.JButton(); smudgeLabel = new javax.swing.JLabel(); smudgeSliderPanel = new javax.swing.JPanel(); velocityLabel = new javax.swing.JLabel(); velocitySliderPanel = new javax.swing.JPanel(); setLayout(new java.awt.GridBagLayout()); jLabel1.setDisplayedMnemonic('R'); jLabel1.setText("Resolution"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; add(jLabel1, gridBagConstraints); jPanel1.setLayout(null); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; add(jPanel1, gridBagConstraints); resolutionListScrollPane.setHorizontalScrollBarPolicy(javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); resolutionList.addListSelectionListener(new javax.swing.event.ListSelectionListener() { public void valueChanged(javax.swing.event.ListSelectionEvent evt) { resolutionListValueChanged(evt); } }); resolutionListScrollPane.setViewportView(resolutionList); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridheight = 2; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.weighty = 1.0; gridBagConstraints.insets = new java.awt.Insets(0, 0, 0, 5); add(resolutionListScrollPane, gridBagConstraints); jLabel2.setDisplayedMnemonic('I'); jLabel2.setText("Intensity"); jLabel2.addFocusListener(new java.awt.event.FocusAdapter() { public void focusGained(java.awt.event.FocusEvent evt) { jLabel2FocusGained(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; add(jLabel2, gridBagConstraints); intensitySliderPanel.setLayout(new java.awt.BorderLayout()); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.weightx = 1.0; gridBagConstraints.weighty = 1.0; add(intensitySliderPanel, gridBagConstraints); jLabel3.setText("Apply to"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; add(jLabel3, gridBagConstraints); noteStartCheckBox.setMnemonic('n'); noteStartCheckBox.setSelected(action.q.quantizeNoteStart); noteStartCheckBox.setText("note start times"); noteStartCheckBox.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 0, 0, 0)); noteStartCheckBox.setMargin(new java.awt.Insets(0, 0, 0, 0)); noteStartCheckBox.addChangeListener(new javax.swing.event.ChangeListener() { public void stateChanged(javax.swing.event.ChangeEvent evt) { noteStartCheckBoxStateChanged(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(0, 5, 0, 0); add(noteStartCheckBox, gridBagConstraints); noteLengthCheckBox.setMnemonic('l'); noteLengthCheckBox.setSelected(action.q.quantizeNoteLength); noteLengthCheckBox.setText("note lengths"); noteLengthCheckBox.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 0, 0, 0)); noteLengthCheckBox.setMargin(new java.awt.Insets(0, 0, 0, 0)); noteLengthCheckBox.addChangeListener(new javax.swing.event.ChangeListener() { public void stateChanged(javax.swing.event.ChangeEvent evt) { noteLengthCheckBoxStateChanged(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(0, 5, 0, 0); add(noteLengthCheckBox, gridBagConstraints); moreLessButton.setMnemonic('M'); moreLessButton.setText("<< Less"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(0, 5, 0, 0); add(moreLessButton, gridBagConstraints); morePanel.setLayout(new java.awt.GridBagLayout()); morePanel.setBorder(javax.swing.BorderFactory.createEtchedBorder()); jLabel4.setDisplayedMnemonic('S'); jLabel4.setText("Swing"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(5, 2, 0, 5); morePanel.add(jLabel4, gridBagConstraints); swingSliderPanel.setLayout(new java.awt.BorderLayout()); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.weightx = 1.0; gridBagConstraints.insets = new java.awt.Insets(0, 0, 0, 2); morePanel.add(swingSliderPanel, gridBagConstraints); grooveQuantizeCheckBox.setMnemonic('G'); grooveQuantizeCheckBox.setText("Groove Quantize"); grooveQuantizeCheckBox.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 0, 0, 0)); grooveQuantizeCheckBox.setMargin(new java.awt.Insets(0, 0, 0, 0)); grooveQuantizeCheckBox.addChangeListener(new javax.swing.event.ChangeListener() { public void stateChanged(javax.swing.event.ChangeEvent evt) { grooveQuantizeCheckBoxStateChanged(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(10, 2, 2, 5); morePanel.add(grooveQuantizeCheckBox, gridBagConstraints); groovePatternComboBox.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Item 1", "Item 2", "Item 3", "Item 4" })); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.weightx = 0.5; gridBagConstraints.insets = new java.awt.Insets(10, 0, 2, 5); morePanel.add(groovePatternComboBox, gridBagConstraints); groovePatternManagerButton.setMnemonic('P'); groovePatternManagerButton.setText("Patterns..."); groovePatternManagerButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { groovePatternManagerButtonActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(10, 0, 2, 2); morePanel.add(groovePatternManagerButton, gridBagConstraints); smudgeLabel.setText("Smudge"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(10, 2, 2, 5); morePanel.add(smudgeLabel, gridBagConstraints); smudgeSliderPanel.setLayout(new java.awt.BorderLayout()); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.insets = new java.awt.Insets(10, 2, 2, 5); morePanel.add(smudgeSliderPanel, gridBagConstraints); velocityLabel.setText("Velocity"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(10, 2, 2, 5); morePanel.add(velocityLabel, gridBagConstraints); velocitySliderPanel.setLayout(new java.awt.BorderLayout()); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.insets = new java.awt.Insets(10, 2, 2, 5); morePanel.add(velocitySliderPanel, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.insets = new java.awt.Insets(5, 0, 0, 0); add(morePanel, gridBagConstraints); }// </editor-fold>//GEN-END:initComponents private void jLabel2FocusGained(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_jLabel2FocusGained intensitySlider.requestFocus(); }//GEN-LAST:event_jLabel2FocusGained private void grooveQuantizeCheckBoxStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_grooveQuantizeCheckBoxStateChanged boolean sel = grooveQuantizeCheckBox.isSelected(); groovePatternComboBox.setEnabled(sel); smudgeSlider.setEnabled(sel); velocitySlider.setEnabled(sel); smudgeLabel.setEnabled(sel); velocityLabel.setEnabled(sel); }//GEN-LAST:event_grooveQuantizeCheckBoxStateChanged private void groovePatternManagerButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_groovePatternManagerButtonActionPerformed openGroovePatternManagerDialog(); }//GEN-LAST:event_groovePatternManagerButtonActionPerformed private void resolutionListValueChanged(javax.swing.event.ListSelectionEvent evt) {//GEN-FIRST:event_resolutionListValueChanged action.q.interval = this.ticks[ resolutionList.getSelectedIndex() ]; }//GEN-LAST:event_resolutionListValueChanged private void noteStartCheckBoxStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_noteStartCheckBoxStateChanged action.q.quantizeNoteStart = noteStartCheckBox.isSelected(); }//GEN-LAST:event_noteStartCheckBoxStateChanged private void noteLengthCheckBoxStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_noteLengthCheckBoxStateChanged action.q.quantizeNoteLength = noteLengthCheckBox.isSelected(); }//GEN-LAST:event_noteLengthCheckBoxStateChanged // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JComboBox groovePatternComboBox; private javax.swing.JButton groovePatternManagerButton; private javax.swing.JCheckBox grooveQuantizeCheckBox; private javax.swing.JPanel intensitySliderPanel; private javax.swing.JLabel jLabel1; private javax.swing.JLabel jLabel2; private javax.swing.JLabel jLabel3; private javax.swing.JLabel jLabel4; private javax.swing.JPanel jPanel1; private javax.swing.JButton moreLessButton; private javax.swing.JPanel morePanel; private javax.swing.JCheckBox noteLengthCheckBox; private javax.swing.JCheckBox noteStartCheckBox; private javax.swing.JList resolutionList; private javax.swing.JScrollPane resolutionListScrollPane; private javax.swing.JLabel smudgeLabel; private javax.swing.JPanel smudgeSliderPanel; private javax.swing.JPanel swingSliderPanel; private javax.swing.JLabel velocityLabel; private javax.swing.JPanel velocitySliderPanel; // End of variables declaration//GEN-END:variables }