NoteNode::NoteNode(Node * parent, const NoteInfo & info) : Node(parent) , info_(info) { mutable_type() = NODE_TYPE_NOTE; mutable_name() = info.name(); mutable_display_name() = info.name(); }
f32 Envelope::Generate(f32 phase, NoteInfo& note){ if(!(note.envFlags & (1<<id))) return 0.0; phase *= ServerLogic::tempo / 60.0; auto position = phase - note.beginTime; switch(type){ case EnvelopeType::None: note.envFlags &= ~(1<<id); return 0.0; case EnvelopeType::DC: { if(!note.held()) note.envFlags &= ~(1<<id); return dc; } case EnvelopeType::Linear: { auto o = 1.0-position/release; if(o < 0.0) note.envFlags &= ~(1<<id); return std::max(o, 0.0); } case EnvelopeType::AR: { auto o = (position < attack)?(position/attack):(1.0-(position-attack)/release); if(o < 0.0) note.envFlags &= ~(1<<id); return std::min(o, 1.0); } case EnvelopeType::ADSR:{ auto end = note.beginTime + attack + decay; if(end < note.endTime) end = note.endTime; auto rpos = phase - end; if(position <= attack){ return std::min(position/attack, 1.f); }else if(position-attack <= decay){ return std::max(1.0 - (position-attack)/decay *(1.0-sustain), 0.0); }else if(note.held() || phase < note.endTime){ return sustain; }else if(rpos < release){ return std::max((1.0-rpos/release)*sustain, 0.0); } note.envFlags &= ~(1<<id); return 0.0; } default: throw "Invalid envelope"; } return 0.0; // No envelope }
bool ContentManager::addNoteIndex(const NoteInfo & note) { QString path = getSketchDB(note.name()); // Ensure note has been created. ContentNode info; getContentNode(info, path, true); return NotesManager::addIndex(*database_, note); }
void UIMain::slotUpdateNoteInfo(NoteInfo note) { if (note.getSymbol()!=err){ updateDrawArea(note.getSemitone()); double const f = note.getFrequency(); QString const freq = QString(" (%1 Hz)") .arg(f == 0 ? "?" : QString::number(f,'f',0)); ui.labelFreq ->setText(freq); ui.labelNote ->setText(note.getSymbolString()+" "); double const rem = note.getRemainder(); QString sRem = QString::number(rem,'f',2); if (rem>=0) sRem.prepend("+"); ui.labelRemainder->setText(sRem); }else{ updateDrawArea(-100); // move out of sight ui.labelFreq ->setText(" (? Hz)"); ui.labelNote ->setText("?"); ui.labelRemainder->setText("+0.0"); } }