Skip to content

Commit

Permalink
Merge pull request #80 from WolfgangDrescher/fb
Browse files Browse the repository at this point in the history
[fb] Determine harmonic intervals with interval quality
  • Loading branch information
craigsapp authored Jul 10, 2023
2 parents 3743c77 + b91e173 commit a948680
Show file tree
Hide file tree
Showing 4 changed files with 220 additions and 10 deletions.
6 changes: 5 additions & 1 deletion include/tool-fb.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ namespace hum {

class FiguredBassNumber {
public:
FiguredBassNumber(int num, string accid, bool showAccid, int voiceIndex, int lineIndex, bool isAttack, bool intervallsatz);
FiguredBassNumber(int num, string accid, bool showAccid, int voiceIndex, int lineIndex, bool isAttack, bool intervallsatz, string intervalQuality, bool hint);
std::string toString(bool nonCompoundIntervalsQ, bool noAccidentalsQ, bool hideThreeQ);
int getNumberWithinOctave(void);

Expand All @@ -35,6 +35,8 @@ class FiguredBassNumber {
bool m_isAttack;
bool m_convert2To9 = false;
bool m_intervallsatz = false;
std::string m_intervalQuality;
bool m_hint = false;

};

Expand Down Expand Up @@ -81,6 +83,7 @@ class Tool_fb : public HumTool {
string getNumberString (vector<FiguredBassNumber*> numbers);
string getKeySignature (HumdrumFile& infile, int lineIndex);
int getLowestBase40Pitch (vector<int> base40Pitches);
string getIntervalQuality (int basePitchBase40, int targetPitchBase40);


private:
Expand All @@ -98,6 +101,7 @@ class Tool_fb : public HumTool {
bool m_showNegativeQ = false;
bool m_aboveQ = false;
string m_rateQ = "";
bool m_hintQ = false;

string m_spineTracks = ""; // used with -s option
string m_kernTracks = ""; // used with -k option
Expand Down
109 changes: 105 additions & 4 deletions min/humlib.cpp
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
//
// Programmer: Craig Stuart Sapp <[email protected]>
// Creation Date: Sat Aug 8 12:24:49 PDT 2015
// Last Modified: Tue Jun 13 04:58:02 PDT 2023
// Last Modified: Mo 10 Jul 2023 15:49:26 CEST
// Filename: min/humlib.cpp
// URL: https://github.com/craigsapp/humlib/blob/master/min/humlib.cpp
// Syntax: C++11
Expand Down Expand Up @@ -78135,6 +78135,7 @@ Tool_fb::Tool_fb(void) {
define("rate=s:", "Rate to display the numbers (use a **recip value, e.g. 4, 4.)");
define("k|kern-tracks=s", "Process only the specified kern spines");
define("s|spine-tracks|spine|spines|track|tracks=s", "Process only the specified spines");
define("hint=b", "Determine harmonic intervals with interval quality");
}


Expand Down Expand Up @@ -78201,6 +78202,7 @@ void Tool_fb::initialize(void) {
m_showNegativeQ = getBoolean("negative");
m_aboveQ = getBoolean("above");
m_rateQ = getString("rate");
m_hintQ = getBoolean("hint");

if (getBoolean("spine-tracks")) {
m_spineTracks = getString("spine-tracks");
Expand All @@ -78227,6 +78229,11 @@ void Tool_fb::initialize(void) {
m_accidentalsQ = true;
m_hideThreeQ = true;
}

if (m_hintQ) {
m_showNegativeQ = true;
// m_lowestQ = true;
}
}


Expand Down Expand Up @@ -78434,6 +78441,10 @@ void Tool_fb::processFile(HumdrumFile& infile) {

string exinterp = m_aboveQ ? "**fba" : "**fb";

if (m_hintQ) {
exinterp = "**hint";
}

if (m_intervallsatzQ) {
// Create **fb spine for each voice
for (int voiceIndex = 0; voiceIndex < grid.getVoiceCount(); voiceIndex++) {
Expand Down Expand Up @@ -78597,7 +78608,9 @@ FiguredBassNumber* Tool_fb::createFiguredBassNumber(int basePitchBase40, int tar
}
}

FiguredBassNumber* number = new FiguredBassNumber(num, accid, showAccid, voiceIndex, lineIndex, isAttack, m_intervallsatzQ);
string intervalQuality = getIntervalQuality(basePitchBase40, targetPitchBase40);

FiguredBassNumber* number = new FiguredBassNumber(num, accid, showAccid, voiceIndex, lineIndex, isAttack, m_intervallsatzQ, intervalQuality, m_hintQ);

return number;
}
Expand Down Expand Up @@ -78873,19 +78886,104 @@ int Tool_fb::getLowestBase40Pitch(vector<int> base40Pitches) {
}



//////////////////////////////
//
// Tool_fb::getIntervalQuality -- Return interval quality prefix string
//

string Tool_fb::getIntervalQuality(int basePitchBase40, int targetPitchBase40) {

int diff = (targetPitchBase40 - basePitchBase40) % 40;

diff = diff < -2 ? abs(diff) : diff;

// See https://wiki.ccarh.org/wiki/Base_40
string quality;
switch (diff) {
// 1
case -2:
case 38:
quality = "dd"; break;
case -1:
case 39:
quality = "d"; break;
case 0: quality = "P"; break;
case 1: quality = "A"; break;
case 2: quality = "AA"; break;

// 2
case 3: quality = "dd"; break;
case 4: quality = "d"; break;
case 5: quality = "m"; break;
case 6: quality = "M"; break;
case 7: quality = "A"; break;
case 8: quality = "AA"; break;

// 3
case 9: quality = "dd"; break;
case 10: quality = "d"; break;
case 11: quality = "m"; break;
case 12: quality = "M"; break;
case 13: quality = "A"; break;
case 14: quality = "AA"; break;

// 4
case 15: quality = "dd"; break;
case 16: quality = "d"; break;
case 17: quality = "P"; break;
case 18: quality = "A"; break;
case 19: quality = "AA"; break;

case 20: quality = "<unused>"; break;

// 5
case 21: quality = "dd"; break;
case 22: quality = "d"; break;
case 23: quality = "P"; break;
case 24: quality = "A"; break;
case 25: quality = "AA"; break;

// 6
case 26: quality = "dd"; break;
case 27: quality = "d"; break;
case 28: quality = "m"; break;
case 29: quality = "M"; break;
case 30: quality = "A"; break;
case 31: quality = "AA"; break;

// 7
case 32: quality = "dd"; break;
case 33: quality = "d"; break;
case 34: quality = "m"; break;
case 35: quality = "M"; break;
case 36: quality = "A"; break;
case 37: quality = "AA"; break;

default: quality = "?"; break;
}

return quality;

}



//////////////////////////////
//
// FiguredBassNumber::FiguredBassNumber -- Constructor
//

FiguredBassNumber::FiguredBassNumber(int num, string accid, bool showAccid, int voiceIdx, int lineIdx, bool isAtk, bool intervallsatz) {
FiguredBassNumber::FiguredBassNumber(int num, string accid, bool showAccid, int voiceIdx, int lineIdx, bool isAtk, bool intervallsatz, string intervalQuality, bool hint) {
m_number = num;
m_accidentals = accid;
m_voiceIndex = voiceIdx;
m_lineIndex = lineIdx;
m_showAccidentals = showAccid;
m_isAttack = isAtk;
m_intervallsatz = intervallsatz;
m_intervalQuality = intervalQuality;
m_hint = hint;
}


Expand All @@ -78897,6 +78995,9 @@ FiguredBassNumber::FiguredBassNumber(int num, string accid, bool showAccid, int

string FiguredBassNumber::toString(bool compoundQ, bool accidentalsQ, bool hideThreeQ) {
int num = (compoundQ) ? getNumberWithinOctave() : m_number;
if (m_hint) {
return m_intervalQuality + to_string(abs(num));
}
string accid = (accidentalsQ && m_showAccidentals) ? m_accidentals : "";
if (((num == 3) || (num == -3)) && accidentalsQ && m_showAccidentals && hideThreeQ) {
return accid;
Expand Down Expand Up @@ -78931,7 +79032,7 @@ int FiguredBassNumber::getNumberWithinOctave(void) {
// Replace 1 with 8 and -8
if (abs(num) == 1) {
// Allow unisono in intervallsatz
if (m_intervallsatz) {
if (m_intervallsatz || m_hint) {
if (abs(m_number) == 1) {
return 1;
}
Expand Down
8 changes: 6 additions & 2 deletions min/humlib.h
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
//
// Programmer: Craig Stuart Sapp <[email protected]>
// Creation Date: Sat Aug 8 12:24:49 PDT 2015
// Last Modified: Tue Jun 13 04:58:02 PDT 2023
// Last Modified: Mo 10 Jul 2023 15:49:26 CEST
// Filename: min/humlib.h
// URL: https://github.com/craigsapp/humlib/blob/master/min/humlib.h
// Syntax: C++11
Expand Down Expand Up @@ -7259,7 +7259,7 @@ class Tool_extract : public HumTool {

class FiguredBassNumber {
public:
FiguredBassNumber(int num, string accid, bool showAccid, int voiceIndex, int lineIndex, bool isAttack, bool intervallsatz);
FiguredBassNumber(int num, string accid, bool showAccid, int voiceIndex, int lineIndex, bool isAttack, bool intervallsatz, string intervalQuality, bool hint);
std::string toString(bool nonCompoundIntervalsQ, bool noAccidentalsQ, bool hideThreeQ);
int getNumberWithinOctave(void);

Expand All @@ -7272,6 +7272,8 @@ class FiguredBassNumber {
bool m_isAttack;
bool m_convert2To9 = false;
bool m_intervallsatz = false;
std::string m_intervalQuality;
bool m_hint = false;

};

Expand Down Expand Up @@ -7318,6 +7320,7 @@ class Tool_fb : public HumTool {
string getNumberString (vector<FiguredBassNumber*> numbers);
string getKeySignature (HumdrumFile& infile, int lineIndex);
int getLowestBase40Pitch (vector<int> base40Pitches);
string getIntervalQuality (int basePitchBase40, int targetPitchBase40);


private:
Expand All @@ -7335,6 +7338,7 @@ class Tool_fb : public HumTool {
bool m_showNegativeQ = false;
bool m_aboveQ = false;
string m_rateQ = "";
bool m_hintQ = false;

string m_spineTracks = ""; // used with -s option
string m_kernTracks = ""; // used with -k option
Expand Down
Loading

0 comments on commit a948680

Please sign in to comment.