From a60d6612ff0be60f174c4ac4e7e55bc6b2a2b4b5 Mon Sep 17 00:00:00 2001 From: Matthias Neeracher Date: Sun, 27 May 2007 04:42:05 +0000 Subject: [PATCH] Remove vestigial MMA / Partial/Visual note infrastructure --- Resources/Info.plist | 2 +- Sources/VLModel.cpp | 344 ------------------------------------------- Sources/VLModel.h | 14 -- 3 files changed, 1 insertion(+), 359 deletions(-) diff --git a/Resources/Info.plist b/Resources/Info.plist index 82901a3..434b481 100644 --- a/Resources/Info.plist +++ b/Resources/Info.plist @@ -140,7 +140,7 @@ CFBundleSignature VçEz CFBundleVersion - 1.0a3 + 1.0a4 NSMainNibFile MainMenu NSPrincipalClass diff --git a/Sources/VLModel.cpp b/Sources/VLModel.cpp index 9cbb791..7c7fa04 100644 --- a/Sources/VLModel.cpp +++ b/Sources/VLModel.cpp @@ -92,27 +92,6 @@ static std::string PitchName(int8_t pitch, bool useSharps) + std::string(kVLFlatStr); } -static std::string MMAPitchName(int8_t pitch, bool useSharps) -{ - if (pitch == VLNote::kNoPitch) - return "r"; - char name[3]; - name[2] = 0; - name[1] = 'n'; - pitch %= 12; - if (kScale[pitch] != ' ') { - name[0] = kScale[pitch]; - } else if (useSharps) { - name[0] = kScale[pitch-1]; - name[1] = '#'; - } else { - name[0] = kScale[pitch+1]; - name[1] = '&'; - } - - return name; -} - VLNote::VLNote(std::string name) { // @@ -151,77 +130,6 @@ void VLNote::Name(std::string & name, bool useSharps) const name = PitchName(fPitch, useSharps); } -static struct { - VLFract fVal; - const char * fName; -} sMMADur [] = { - {{1,1}, "1"}, - {{1,2}, "2"}, - {{1,3}, "23"}, - {{1,4}, "4"}, - {{1,6}, "81"}, - {{1,8}, "8"}, - {{1,12}, "82"}, - {{1,16}, "16"}, - {{1,24}, "6"}, - {{1,32}, "32"}, - {{1,64}, "64"}, - {{0,0}, 0} -}; - -void VLNote::MMAName(std::string & name, VLFraction at, VLFraction dur, VLFraction prevDur, VLFraction nextDur, const VLProperties & prop) const -{ - if (fTied & kTiedWithPrev) { - if (fTied & kTiedWithNext) { - name = "~<>~"; - } else { - name = '~'; - } - return; - } - bool useSharps = prop.fKey >= 0; - - name.clear(); - VLFraction prevPart(0); - while (dur.fNum) { - VLFraction part; - bool grouped = dur==nextDur || - (prevPart!=0 ? dur==prevPart : dur==prevDur); - prop.PartialNote(at, dur, grouped, &part); - const char * durName; - for (int d=0; sMMADur[d].fName; ++d) - if (part == sMMADur[d].fVal) { - durName = sMMADur[d].fName; - break; - } - if (!strcmp(durName, "82")) { - // - // Distinguish 2nd pair of swing 8ths from regular triplet - // - const VLFraction kBeat(1, prop.fTime.fDenom); - VLFraction withinBeat = at % kBeat; - if (withinBeat != 2*kBeat/3) - durName = "3"; - } - if (name.size()) - name += '+'; - name += durName; - prevPart = part; - dur -= part; - at += part; - } - int pitch = fTied & kTiedWithPrev ? kNoPitch : fPitch; - name += MMAPitchName(pitch, useSharps); - if (pitch != kNoPitch) { - for (int raise = (pitch-kMiddleC)/kOctave; raise>0; --raise) - name += '+'; - for (int lower = (kMiddleC+kOctave-1-pitch)/kOctave; lower>0; --lower) - name += '-'; - } - if (fTied & kTiedWithNext) - name += '~'; -} - void VLNote::MakeRepresentable() { if (fDuration > 1) @@ -467,263 +375,11 @@ void VLChord::Name(std::string & base, std::string & ext, std::string & root, bo root = PitchName(fRootPitch, useSharps); } -// -// MMA supports a large but finite list of chords -// -static const VLChordModifier kMMAModifiers[] = { - {"", 0, 0}, - {"+", _ kmAug5th, _ km5th}, - {"11", _ kmMin7th | _ kmMaj9th | _ km11th, 0}, - {"11b9", _ kmMin7th | _ kmMin9th | _ km11th, 0}, - {"13", _ kmMin7th | _ kmMaj9th | _ km11th | _ kmMaj13th, 0}, - {"5", 0, _ kmMaj3rd}, - {"6", _ kmDim7th, 0}, - {"69", _ kmDim7th | _ kmMaj9th, 0}, - {"7", _ kmMin7th, 0}, - {"7#11", _ kmMin7th | _ kmAug11th, 0}, - {"7#5", _ kmMin7th | _ kmAug5th, _ km5th}, - {"7#5#9", _ kmMin7th | _ kmAug5th | _ kmAug9th, _ km5th}, - {"7#5b9", _ kmMin7th | _ kmAug5th | _ kmMin9th, _ km5th}, - {"7#9", _ kmMin7th | _ kmAug9th, 0}, - {"7#9#11", _ kmMin7th | _ kmAug9th | _ kmAug11th, 0}, - {"7b5", _ kmMin7th | _ kmDim5th, _ km5th}, - {"7b5#9", _ kmMin7th | _ kmDim5th | _ kmAug9th, _ km5th}, - {"7b5b9", _ kmMin7th | _ kmDim5th | _ kmMin9th, _ km5th}, - {"7b9", _ kmMin7th | _ kmMin9th, 0}, - {"7sus", _ kmMin7th | _ km4th, _ kmMaj3rd}, - {"7sus2", _ kmMin7th | _ kmMaj2nd, _ kmMaj3rd}, - {"9", _ kmMin7th | _ kmMaj9th, 0}, - {"9#11", _ kmMin7th | _ kmMaj9th | _ kmAug11th, 0}, - {"9#5", _ kmMin7th | _ kmMaj9th | _ kmAug5th, _ km5th}, - {"9b5", _ kmMin7th | _ kmMaj9th | _ kmDim5th, _ km5th}, - {"9sus", _ kmMaj9th, 0}, - {"M13", _ kmMaj7th | _ kmMaj13th, 0}, - {"M7", _ kmMaj7th, 0}, - {"M7#11", _ kmMaj7th | _ kmMaj9th | _ kmAug11th, 0}, - {"M7#5", _ kmMaj7th | _ kmAug5th, _ km5th}, - {"M7b5", _ kmMaj7th | _ kmDim5th, _ km5th}, - {"M9", _ kmMaj7th | _ kmMaj9th, 0}, - {"aug9", _ kmMin7th | _ kmMaj9th | _ kmAug5th, _ km5th}, - {"dim3", _ kmMin3rd | _ kmDim5th, _ kmMaj3rd | _ km5th}, - {"dim7", _ kmMin3rd | _ kmDim5th | _ kmDim7th, _ kmMaj3rd | _ km5th}, - {"m", _ kmMin3rd, _ kmMaj3rd}, - {"m#5", _ kmMin3rd | _ kmAug5th, _ kmMaj3rd | _ km5th}, - {"m(maj7)", _ kmMin3rd | _ kmMaj7th, _ kmMaj3rd}, - {"m(sus9)", _ kmMin3rd | _ kmMaj9th, _ kmMaj3rd}, - {"m11", _ kmMin3rd | _ kmMin7th | _ kmMaj9th | _ km11th, _ kmMaj3rd}, - {"m6", _ kmMin3rd | _ kmDim7th, _ kmMaj3rd}, - {"m69", _ kmMin3rd | _ kmDim7th | _ kmMaj9th, _ kmMaj3rd}, - {"m7", _ kmMin3rd | _ kmMin7th, _ kmMaj3rd}, - {"m7b5", _ kmMin3rd | _ kmMin7th | _ kmDim5th, _ kmMaj3rd | _ km5th}, - {"m7b9", _ kmMin3rd | _ kmMin7th | _ kmMin9th, _ kmMaj3rd}, - {"m9", _ kmMin3rd | _ kmMin7th | _ kmMaj9th, _ kmMaj3rd}, - {"m9b5", _ kmMin3rd | _ kmMin7th | _ kmMaj9th | _ kmDim5th, _ kmMaj3rd | _ km5th}, - {"mM7", _ kmMin3rd | _ kmMaj7th, _ kmMaj3rd}, - {"mb5", _ kmMin3rd | _ kmDim5th, _ kmMaj3rd | _ km5th}, - {"sus", _ km4th, _ kmMaj3rd}, - {"sus2", _ kmMaj2nd, _ kmMaj3rd}, - {"sus9", _ kmMaj9th, 0}, - {NULL, 0, 0} -}; - -bool VLChord::MMAName(std::string & name, bool useSharps, bool initial) const -{ - VLFraction dur = fDuration; - int quarters = static_cast(dur*4.0f+0.5f); - name = ""; - if (!quarters--) - return initial; - if (fPitch == kNoPitch) { - name = initial ? 'z' : '/'; - } else { - std::string base, ext; - VLNote::Name(base, useSharps); - - size_t best = 0; - size_t bestBits = 32; - size_t bestScore= 0; - for (size_t i=0; kMMAModifiers[i].fName; ++i) { - uint32_t steps = (kmUnison | kmMaj3rd | km5th) - | kMMAModifiers[i].fAddSteps - &~kMMAModifiers[i].fDelSteps; - if (fSteps == steps) { - // - // Exact match - // - best = i; - break; - } - steps ^= fSteps; - size_t bits=0; - size_t score=0; - for (uint32_t b=steps; b; b &= (b-1)) - ++bits; - for (size_t b=0; b<32; ++b) - if (steps & (1<= 1) - return 1; - if (d.fNum == 1 && !(d.fDenom & (d.fDenom-1))) // Power of 2 - return d; - - - VLFraction note(1,2); - VLFraction triplet(1,3); - - for (;;) { - if (d >= note) - return note; - else if (d >= triplet) - return triplet; - note /= 2; - triplet /= 2; - } -} - -static void TrimNote(VLFraction at, VLFraction & d, VLFraction grid) -{ - if (at < grid && d > grid-at) - d = MaxNote(grid-at); -} - -void VLProperties::PartialNote(VLFraction at, VLFraction totalDuration, - bool grouped, VLFraction * noteDuration) const -{ - const VLFraction kBeat(1, fTime.fDenom); - - at %= fTime; - *noteDuration = MaxNote(std::min(MaxNote(totalDuration), fTime-at)); // Don't extend past measure - - if (at.fDenom > kBeat.fDenom) { // Break up notes not starting on beat - // Don't extend past "middle" of measure - if (fTime.fNum & 1) // Odd timecode, round up (most 5/4 seems to be 3+2, not 2+3) - TrimNote(at, *noteDuration, VLFraction((fTime.fNum+1)/2, fTime.fDenom)); - else - TrimNote(at, *noteDuration, fTime / 2); - at %= kBeat; - if (at == 2*kBeat/3) - TrimNote(0, *noteDuration, kBeat); // Allow syncopated beats in swing - else - TrimNote(at, *noteDuration, kBeat);// Don't let other notes span beats - } - if (!(noteDuration->fDenom % 3)) - if (*noteDuration != totalDuration) { - if (((at+*noteDuration)%kBeat) > 0) - *noteDuration *= VLFraction(3,4); // avoid frivolous triplets - } else if (*noteDuration > VLFraction(1,4*fDivisions) && !grouped) { - if (*noteDuration == VLFraction(1,2*fDivisions)) - if (at % VLFraction(1, 4*fDivisions/3) == 0) - return; // Permit larger swing notes - *noteDuration *= VLFraction(3,4); // avoid other isolated triplets - } -} - -void VLProperties::VisualNote(VLFraction at, VLFraction actualDur, - bool prevTriplet, - VLFraction *visualDur, bool * triplet) const -{ - bool swing= !(fDivisions % 3); // In swing mode? - VLFraction swung(3, fDivisions*8, true); // Which notes to swing - VLFraction swingGrid(2*swung); // Alignment of swing notes - - if (*triplet = !(actualDur.fDenom % 3)) { - if (swing) { // Swing 8ths / 16ths are written as straight 8ths - if (actualDur == 4*swung/3 && (at % swingGrid) == 0) { - *visualDur = swung; - *triplet = false; - } else if (actualDur == 2*swung/3 && ((at+actualDur) % swingGrid) == 0 && !prevTriplet) { - *visualDur = swung; - *triplet = false; - } else { - *visualDur = 3*actualDur/2; - } - } else { - *visualDur = 3*actualDur/2; - } - } else { - *visualDur = actualDur; - } -} - VLMeasure::VLMeasure() : fPropIdx(0) { } -void VLMeasure::MMANotes(std::string & notes, const VLProperties & prop, - VLFraction extra) const -{ - VLFraction at(0); - VLNoteList::const_iterator i = fMelody.begin(); - VLNoteList::const_iterator e = fMelody.end(); - - notes.clear(); - VLFraction prevDur(0); - for (; i!=e; ++i) { - std::string note; - VLFraction nextDur(0); - VLFraction dur(i->fDuration); - VLNoteList::const_iterator n=i; - if (++n != e) - nextDur = n->fDuration; - else - dur += extra; - i->MMAName(note, at, dur, prevDur, nextDur, prop); - if (notes.size()>1) - notes += ' '; - if (note == "~") - notes += note; - else - notes += note+';'; - at += i->fDuration; - } - if (notes == "~") - notes += "<>;"; -} - -void VLMeasure::MMAChords(std::string & chords, const VLProperties & prop, - bool initial) const -{ - VLChordList::const_iterator i = fChords.begin(); - VLChordList::const_iterator e = fChords.end(); - - chords.clear(); - for (; i!=e; ++i) { - std::string chord; - initial = i->MMAName(chord, prop.fKey >= 0, initial); - if (chords.size()) - chords += ' '; - chords += chord; - } -} - bool VLMeasure::IsEmpty() const { return fChords.size() == 1 && fMelody.size() == 1 diff --git a/Sources/VLModel.h b/Sources/VLModel.h index 03ec455..46cddb9 100644 --- a/Sources/VLModel.h +++ b/Sources/VLModel.h @@ -150,7 +150,6 @@ struct VLNote { VLNote(VLFraction dur=0, int pitch=kNoPitch); VLNote(std::string name); void Name(std::string & name, bool useSharps = false) const; - void MMAName(std::string & name, VLFraction at, VLFraction dur, VLFraction prevDur, VLFraction nextDur, const VLProperties & prop) const; void MakeRepresentable(); void AlignToGrid(VLFraction at, VLFraction grid); }; @@ -209,7 +208,6 @@ struct VLChord : VLNote { VLChord(VLFraction dur=0, int pitch=kNoPitch, int rootPitch=kNoPitch); VLChord(std::string name); void Name(std::string & base, std::string & ext, std::string & root, bool useSharps = false) const; - bool MMAName(std::string & name, bool useSharps, bool initial) const; }; struct VLChordModifier { @@ -223,15 +221,6 @@ struct VLProperties { int8_t fKey; // Circle of fifths from C, >0 sharps, <0 flats int8_t fMode; // 1 = major -1 = minor int8_t fDivisions; // Number of divisions per quarter note - - // - // Subdivide a note and adjust for swing - // - void PartialNote(VLFraction at, VLFraction totalDuration, bool grouped, VLFraction * noteDuration) const; - // - // Determine visual representation of note head - // - void VisualNote(VLFraction at, VLFraction actualDur, bool prevTriplet, VLFraction *visualDur, bool * triplet) const; bool operator==(const VLProperties & other) { return fTime == other.fTime && fKey == other.fKey && fMode == other.fMode @@ -256,9 +245,6 @@ struct VLMeasure { VLMeasure(); - void MMANotes(std::string & notes, const VLProperties & prop, VLFraction extra) const; - void MMAChords(std::string & chords, const VLProperties & prop, bool initial) const; - bool IsEmpty() const; bool NoChords() const;