/* * Created on Mar 4, 2006 * * Copyright (c) 2006 P.J.Leonard * * 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; import java.awt.Insets; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.BorderFactory; import javax.swing.JButton; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JSlider; import javax.swing.JSpinner; import javax.swing.JToolBar; import javax.swing.SpinnerNumberModel; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import com.frinika.voiceserver.AudioContext; import com.frinika.voiceserver.JavaSoundVoiceServer; import com.frinika.voiceserver.VoiceServer; import com.frinika.gui.ToolbarSeperator; import com.frinika.project.ProjectContainer; import com.frinika.project.gui.ProjectFrame; import com.frinika.sequencer.FrinikaSequencer; import com.frinika.sequencer.Metronome; import com.frinika.sequencer.SwingSongPositionListenerWrapper; import com.frinika.sequencer.TempoChangeListener; import com.frinika.sequencer.gui.transport.TransportPanel; import com.frinika.sequencer.model.tempo.TempoList; import com.frinika.sequencer.model.tempo.TempoList.MyTempoEvent; import static com.frinika.gui.util.ButtonFactory.makePressButton; import static com.frinika.gui.util.ButtonFactory.makeIconLabel; import static com.frinika.localization.CurrentLocale.getMessage; public class GlobalToolBar extends JToolBar { /** * */ private static final long serialVersionUID = 1L; LoopPanel loopPanel; // ProjectFrame projectFrame; public GlobalToolBar(final ProjectFrame projectFrame) { final ProjectContainer project = projectFrame.getProjectContainer(); Insets insets = new Insets(0, 0, 0, 0); setMargin(insets); JPanel panel = new TransportPanel(projectFrame); panel.setOpaque(false); // panel.setMargin(insets); // panel.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(),"transport")); // panel.setBorder(BorderFactory.createEtchedBorder()); add(panel); // item.setIcon(); add(new ToolbarSeperator()); loopPanel = new LoopPanel(project); loopPanel.setOpaque(false); // panel.setMargin(insets); // loopPanel.setBorder(BorderFactory.createEtchedBorder()); add(loopPanel); add(new ToolbarSeperator()); AudioContext context = AudioContext.getDefaultAudioContext(); if (context != null) { VoiceServer vs = context.getVoiceServer(); if (vs != null && vs instanceof JavaSoundVoiceServer) { ((JavaSoundVoiceServer) vs).cpuMeter.setBorder(BorderFactory .createEtchedBorder()); add(((JavaSoundVoiceServer) vs).cpuMeter); } } panel = new JPanel(); panel.setOpaque(false); add(panel); /* * final JTextField tempoTextField = new JTextField("" + (int) * projectFrame.getProjectContainer().getSequencer().getTempoInBPM()); * tempoTextField.setColumns(5); tempoTextField.addFocusListener(new * FocusAdapter() { public void focusLost(FocusEvent e) { float tempo = * projectFrame.getProjectContainer().getTempo(); try { tempo = * Float.parseFloat(tempoTextField.getText()); * projectFrame.getProjectContainer().setTempoInBPM(tempo); } catch * (Exception ex) { tempoTextField.setText(tempo + ""); } } }); */ // TODO should be a float int bpm = (int) projectFrame.getProjectContainer().getSequencer() .getTempoInBPM(); final JSpinner tempoSpinner = new JSpinnerDraggable( new SpinnerNumberModel((double) bpm, 0d, 999d, 1d)); tempoSpinner.addChangeListener(new ChangeListener() { public void stateChanged(ChangeEvent e) { long tickNow = project.getSequencer().getTickPosition(); float tempo = (((Double) tempoSpinner.getValue()).floatValue()); TempoList list = project.getTempoList(); MyTempoEvent ev = list.getTempoEventAt(tickNow); tickNow = ev.getTick(); list.remove(ev.getTick(), ev.getTick() + 1); list.add(tickNow, tempo); list.notifyListeners(); project.getSequencer().setTempoInBPM(tempo); } }); projectFrame.getProjectContainer().getSequencer() .addTempoChangeListener(new TempoChangeListener() { public void notifyTempoChange(float bpm) { // System.out.println(" TEMPO CHANGE "+ bpm); tempoSpinner.setValue((double)bpm); } }); panel.add(new JLabel("BPM")); // panel.add(tempoTextField); panel.add(tempoSpinner); add(panel); panel = new JPanel(); panel.setOpaque(false); final JSlider metronomeSlider = new JSlider(0, 127, 0); metronomeSlider.setOpaque(false); try { // ------------------------- Choose midi based or sample based // metronome ---------------- // Midi based metronome final Metronome metronome = new Metronome(project); project.getSequencer().addSongPositionListener(metronome); // new SwingSongPositionListenerWrapper(metronome)); // Sample based metronome // final SampleBasedMetronome metronome=new // SampleBasedMetronome(project); // --------------------------------------------------------------------------------------- project.injectIntoOutput(metronome); metronomeSlider.addChangeListener(new ChangeListener() { public void stateChanged(ChangeEvent e) { metronome.setVelocity(metronomeSlider.getValue()); } }); panel.add(makeIconLabel("metronome20")); panel.add(metronomeSlider); add(panel); } catch (Exception e) { e.printStackTrace(); } ActionListener act = new ActionListener() { public void actionPerformed(ActionEvent e) { FrinikaSequencer sequencer = project.getSequencer(); sequencer.panic(); } }; JButton reset = makePressButton("exclamation32", "reset", getMessage("sequencer.toolbar.reset_tip"), act, this); reset.setMargin(new Insets(0, 0, 0, 0)); } public LoopPanel getLoopPanel() { return loopPanel; } }