1
//=========================================================
4
// $Id: waveview.cpp,v 1.1 2002/01/30 14:10:09 muse Exp $
5
// (C) Copyright 2000 Werner Schweer (ws@seh.de)
6
//=========================================================
16
#include "../sf/sndfile.h"
17
#include "../midieditor.h"
19
//---------------------------------------------------------
21
//---------------------------------------------------------
23
WaveView::WaveView(MidiEditor* pr, QWidget* parent, int xscale, int yscale)
24
: View(parent, xscale, 1)
28
pos[0] = int(tempomap.tick2time(song->cpos()) * sampleRate);
29
pos[1] = int(tempomap.tick2time(song->lpos()) * sampleRate);
30
pos[2] = int(tempomap.tick2time(song->rpos()) * sampleRate);
33
setMouseTracking(true);
36
if (editor->parts()->empty()) {
40
curPart = (WavePart*)(editor->parts()->begin()->second);
41
curPartId = curPart->sn();
43
connect(song, SIGNAL(posChanged(int,int,bool)), SLOT(setPos(int,int,bool)));
46
//---------------------------------------------------------
48
//---------------------------------------------------------
50
void WaveView::setYScale(int val)
56
//---------------------------------------------------------
58
//---------------------------------------------------------
60
void WaveView::pdraw(QPainter& p, const QRect& rr)
63
int x2 = rr.right() + 1;
72
for (iPart ip = editor->parts()->begin(); ip != editor->parts()->end(); ++ip) {
73
WavePart* wp = (WavePart*)(ip->second);
74
EventList* el = wp->events();
75
for (iEvent e = el->begin(); e != el->end(); ++e) {
76
WaveEvent* event = (WaveEvent*)e->second;
77
// printf("draw part %p event %p\n", curPart, event);
78
Clip* clip = event->clip();
81
const SndFile* f = clip->file();
88
int sx = (event->posSample() + xScale/2 - startSample) / xScale;
89
int ex = (event->posSample() + event->lenSample() + xScale/2 - startSample) / xScale;
90
// printf("----%d-%d xpos %d %d-%d\n", sx,ex, xpos, x1,x2);
99
int pos = (xpos + sx) * xScale + clip->spos() - event->posSample();
100
h = hh / (f->channels() * 2);
101
int cc = hh % (f->channels() * 2) ? 0 : 1;
103
// printf("draw %d-%d pos %d Event: pos %d len:%d, clip pos %d\n",
104
// sx, ex, event->posSample(), pos, event->lenSample(), clip->spos());
106
for (int i = sx; i < ex; i++) {
108
SampleV sa[f->channels()];
109
const_cast<SndFile*>(f)->read(sa, xScale, pos);
111
for (unsigned k = 0; k < f->channels(); ++k) {
112
int peak = (sa[k].peak * (h - 1)) / yScale;
113
int rms = (sa[k].rms * (h - 1)) / yScale;
118
p.setPen(QColor(darkGray));
119
p.drawLine(i, y - peak - cc, i, y + peak);
120
p.setPen(QColor(black));
121
p.drawLine(i, y - rms - cc, i, y + rms);
130
//---------------------------------------------------------
132
//---------------------------------------------------------
134
void WaveView::draw(QPainter& p, const QRect& r)
153
// draw marker & centerline
156
if (pos[0] >= x && pos[0] < x2) {
157
p.drawLine(pos[0], y, pos[0], y2);
160
if (pos[1] >= x && pos[1] < x2) {
161
p.drawLine(pos[1], y, pos[1], y2);
163
if (pos[2] >= x && pos[2] < x2)
164
p.drawLine(pos[2], y, pos[2], y2);
165
p.setPen(QColor(blue));
166
p.drawLine(x, center1, x2, center1);
167
p.setPen(QColor(red));
168
p.drawLine(x, center2, x2, center2);
169
p.setPen(QColor(black));
170
p.drawLine(x, h2, x2, h2);
173
//---------------------------------------------------------
175
//---------------------------------------------------------
177
QString WaveView::getCaption() const
179
return QString("Part ") + curPart->name();
182
//---------------------------------------------------------
184
//---------------------------------------------------------
186
void WaveView::songChanged(int flags)
188
if (flags & ~SC_SELECTION) {
189
startSample = MAXINT;
192
for (iPart p = editor->parts()->begin(); p != editor->parts()->end(); ++p) {
193
WavePart* part = (WavePart*)(p->second);
194
if (part->sn() == curPartId)
196
int ssample = part->posSample();
197
int esample = ssample + part->lenSample();
198
if (ssample < startSample)
199
startSample = ssample;
200
if (esample > endSample)
207
//---------------------------------------------------------
209
// set one of three markers
210
// idx - 0-cpos 1-lpos 2-rpos
211
// flag - emit followEvent()
212
//---------------------------------------------------------
214
void WaveView::setPos(int idx, int val, bool adjustScrollbar)
216
val = int(tempomap.tick2time(val) * sampleRate);
223
int opos = mapx(pos[idx]);
224
int npos = mapx(val);
226
if (adjustScrollbar && idx == 0) {
227
switch (song->follow()) {
231
if (npos >= width()) {
233
emit followEvent(val);
237
case Song::CONTINUOUS:
241
int ppos = pos[0] - rmapxDev(w2);
244
emit followEvent(ppos);
265
// redraw(QRect(x, 0, w, height()));
266
redraw(QRect(opos, 0, 1, height()));
267
redraw(QRect(npos, 0, 1, height()));
270
//---------------------------------------------------------
271
// viewMousePressEvent
272
//---------------------------------------------------------
274
void WaveView::viewMousePressEvent(QMouseEvent* event)
276
button = event->button();
277
viewMouseMoveEvent(event);
280
void WaveView::viewMouseReleaseEvent(QMouseEvent*)
282
button = QMouseEvent::NoButton;
285
//---------------------------------------------------------
286
// viewMouseMoveEvent
287
//---------------------------------------------------------
289
void WaveView::viewMouseMoveEvent(QMouseEvent* event)
296
case QMouseEvent::LeftButton:
299
case QMouseEvent::MidButton:
302
case QMouseEvent::RightButton:
308
x = tempomap.time2tick(double(x) / double(sampleRate));
312
//---------------------------------------------------------
314
// returns range in samples
315
//---------------------------------------------------------
317
void WaveView::range(int* s, int *e)
319
*s = curPart->posSample();
320
int etick = curPart->posTick() + curPart->lenTick();
321
*e = tempomap.tick2samples(etick);