diff --git a/include/tool-deg.h b/include/tool-deg.h index a882cdc5..9fcd9842 100644 --- a/include/tool-deg.h +++ b/include/tool-deg.h @@ -41,7 +41,7 @@ class Tool_deg : public HumTool { ScaleDegree (void); ~ScaleDegree (); - void setLinkedKernToken (hum::HTp token, const std::string& mode, int b40tonic, bool unpitched = false); + void setLinkedKernToken (hum::HTp token, const std::string& mode, int b40tonic, bool unpitched = false, bool resolveNull = false); hum::HTp getLinkedKernToken (void) const; std::string getDegToken (void) const; @@ -250,6 +250,7 @@ class Tool_deg : public HumTool { bool m_recipQ = false; // used with -r option bool m_kernQ = false; // used with --kern option bool m_degTiesQ = false; // used with -t option + bool m_resolveNullQ = false; // used with --resolve-null option bool m_forceKeyQ = false; // used with -K option std::string m_defaultKey = ""; // used with --default-key option diff --git a/min/humlib.cpp b/min/humlib.cpp index ef2b7cbd..f32b796a 100644 --- a/min/humlib.cpp +++ b/min/humlib.cpp @@ -1,7 +1,7 @@ // // Programmer: Craig Stuart Sapp // Creation Date: Sat Aug 8 12:24:49 PDT 2015 -// Last Modified: Do 21 Nov 2024 21:59:25 CET +// Last Modified: Do 21 Nov 2024 23:37:38 CET // Filename: min/humlib.cpp // URL: https://github.com/craigsapp/humlib/blob/master/min/humlib.cpp // Syntax: C++11 @@ -74186,6 +74186,7 @@ Tool_deg::Tool_deg(void) { define("t|ties=b", "include scale degrees for tied notes"); define("s|spine-tracks|spine|spines|track|tracks=s", "process only the specified spines"); define("0|O|z|zero|zeros=b", "show rests as scale degree 0"); + define("resolve-null=b", "show scale degrees for tokens without attack"); } @@ -74261,6 +74262,7 @@ void Tool_deg::initialize(void) { m_recipQ = true; } m_degTiesQ = getBoolean("ties"); + m_resolveNullQ = getBoolean("resolve-null"); Tool_deg::ScaleDegree::setShowOctaves(getBoolean("octave")); if (getBoolean("spine-tracks")) { @@ -75619,7 +75621,7 @@ void Tool_deg::prepareDegSpine(vector>& degspine, HTp kernst int line = current->getLineIndex(); if (!current->getOwner()->hasSpines()) { degspine.at(line).resize(1); - degspine.at(line).back().setLinkedKernToken(current, mode, b40tonic, isUnpitched); + degspine.at(line).back().setLinkedKernToken(current, mode, b40tonic, isUnpitched, m_resolveNullQ); current = current->getNextToken(); continue; } @@ -75642,7 +75644,7 @@ void Tool_deg::prepareDegSpine(vector>& degspine, HTp kernst break; } degspine.at(line).resize((int)degspine.at(line).size() + 1); - degspine.at(line).back().setLinkedKernToken(curr, mode, b40tonic, isUnpitched); + degspine.at(line).back().setLinkedKernToken(curr, mode, b40tonic, isUnpitched, m_resolveNullQ); curr = curr->getNextFieldToken(); } current = current->getNextToken(); @@ -75738,8 +75740,8 @@ Tool_deg::ScaleDegree::~ScaleDegree () { // Unpitched scale degrees will be output as null data tokens. // -void Tool_deg::ScaleDegree::setLinkedKernToken(HTp token, const string& mode, int b40tonic, bool unpitched) { - m_linkedKernToken = token; +void Tool_deg::ScaleDegree::setLinkedKernToken(HTp token, const string& mode, int b40tonic, bool unpitched, bool resolveNull) { + m_linkedKernToken = resolveNull ? token->resolveNull() : token; m_unpitched = unpitched; if (!unpitched) { if (mode == "major") { diff --git a/min/humlib.h b/min/humlib.h index 738ca2ad..98f0a71d 100644 --- a/min/humlib.h +++ b/min/humlib.h @@ -1,7 +1,7 @@ // // Programmer: Craig Stuart Sapp // Creation Date: Sat Aug 8 12:24:49 PDT 2015 -// Last Modified: Do 21 Nov 2024 21:59:25 CET +// Last Modified: Do 21 Nov 2024 23:37:38 CET // Filename: min/humlib.h // URL: https://github.com/craigsapp/humlib/blob/master/min/humlib.h // Syntax: C++11 @@ -6994,7 +6994,7 @@ class Tool_deg : public HumTool { ScaleDegree (void); ~ScaleDegree (); - void setLinkedKernToken (hum::HTp token, const std::string& mode, int b40tonic, bool unpitched = false); + void setLinkedKernToken (hum::HTp token, const std::string& mode, int b40tonic, bool unpitched = false, bool resolveNull = false); hum::HTp getLinkedKernToken (void) const; std::string getDegToken (void) const; @@ -7203,6 +7203,7 @@ class Tool_deg : public HumTool { bool m_recipQ = false; // used with -r option bool m_kernQ = false; // used with --kern option bool m_degTiesQ = false; // used with -t option + bool m_resolveNullQ = false; // used with --resolve-null option bool m_forceKeyQ = false; // used with -K option std::string m_defaultKey = ""; // used with --default-key option diff --git a/src/tool-deg.cpp b/src/tool-deg.cpp index 3319093d..ee7f15c1 100644 --- a/src/tool-deg.cpp +++ b/src/tool-deg.cpp @@ -56,6 +56,7 @@ Tool_deg::Tool_deg(void) { define("t|ties=b", "include scale degrees for tied notes"); define("s|spine-tracks|spine|spines|track|tracks=s", "process only the specified spines"); define("0|O|z|zero|zeros=b", "show rests as scale degree 0"); + define("resolve-null=b", "show scale degrees for tokens without attack"); } @@ -131,6 +132,7 @@ void Tool_deg::initialize(void) { m_recipQ = true; } m_degTiesQ = getBoolean("ties"); + m_resolveNullQ = getBoolean("resolve-null"); Tool_deg::ScaleDegree::setShowOctaves(getBoolean("octave")); if (getBoolean("spine-tracks")) { @@ -1489,7 +1491,7 @@ void Tool_deg::prepareDegSpine(vector>& degspine, HTp kernst int line = current->getLineIndex(); if (!current->getOwner()->hasSpines()) { degspine.at(line).resize(1); - degspine.at(line).back().setLinkedKernToken(current, mode, b40tonic, isUnpitched); + degspine.at(line).back().setLinkedKernToken(current, mode, b40tonic, isUnpitched, m_resolveNullQ); current = current->getNextToken(); continue; } @@ -1512,7 +1514,7 @@ void Tool_deg::prepareDegSpine(vector>& degspine, HTp kernst break; } degspine.at(line).resize((int)degspine.at(line).size() + 1); - degspine.at(line).back().setLinkedKernToken(curr, mode, b40tonic, isUnpitched); + degspine.at(line).back().setLinkedKernToken(curr, mode, b40tonic, isUnpitched, m_resolveNullQ); curr = curr->getNextFieldToken(); } current = current->getNextToken(); @@ -1608,8 +1610,8 @@ Tool_deg::ScaleDegree::~ScaleDegree () { // Unpitched scale degrees will be output as null data tokens. // -void Tool_deg::ScaleDegree::setLinkedKernToken(HTp token, const string& mode, int b40tonic, bool unpitched) { - m_linkedKernToken = token; +void Tool_deg::ScaleDegree::setLinkedKernToken(HTp token, const string& mode, int b40tonic, bool unpitched, bool resolveNull) { + m_linkedKernToken = resolveNull ? token->resolveNull() : token; m_unpitched = unpitched; if (!unpitched) { if (mode == "major") {