Mercurial > hg > svgui
comparison layer/NoteLayer.cpp @ 922:26da827e8fb5 tonioni
Merge from cxx11 branch
| author | Chris Cannam |
|---|---|
| date | Mon, 23 Mar 2015 11:26:28 +0000 |
| parents | b66fb15de477 |
| children | 94e4952a6774 |
comparison
equal
deleted
inserted
replaced
| 921:4968bbaf1ed8 | 922:26da827e8fb5 |
|---|---|
| 207 // unit.startsWith("midi")) return true; | 207 // unit.startsWith("midi")) return true; |
| 208 // return false; | 208 // return false; |
| 209 } | 209 } |
| 210 | 210 |
| 211 bool | 211 bool |
| 212 NoteLayer::getValueExtents(float &min, float &max, | 212 NoteLayer::getValueExtents(double &min, double &max, |
| 213 bool &logarithmic, QString &unit) const | 213 bool &logarithmic, QString &unit) const |
| 214 { | 214 { |
| 215 if (!m_model) return false; | 215 if (!m_model) return false; |
| 216 min = m_model->getValueMinimum(); | 216 min = m_model->getValueMinimum(); |
| 217 max = m_model->getValueMaximum(); | 217 max = m_model->getValueMaximum(); |
| 218 | 218 |
| 219 if (shouldConvertMIDIToHz()) { | 219 if (shouldConvertMIDIToHz()) { |
| 220 unit = "Hz"; | 220 unit = "Hz"; |
| 221 min = Pitch::getFrequencyForPitch(lrintf(min)); | 221 min = Pitch::getFrequencyForPitch(int(lrint(min))); |
| 222 max = Pitch::getFrequencyForPitch(lrintf(max + 1)); | 222 max = Pitch::getFrequencyForPitch(int(lrint(max + 1))); |
| 223 } else unit = getScaleUnits(); | 223 } else unit = getScaleUnits(); |
| 224 | 224 |
| 225 if (m_verticalScale == MIDIRangeScale || | 225 if (m_verticalScale == MIDIRangeScale || |
| 226 m_verticalScale == LogScale) logarithmic = true; | 226 m_verticalScale == LogScale) logarithmic = true; |
| 227 | 227 |
| 228 return true; | 228 return true; |
| 229 } | 229 } |
| 230 | 230 |
| 231 bool | 231 bool |
| 232 NoteLayer::getDisplayExtents(float &min, float &max) const | 232 NoteLayer::getDisplayExtents(double &min, double &max) const |
| 233 { | 233 { |
| 234 if (!m_model || shouldAutoAlign()) return false; | 234 if (!m_model || shouldAutoAlign()) return false; |
| 235 | 235 |
| 236 if (m_verticalScale == MIDIRangeScale) { | 236 if (m_verticalScale == MIDIRangeScale) { |
| 237 min = Pitch::getFrequencyForPitch(0); | 237 min = Pitch::getFrequencyForPitch(0); |
| 246 min = m_scaleMinimum; | 246 min = m_scaleMinimum; |
| 247 max = m_scaleMaximum; | 247 max = m_scaleMaximum; |
| 248 } | 248 } |
| 249 | 249 |
| 250 if (shouldConvertMIDIToHz()) { | 250 if (shouldConvertMIDIToHz()) { |
| 251 min = Pitch::getFrequencyForPitch(lrintf(min)); | 251 min = Pitch::getFrequencyForPitch(int(lrint(min))); |
| 252 max = Pitch::getFrequencyForPitch(lrintf(max + 1)); | 252 max = Pitch::getFrequencyForPitch(int(lrint(max + 1))); |
| 253 } | 253 } |
| 254 | 254 |
| 255 #ifdef DEBUG_NOTE_LAYER | 255 #ifdef DEBUG_NOTE_LAYER |
| 256 cerr << "NoteLayer::getDisplayExtents: min = " << min << ", max = " << max << " (m_scaleMinimum = " << m_scaleMinimum << ", m_scaleMaximum = " << m_scaleMaximum << ")" << endl; | 256 cerr << "NoteLayer::getDisplayExtents: min = " << min << ", max = " << max << " (m_scaleMinimum = " << m_scaleMinimum << ", m_scaleMaximum = " << m_scaleMaximum << ")" << endl; |
| 257 #endif | 257 #endif |
| 258 | 258 |
| 259 return true; | 259 return true; |
| 260 } | 260 } |
| 261 | 261 |
| 262 bool | 262 bool |
| 263 NoteLayer::setDisplayExtents(float min, float max) | 263 NoteLayer::setDisplayExtents(double min, double max) |
| 264 { | 264 { |
| 265 if (!m_model) return false; | 265 if (!m_model) return false; |
| 266 | 266 |
| 267 if (min == max) { | 267 if (min == max) { |
| 268 if (min == 0.f) { | 268 if (min == 0.f) { |
| 300 if (!m_model) return 0; | 300 if (!m_model) return 0; |
| 301 | 301 |
| 302 RangeMapper *mapper = getNewVerticalZoomRangeMapper(); | 302 RangeMapper *mapper = getNewVerticalZoomRangeMapper(); |
| 303 if (!mapper) return 0; | 303 if (!mapper) return 0; |
| 304 | 304 |
| 305 float dmin, dmax; | 305 double dmin, dmax; |
| 306 getDisplayExtents(dmin, dmax); | 306 getDisplayExtents(dmin, dmax); |
| 307 | 307 |
| 308 int nr = mapper->getPositionForValue(dmax - dmin); | 308 int nr = mapper->getPositionForValue(dmax - dmin); |
| 309 | 309 |
| 310 delete mapper; | 310 delete mapper; |
| 321 if (!m_model) return; | 321 if (!m_model) return; |
| 322 | 322 |
| 323 RangeMapper *mapper = getNewVerticalZoomRangeMapper(); | 323 RangeMapper *mapper = getNewVerticalZoomRangeMapper(); |
| 324 if (!mapper) return; | 324 if (!mapper) return; |
| 325 | 325 |
| 326 float min, max; | 326 double min, max; |
| 327 bool logarithmic; | 327 bool logarithmic; |
| 328 QString unit; | 328 QString unit; |
| 329 getValueExtents(min, max, logarithmic, unit); | 329 getValueExtents(min, max, logarithmic, unit); |
| 330 | 330 |
| 331 float dmin, dmax; | 331 double dmin, dmax; |
| 332 getDisplayExtents(dmin, dmax); | 332 getDisplayExtents(dmin, dmax); |
| 333 | 333 |
| 334 float newdist = mapper->getValueForPosition(100 - step); | 334 double newdist = mapper->getValueForPosition(100 - step); |
| 335 | 335 |
| 336 float newmin, newmax; | 336 double newmin, newmax; |
| 337 | 337 |
| 338 if (logarithmic) { | 338 if (logarithmic) { |
| 339 | 339 |
| 340 // see SpectrogramLayer::setVerticalZoomStep | 340 // see SpectrogramLayer::setVerticalZoomStep |
| 341 | 341 |
| 342 newmax = (newdist + sqrtf(newdist*newdist + 4*dmin*dmax)) / 2; | 342 newmax = (newdist + sqrt(newdist*newdist + 4*dmin*dmax)) / 2; |
| 343 newmin = newmax - newdist; | 343 newmin = newmax - newdist; |
| 344 | 344 |
| 345 // cerr << "newmin = " << newmin << ", newmax = " << newmax << endl; | 345 // cerr << "newmin = " << newmin << ", newmax = " << newmax << endl; |
| 346 | 346 |
| 347 } else { | 347 } else { |
| 348 float dmid = (dmax + dmin) / 2; | 348 double dmid = (dmax + dmin) / 2; |
| 349 newmin = dmid - newdist / 2; | 349 newmin = dmid - newdist / 2; |
| 350 newmax = dmid + newdist / 2; | 350 newmax = dmid + newdist / 2; |
| 351 } | 351 } |
| 352 | 352 |
| 353 if (newmin < min) { | 353 if (newmin < min) { |
| 370 { | 370 { |
| 371 if (!m_model) return 0; | 371 if (!m_model) return 0; |
| 372 | 372 |
| 373 RangeMapper *mapper; | 373 RangeMapper *mapper; |
| 374 | 374 |
| 375 float min, max; | 375 double min, max; |
| 376 bool logarithmic; | 376 bool logarithmic; |
| 377 QString unit; | 377 QString unit; |
| 378 getValueExtents(min, max, logarithmic, unit); | 378 getValueExtents(min, max, logarithmic, unit); |
| 379 | 379 |
| 380 if (min == max) return 0; | 380 if (min == max) return 0; |
| 391 NoteModel::PointList | 391 NoteModel::PointList |
| 392 NoteLayer::getLocalPoints(View *v, int x) const | 392 NoteLayer::getLocalPoints(View *v, int x) const |
| 393 { | 393 { |
| 394 if (!m_model) return NoteModel::PointList(); | 394 if (!m_model) return NoteModel::PointList(); |
| 395 | 395 |
| 396 int frame = v->getFrameForX(x); | 396 sv_frame_t frame = v->getFrameForX(x); |
| 397 | 397 |
| 398 NoteModel::PointList onPoints = | 398 NoteModel::PointList onPoints = |
| 399 m_model->getPoints(frame); | 399 m_model->getPoints(frame); |
| 400 | 400 |
| 401 if (!onPoints.empty()) { | 401 if (!onPoints.empty()) { |
| 434 bool | 434 bool |
| 435 NoteLayer::getPointToDrag(View *v, int x, int y, NoteModel::Point &p) const | 435 NoteLayer::getPointToDrag(View *v, int x, int y, NoteModel::Point &p) const |
| 436 { | 436 { |
| 437 if (!m_model) return false; | 437 if (!m_model) return false; |
| 438 | 438 |
| 439 int frame = v->getFrameForX(x); | 439 sv_frame_t frame = v->getFrameForX(x); |
| 440 | 440 |
| 441 NoteModel::PointList onPoints = m_model->getPoints(frame); | 441 NoteModel::PointList onPoints = m_model->getPoints(frame); |
| 442 if (onPoints.empty()) return false; | 442 if (onPoints.empty()) return false; |
| 443 | 443 |
| 444 // cerr << "frame " << frame << ": " << onPoints.size() << " candidate points" << endl; | 444 // cerr << "frame " << frame << ": " << onPoints.size() << " candidate points" << endl; |
| 504 | 504 |
| 505 QString pitchText; | 505 QString pitchText; |
| 506 | 506 |
| 507 if (shouldConvertMIDIToHz()) { | 507 if (shouldConvertMIDIToHz()) { |
| 508 | 508 |
| 509 int mnote = lrintf(note.value); | 509 int mnote = int(lrint(note.value)); |
| 510 int cents = lrintf((note.value - mnote) * 100); | 510 int cents = int(lrint((note.value - float(mnote)) * 100)); |
| 511 float freq = Pitch::getFrequencyForPitch(mnote, cents); | 511 double freq = Pitch::getFrequencyForPitch(mnote, cents); |
| 512 pitchText = tr("%1 (%2, %3 Hz)") | 512 pitchText = tr("%1 (%2, %3 Hz)") |
| 513 .arg(Pitch::getPitchLabel(mnote, cents)) | 513 .arg(Pitch::getPitchLabel(mnote, cents)) |
| 514 .arg(mnote) | 514 .arg(mnote) |
| 515 .arg(freq); | 515 .arg(freq); |
| 516 | 516 |
| 545 getYForValue(v, note.value)); | 545 getYForValue(v, note.value)); |
| 546 return text; | 546 return text; |
| 547 } | 547 } |
| 548 | 548 |
| 549 bool | 549 bool |
| 550 NoteLayer::snapToFeatureFrame(View *v, int &frame, | 550 NoteLayer::snapToFeatureFrame(View *v, sv_frame_t &frame, |
| 551 int &resolution, | 551 int &resolution, |
| 552 SnapType snap) const | 552 SnapType snap) const |
| 553 { | 553 { |
| 554 if (!m_model) { | 554 if (!m_model) { |
| 555 return Layer::snapToFeatureFrame(v, frame, resolution, snap); | 555 return Layer::snapToFeatureFrame(v, frame, resolution, snap); |
| 565 frame = points.begin()->frame; | 565 frame = points.begin()->frame; |
| 566 return true; | 566 return true; |
| 567 } | 567 } |
| 568 | 568 |
| 569 points = m_model->getPoints(frame, frame); | 569 points = m_model->getPoints(frame, frame); |
| 570 int snapped = frame; | 570 sv_frame_t snapped = frame; |
| 571 bool found = false; | 571 bool found = false; |
| 572 | 572 |
| 573 for (NoteModel::PointList::const_iterator i = points.begin(); | 573 for (NoteModel::PointList::const_iterator i = points.begin(); |
| 574 i != points.end(); ++i) { | 574 i != points.end(); ++i) { |
| 575 | 575 |
| 617 frame = snapped; | 617 frame = snapped; |
| 618 return found; | 618 return found; |
| 619 } | 619 } |
| 620 | 620 |
| 621 void | 621 void |
| 622 NoteLayer::getScaleExtents(View *v, float &min, float &max, bool &log) const | 622 NoteLayer::getScaleExtents(View *v, double &min, double &max, bool &log) const |
| 623 { | 623 { |
| 624 min = 0.0; | 624 min = 0.0; |
| 625 max = 0.0; | 625 max = 0.0; |
| 626 log = false; | 626 log = false; |
| 627 | 627 |
| 635 | 635 |
| 636 min = m_model->getValueMinimum(); | 636 min = m_model->getValueMinimum(); |
| 637 max = m_model->getValueMaximum(); | 637 max = m_model->getValueMaximum(); |
| 638 | 638 |
| 639 if (shouldConvertMIDIToHz()) { | 639 if (shouldConvertMIDIToHz()) { |
| 640 min = Pitch::getFrequencyForPitch(lrintf(min)); | 640 min = Pitch::getFrequencyForPitch(int(lrint(min))); |
| 641 max = Pitch::getFrequencyForPitch(lrintf(max + 1)); | 641 max = Pitch::getFrequencyForPitch(int(lrint(max + 1))); |
| 642 } | 642 } |
| 643 | 643 |
| 644 #ifdef DEBUG_NOTE_LAYER | 644 #ifdef DEBUG_NOTE_LAYER |
| 645 cerr << "NoteLayer[" << this << "]::getScaleExtents: min = " << min << ", max = " << max << ", log = " << log << endl; | 645 cerr << "NoteLayer[" << this << "]::getScaleExtents: min = " << min << ", max = " << max << ", log = " << log << endl; |
| 646 #endif | 646 #endif |
| 661 | 661 |
| 662 if (m_verticalScale == MIDIRangeScale) { | 662 if (m_verticalScale == MIDIRangeScale) { |
| 663 min = Pitch::getFrequencyForPitch(0); | 663 min = Pitch::getFrequencyForPitch(0); |
| 664 max = Pitch::getFrequencyForPitch(127); | 664 max = Pitch::getFrequencyForPitch(127); |
| 665 } else if (shouldConvertMIDIToHz()) { | 665 } else if (shouldConvertMIDIToHz()) { |
| 666 min = Pitch::getFrequencyForPitch(lrintf(min)); | 666 min = Pitch::getFrequencyForPitch(int(lrint(min))); |
| 667 max = Pitch::getFrequencyForPitch(lrintf(max + 1)); | 667 max = Pitch::getFrequencyForPitch(int(lrint(max + 1))); |
| 668 } | 668 } |
| 669 | 669 |
| 670 if (m_verticalScale == LogScale || m_verticalScale == MIDIRangeScale) { | 670 if (m_verticalScale == LogScale || m_verticalScale == MIDIRangeScale) { |
| 671 LogRange::mapRange(min, max); | 671 LogRange::mapRange(min, max); |
| 672 log = true; | 672 log = true; |
| 675 | 675 |
| 676 if (max == min) max = min + 1.0; | 676 if (max == min) max = min + 1.0; |
| 677 } | 677 } |
| 678 | 678 |
| 679 int | 679 int |
| 680 NoteLayer::getYForValue(View *v, float val) const | 680 NoteLayer::getYForValue(View *v, double val) const |
| 681 { | 681 { |
| 682 float min = 0.0, max = 0.0; | 682 double min = 0.0, max = 0.0; |
| 683 bool logarithmic = false; | 683 bool logarithmic = false; |
| 684 int h = v->height(); | 684 int h = v->height(); |
| 685 | 685 |
| 686 getScaleExtents(v, min, max, logarithmic); | 686 getScaleExtents(v, min, max, logarithmic); |
| 687 | 687 |
| 688 #ifdef DEBUG_NOTE_LAYER | 688 #ifdef DEBUG_NOTE_LAYER |
| 689 cerr << "NoteLayer[" << this << "]::getYForValue(" << val << "): min = " << min << ", max = " << max << ", log = " << logarithmic << endl; | 689 cerr << "NoteLayer[" << this << "]::getYForValue(" << val << "): min = " << min << ", max = " << max << ", log = " << logarithmic << endl; |
| 690 #endif | 690 #endif |
| 691 | 691 |
| 692 if (shouldConvertMIDIToHz()) { | 692 if (shouldConvertMIDIToHz()) { |
| 693 val = Pitch::getFrequencyForPitch(lrintf(val), | 693 val = Pitch::getFrequencyForPitch(int(lrint(val)), |
| 694 lrintf((val - lrintf(val)) * 100)); | 694 int(lrint((val - rint(val)) * 100))); |
| 695 #ifdef DEBUG_NOTE_LAYER | 695 #ifdef DEBUG_NOTE_LAYER |
| 696 cerr << "shouldConvertMIDIToHz true, val now = " << val << endl; | 696 cerr << "shouldConvertMIDIToHz true, val now = " << val << endl; |
| 697 #endif | 697 #endif |
| 698 } | 698 } |
| 699 | 699 |
| 709 cerr << "y = " << y << endl; | 709 cerr << "y = " << y << endl; |
| 710 #endif | 710 #endif |
| 711 return y; | 711 return y; |
| 712 } | 712 } |
| 713 | 713 |
| 714 float | 714 double |
| 715 NoteLayer::getValueForY(View *v, int y) const | 715 NoteLayer::getValueForY(View *v, int y) const |
| 716 { | 716 { |
| 717 float min = 0.0, max = 0.0; | 717 double min = 0.0, max = 0.0; |
| 718 bool logarithmic = false; | 718 bool logarithmic = false; |
| 719 int h = v->height(); | 719 int h = v->height(); |
| 720 | 720 |
| 721 getScaleExtents(v, min, max, logarithmic); | 721 getScaleExtents(v, min, max, logarithmic); |
| 722 | 722 |
| 723 float val = min + (float(h - y) * float(max - min)) / h; | 723 double val = min + (double(h - y) * double(max - min)) / h; |
| 724 | 724 |
| 725 if (logarithmic) { | 725 if (logarithmic) { |
| 726 val = powf(10.f, val); | 726 val = pow(10.0, val); |
| 727 } | 727 } |
| 728 | 728 |
| 729 if (shouldConvertMIDIToHz()) { | 729 if (shouldConvertMIDIToHz()) { |
| 730 val = Pitch::getPitchForFrequency(val); | 730 val = Pitch::getPitchForFrequency(val); |
| 731 } | 731 } |
| 743 void | 743 void |
| 744 NoteLayer::paint(View *v, QPainter &paint, QRect rect) const | 744 NoteLayer::paint(View *v, QPainter &paint, QRect rect) const |
| 745 { | 745 { |
| 746 if (!m_model || !m_model->isOK()) return; | 746 if (!m_model || !m_model->isOK()) return; |
| 747 | 747 |
| 748 int sampleRate = m_model->getSampleRate(); | 748 sv_samplerate_t sampleRate = m_model->getSampleRate(); |
| 749 if (!sampleRate) return; | 749 if (!sampleRate) return; |
| 750 | 750 |
| 751 // Profiler profiler("NoteLayer::paint", true); | 751 // Profiler profiler("NoteLayer::paint", true); |
| 752 | 752 |
| 753 int x0 = rect.left(), x1 = rect.right(); | 753 int x0 = rect.left(), x1 = rect.right(); |
| 754 int frame0 = v->getFrameForX(x0); | 754 sv_frame_t frame0 = v->getFrameForX(x0); |
| 755 int frame1 = v->getFrameForX(x1); | 755 sv_frame_t frame1 = v->getFrameForX(x1); |
| 756 | 756 |
| 757 NoteModel::PointList points(m_model->getPoints(frame0, frame1)); | 757 NoteModel::PointList points(m_model->getPoints(frame0, frame1)); |
| 758 if (points.empty()) return; | 758 if (points.empty()) return; |
| 759 | 759 |
| 760 paint.setPen(getBaseQColor()); | 760 paint.setPen(getBaseQColor()); |
| 763 brushColour.setAlpha(80); | 763 brushColour.setAlpha(80); |
| 764 | 764 |
| 765 // SVDEBUG << "NoteLayer::paint: resolution is " | 765 // SVDEBUG << "NoteLayer::paint: resolution is " |
| 766 // << m_model->getResolution() << " frames" << endl; | 766 // << m_model->getResolution() << " frames" << endl; |
| 767 | 767 |
| 768 float min = m_model->getValueMinimum(); | 768 double min = m_model->getValueMinimum(); |
| 769 float max = m_model->getValueMaximum(); | 769 double max = m_model->getValueMaximum(); |
| 770 if (max == min) max = min + 1.0; | 770 if (max == min) max = min + 1.0; |
| 771 | 771 |
| 772 QPoint localPos; | 772 QPoint localPos; |
| 773 NoteModel::Point illuminatePoint(0); | 773 NoteModel::Point illuminatePoint(0); |
| 774 bool shouldIlluminate = false; | 774 bool shouldIlluminate = false; |
| 847 NoteLayer::paintVerticalScale(View *v, bool, QPainter &paint, QRect) const | 847 NoteLayer::paintVerticalScale(View *v, bool, QPainter &paint, QRect) const |
| 848 { | 848 { |
| 849 if (!m_model || m_model->getPoints().empty()) return; | 849 if (!m_model || m_model->getPoints().empty()) return; |
| 850 | 850 |
| 851 QString unit; | 851 QString unit; |
| 852 float min, max; | 852 double min, max; |
| 853 bool logarithmic; | 853 bool logarithmic; |
| 854 | 854 |
| 855 int w = getVerticalScaleWidth(v, false, paint); | 855 int w = getVerticalScaleWidth(v, false, paint); |
| 856 int h = v->height(); | 856 int h = v->height(); |
| 857 | 857 |
| 886 { | 886 { |
| 887 // SVDEBUG << "NoteLayer::drawStart(" << e->x() << "," << e->y() << ")" << endl; | 887 // SVDEBUG << "NoteLayer::drawStart(" << e->x() << "," << e->y() << ")" << endl; |
| 888 | 888 |
| 889 if (!m_model) return; | 889 if (!m_model) return; |
| 890 | 890 |
| 891 int frame = v->getFrameForX(e->x()); | 891 sv_frame_t frame = v->getFrameForX(e->x()); |
| 892 if (frame < 0) frame = 0; | 892 if (frame < 0) frame = 0; |
| 893 frame = frame / m_model->getResolution() * m_model->getResolution(); | 893 frame = frame / m_model->getResolution() * m_model->getResolution(); |
| 894 | 894 |
| 895 float value = getValueForY(v, e->y()); | 895 double value = getValueForY(v, e->y()); |
| 896 | 896 |
| 897 m_editingPoint = NoteModel::Point(frame, value, 0, 0.8, tr("New Point")); | 897 m_editingPoint = NoteModel::Point(frame, float(value), 0, 0.8f, tr("New Point")); |
| 898 m_originalPoint = m_editingPoint; | 898 m_originalPoint = m_editingPoint; |
| 899 | 899 |
| 900 if (m_editingCommand) finish(m_editingCommand); | 900 if (m_editingCommand) finish(m_editingCommand); |
| 901 m_editingCommand = new NoteModel::EditCommand(m_model, | 901 m_editingCommand = new NoteModel::EditCommand(m_model, |
| 902 tr("Draw Point")); | 902 tr("Draw Point")); |
| 910 { | 910 { |
| 911 // SVDEBUG << "NoteLayer::drawDrag(" << e->x() << "," << e->y() << ")" << endl; | 911 // SVDEBUG << "NoteLayer::drawDrag(" << e->x() << "," << e->y() << ")" << endl; |
| 912 | 912 |
| 913 if (!m_model || !m_editing) return; | 913 if (!m_model || !m_editing) return; |
| 914 | 914 |
| 915 int frame = v->getFrameForX(e->x()); | 915 sv_frame_t frame = v->getFrameForX(e->x()); |
| 916 if (frame < 0) frame = 0; | 916 if (frame < 0) frame = 0; |
| 917 frame = frame / m_model->getResolution() * m_model->getResolution(); | 917 frame = frame / m_model->getResolution() * m_model->getResolution(); |
| 918 | 918 |
| 919 float newValue = getValueForY(v, e->y()); | 919 double newValue = getValueForY(v, e->y()); |
| 920 | 920 |
| 921 int newFrame = m_editingPoint.frame; | 921 sv_frame_t newFrame = m_editingPoint.frame; |
| 922 int newDuration = frame - newFrame; | 922 sv_frame_t newDuration = frame - newFrame; |
| 923 if (newDuration < 0) { | 923 if (newDuration < 0) { |
| 924 newFrame = frame; | 924 newFrame = frame; |
| 925 newDuration = -newDuration; | 925 newDuration = -newDuration; |
| 926 } else if (newDuration == 0) { | 926 } else if (newDuration == 0) { |
| 927 newDuration = 1; | 927 newDuration = 1; |
| 928 } | 928 } |
| 929 | 929 |
| 930 m_editingCommand->deletePoint(m_editingPoint); | 930 m_editingCommand->deletePoint(m_editingPoint); |
| 931 m_editingPoint.frame = newFrame; | 931 m_editingPoint.frame = newFrame; |
| 932 m_editingPoint.value = newValue; | 932 m_editingPoint.value = float(newValue); |
| 933 m_editingPoint.duration = newDuration; | 933 m_editingPoint.duration = newDuration; |
| 934 m_editingCommand->addPoint(m_editingPoint); | 934 m_editingCommand->addPoint(m_editingPoint); |
| 935 } | 935 } |
| 936 | 936 |
| 937 void | 937 void |
| 1017 int xdist = e->x() - m_dragStartX; | 1017 int xdist = e->x() - m_dragStartX; |
| 1018 int ydist = e->y() - m_dragStartY; | 1018 int ydist = e->y() - m_dragStartY; |
| 1019 int newx = m_dragPointX + xdist; | 1019 int newx = m_dragPointX + xdist; |
| 1020 int newy = m_dragPointY + ydist; | 1020 int newy = m_dragPointY + ydist; |
| 1021 | 1021 |
| 1022 int frame = v->getFrameForX(newx); | 1022 sv_frame_t frame = v->getFrameForX(newx); |
| 1023 if (frame < 0) frame = 0; | 1023 if (frame < 0) frame = 0; |
| 1024 frame = frame / m_model->getResolution() * m_model->getResolution(); | 1024 frame = frame / m_model->getResolution() * m_model->getResolution(); |
| 1025 | 1025 |
| 1026 float value = getValueForY(v, newy); | 1026 double value = getValueForY(v, newy); |
| 1027 | 1027 |
| 1028 if (!m_editingCommand) { | 1028 if (!m_editingCommand) { |
| 1029 m_editingCommand = new NoteModel::EditCommand(m_model, | 1029 m_editingCommand = new NoteModel::EditCommand(m_model, |
| 1030 tr("Drag Point")); | 1030 tr("Drag Point")); |
| 1031 } | 1031 } |
| 1032 | 1032 |
| 1033 m_editingCommand->deletePoint(m_editingPoint); | 1033 m_editingCommand->deletePoint(m_editingPoint); |
| 1034 m_editingPoint.frame = frame; | 1034 m_editingPoint.frame = frame; |
| 1035 m_editingPoint.value = value; | 1035 m_editingPoint.value = float(value); |
| 1036 m_editingCommand->addPoint(m_editingPoint); | 1036 m_editingCommand->addPoint(m_editingPoint); |
| 1037 } | 1037 } |
| 1038 | 1038 |
| 1039 void | 1039 void |
| 1040 NoteLayer::editEnd(View *, QMouseEvent *) | 1040 NoteLayer::editEnd(View *, QMouseEvent *) |
| 1105 delete dialog; | 1105 delete dialog; |
| 1106 return true; | 1106 return true; |
| 1107 } | 1107 } |
| 1108 | 1108 |
| 1109 void | 1109 void |
| 1110 NoteLayer::moveSelection(Selection s, int newStartFrame) | 1110 NoteLayer::moveSelection(Selection s, sv_frame_t newStartFrame) |
| 1111 { | 1111 { |
| 1112 if (!m_model) return; | 1112 if (!m_model) return; |
| 1113 | 1113 |
| 1114 NoteModel::EditCommand *command = | 1114 NoteModel::EditCommand *command = |
| 1115 new NoteModel::EditCommand(m_model, tr("Drag Selection")); | 1115 new NoteModel::EditCommand(m_model, tr("Drag Selection")); |
| 1149 for (NoteModel::PointList::iterator i = points.begin(); | 1149 for (NoteModel::PointList::iterator i = points.begin(); |
| 1150 i != points.end(); ++i) { | 1150 i != points.end(); ++i) { |
| 1151 | 1151 |
| 1152 if (s.contains(i->frame)) { | 1152 if (s.contains(i->frame)) { |
| 1153 | 1153 |
| 1154 double targetStart = i->frame; | 1154 double targetStart = double(i->frame); |
| 1155 targetStart = newSize.getStartFrame() + | 1155 targetStart = double(newSize.getStartFrame()) + |
| 1156 double(targetStart - s.getStartFrame()) * ratio; | 1156 targetStart - double(s.getStartFrame()) * ratio; |
| 1157 | 1157 |
| 1158 double targetEnd = i->frame + i->duration; | 1158 double targetEnd = double(i->frame + i->duration); |
| 1159 targetEnd = newSize.getStartFrame() + | 1159 targetEnd = double(newSize.getStartFrame()) + |
| 1160 double(targetEnd - s.getStartFrame()) * ratio; | 1160 targetEnd - double(s.getStartFrame()) * ratio; |
| 1161 | 1161 |
| 1162 NoteModel::Point newPoint(*i); | 1162 NoteModel::Point newPoint(*i); |
| 1163 newPoint.frame = lrint(targetStart); | 1163 newPoint.frame = lrint(targetStart); |
| 1164 newPoint.duration = lrint(targetEnd - targetStart); | 1164 newPoint.duration = lrint(targetEnd - targetStart); |
| 1165 command->deletePoint(*i); | 1165 command->deletePoint(*i); |
| 1209 } | 1209 } |
| 1210 } | 1210 } |
| 1211 } | 1211 } |
| 1212 | 1212 |
| 1213 bool | 1213 bool |
| 1214 NoteLayer::paste(View *v, const Clipboard &from, int /* frameOffset */, bool /* interactive */) | 1214 NoteLayer::paste(View *v, const Clipboard &from, sv_frame_t /* frameOffset */, bool /* interactive */) |
| 1215 { | 1215 { |
| 1216 if (!m_model) return false; | 1216 if (!m_model) return false; |
| 1217 | 1217 |
| 1218 const Clipboard::PointList &points = from.getPoints(); | 1218 const Clipboard::PointList &points = from.getPoints(); |
| 1219 | 1219 |
| 1241 | 1241 |
| 1242 for (Clipboard::PointList::const_iterator i = points.begin(); | 1242 for (Clipboard::PointList::const_iterator i = points.begin(); |
| 1243 i != points.end(); ++i) { | 1243 i != points.end(); ++i) { |
| 1244 | 1244 |
| 1245 if (!i->haveFrame()) continue; | 1245 if (!i->haveFrame()) continue; |
| 1246 int frame = 0; | 1246 sv_frame_t frame = 0; |
| 1247 | 1247 |
| 1248 if (!realign) { | 1248 if (!realign) { |
| 1249 | 1249 |
| 1250 frame = i->getFrame(); | 1250 frame = i->getFrame(); |
| 1251 | 1251 |
| 1266 else newPoint.value = (m_model->getValueMinimum() + | 1266 else newPoint.value = (m_model->getValueMinimum() + |
| 1267 m_model->getValueMaximum()) / 2; | 1267 m_model->getValueMaximum()) / 2; |
| 1268 if (i->haveLevel()) newPoint.level = i->getLevel(); | 1268 if (i->haveLevel()) newPoint.level = i->getLevel(); |
| 1269 if (i->haveDuration()) newPoint.duration = i->getDuration(); | 1269 if (i->haveDuration()) newPoint.duration = i->getDuration(); |
| 1270 else { | 1270 else { |
| 1271 int nextFrame = frame; | 1271 sv_frame_t nextFrame = frame; |
| 1272 Clipboard::PointList::const_iterator j = i; | 1272 Clipboard::PointList::const_iterator j = i; |
| 1273 for (; j != points.end(); ++j) { | 1273 for (; j != points.end(); ++j) { |
| 1274 if (!j->haveFrame()) continue; | 1274 if (!j->haveFrame()) continue; |
| 1275 if (j != i) break; | 1275 if (j != i) break; |
| 1276 } | 1276 } |
| 1290 finish(command); | 1290 finish(command); |
| 1291 return true; | 1291 return true; |
| 1292 } | 1292 } |
| 1293 | 1293 |
| 1294 void | 1294 void |
| 1295 NoteLayer::addNoteOn(int frame, int pitch, int velocity) | 1295 NoteLayer::addNoteOn(sv_frame_t frame, int pitch, int velocity) |
| 1296 { | 1296 { |
| 1297 m_pendingNoteOns.insert(Note(frame, pitch, 0, float(velocity) / 127.0, "")); | 1297 m_pendingNoteOns.insert(Note(frame, float(pitch), 0, float(velocity) / 127.f, "")); |
| 1298 } | 1298 } |
| 1299 | 1299 |
| 1300 void | 1300 void |
| 1301 NoteLayer::addNoteOff(int frame, int pitch) | 1301 NoteLayer::addNoteOff(sv_frame_t frame, int pitch) |
| 1302 { | 1302 { |
| 1303 for (NoteSet::iterator i = m_pendingNoteOns.begin(); | 1303 for (NoteSet::iterator i = m_pendingNoteOns.begin(); |
| 1304 i != m_pendingNoteOns.end(); ++i) { | 1304 i != m_pendingNoteOns.end(); ++i) { |
| 1305 if (lrintf((*i).value) == pitch) { | 1305 if (lrintf((*i).value) == pitch) { |
| 1306 Note note(*i); | 1306 Note note(*i); |
