本文整理汇总了C++中Note类的典型用法代码示例。如果您正苦于以下问题:C++ Note类的具体用法?C++ Note怎么用?C++ Note使用的例子?那么, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了Note类的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: assert
void View::DrawMensuralNote(DeviceContext *dc, LayerElement *element, Layer *layer, Staff *staff, Measure *measure)
{
assert(dc);
assert(element);
assert(layer);
assert(staff);
assert(measure);
Note *note = dynamic_cast<Note *>(element);
assert(note);
int noteY = element->GetDrawingY();
int xNote, xStem;
int drawingDur;
int staffY = staff->GetDrawingY();
wchar_t charCode;
int verticalCenter = 0;
bool mensural_black = (staff->m_drawingNotationType == NOTATIONTYPE_mensural_black);
xStem = element->GetDrawingX();
drawingDur = note->GetDrawingDur();
int radius = m_doc->GetGlyphWidth(SMUFL_E93C_mensuralNoteheadMinimaWhite, staff->m_drawingStaffSize, false) / 2;
if (drawingDur > DUR_1) {
if (mensural_black) radius *= TEMP_MINIMA_WIDTH_FACTOR;
}
else {
radius += radius / 3;
}
/************** Stem/notehead direction: **************/
data_STEMDIRECTION stemDir = STEMDIRECTION_NONE;
verticalCenter = staffY - m_doc->GetDrawingDoubleUnit(staff->m_drawingStaffSize) * 2;
if (note->HasStemDir()) {
stemDir = note->GetStemDir();
}
else if (layer->GetDrawingStemDir() != STEMDIRECTION_NONE) {
stemDir = layer->GetDrawingStemDir();
}
else {
if (drawingDur < DUR_1)
stemDir = STEMDIRECTION_down;
else
stemDir = (noteY > verticalCenter) ? STEMDIRECTION_down : STEMDIRECTION_up;
}
xNote = xStem - radius;
/************** Noteheads: **************/
// Ligature, maxima,longa, and brevis
if ((note->GetLig() != noteLogMensural_LIG_NONE) && (drawingDur <= DUR_1)) {
DrawLigatureNote(dc, element, layer, staff);
}
else if (drawingDur < DUR_1) {
DrawMaximaToBrevis(dc, noteY, element, layer, staff);
}
// Semibrevis
else if (drawingDur == DUR_1) {
if (mensural_black) {
int sbStaffSize = 0.8 * staff->m_drawingStaffSize;
DrawDiamond(dc, xNote, noteY, 2 * sbStaffSize, (int)(1.2 * sbStaffSize), !note->GetColored(), 20);
}
else {
// Maybe we can add this to Note::GetMensuralSmuflNoteHead?
if (note->GetColored())
charCode = SMUFL_E938_mensuralNoteheadSemibrevisBlack;
else
charCode = SMUFL_E939_mensuralNoteheadSemibrevisVoid;
DrawSmuflCode(dc, xNote, noteY, charCode, staff->m_drawingStaffSize, false);
}
}
// Shorter values
else {
if (mensural_black) {
// SMuFL 1.20 doesn't have a codepoint for the "colored" semibrevis and minima head in black
// mensural notation. But an unfilled (void) narrow diamond is fine, so we draw one.
int sbStaffSize = 0.8 * staff->m_drawingStaffSize;
DrawDiamond(dc, xNote, noteY, 2 * sbStaffSize, (int)(TEMP_MINIMA_WIDTH_FACTOR * 2 * sbStaffSize),
!note->GetColored(), 20);
}
else {
DrawSmuflCode(dc, xNote, noteY, note->GetMensuralSmuflNoteHead(), staff->m_drawingStaffSize, false);
}
DrawMensuralStem(dc, note, staff, stemDir, radius, xStem, noteY);
}
/************ Draw children (verse / syl) ************/
DrawLayerChildren(dc, note, layer, staff, measure);
}
示例2: fixedTCOs
void PatternView::mousePressEvent( QMouseEvent * _me )
{
if( _me->button() == Qt::LeftButton &&
m_pat->m_patternType == Pattern::BeatPattern &&
( fixedTCOs() || pixelsPerTact() >= 96 ||
m_pat->m_steps != MidiTime::stepsPerTact() ) &&
_me->y() > height() - s_stepBtnOff->height() )
// when mouse button is pressed in beat/bassline -mode
{
// get the step number that was clicked on and
// do calculations in floats to prevent rounding errors...
float tmp = ( ( float(_me->x()) - TCO_BORDER_WIDTH ) *
float( m_pat -> m_steps ) ) / float(width() - TCO_BORDER_WIDTH*2);
int step = int( tmp );
// debugging to ensure we get the correct step...
// qDebug( "Step (%f) %d", tmp, step );
if( step >= m_pat->m_steps )
{
qDebug( "Something went wrong in pattern.cpp: step %d doesn't exist in pattern!", step );
return;
}
Note * n = m_pat->noteAtStep( step );
// if note at step not found, ensureBeatNotes and try again
if( n == NULL )
{
m_pat -> ensureBeatNotes();
n = m_pat->noteAtStep( step );
if( n == NULL ) // still can't find a note? bail!
{
qDebug( "Something went wrong in pattern.cpp: couldn't add note at step %d!", step );
return;
}
}
else // note at step found
{
if( n->length() < 0 )
{
n->setLength( 0 ); // set note as enabled beat note
}
else
{
n->setLength( -DefaultTicksPerTact ); // set note as disabled beat note
}
}
Engine::getSong()->setModified();
update();
if( gui->pianoRoll()->currentPattern() == m_pat )
{
gui->pianoRoll()->update();
}
}
else
// if not in beat/bassline -mode, let parent class handle the event
{
TrackContentObjectView::mousePressEvent( _me );
}
}
示例3: assert
void View::DrawSlurInitial(FloatingCurvePositioner *curve, Slur *slur, int x1, int x2, Staff *staff, char spanningType)
{
Beam *parentBeam = NULL;
Chord *startParentChord = NULL;
Chord *endParentChord = NULL;
Note *startNote = NULL;
Note *endNote = NULL;
Chord *startChord = NULL;
Chord *endChord = NULL;
curvature_CURVEDIR drawingCurveDir = curvature_CURVEDIR_above;
data_STEMDIRECTION startStemDir = STEMDIRECTION_NONE;
data_STEMDIRECTION endStemDir = STEMDIRECTION_NONE;
data_STEMDIRECTION stemDir = STEMDIRECTION_NONE;
bool isGraceToNoteSlur = false;
int y1 = staff->GetDrawingY();
int y2 = staff->GetDrawingY();
/************** parent layers **************/
LayerElement *start = dynamic_cast<LayerElement *>(slur->GetStart());
LayerElement *end = dynamic_cast<LayerElement *>(slur->GetEnd());
if (!start || !end) {
// no start and end, obviously nothing to do...
return;
}
if (start->Is(TIMESTAMP_ATTR) && end->Is(TIMESTAMP_ATTR)) {
// for now ignore slur using 2 tstamps
return;
}
if (start->Is(NOTE)) {
startNote = dynamic_cast<Note *>(start);
assert(startNote);
startParentChord = startNote->IsChordTone();
startStemDir = startNote->GetDrawingStemDir();
}
else if (start->Is(CHORD)) {
startChord = dynamic_cast<Chord *>(start);
assert(startChord);
startStemDir = startChord->GetDrawingStemDir();
}
if (end->Is(NOTE)) {
endNote = dynamic_cast<Note *>(end);
assert(endNote);
endParentChord = endNote->IsChordTone();
endStemDir = endNote->GetDrawingStemDir();
}
else if (end->Is(CHORD)) {
endChord = dynamic_cast<Chord *>(end);
assert(endChord);
endStemDir = endChord->GetDrawingStemDir();
}
if (startNote && endNote && startNote->IsGraceNote() && !endNote->IsGraceNote()) {
isGraceToNoteSlur = true;
}
Layer *layer = NULL;
LayerElement *layerElement = NULL;
// For now, with timestamps, get the first layer. We should eventually look at the @layerident (not implemented)
if (!start->Is(TIMESTAMP_ATTR)) {
layer = dynamic_cast<Layer *>(start->GetFirstParent(LAYER));
layerElement = start;
}
else {
layer = dynamic_cast<Layer *>(end->GetFirstParent(LAYER));
layerElement = end;
}
assert(layer);
if (!start->Is(TIMESTAMP_ATTR) && !end->Is(TIMESTAMP_ATTR) && (spanningType == SPANNING_START_END)) {
System *system = dynamic_cast<System *>(staff->GetFirstParent(SYSTEM));
assert(system);
// If we have a start to end situation, then store the curvedir in the slur for mixed drawing stem dir
// situations
if (system->HasMixedDrawingStemDir(start, end)) {
slur->SetDrawingCurvedir(curvature_CURVEDIR_above);
}
}
/************** calculate the radius for adjusting the x position **************/
int startRadius = 0;
if (!start->Is(TIMESTAMP_ATTR)) {
startRadius = start->GetDrawingRadius(m_doc);
}
int endRadius = 0;
if (!end->Is(TIMESTAMP_ATTR)) {
endRadius = end->GetDrawingRadius(m_doc);
}
/************** note stem dir **************/
if (spanningType == SPANNING_START_END) {
stemDir = startStemDir;
}
//.........这里部分代码省略.........
示例4: readUChar
//.........这里部分代码省略.........
int strings = readUChar(); // used strings mask
Fraction l = len2fraction(len);
// Some beat effects could add a Chord before this
ChordRest* cr = segment->cr(track);
if (voice != 0 && pause == 0 && strings == 0)
cr = 0;
else {
if (strings == 0) {
if (cr) {
segment->remove(cr);
delete cr;
cr = 0;
}
cr = new Rest(score);
}
else {
if (!cr)
cr = new Chord(score);
}
cr->setTrack(track);
TDuration d(l);
d.setDots(dotted ? 1 : 0);
if (dotted)
l = l + (l/2);
if (tuple) {
Tuplet* tuplet = tuplets[staffIdx * 2 + voice];
if ((tuplet == 0) || (tuplet->elementsDuration() == tuplet->baseLen().fraction() * tuplet->ratio().numerator())) {
tuplet = new Tuplet(score);
// int track = staffIdx * 2 + voice;
tuplets[staffIdx * 2 + voice] = tuplet;
tuplet->setTrack(cr->track());
setTuplet(tuplet, tuple);
tuplet->setParent(measure);
}
tuplet->setTrack(cr->track());
tuplet->setBaseLen(l);
tuplet->setDuration(l * tuplet->ratio().denominator());
cr->setTuplet(tuplet);
tuplet->add(cr);
}
cr->setDuration(l);
if (cr->type() == Element::Type::REST && (pause == 0 || l == measure->len()))
cr->setDurationType(TDuration::DurationType::V_MEASURE);
else
cr->setDurationType(d);
if(!segment->cr(track))
segment->add(cr);
Staff* staff = cr->staff();
int numStrings = staff->part()->instr()->stringData()->strings();
bool hasSlur = false;
for (int i = 6; i >= 0; --i) {
if (strings & (1 << i) && ((6-i) < numStrings)) {
Note* note = new Note(score);
if (dotted) {
// there is at most one dotted note in this guitar pro version
NoteDot* dot = new NoteDot(score);
dot->setIdx(0);
dot->setParent(note);
dot->setTrack(track); // needed to know the staff it belongs to (and detect tablature)
dot->setVisible(true);
note->add(dot);
}
static_cast<Chord*>(cr)->add(note);
hasSlur = readNote(6-i, note);
note->setTpcFromPitch();
}
}
createSlur(hasSlur, staffIdx, cr);
if (lyrics)
cr->add(lyrics);
}
int rr = readChar();
if (cr && (cr->type() == Element::Type::CHORD)) {
Chord* chord = static_cast<Chord*>(cr);
applyBeatEffects(chord, beatEffects);
if (rr == ARPEGGIO_DOWN)
chord->setStemDirection(MScore::Direction::DOWN);
else if (rr == ARPEGGIO_UP)
chord->setStemDirection(MScore::Direction::UP);
}
int r = readChar();
if (r & 0x8) {
int rrr = readChar();
qDebug(" 3beat read 0x%02x", rrr);
}
if (cr && (cr->type() == Element::Type::CHORD) && slide > 0)
createSlide(slide, cr, staffIdx);
restsForEmptyBeats(segment, measure, cr, l, track, tick);
return cr ? cr->actualTicks() : measure->ticks();
}
示例5: getNote
bool NoteHistoryItem::isNoteValid() {
Note note = getNote();
return note.exists();
}
示例6: spatium
void Bend::layout()
{
// during mtest, there may be no score. If so, exit.
if (!score())
return;
qreal _spatium = spatium();
if (staff() && !staff()->isTabStaff(tick())) {
if (!parent()) {
noteWidth = -_spatium*2;
notePos = QPointF(0.0, _spatium*3);
}
}
qreal _lw = _lineWidth;
Note* note = toNote(parent());
if (note == 0) {
noteWidth = 0.0;
notePos = QPointF();
}
else {
notePos = note->pos();
noteWidth = note->width();
}
QRectF bb;
QFontMetricsF fm(font(_spatium), MScore::paintDevice());
int n = _points.size();
qreal x = noteWidth;
qreal y = -_spatium * .8;
qreal x2, y2;
qreal aw = _spatium * .5;
QPolygonF arrowUp;
arrowUp << QPointF(0, 0) << QPointF(aw*.5, aw) << QPointF(-aw*.5, aw);
QPolygonF arrowDown;
arrowDown << QPointF(0, 0) << QPointF(aw*.5, -aw) << QPointF(-aw*.5, -aw);
for (int pt = 0; pt < n; ++pt) {
if (pt == (n-1))
break;
int pitch = _points[pt].pitch;
if (pt == 0 && pitch) {
y2 = -notePos.y() -_spatium * 2;
x2 = x;
bb |= QRectF(x, y, x2-x, y2-y);
bb |= arrowUp.translated(x2, y2 + _spatium * .2).boundingRect();
int idx = (pitch + 12)/25;
const char* l = label[idx];
bb |= fm.boundingRect(QRectF(x2, y2, 0, 0),
Qt::AlignHCenter | Qt::AlignBottom | Qt::TextDontClip, QString(l));
y = y2;
}
if (pitch == _points[pt+1].pitch) {
if (pt == (n-2))
break;
x2 = x + _spatium;
y2 = y;
bb |= QRectF(x, y, x2-x, y2-y);
}
else if (pitch < _points[pt+1].pitch) {
// up
x2 = x + _spatium*.5;
y2 = -notePos.y() -_spatium * 2;
qreal dx = x2 - x;
qreal dy = y2 - y;
QPainterPath path;
path.moveTo(x, y);
path.cubicTo(x+dx/2, y, x2, y+dy/4, x2, y2);
bb |= path.boundingRect();
bb |= arrowUp.translated(x2, y2 + _spatium * .2).boundingRect();
int idx = (_points[pt+1].pitch + 12)/25;
const char* l = label[idx];
QRectF r;
bb |= fm.boundingRect(QRectF(x2, y2, 0, 0),
Qt::AlignHCenter | Qt::AlignBottom | Qt::TextDontClip, QString(l));
}
else {
// down
x2 = x + _spatium*.5;
y2 = y + _spatium * 3;
qreal dx = x2 - x;
qreal dy = y2 - y;
QPainterPath path;
path.moveTo(x, y);
path.cubicTo(x+dx/2, y, x2, y+dy/4, x2, y2);
bb |= path.boundingRect();
bb |= arrowDown.translated(x2, y2 - _spatium * .2).boundingRect();
}
x = x2;
y = y2;
}
//.........这里部分代码省略.........
示例7: writeChord
static void writeChord(KoXmlWriter& w, Chord* chord, Voice* voice, Part* part, int bar)
{
if (!chord->noteCount()) {
w.startElement("music:note");
w.startElement("music:rest");
w.endElement(); // music:rest
w.startElement("music:duration");
w.addTextNode(QString::number(chord->length()));
w.endElement(); // music:duration
w.startElement("music:voice");
w.addTextNode(QString::number(part->indexOfVoice(voice) + 1));
w.endElement(); // music:voice
w.startElement("music:type");
w.addTextNode(durationToString(chord->duration()));
w.endElement(); // music:type
for (int i = 0; i < chord->dots(); i++) {
w.startElement("music:dot");
w.endElement(); // music:dot
}
if (part->staffCount() > 1) {
// only write staff info when more than one staff exists
Staff* s = chord->staff();
w.startElement("music:staff");
w.addTextNode(QString::number(part->indexOfStaff(s) + 1));
w.endElement(); //music:staff
}
w.endElement(); // music:note
} else for (int n = 0; n < chord->noteCount(); n++) {
Staff* staff = chord->note(n)->staff();
w.startElement("music:note");
if (n > 0) {
w.startElement("music:chord");
w.endElement(); // music:chord
}
w.startElement("music:pitch");
w.startElement("music:step");
int pitch = chord->note(n)->pitch();
char note = 'A' + ((((pitch + 2) % 7) + 7) % 7);
w.addTextNode(QString(note));
w.endElement(); // music:step
if (chord->note(n)->accidentals()) {
w.startElement("music:alter");
w.addTextNode(QString::number(chord->note(n)->accidentals()));
w.endElement(); // music:alter
}
w.startElement("music:octave");
w.addTextNode(QString::number((pitch + 4*7) / 7)); // first add, than divide to get proper rounding
w.endElement(); // music:octave
w.endElement(); // music:pitch
w.startElement("music:duration");
w.addTextNode(QString::number(chord->length()));
w.endElement(); // music:duration
w.startElement("music:voice");
w.addTextNode(QString::number(part->indexOfVoice(voice) + 1));
w.endElement(); // music:voice
w.startElement("music:type");
w.addTextNode(durationToString(chord->duration()));
w.endElement(); // music:type
for (int i = 0; i < chord->dots(); i++) {
w.startElement("music:dot");
w.endElement(); // music:dot
}
int activeAccidentals = 0;
KeySignature* ks = staff->lastKeySignatureChange(bar);
if (ks) activeAccidentals = ks->accidentals(chord->note(n)->pitch());
VoiceBar* vb = chord->voiceBar();
// next check the bar for the last previous note in the same voice with the same pitch
for (int e = 0; e < vb->elementCount(); e++) {
Chord* c = dynamic_cast<Chord*>(vb->element(e));
if (!c) continue;
if (c == chord) break;
for (int nid = 0; nid < c->noteCount(); nid++) {
Note* note = c->note(nid);
if (note->staff() != staff) continue;
if (note->pitch() == chord->note(n)->pitch()) {
activeAccidentals = note->accidentals();
}
}
}
if (chord->note(n)->accidentals() != activeAccidentals) {
w.startElement("music:accidental");
switch (chord->note(n)->accidentals()) {
case -2: w.addTextNode("flat-flat"); break;
case -1: w.addTextNode("flat"); break;
case 0: w.addTextNode("natural"); break;
//.........这里部分代码省略.........
示例8: assert
void View::DrawLigature ( DeviceContext *dc, int y, LayerElement *element, Layer *layer, Staff *staff )
{
assert( dc );
assert( element );
assert( layer );
assert( staff );
Note *note = dynamic_cast<Note*>(element);
assert( note );
int xn, x1, x2, y1, y2, y3, y4;
// int yy2, y5; // unused
int verticalCenter, up, epaisseur;
epaisseur = std::max (2, m_doc->GetDrawingBeamWidth(staff->m_drawingStaffSize, false) / 2);
xn = element->GetDrawingX();
/*
if ((note->m_lig==LIG_MEDIAL) || (note->m_lig==LIG_TERMINAL))
{
CalculateLigaturePosX ( element, layer, staff );
}
else
*/{
xn = element->GetDrawingX();
}
// calcul des dimensions du rectangle
x1 = xn - m_doc->GetDrawingBrevisWidth(staff->m_drawingStaffSize); x2 = xn + m_doc->GetDrawingBrevisWidth(staff->m_drawingStaffSize);
y1 = y + m_doc->GetDrawingUnit(staff->m_drawingStaffSize);
y2 = y - m_doc->GetDrawingUnit(staff->m_drawingStaffSize);
y3 = (int)(y1 + m_doc->GetDrawingUnit(staff->m_drawingStaffSize)/2); // partie d'encadrement qui depasse
y4 = (int)(y2 - m_doc->GetDrawingUnit(staff->m_drawingStaffSize)/2);
//if (!note->m_ligObliqua && (!View::s_drawingLigObliqua)) // notes rectangulaires, y c. en ligature
{
if (note->GetColored()!=BOOLEAN_true)
{ // double base des carrees
DrawObliquePolygon ( dc, x1, y1, x2, y1, -epaisseur );
DrawObliquePolygon ( dc, x1, y2, x2, y2, epaisseur );
}
else
DrawFullRectangle( dc,x1,y1,x2,y2); // dessine val carree pleine // ENZ correction de x2
DrawVerticalLine ( dc, y3, y4, x1, m_doc->GetDrawingStemWidth(staff->m_drawingStaffSize) ); // corset lateral
DrawVerticalLine ( dc, y3, y4, x2, m_doc->GetDrawingStemWidth(staff->m_drawingStaffSize) );
}
/*
else // traitement des obliques
{
if (!View::s_drawingLigObliqua) // 1e passage: ligne flagStemHeighte initiale
{
DrawVerticalLine (dc,y3,y4,x1, m_doc->GetDrawingStemWidth(staff->m_drawingStaffSize) );
View::s_drawingLigObliqua = true;
//oblique = OFF;
// if (val == DUR_1) // queue gauche haut si DUR_1
// queue_lig = ON;
}
else // 2e passage: lignes obl. et flagStemHeighte finale
{
x1 -= m_doc->m_drawingBrevisWidth[staff->m_drawingStaffSize]*2; // avance auto
y1 = *View::s_drawingLigY - m_doc->GetDrawingUnit(staff->m_drawingStaffSize); // ligat_y contient y original
yy2 = y2;
y5 = y1+ m_doc->GetDrawingDoubleUnit(staff->m_drawingStaffSize); y2 += m_doc->GetDrawingDoubleUnit(staff->m_drawingStaffSize); // on monte d'un INTERL
if (note->GetColored()==BOOLEAN_true)
DrawObliquePolygon ( dc, x1, y1, x2, yy2, m_doc->GetDrawingDoubleUnit(staff->m_drawingStaffSize));
else
{ DrawObliquePolygon ( dc, x1, y1, x2, yy2, 5);
DrawObliquePolygon ( dc, x1, y5, x2, y2, -5);
}
DrawVerticalLine ( dc,y3,y4,x2,m_doc->GetDrawingStemWidth(staff->m_drawingStaffSize)); //cloture flagStemHeighte
View::s_drawingLigObliqua = false;
// queue_lig = OFF; //desamorce alg.queue DUR_BR
}
}
if (note->m_lig) // memoriser positions d'une note a l'autre; relier notes par barres
{
*(View::s_drawingLigX+1) = x2; *(View::s_drawingLigY+1) = y; // relie notes ligaturees par barres flagStemHeightes
//if (in(x1,(*View::s_drawingLigX)-2,(*View::s_drawingLigX)+2) || (this->fligat && this->lat && !Note1::marq_obl))
// les dernieres conditions pour permettre ligature flagStemHeighte ancienne
// DrawVerticalLine (dc, *ligat_y, y1, (this->fligat && this->lat) ? x2: x1, m_doc->m_parameters.m_stemWidth); // ax2 - drawing flagStemHeight lines missing
*View::s_drawingLigX = *(View::s_drawingLigX + 1);
*View::s_drawingLigY = *(View::s_drawingLigY + 1);
}
y3 = y2 - m_doc->GetDrawingUnit(staff->m_drawingStaffSize)*6;
if (note->m_lig)
{
if (note->m_dur == DUR_BR) // && this->queue_lig) // queue gauche bas: DUR_BR initiale descendante // ax2 - no support of queue_lig (see WG corrigeLigature)
{
DrawVerticalLine ( dc, y2, y3, x1, m_doc->GetDrawingStemWidth(staff->m_drawingStaffSize) );
}
//.........这里部分代码省略.........
示例9: PlayHandle
NotePlayHandle::NotePlayHandle( InstrumentTrack* instrumentTrack,
const f_cnt_t _offset,
const f_cnt_t _frames,
const Note& n,
NotePlayHandle *parent,
int midiEventChannel,
Origin origin ) :
PlayHandle( TypeNotePlayHandle, _offset ),
Note( n.length(), n.pos(), n.key(), n.getVolume(), n.getPanning(), n.detuning() ),
m_pluginData( NULL ),
m_filter( NULL ),
m_instrumentTrack( instrumentTrack ),
m_frames( 0 ),
m_totalFramesPlayed( 0 ),
m_framesBeforeRelease( 0 ),
m_releaseFramesToDo( 0 ),
m_releaseFramesDone( 0 ),
m_subNotes(),
m_released( false ),
m_hasParent( parent != NULL ),
m_parent( parent ),
m_hadChildren( false ),
m_muted( false ),
m_bbTrack( NULL ),
m_origTempo( Engine::getSong()->getTempo() ),
m_origBaseNote( instrumentTrack->baseNote() ),
m_frequency( 0 ),
m_unpitchedFrequency( 0 ),
m_baseDetuning( NULL ),
m_songGlobalParentOffset( 0 ),
m_midiChannel( midiEventChannel >= 0 ? midiEventChannel : instrumentTrack->midiPort()->realOutputChannel() ),
m_origin( origin ),
m_frequencyNeedsUpdate( false )
{
lock();
if( hasParent() == false )
{
m_baseDetuning = new BaseDetuning( detuning() );
m_instrumentTrack->m_processHandles.push_back( this );
}
else
{
m_baseDetuning = parent->m_baseDetuning;
parent->m_subNotes.push_back( this );
parent->m_hadChildren = true;
m_bbTrack = parent->m_bbTrack;
parent->setUsesBuffer( false );
}
updateFrequency();
setFrames( _frames );
// inform attached components about new MIDI note (used for recording in Piano Roll)
if( m_origin == OriginMidiInput )
{
m_instrumentTrack->midiNoteOn( *this );
}
if( hasParent() || ! m_instrumentTrack->isArpeggioEnabled() )
{
const int baseVelocity = m_instrumentTrack->midiPort()->baseVelocity();
// send MidiNoteOn event
m_instrumentTrack->processOutEvent(
MidiEvent( MidiNoteOn, midiChannel(), midiKey(), midiVelocity( baseVelocity ) ),
MidiTime::fromFrames( offset(), Engine::framesPerTick() ),
offset() );
}
if( m_instrumentTrack->instrument()->flags() & Instrument::IsSingleStreamed )
{
setUsesBuffer( false );
}
setAudioPort( instrumentTrack->audioPort() );
unlock();
}
示例10: FOREACH_NOTE_CST_IT_BOUND
void Sampler::setPlayingNotelength( Instrument* instrument, unsigned long ticks, unsigned long noteOnTick )
{
if ( instrument ) { // stop all notes using this instrument
Hydrogen *pEngine = Hydrogen::get_instance();
Song* mSong = pEngine->getSong();
int selectedpattern = pEngine->__get_selected_PatterNumber();
Pattern* currentPattern = NULL;
if ( mSong->get_mode() == Song::PATTERN_MODE ||
( pEngine->getState() != STATE_PLAYING )){
PatternList *pPatternList = mSong->get_pattern_list();
if ( ( selectedpattern != -1 )
&& ( selectedpattern < ( int )pPatternList->size() ) ) {
currentPattern = pPatternList->get( selectedpattern );
}
}else
{
std::vector<PatternList*> *pColumns = mSong->get_pattern_group_vector();
// Pattern *pPattern = NULL;
int pos = pEngine->getPatternPos() +1;
for ( int i = 0; i < pos; ++i ) {
PatternList *pColumn = ( *pColumns )[i];
currentPattern = pColumn->get( 0 );
}
}
if ( currentPattern ) {
int patternsize = currentPattern->get_length();
for ( unsigned nNote = 0; nNote < currentPattern->get_length(); nNote++ ) {
const Pattern::notes_t* notes = currentPattern->get_notes();
FOREACH_NOTE_CST_IT_BOUND(notes,it,nNote) {
Note *pNote = it->second;
if ( pNote!=NULL ) {
if( !Preferences::get_instance()->__playselectedinstrument ){
if ( pNote->get_instrument() == instrument
&& pNote->get_position() == noteOnTick ) {
AudioEngine::get_instance()->lock( RIGHT_HERE );
if ( ticks > patternsize )
ticks = patternsize - noteOnTick;
pNote->set_length( ticks );
Hydrogen::get_instance()->getSong()->__is_modified = true;
AudioEngine::get_instance()->unlock(); // unlock the audio engine
}
}else
{
if ( pNote->get_instrument() == pEngine->getSong()->get_instrument_list()->get( pEngine->getSelectedInstrumentNumber())
&& pNote->get_position() == noteOnTick ) {
AudioEngine::get_instance()->lock( RIGHT_HERE );
if ( ticks > patternsize )
ticks = patternsize - noteOnTick;
pNote->set_length( ticks );
Hydrogen::get_instance()->getSong()->__is_modified = true;
AudioEngine::get_instance()->unlock(); // unlock the audio engine
}
}
}
}
}
}
}
示例11: spatium
void Tremolo::layout()
{
qreal _spatium = spatium();
qreal w2 = _spatium * score()->styleS(ST_tremoloWidth).val() * .5;
qreal h2 = _spatium * score()->styleS(ST_tremoloBoxHeight).val() * .5;
qreal lw = _spatium * score()->styleS(ST_tremoloStrokeWidth).val();
qreal td = _spatium * score()->styleS(ST_tremoloDistance).val();
path = QPainterPath();
qreal ty = 0.0;
for (int i = 0; i < _lines; ++i) {
path.moveTo(-w2, ty + h2 - lw);
path.lineTo( w2, ty - h2);
path.lineTo( w2, ty - h2 + lw);
path.lineTo(-w2, ty + h2);
path.closeSubpath();
ty += td;
}
setbbox(path.boundingRect());
_chord1 = static_cast<Chord*>(parent());
if (_chord1 == 0)
return;
Note* anchor1 = _chord1->upNote();
Stem* stem = _chord1->stem();
qreal x, y, h;
if (stem) {
x = stem->pos().x();
y = stem->pos().y();
h = stem->stemLen();
}
else {
// center tremolo above note
x = anchor1->x() + anchor1->headWidth() * .5;
y = anchor1->y();
h = 2.0 * _spatium + bbox().height();
if (anchor1->line() > 4)
h *= -1;
}
if (!twoNotes()) {
//
// single note tremolos
//
bool up = _chord1->up();
int line = up ? _chord1->upLine() : _chord1->downLine();
static const qreal t[3][2][4][2] = {
// normal stem
{
// DOWN
{
// even line odd line
{ 6, 5 }, // line 1
{ 6 - 2 * .8, 5 - 2 * .8 }, // line 2
{ 6 - 4 * .8, 3 }, // line 3
{ 2 , 3 } // line 4
},
// UP
{
// even line odd line
{ -6, -5 }, // line 1
{ -6, -5 }, // line 2
{ -6, -3 - 4 * .8 }, // line 3
{ -2 - 6 * .8, -3 - 6 * .8 } // line 4
}
},
// stem with hook
{
// DOWN
{
// even line odd line
{ 3, 3 }, // line 1
{ 2, 2 }, // line 2
{ 2, 2 }, // line 3
{ 2, 2 } // line 4
},
// UP
{
// even line odd line
{ -3, -3 }, // line 1
{ -2 - 2 * .8, -2 - 2 * .8 }, // line 2
{ -2 - 4 * .8, -2 - 4 * .8 }, // line 3
{ -2 - 6 * .8, -2 - 6 * .8 } // line 4
}
},
// stem with beam
{
// DOWN
{
// even line odd line
{ 3, 3 }, // line 1
{ 2, 2 }, // line 2
{ 2, 2 }, // line 3
{ 2, 2 } // line 4
},
// UP
{
// even line odd line
{ -3, -3 }, // line 1
//.........这里部分代码省略.........
示例12: p
//.........这里部分代码省略.........
/ (float) m_pat->length().getTact();
const int x_base = TCO_BORDER_WIDTH;
p.setPen( c.darker( 300 ) );
for( tact_t t = 1; t < m_pat->length().getTact(); ++t )
{
p.drawLine( x_base + static_cast<int>( ppt * t ) - 1,
TCO_BORDER_WIDTH, x_base + static_cast<int>(
ppt * t ) - 1, 5 );
p.drawLine( x_base + static_cast<int>( ppt * t ) - 1,
height() - ( 4 + 2 * TCO_BORDER_WIDTH ),
x_base + static_cast<int>( ppt * t ) - 1,
height() - 2 * TCO_BORDER_WIDTH );
}
// melody pattern paint event
if( m_pat->m_patternType == Pattern::MelodyPattern )
{
if( m_pat->m_notes.size() > 0 )
{
// first determine the central tone so that we can
// display the area where most of the m_notes are
// also calculate min/max tones so the tonal range can be
// properly stretched accross the pattern vertically
int central_key = 0;
int max_key = 0;
int min_key = 9999999;
int total_notes = 0;
for( NoteVector::Iterator it = m_pat->m_notes.begin();
it != m_pat->m_notes.end(); ++it )
{
if( ( *it )->length() > 0 )
{
max_key = qMax( max_key, ( *it )->key() );
min_key = qMin( min_key, ( *it )->key() );
central_key += ( *it )->key();
++total_notes;
}
}
if( total_notes > 0 )
{
central_key = central_key / total_notes;
const int keyrange = qMax( qMax( max_key - central_key, central_key - min_key ), 1 );
// debug code
// qDebug( "keyrange: %d", keyrange );
// determine height of the pattern view, sans borders
const int ht = (height() - 1 - TCO_BORDER_WIDTH * 2) -1;
// determine maximum height value for drawing bounds checking
const int max_ht = height() - 1 - TCO_BORDER_WIDTH;
// set colour based on mute status
if( m_pat->getTrack()->isMuted() ||
m_pat->isMuted() )
{
p.setPen( QColor( 160, 160, 160 ) );
}
else
示例13: WXUNUSED
/// Command Events
///< This code demonstrates how to parse a loaded Power Tab document
///< You could also load a document directly using Load
void PowerTabView::OnTestParseFile(wxCommandEvent& event)
{
// Menu Test -> Parse File
//------Last Checked------//
// - Jan 25, 2005
WXUNUSED(event);
// Get the active document
PowerTabDocument* document = (PowerTabDocument*)GetDocument();
wxCHECK2(document != NULL, return);
wxLongLong startTime = ::wxGetLocalTimeMillis();
// Get the header
PowerTabFileHeader& header = document->GetHeaderRef();
// File version that the file was saved as; the document automatically
// converts to the latest version during deserialization
wxWord version = header.GetVersion();
// In Power Tab Editor v1.7, most of the header data is accessable via the Song Property Sheet:
// Menu View -> File Information
// Menu View -> Performance Notes
// Menu View -> Lyrics
// File is a song
if (header.IsSong())
{
wxByte contentType = header.GetSongContentType();
wxString title = header.GetSongTitle();
wxString artist = header.GetSongArtist();
wxByte releaseType = header.GetSongReleaseType();
// Audio release
if (releaseType == PowerTabFileHeader::RELEASETYPE_PUBLIC_AUDIO)
{
wxByte releaseType = header.GetSongAudioReleaseType();
wxString releaseTitle = header.GetSongAudioReleaseTitle();
wxWord year = header.GetSongAudioReleaseYear();
bool live = header.IsSongAudioReleaseLive();
}
// Video release
else if (releaseType == PowerTabFileHeader::RELEASETYPE_PUBLIC_VIDEO)
{
wxString releaseTitle = header.GetSongVideoReleaseTitle();
bool live = header.IsSongVideoReleaseLive();
}
// Bootleg
else if (releaseType == PowerTabFileHeader::RELEASETYPE_BOOTLEG)
{
wxString releaseTitle = header.GetSongBootlegTitle();
wxDateTime bootlegDate = header.GetSongBootlegDate();
}
// Not released
else if (releaseType == PowerTabFileHeader::RELEASETYPE_NOTRELEASED)
{
// no extra data for this data
}
// If author is known, get the composer and lyricist; otherwise, song is traditional
if (header.GetSongAuthorType() == PowerTabFileHeader::AUTHORTYPE_AUTHORKNOWN)
{
wxString composer = header.GetSongComposer();
wxString lyricist = header.GetSongLyricist();
}
wxString arranger = header.GetSongArranger();
wxString guitarScoreTranscriber = header.GetSongGuitarScoreTranscriber();
wxString bassScoreTranscriber = header.GetSongBassScoreTranscriber();
wxString copyright = header.GetSongCopyright();
wxString lyrics = header.GetSongLyrics();
wxString guitarScoreNotes = header.GetSongGuitarScoreNotes();
wxString bassScoreNotes = header.GetSongBassScoreNotes();
}
// File is a lesson
else if (header.IsLesson())
{
wxString title = header.GetLessonTitle();
wxString subtitle = header.GetLessonSubtitle();
wxWord musicStyle = header.GetLessonMusicStyle();
wxByte level = header.GetLessonLevel();
wxString author = header.GetLessonAuthor();
wxString notes = header.GetLessonNotes();
wxString copyright = header.GetLessonCopyright();
}
wxUint8 scoreIndex = 0;
// There are two scores in each document:
// 1) Guitar score
// 2) Bass score
for (; scoreIndex < 2; scoreIndex++)
{
//.........这里部分代码省略.........
示例14:
bool operator>(const Note n1, const Note n2)
{
return n1.getRang()>n2.getRang();
}
示例15: switch
void PlayBack::process()
{
for(unsigned int i=0; i<staff.getNumOfNotes(); i++){
Note note = staff.getNoteByNum(i+1);
switch (staff.getNoteByNum(i+1).getPitch()) {
case -24:
if(accents.at(i)->getAccent() == Accent::flat){
note--;
}
break;
case -20:
if(accents.at(i)->getAccent() == Accent::sharp){
note++;
}
break;
case -19:
if(accents.at(i)->getAccent() == Accent::flat){
note--;
}
break;
case -13:
if(accents.at(i)->getAccent() == Accent::sharp){
note++;
}
break;
case -12:
if(accents.at(i)->getAccent() == Accent::flat){
note--;
}
break;
case -8:
if(accents.at(i)->getAccent() == Accent::sharp){
note++;
}
break;
case -7:
if(accents.at(i)->getAccent() == Accent::flat){
note--;
}
break;
case -1:
if(accents.at(i)->getAccent() == Accent::sharp){
note++;
}
break;
case 0:
if(accents.at(i)->getAccent() == Accent::flat){
note--;
}
break;
case 4:
if(accents.at(i)->getAccent() == Accent::sharp){
note++;
}
break;
case 5:
if(accents.at(i)->getAccent() == Accent::flat){
note--;
}
break;
case 11:
if(accents.at(i)->getAccent() == Accent::sharp){
note++;
}
break;
case 12:
if(accents.at(i)->getAccent() == Accent::flat){
note--;
}
break;
case 16:
if(accents.at(i)->getAccent() == Accent::sharp){
note++;
}
break;
case 17:
if(accents.at(i)->getAccent() == Accent::flat){
note--;
}
break;
case 23:
if(accents.at(i)->getAccent() == Accent::sharp){
note++;
}
break;
case 24:
if(accents.at(i)->getAccent() == Accent::flat){
note--;
}
break;
default:
break;
}
if(!midi->isConnected()){
emit finished();
return;
//.........这里部分代码省略.........