package com.ordrumbox.gui.panels;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.BorderFactory;
import com.ordrumbox.core.control.SongManager;
import com.ordrumbox.core.description.Note;
import com.ordrumbox.core.description.OrPattern;
import com.ordrumbox.core.description.Patternsequencer;
import com.ordrumbox.core.listener.LiveNotesChangeListener;
import com.ordrumbox.core.orsnd.listener.CursorPositionListener;
import com.ordrumbox.core.orsnd.player.LiveNote;
import com.ordrumbox.core.orsnd.player.LiveNotes;
import com.ordrumbox.core.orsnd.player.LiveNotesManager;
import com.ordrumbox.core.orsnd.player.Player;
import com.ordrumbox.gui.controler.PanelControler;
import com.ordrumbox.gui.panels.pattern.PatternGridView;
import com.ordrumbox.gui.panels.pattern.TrackListView;
import com.ordrumbox.gui.widgets.NoteView;
import com.ordrumbox.gui.widgets.OrWidget;
import com.ordrumbox.gui.widgets.OrXScrollPanel;
public class LiveNotesView extends OrXScrollPanel implements LiveNotesChangeListener, CursorPositionListener {
/**
*
*/
private static final long serialVersionUID = 1L;
private static final int NOTE_H = 6;
private int songStep;
public LiveNotesView() {
super();
setVisible(false);
PanelControler.getInstance().setLiveNoteListView(this);
setLayout(null);
setBackground(Color.darkGray);
setBorder(BorderFactory.createLineBorder(Color.white));
// setMaximumSize(new Dimension(TrackListView._W + PatternGridView._NB_STEPS * NoteView._W + 6, OrWidget.H_RACK *2));
setPreferredSize(new Dimension(TrackListView._W + PatternGridView._NB_STEPS * NoteView._W + 6, OrWidget.H_RACK * 2));
Player.getInstance().addCursorPositionListener(this);
LiveNotesManager.getInstance().addLiveNotesChangeListener(this);
}
public void paintComponent(Graphics g) {
//System.out.println("LiveNoteView::paintComponent");
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
int index = 0;
for (LiveNote liveNote : LiveNotesManager.getInstance().getLiveNotes().getList()) {
if (liveNote.isEnabled()) {
index++;
if (liveNote.getNote() != null) {
drawLiveNote(g, liveNote);
}
}
}
paintPatternSequencers(g2d);
paintCursor(g);
displayOrScrollBar(g);
}
private void paintCursor(Graphics g) {
int nbSteps = SongManager.getInstance().getCurrentSong().getNbSongSteps();
g.fillRect((int) (((float) songStep * getWidth() / nbSteps - start) / zoom), 0, 2, getHeight());
}
private void drawLiveNote(Graphics g, LiveNote liveNote) {
int y = liveNote.getNote().getTrack().getPattern().getNumFromTrack(liveNote.getNote().getTrack()) + 6;
if (liveNote.getNote().getType() == Note.FANTOM) {
g.setColor(Color.gray);
} else {
int qvelo = (int) (liveNote.getNote().getVelo() * 100) / Note.MAXVELO / 40;
if (qvelo == 0)
g.setColor(OrWidget.NOTE_COLOR_0);
else if (qvelo == 1)
g.setColor(OrWidget.NOTE_COLOR_1);
else if (qvelo == 2)
g.setColor(OrWidget.NOTE_COLOR_2);
else if (qvelo == 3)
g.setColor(OrWidget.NOTE_COLOR_3);
}
float coef = LiveNotesManager.getInstance().getNb_SFramesPerStep();
int step = (int) (liveNote.getStartSFrame() / coef);
int nbSteps = SongManager.getInstance().getCurrentSong().getNbSongSteps();
float x1 = (step * getWidth() / nbSteps - start) / zoom;
float stepWidth = (float) ((liveNote.getEndSFrame() - liveNote.getStartSFrame()) / coef);
float w1 = (stepWidth * getWidth() / nbSteps) / zoom;
if (!liveNote.getNote().getTrack().isMute())
g.fillRect((int) x1, y * NOTE_H, (int) (w1), NOTE_H);
g.setColor(Color.black);
g.drawRect((int) x1, y * NOTE_H, (int) (w1), NOTE_H);
}
private void paintPatternSequencers(Graphics g) {
int i = 0;
int startStep = 0;
g.setFont(OrWidget.SMALL_FONT);
for (Patternsequencer patternsequencer : SongManager.getInstance().getCurrentSong().getPatternSequencers()) {
i++;
int nbSteps = patternsequencer.getRepeat() * patternsequencer.getPattern().getNbSteps();
int x1 = (int) ((getWidth() / zoom) * startStep / SongManager.getInstance().getCurrentSong().getNbSongSteps() - start / zoom);
int w = (int) ((getWidth() * nbSteps) / zoom);
g.setColor(Color.black);
g.drawRect(x1, 6, w, getHeight() - 20);
g.drawString(patternsequencer.getPattern().getDisplayName(), x1 + 2, 20);
g.drawString(patternsequencer.getRepeat() + "x", x1 + 2, 30);
// g.setColor(Color.blue);
// g.drawString("" + i, x1 + 2, 40);
startStep += nbSteps;
}
}
public void liveNotesChanged(LiveNotes liveNotes, long nb_SFramePerStep, int nbSongStep) {
repaint();
}
public void cursorPositionChanged(Patternsequencer patternsequencer,OrPattern newPattern, int newSongStep, int newPatternStep, int newCurrentFrame, String newSongTime, int maxLeft, int maxRight) {
this.songStep = newSongStep;
repaint();
}
}
|