diff --git a/NEWS.md b/NEWS.md
index bc62bdca..880da6fd 100644
--- a/NEWS.md
+++ b/NEWS.md
@@ -1,3 +1,53 @@
+# humdrumR 7.0.5
+
+Version 7.0.5 includes a small patch to fix a bug related to the `::` function, as well as a new feature/behavior which builds off of that fix.
+
+
+In previous versions, an error would occur if you used `::` inside any of the fundamental humdrumR "with/within" methods (including `base` functions and `dplyr` "verbs").
+We've fixed this bug.
+
+----
+
+We've also added a new feature; specifically, we've made using `::` in humdrumR less necessary.
+Now, within a humdrumR call to any of these methods (listed below), if you use any function exported by humdrumR, humdrumR will automatically use the humdrumR version of that function, even if another package you have attached includes a function with same name.
+In other words, the humdrumR namespace will always takes priority within a humdrumR method call.
+
+For example, the `dplyr` package exports a function called `lag()` and so does humdrumR (these functions do the same thing, but humdrumR's version has a few extra features).
+Before this update, if you loaded `dplyr` *after* you loaded humdrumR, then `dplyr`'s `lag()` function would generally take priority over humdrumR's `lag()`.
+So, code like this
+
+```
+library(humdrumR)
+library(dplyr)
+
+readHumdrum(humdrumRroot, 'HumdrumData/BachChorales/.*krn') -> chorales
+
+chorales |> mutate(Lagged = lag(Token))
+
+
+```
+
+would call `dplyr::lag()`.
+This sort of behavior can be confusing but wouldn't normally be the end of the world (this is how R is supposed to work, after all).
+However, the `lag()` function is particularly problematic because *many* humdrumR methods rely on our special version of `lag()`.
+This is why we've implemented a change:
+Now, if you use `lag()` within a humdrumR with/within method, it will default to using the humdrumR version, regardless of what other packages are loaded.
+So the code above would use `humdrumR::lag()`.
+If you *want* to use `dplyr`'s version (or any other package), you still can by specifying (for example) `dplyr::lag()`.
+Another function which (in the past) could lead to frequent namespace confusion was `transpose()`---now, you can safely use `transpose()` and know that your system will use `humdrumR::transpose()`.
+
+
+All `.humdrumR` methods for the following functions are affected by this change:
+
++ `with()`
++ `within()`
++ `mutate()`
++ `reframe()`
++ `summarize()`
++ `filter()`
++ `subset()`
+
+
# humdrumR 7.0.3
### count() and table()
diff --git a/R/Dispatch.R b/R/Dispatch.R
index c9c7e243..7f7d7355 100644
--- a/R/Dispatch.R
+++ b/R/Dispatch.R
@@ -137,11 +137,11 @@ memoizeParse <- function(args, ..., dispatchArgs = c(), minMemoize = 100L, memoi
if (is.struct(result)) {
uniqueArgs$i <- seq_len(nrow(uniqueArgs))
- result[merge(memoizeArgs, uniqueArgs, on = colnames(uniqueArgs), sort = FALSE)$i]
+ result[merge(memoizeArgs, uniqueArgs, sort = FALSE)$i]
} else {
uniqueArgs[ , Result := result]
- merge(memoizeArgs, uniqueArgs, on = head(colnames(uniqueArgs), -1), sort = FALSE)$Result
+ merge(memoizeArgs, uniqueArgs, by = head(colnames(uniqueArgs), -1), sort = FALSE)$Result
}
diff --git a/R/Within.R b/R/Within.R
index 57244b14..04841e82 100644
--- a/R/Within.R
+++ b/R/Within.R
@@ -71,6 +71,12 @@
#' If multiple expression arguments are provided, each expression is evaluated in order, from left to right.
#' Each expression can refer variables assigned in the previous expression (examples below).
#'
+#' *Note*: Within any of these expressions, the humdrumR namespace takes priority.
+#' This means that, for example, if you use `lag()` within an expression, the humdrumR version of `lag()`
+#' will be used, even if you have loaded other packages which have their own `lag()` function.
+#' To use another package's function, you'll have to specify `package::function()`---for example, `dplyr::lag()`.
+#' This is only an issue when functions have the exact same name as a humdrumR function.
+#'
#' ### Expression pre-processing
#'
#' These functions all do some
@@ -801,15 +807,21 @@ unformula <- function(quosures) {
quoForceHumdrumRcalls <- function(quosures) {
- # this changes any function call from a humdrumR function to humdrumR::function
- humdrumRpackage <- ls('package:humdrumR')
+ # this changes any function call from a humdrumR function to humdrumR:::function
+ # we use ::: because the ls() output includes methods that aren't actually exported (:: won't work).
+ # we don't include infix functions line %~%
+
+ humdrumRpackage <- ls('package:humdrumR') |> grep(pattern = '%', x = _, value = TRUE, invert = TRUE)
+ humdrumRpackage <- setdiff(humdrumRpackage, 'count')
+ # we can't do it to count because the count() generic was originally exported by dplyr
+ # there might other functions which need to be added to this list?
lapply(quosures,
\(quo) {
withinExpression(quo,
predicate = \(Head) Head[1] %in% humdrumRpackage,
func = \(exprA) {
- exprA$Head <- paste0('humdrumR::', exprA$Head)
+ exprA$Head <- paste0('humdrumR:::', exprA$Head)
exprA
})
})
@@ -1036,9 +1048,13 @@ activateQuo <- function(funcQuosure, dotField) {
autoArgsQuo <- function(funcQuosure, fields) {
- predicate <- \(Head) Head %in% c(autoArgTable$Function, paste0(autoArgTable$Function, '.default'))
+
+ funcRegex <- paste0('^(humdrumR:::?)?', autoArgTable$Function, '(\\.default)?$')
+
+ predicate <- \(Head) any(stringr::str_detect(Head, funcRegex))
+
do <- \(exprA) {
- tab <- autoArgTable[(Function == exprA$Head | paste0(Function, '.default') == exprA$Head) &
+ tab <- autoArgTable[stringr::str_detect(exprA$Head, funcRegex) &
!Argument %in% names(exprA$Args) &
sapply(Expression, \(expr) length(namesInExpr(fields, expr)) > 0L)]
args <- setNames(tab$Expression, tab$Argument)
diff --git a/R/humdrumR-package.R b/R/humdrumR-package.R
index 138b202c..9f36f25d 100644
--- a/R/humdrumR-package.R
+++ b/R/humdrumR-package.R
@@ -112,7 +112,6 @@ autoArgTable <- rbind(data.table(Argument = 'groupby', Type = 'melodic',
Expression = list(quote(Tandem)))
)
-autoArgTable[, Function := paste0('humdrumR::', Function)]
setOldClass('quosure')
setOldClass('quosures')
diff --git a/docs/404.html b/docs/404.html
index 7adf8057..fbd20f42 100644
--- a/docs/404.html
+++ b/docs/404.html
@@ -7,10 +7,10 @@
Page not found (404) • humdrumR
-
-
+
+
-
+
License • humdrumR License • humdrumR
Skip to contents
-
+
humdrumR
-
0.7.0.4
+
0.7.0.5
@@ -98,11 +98,11 @@
diff --git a/docs/articles/ComplexSyntax.html b/docs/articles/ComplexSyntax.html
index 53bb3343..49584b54 100644
--- a/docs/articles/ComplexSyntax.html
+++ b/docs/articles/ComplexSyntax.html
@@ -8,10 +8,10 @@
Complex humdrum syntax • humdrumR
-
-
+
+
-
+
+
+
-
+
+
+
-
+
+
+
-
+
+
+
-
+
+
+
-
+
+
+
-
+
+
+
-
+
+
+
-
+
+
+
-
+
+
+
-
+
+
+
-
+
+
+
-
+
+
+
-
+
Articles • humdrumR Articles • humdrumR
Skip to contents
-
+
humdrumR
-
0.7.0.4
+
0.7.0.5
@@ -76,7 +76,7 @@
Background
-
Background info on humdrum and R
+
Background info on humdrum and R
The humdrum syntax
@@ -94,7 +94,7 @@ Background
Preparing data
-
Getting your data ready for analysis
+
Getting your data ready for analysis
Reading and writing humdrum data
@@ -107,7 +107,7 @@ Preparing data
Musical Processing
-
Functionality for analyzing musical information
+
Functionality for analyzing musical information
Pitch and tonality in humdrumR
@@ -132,11 +132,11 @@ Musical Processing
diff --git a/docs/authors.html b/docs/authors.html
index 6bacd0ff..bff1c3a1 100644
--- a/docs/authors.html
+++ b/docs/authors.html
@@ -1,16 +1,16 @@
-Authors and Citation • humdrumR Authors and Citation • humdrumR
Skip to contents
-
+
humdrumR
-
0.7.0.4
+
0.7.0.5
@@ -111,11 +111,11 @@ Citation
diff --git a/docs/deps/bootstrap-5.3.1/bootstrap.bundle.min.js b/docs/deps/bootstrap-5.3.1/bootstrap.bundle.min.js
new file mode 100644
index 00000000..e8f21f70
--- /dev/null
+++ b/docs/deps/bootstrap-5.3.1/bootstrap.bundle.min.js
@@ -0,0 +1,7 @@
+/*!
+ * Bootstrap v5.3.1 (https://getbootstrap.com/)
+ * Copyright 2011-2023 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
+ */
+!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).bootstrap=e()}(this,(function(){"use strict";const t=new Map,e={set(e,i,n){t.has(e)||t.set(e,new Map);const s=t.get(e);s.has(i)||0===s.size?s.set(i,n):console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(s.keys())[0]}.`)},get:(e,i)=>t.has(e)&&t.get(e).get(i)||null,remove(e,i){if(!t.has(e))return;const n=t.get(e);n.delete(i),0===n.size&&t.delete(e)}},i="transitionend",n=t=>(t&&window.CSS&&window.CSS.escape&&(t=t.replace(/#([^\s"#']+)/g,((t,e)=>`#${CSS.escape(e)}`))),t),s=t=>{t.dispatchEvent(new Event(i))},o=t=>!(!t||"object"!=typeof t)&&(void 0!==t.jquery&&(t=t[0]),void 0!==t.nodeType),r=t=>o(t)?t.jquery?t[0]:t:"string"==typeof t&&t.length>0?document.querySelector(n(t)):null,a=t=>{if(!o(t)||0===t.getClientRects().length)return!1;const e="visible"===getComputedStyle(t).getPropertyValue("visibility"),i=t.closest("details:not([open])");if(!i)return e;if(i!==t){const e=t.closest("summary");if(e&&e.parentNode!==i)return!1;if(null===e)return!1}return e},l=t=>!t||t.nodeType!==Node.ELEMENT_NODE||!!t.classList.contains("disabled")||(void 0!==t.disabled?t.disabled:t.hasAttribute("disabled")&&"false"!==t.getAttribute("disabled")),c=t=>{if(!document.documentElement.attachShadow)return null;if("function"==typeof t.getRootNode){const e=t.getRootNode();return e instanceof ShadowRoot?e:null}return t instanceof ShadowRoot?t:t.parentNode?c(t.parentNode):null},h=()=>{},d=t=>{t.offsetHeight},u=()=>window.jQuery&&!document.body.hasAttribute("data-bs-no-jquery")?window.jQuery:null,f=[],p=()=>"rtl"===document.documentElement.dir,m=t=>{var e;e=()=>{const e=u();if(e){const i=t.NAME,n=e.fn[i];e.fn[i]=t.jQueryInterface,e.fn[i].Constructor=t,e.fn[i].noConflict=()=>(e.fn[i]=n,t.jQueryInterface)}},"loading"===document.readyState?(f.length||document.addEventListener("DOMContentLoaded",(()=>{for(const t of f)t()})),f.push(e)):e()},g=(t,e=[],i=t)=>"function"==typeof t?t(...e):i,_=(t,e,n=!0)=>{if(!n)return void g(t);const o=(t=>{if(!t)return 0;let{transitionDuration:e,transitionDelay:i}=window.getComputedStyle(t);const n=Number.parseFloat(e),s=Number.parseFloat(i);return n||s?(e=e.split(",")[0],i=i.split(",")[0],1e3*(Number.parseFloat(e)+Number.parseFloat(i))):0})(e)+5;let r=!1;const a=({target:n})=>{n===e&&(r=!0,e.removeEventListener(i,a),g(t))};e.addEventListener(i,a),setTimeout((()=>{r||s(e)}),o)},b=(t,e,i,n)=>{const s=t.length;let o=t.indexOf(e);return-1===o?!i&&n?t[s-1]:t[0]:(o+=i?1:-1,n&&(o=(o+s)%s),t[Math.max(0,Math.min(o,s-1))])},v=/[^.]*(?=\..*)\.|.*/,y=/\..*/,w=/::\d+$/,A={};let E=1;const T={mouseenter:"mouseover",mouseleave:"mouseout"},C=new Set(["click","dblclick","mouseup","mousedown","contextmenu","mousewheel","DOMMouseScroll","mouseover","mouseout","mousemove","selectstart","selectend","keydown","keypress","keyup","orientationchange","touchstart","touchmove","touchend","touchcancel","pointerdown","pointermove","pointerup","pointerleave","pointercancel","gesturestart","gesturechange","gestureend","focus","blur","change","reset","select","submit","focusin","focusout","load","unload","beforeunload","resize","move","DOMContentLoaded","readystatechange","error","abort","scroll"]);function O(t,e){return e&&`${e}::${E++}`||t.uidEvent||E++}function x(t){const e=O(t);return t.uidEvent=e,A[e]=A[e]||{},A[e]}function k(t,e,i=null){return Object.values(t).find((t=>t.callable===e&&t.delegationSelector===i))}function L(t,e,i){const n="string"==typeof e,s=n?i:e||i;let o=I(t);return C.has(o)||(o=t),[n,s,o]}function S(t,e,i,n,s){if("string"!=typeof e||!t)return;let[o,r,a]=L(e,i,n);if(e in T){const t=t=>function(e){if(!e.relatedTarget||e.relatedTarget!==e.delegateTarget&&!e.delegateTarget.contains(e.relatedTarget))return t.call(this,e)};r=t(r)}const l=x(t),c=l[a]||(l[a]={}),h=k(c,r,o?i:null);if(h)return void(h.oneOff=h.oneOff&&s);const d=O(r,e.replace(v,"")),u=o?function(t,e,i){return function n(s){const o=t.querySelectorAll(e);for(let{target:r}=s;r&&r!==this;r=r.parentNode)for(const a of o)if(a===r)return P(s,{delegateTarget:r}),n.oneOff&&N.off(t,s.type,e,i),i.apply(r,[s])}}(t,i,r):function(t,e){return function i(n){return P(n,{delegateTarget:t}),i.oneOff&&N.off(t,n.type,e),e.apply(t,[n])}}(t,r);u.delegationSelector=o?i:null,u.callable=r,u.oneOff=s,u.uidEvent=d,c[d]=u,t.addEventListener(a,u,o)}function D(t,e,i,n,s){const o=k(e[i],n,s);o&&(t.removeEventListener(i,o,Boolean(s)),delete e[i][o.uidEvent])}function $(t,e,i,n){const s=e[i]||{};for(const[o,r]of Object.entries(s))o.includes(n)&&D(t,e,i,r.callable,r.delegationSelector)}function I(t){return t=t.replace(y,""),T[t]||t}const N={on(t,e,i,n){S(t,e,i,n,!1)},one(t,e,i,n){S(t,e,i,n,!0)},off(t,e,i,n){if("string"!=typeof e||!t)return;const[s,o,r]=L(e,i,n),a=r!==e,l=x(t),c=l[r]||{},h=e.startsWith(".");if(void 0===o){if(h)for(const i of Object.keys(l))$(t,l,i,e.slice(1));for(const[i,n]of Object.entries(c)){const s=i.replace(w,"");a&&!e.includes(s)||D(t,l,r,n.callable,n.delegationSelector)}}else{if(!Object.keys(c).length)return;D(t,l,r,o,s?i:null)}},trigger(t,e,i){if("string"!=typeof e||!t)return null;const n=u();let s=null,o=!0,r=!0,a=!1;e!==I(e)&&n&&(s=n.Event(e,i),n(t).trigger(s),o=!s.isPropagationStopped(),r=!s.isImmediatePropagationStopped(),a=s.isDefaultPrevented());const l=P(new Event(e,{bubbles:o,cancelable:!0}),i);return a&&l.preventDefault(),r&&t.dispatchEvent(l),l.defaultPrevented&&s&&s.preventDefault(),l}};function P(t,e={}){for(const[i,n]of Object.entries(e))try{t[i]=n}catch(e){Object.defineProperty(t,i,{configurable:!0,get:()=>n})}return t}function M(t){if("true"===t)return!0;if("false"===t)return!1;if(t===Number(t).toString())return Number(t);if(""===t||"null"===t)return null;if("string"!=typeof t)return t;try{return JSON.parse(decodeURIComponent(t))}catch(e){return t}}function j(t){return t.replace(/[A-Z]/g,(t=>`-${t.toLowerCase()}`))}const F={setDataAttribute(t,e,i){t.setAttribute(`data-bs-${j(e)}`,i)},removeDataAttribute(t,e){t.removeAttribute(`data-bs-${j(e)}`)},getDataAttributes(t){if(!t)return{};const e={},i=Object.keys(t.dataset).filter((t=>t.startsWith("bs")&&!t.startsWith("bsConfig")));for(const n of i){let i=n.replace(/^bs/,"");i=i.charAt(0).toLowerCase()+i.slice(1,i.length),e[i]=M(t.dataset[n])}return e},getDataAttribute:(t,e)=>M(t.getAttribute(`data-bs-${j(e)}`))};class H{static get Default(){return{}}static get DefaultType(){return{}}static get NAME(){throw new Error('You have to implement the static method "NAME", for each component!')}_getConfig(t){return t=this._mergeConfigObj(t),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}_configAfterMerge(t){return t}_mergeConfigObj(t,e){const i=o(e)?F.getDataAttribute(e,"config"):{};return{...this.constructor.Default,..."object"==typeof i?i:{},...o(e)?F.getDataAttributes(e):{},..."object"==typeof t?t:{}}}_typeCheckConfig(t,e=this.constructor.DefaultType){for(const[n,s]of Object.entries(e)){const e=t[n],r=o(e)?"element":null==(i=e)?`${i}`:Object.prototype.toString.call(i).match(/\s([a-z]+)/i)[1].toLowerCase();if(!new RegExp(s).test(r))throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option "${n}" provided type "${r}" but expected type "${s}".`)}var i}}class W extends H{constructor(t,i){super(),(t=r(t))&&(this._element=t,this._config=this._getConfig(i),e.set(this._element,this.constructor.DATA_KEY,this))}dispose(){e.remove(this._element,this.constructor.DATA_KEY),N.off(this._element,this.constructor.EVENT_KEY);for(const t of Object.getOwnPropertyNames(this))this[t]=null}_queueCallback(t,e,i=!0){_(t,e,i)}_getConfig(t){return t=this._mergeConfigObj(t,this._element),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}static getInstance(t){return e.get(r(t),this.DATA_KEY)}static getOrCreateInstance(t,e={}){return this.getInstance(t)||new this(t,"object"==typeof e?e:null)}static get VERSION(){return"5.3.1"}static get DATA_KEY(){return`bs.${this.NAME}`}static get EVENT_KEY(){return`.${this.DATA_KEY}`}static eventName(t){return`${t}${this.EVENT_KEY}`}}const B=t=>{let e=t.getAttribute("data-bs-target");if(!e||"#"===e){let i=t.getAttribute("href");if(!i||!i.includes("#")&&!i.startsWith("."))return null;i.includes("#")&&!i.startsWith("#")&&(i=`#${i.split("#")[1]}`),e=i&&"#"!==i?i.trim():null}return n(e)},z={find:(t,e=document.documentElement)=>[].concat(...Element.prototype.querySelectorAll.call(e,t)),findOne:(t,e=document.documentElement)=>Element.prototype.querySelector.call(e,t),children:(t,e)=>[].concat(...t.children).filter((t=>t.matches(e))),parents(t,e){const i=[];let n=t.parentNode.closest(e);for(;n;)i.push(n),n=n.parentNode.closest(e);return i},prev(t,e){let i=t.previousElementSibling;for(;i;){if(i.matches(e))return[i];i=i.previousElementSibling}return[]},next(t,e){let i=t.nextElementSibling;for(;i;){if(i.matches(e))return[i];i=i.nextElementSibling}return[]},focusableChildren(t){const e=["a","button","input","textarea","select","details","[tabindex]",'[contenteditable="true"]'].map((t=>`${t}:not([tabindex^="-"])`)).join(",");return this.find(e,t).filter((t=>!l(t)&&a(t)))},getSelectorFromElement(t){const e=B(t);return e&&z.findOne(e)?e:null},getElementFromSelector(t){const e=B(t);return e?z.findOne(e):null},getMultipleElementsFromSelector(t){const e=B(t);return e?z.find(e):[]}},R=(t,e="hide")=>{const i=`click.dismiss${t.EVENT_KEY}`,n=t.NAME;N.on(document,i,`[data-bs-dismiss="${n}"]`,(function(i){if(["A","AREA"].includes(this.tagName)&&i.preventDefault(),l(this))return;const s=z.getElementFromSelector(this)||this.closest(`.${n}`);t.getOrCreateInstance(s)[e]()}))},q=".bs.alert",V=`close${q}`,K=`closed${q}`;class Q extends W{static get NAME(){return"alert"}close(){if(N.trigger(this._element,V).defaultPrevented)return;this._element.classList.remove("show");const t=this._element.classList.contains("fade");this._queueCallback((()=>this._destroyElement()),this._element,t)}_destroyElement(){this._element.remove(),N.trigger(this._element,K),this.dispose()}static jQueryInterface(t){return this.each((function(){const e=Q.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}R(Q,"close"),m(Q);const X='[data-bs-toggle="button"]';class Y extends W{static get NAME(){return"button"}toggle(){this._element.setAttribute("aria-pressed",this._element.classList.toggle("active"))}static jQueryInterface(t){return this.each((function(){const e=Y.getOrCreateInstance(this);"toggle"===t&&e[t]()}))}}N.on(document,"click.bs.button.data-api",X,(t=>{t.preventDefault();const e=t.target.closest(X);Y.getOrCreateInstance(e).toggle()})),m(Y);const U=".bs.swipe",G=`touchstart${U}`,J=`touchmove${U}`,Z=`touchend${U}`,tt=`pointerdown${U}`,et=`pointerup${U}`,it={endCallback:null,leftCallback:null,rightCallback:null},nt={endCallback:"(function|null)",leftCallback:"(function|null)",rightCallback:"(function|null)"};class st extends H{constructor(t,e){super(),this._element=t,t&&st.isSupported()&&(this._config=this._getConfig(e),this._deltaX=0,this._supportPointerEvents=Boolean(window.PointerEvent),this._initEvents())}static get Default(){return it}static get DefaultType(){return nt}static get NAME(){return"swipe"}dispose(){N.off(this._element,U)}_start(t){this._supportPointerEvents?this._eventIsPointerPenTouch(t)&&(this._deltaX=t.clientX):this._deltaX=t.touches[0].clientX}_end(t){this._eventIsPointerPenTouch(t)&&(this._deltaX=t.clientX-this._deltaX),this._handleSwipe(),g(this._config.endCallback)}_move(t){this._deltaX=t.touches&&t.touches.length>1?0:t.touches[0].clientX-this._deltaX}_handleSwipe(){const t=Math.abs(this._deltaX);if(t<=40)return;const e=t/this._deltaX;this._deltaX=0,e&&g(e>0?this._config.rightCallback:this._config.leftCallback)}_initEvents(){this._supportPointerEvents?(N.on(this._element,tt,(t=>this._start(t))),N.on(this._element,et,(t=>this._end(t))),this._element.classList.add("pointer-event")):(N.on(this._element,G,(t=>this._start(t))),N.on(this._element,J,(t=>this._move(t))),N.on(this._element,Z,(t=>this._end(t))))}_eventIsPointerPenTouch(t){return this._supportPointerEvents&&("pen"===t.pointerType||"touch"===t.pointerType)}static isSupported(){return"ontouchstart"in document.documentElement||navigator.maxTouchPoints>0}}const ot=".bs.carousel",rt=".data-api",at="next",lt="prev",ct="left",ht="right",dt=`slide${ot}`,ut=`slid${ot}`,ft=`keydown${ot}`,pt=`mouseenter${ot}`,mt=`mouseleave${ot}`,gt=`dragstart${ot}`,_t=`load${ot}${rt}`,bt=`click${ot}${rt}`,vt="carousel",yt="active",wt=".active",At=".carousel-item",Et=wt+At,Tt={ArrowLeft:ht,ArrowRight:ct},Ct={interval:5e3,keyboard:!0,pause:"hover",ride:!1,touch:!0,wrap:!0},Ot={interval:"(number|boolean)",keyboard:"boolean",pause:"(string|boolean)",ride:"(boolean|string)",touch:"boolean",wrap:"boolean"};class xt extends W{constructor(t,e){super(t,e),this._interval=null,this._activeElement=null,this._isSliding=!1,this.touchTimeout=null,this._swipeHelper=null,this._indicatorsElement=z.findOne(".carousel-indicators",this._element),this._addEventListeners(),this._config.ride===vt&&this.cycle()}static get Default(){return Ct}static get DefaultType(){return Ot}static get NAME(){return"carousel"}next(){this._slide(at)}nextWhenVisible(){!document.hidden&&a(this._element)&&this.next()}prev(){this._slide(lt)}pause(){this._isSliding&&s(this._element),this._clearInterval()}cycle(){this._clearInterval(),this._updateInterval(),this._interval=setInterval((()=>this.nextWhenVisible()),this._config.interval)}_maybeEnableCycle(){this._config.ride&&(this._isSliding?N.one(this._element,ut,(()=>this.cycle())):this.cycle())}to(t){const e=this._getItems();if(t>e.length-1||t<0)return;if(this._isSliding)return void N.one(this._element,ut,(()=>this.to(t)));const i=this._getItemIndex(this._getActive());if(i===t)return;const n=t>i?at:lt;this._slide(n,e[t])}dispose(){this._swipeHelper&&this._swipeHelper.dispose(),super.dispose()}_configAfterMerge(t){return t.defaultInterval=t.interval,t}_addEventListeners(){this._config.keyboard&&N.on(this._element,ft,(t=>this._keydown(t))),"hover"===this._config.pause&&(N.on(this._element,pt,(()=>this.pause())),N.on(this._element,mt,(()=>this._maybeEnableCycle()))),this._config.touch&&st.isSupported()&&this._addTouchEventListeners()}_addTouchEventListeners(){for(const t of z.find(".carousel-item img",this._element))N.on(t,gt,(t=>t.preventDefault()));const t={leftCallback:()=>this._slide(this._directionToOrder(ct)),rightCallback:()=>this._slide(this._directionToOrder(ht)),endCallback:()=>{"hover"===this._config.pause&&(this.pause(),this.touchTimeout&&clearTimeout(this.touchTimeout),this.touchTimeout=setTimeout((()=>this._maybeEnableCycle()),500+this._config.interval))}};this._swipeHelper=new st(this._element,t)}_keydown(t){if(/input|textarea/i.test(t.target.tagName))return;const e=Tt[t.key];e&&(t.preventDefault(),this._slide(this._directionToOrder(e)))}_getItemIndex(t){return this._getItems().indexOf(t)}_setActiveIndicatorElement(t){if(!this._indicatorsElement)return;const e=z.findOne(wt,this._indicatorsElement);e.classList.remove(yt),e.removeAttribute("aria-current");const i=z.findOne(`[data-bs-slide-to="${t}"]`,this._indicatorsElement);i&&(i.classList.add(yt),i.setAttribute("aria-current","true"))}_updateInterval(){const t=this._activeElement||this._getActive();if(!t)return;const e=Number.parseInt(t.getAttribute("data-bs-interval"),10);this._config.interval=e||this._config.defaultInterval}_slide(t,e=null){if(this._isSliding)return;const i=this._getActive(),n=t===at,s=e||b(this._getItems(),i,n,this._config.wrap);if(s===i)return;const o=this._getItemIndex(s),r=e=>N.trigger(this._element,e,{relatedTarget:s,direction:this._orderToDirection(t),from:this._getItemIndex(i),to:o});if(r(dt).defaultPrevented)return;if(!i||!s)return;const a=Boolean(this._interval);this.pause(),this._isSliding=!0,this._setActiveIndicatorElement(o),this._activeElement=s;const l=n?"carousel-item-start":"carousel-item-end",c=n?"carousel-item-next":"carousel-item-prev";s.classList.add(c),d(s),i.classList.add(l),s.classList.add(l),this._queueCallback((()=>{s.classList.remove(l,c),s.classList.add(yt),i.classList.remove(yt,c,l),this._isSliding=!1,r(ut)}),i,this._isAnimated()),a&&this.cycle()}_isAnimated(){return this._element.classList.contains("slide")}_getActive(){return z.findOne(Et,this._element)}_getItems(){return z.find(At,this._element)}_clearInterval(){this._interval&&(clearInterval(this._interval),this._interval=null)}_directionToOrder(t){return p()?t===ct?lt:at:t===ct?at:lt}_orderToDirection(t){return p()?t===lt?ct:ht:t===lt?ht:ct}static jQueryInterface(t){return this.each((function(){const e=xt.getOrCreateInstance(this,t);if("number"!=typeof t){if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}else e.to(t)}))}}N.on(document,bt,"[data-bs-slide], [data-bs-slide-to]",(function(t){const e=z.getElementFromSelector(this);if(!e||!e.classList.contains(vt))return;t.preventDefault();const i=xt.getOrCreateInstance(e),n=this.getAttribute("data-bs-slide-to");return n?(i.to(n),void i._maybeEnableCycle()):"next"===F.getDataAttribute(this,"slide")?(i.next(),void i._maybeEnableCycle()):(i.prev(),void i._maybeEnableCycle())})),N.on(window,_t,(()=>{const t=z.find('[data-bs-ride="carousel"]');for(const e of t)xt.getOrCreateInstance(e)})),m(xt);const kt=".bs.collapse",Lt=`show${kt}`,St=`shown${kt}`,Dt=`hide${kt}`,$t=`hidden${kt}`,It=`click${kt}.data-api`,Nt="show",Pt="collapse",Mt="collapsing",jt=`:scope .${Pt} .${Pt}`,Ft='[data-bs-toggle="collapse"]',Ht={parent:null,toggle:!0},Wt={parent:"(null|element)",toggle:"boolean"};class Bt extends W{constructor(t,e){super(t,e),this._isTransitioning=!1,this._triggerArray=[];const i=z.find(Ft);for(const t of i){const e=z.getSelectorFromElement(t),i=z.find(e).filter((t=>t===this._element));null!==e&&i.length&&this._triggerArray.push(t)}this._initializeChildren(),this._config.parent||this._addAriaAndCollapsedClass(this._triggerArray,this._isShown()),this._config.toggle&&this.toggle()}static get Default(){return Ht}static get DefaultType(){return Wt}static get NAME(){return"collapse"}toggle(){this._isShown()?this.hide():this.show()}show(){if(this._isTransitioning||this._isShown())return;let t=[];if(this._config.parent&&(t=this._getFirstLevelChildren(".collapse.show, .collapse.collapsing").filter((t=>t!==this._element)).map((t=>Bt.getOrCreateInstance(t,{toggle:!1})))),t.length&&t[0]._isTransitioning)return;if(N.trigger(this._element,Lt).defaultPrevented)return;for(const e of t)e.hide();const e=this._getDimension();this._element.classList.remove(Pt),this._element.classList.add(Mt),this._element.style[e]=0,this._addAriaAndCollapsedClass(this._triggerArray,!0),this._isTransitioning=!0;const i=`scroll${e[0].toUpperCase()+e.slice(1)}`;this._queueCallback((()=>{this._isTransitioning=!1,this._element.classList.remove(Mt),this._element.classList.add(Pt,Nt),this._element.style[e]="",N.trigger(this._element,St)}),this._element,!0),this._element.style[e]=`${this._element[i]}px`}hide(){if(this._isTransitioning||!this._isShown())return;if(N.trigger(this._element,Dt).defaultPrevented)return;const t=this._getDimension();this._element.style[t]=`${this._element.getBoundingClientRect()[t]}px`,d(this._element),this._element.classList.add(Mt),this._element.classList.remove(Pt,Nt);for(const t of this._triggerArray){const e=z.getElementFromSelector(t);e&&!this._isShown(e)&&this._addAriaAndCollapsedClass([t],!1)}this._isTransitioning=!0,this._element.style[t]="",this._queueCallback((()=>{this._isTransitioning=!1,this._element.classList.remove(Mt),this._element.classList.add(Pt),N.trigger(this._element,$t)}),this._element,!0)}_isShown(t=this._element){return t.classList.contains(Nt)}_configAfterMerge(t){return t.toggle=Boolean(t.toggle),t.parent=r(t.parent),t}_getDimension(){return this._element.classList.contains("collapse-horizontal")?"width":"height"}_initializeChildren(){if(!this._config.parent)return;const t=this._getFirstLevelChildren(Ft);for(const e of t){const t=z.getElementFromSelector(e);t&&this._addAriaAndCollapsedClass([e],this._isShown(t))}}_getFirstLevelChildren(t){const e=z.find(jt,this._config.parent);return z.find(t,this._config.parent).filter((t=>!e.includes(t)))}_addAriaAndCollapsedClass(t,e){if(t.length)for(const i of t)i.classList.toggle("collapsed",!e),i.setAttribute("aria-expanded",e)}static jQueryInterface(t){const e={};return"string"==typeof t&&/show|hide/.test(t)&&(e.toggle=!1),this.each((function(){const i=Bt.getOrCreateInstance(this,e);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t]()}}))}}N.on(document,It,Ft,(function(t){("A"===t.target.tagName||t.delegateTarget&&"A"===t.delegateTarget.tagName)&&t.preventDefault();for(const t of z.getMultipleElementsFromSelector(this))Bt.getOrCreateInstance(t,{toggle:!1}).toggle()})),m(Bt);var zt="top",Rt="bottom",qt="right",Vt="left",Kt="auto",Qt=[zt,Rt,qt,Vt],Xt="start",Yt="end",Ut="clippingParents",Gt="viewport",Jt="popper",Zt="reference",te=Qt.reduce((function(t,e){return t.concat([e+"-"+Xt,e+"-"+Yt])}),[]),ee=[].concat(Qt,[Kt]).reduce((function(t,e){return t.concat([e,e+"-"+Xt,e+"-"+Yt])}),[]),ie="beforeRead",ne="read",se="afterRead",oe="beforeMain",re="main",ae="afterMain",le="beforeWrite",ce="write",he="afterWrite",de=[ie,ne,se,oe,re,ae,le,ce,he];function ue(t){return t?(t.nodeName||"").toLowerCase():null}function fe(t){if(null==t)return window;if("[object Window]"!==t.toString()){var e=t.ownerDocument;return e&&e.defaultView||window}return t}function pe(t){return t instanceof fe(t).Element||t instanceof Element}function me(t){return t instanceof fe(t).HTMLElement||t instanceof HTMLElement}function ge(t){return"undefined"!=typeof ShadowRoot&&(t instanceof fe(t).ShadowRoot||t instanceof ShadowRoot)}const _e={name:"applyStyles",enabled:!0,phase:"write",fn:function(t){var e=t.state;Object.keys(e.elements).forEach((function(t){var i=e.styles[t]||{},n=e.attributes[t]||{},s=e.elements[t];me(s)&&ue(s)&&(Object.assign(s.style,i),Object.keys(n).forEach((function(t){var e=n[t];!1===e?s.removeAttribute(t):s.setAttribute(t,!0===e?"":e)})))}))},effect:function(t){var e=t.state,i={popper:{position:e.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(e.elements.popper.style,i.popper),e.styles=i,e.elements.arrow&&Object.assign(e.elements.arrow.style,i.arrow),function(){Object.keys(e.elements).forEach((function(t){var n=e.elements[t],s=e.attributes[t]||{},o=Object.keys(e.styles.hasOwnProperty(t)?e.styles[t]:i[t]).reduce((function(t,e){return t[e]="",t}),{});me(n)&&ue(n)&&(Object.assign(n.style,o),Object.keys(s).forEach((function(t){n.removeAttribute(t)})))}))}},requires:["computeStyles"]};function be(t){return t.split("-")[0]}var ve=Math.max,ye=Math.min,we=Math.round;function Ae(){var t=navigator.userAgentData;return null!=t&&t.brands&&Array.isArray(t.brands)?t.brands.map((function(t){return t.brand+"/"+t.version})).join(" "):navigator.userAgent}function Ee(){return!/^((?!chrome|android).)*safari/i.test(Ae())}function Te(t,e,i){void 0===e&&(e=!1),void 0===i&&(i=!1);var n=t.getBoundingClientRect(),s=1,o=1;e&&me(t)&&(s=t.offsetWidth>0&&we(n.width)/t.offsetWidth||1,o=t.offsetHeight>0&&we(n.height)/t.offsetHeight||1);var r=(pe(t)?fe(t):window).visualViewport,a=!Ee()&&i,l=(n.left+(a&&r?r.offsetLeft:0))/s,c=(n.top+(a&&r?r.offsetTop:0))/o,h=n.width/s,d=n.height/o;return{width:h,height:d,top:c,right:l+h,bottom:c+d,left:l,x:l,y:c}}function Ce(t){var e=Te(t),i=t.offsetWidth,n=t.offsetHeight;return Math.abs(e.width-i)<=1&&(i=e.width),Math.abs(e.height-n)<=1&&(n=e.height),{x:t.offsetLeft,y:t.offsetTop,width:i,height:n}}function Oe(t,e){var i=e.getRootNode&&e.getRootNode();if(t.contains(e))return!0;if(i&&ge(i)){var n=e;do{if(n&&t.isSameNode(n))return!0;n=n.parentNode||n.host}while(n)}return!1}function xe(t){return fe(t).getComputedStyle(t)}function ke(t){return["table","td","th"].indexOf(ue(t))>=0}function Le(t){return((pe(t)?t.ownerDocument:t.document)||window.document).documentElement}function Se(t){return"html"===ue(t)?t:t.assignedSlot||t.parentNode||(ge(t)?t.host:null)||Le(t)}function De(t){return me(t)&&"fixed"!==xe(t).position?t.offsetParent:null}function $e(t){for(var e=fe(t),i=De(t);i&&ke(i)&&"static"===xe(i).position;)i=De(i);return i&&("html"===ue(i)||"body"===ue(i)&&"static"===xe(i).position)?e:i||function(t){var e=/firefox/i.test(Ae());if(/Trident/i.test(Ae())&&me(t)&&"fixed"===xe(t).position)return null;var i=Se(t);for(ge(i)&&(i=i.host);me(i)&&["html","body"].indexOf(ue(i))<0;){var n=xe(i);if("none"!==n.transform||"none"!==n.perspective||"paint"===n.contain||-1!==["transform","perspective"].indexOf(n.willChange)||e&&"filter"===n.willChange||e&&n.filter&&"none"!==n.filter)return i;i=i.parentNode}return null}(t)||e}function Ie(t){return["top","bottom"].indexOf(t)>=0?"x":"y"}function Ne(t,e,i){return ve(t,ye(e,i))}function Pe(t){return Object.assign({},{top:0,right:0,bottom:0,left:0},t)}function Me(t,e){return e.reduce((function(e,i){return e[i]=t,e}),{})}const je={name:"arrow",enabled:!0,phase:"main",fn:function(t){var e,i=t.state,n=t.name,s=t.options,o=i.elements.arrow,r=i.modifiersData.popperOffsets,a=be(i.placement),l=Ie(a),c=[Vt,qt].indexOf(a)>=0?"height":"width";if(o&&r){var h=function(t,e){return Pe("number"!=typeof(t="function"==typeof t?t(Object.assign({},e.rects,{placement:e.placement})):t)?t:Me(t,Qt))}(s.padding,i),d=Ce(o),u="y"===l?zt:Vt,f="y"===l?Rt:qt,p=i.rects.reference[c]+i.rects.reference[l]-r[l]-i.rects.popper[c],m=r[l]-i.rects.reference[l],g=$e(o),_=g?"y"===l?g.clientHeight||0:g.clientWidth||0:0,b=p/2-m/2,v=h[u],y=_-d[c]-h[f],w=_/2-d[c]/2+b,A=Ne(v,w,y),E=l;i.modifiersData[n]=((e={})[E]=A,e.centerOffset=A-w,e)}},effect:function(t){var e=t.state,i=t.options.element,n=void 0===i?"[data-popper-arrow]":i;null!=n&&("string"!=typeof n||(n=e.elements.popper.querySelector(n)))&&Oe(e.elements.popper,n)&&(e.elements.arrow=n)},requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};function Fe(t){return t.split("-")[1]}var He={top:"auto",right:"auto",bottom:"auto",left:"auto"};function We(t){var e,i=t.popper,n=t.popperRect,s=t.placement,o=t.variation,r=t.offsets,a=t.position,l=t.gpuAcceleration,c=t.adaptive,h=t.roundOffsets,d=t.isFixed,u=r.x,f=void 0===u?0:u,p=r.y,m=void 0===p?0:p,g="function"==typeof h?h({x:f,y:m}):{x:f,y:m};f=g.x,m=g.y;var _=r.hasOwnProperty("x"),b=r.hasOwnProperty("y"),v=Vt,y=zt,w=window;if(c){var A=$e(i),E="clientHeight",T="clientWidth";A===fe(i)&&"static"!==xe(A=Le(i)).position&&"absolute"===a&&(E="scrollHeight",T="scrollWidth"),(s===zt||(s===Vt||s===qt)&&o===Yt)&&(y=Rt,m-=(d&&A===w&&w.visualViewport?w.visualViewport.height:A[E])-n.height,m*=l?1:-1),s!==Vt&&(s!==zt&&s!==Rt||o!==Yt)||(v=qt,f-=(d&&A===w&&w.visualViewport?w.visualViewport.width:A[T])-n.width,f*=l?1:-1)}var C,O=Object.assign({position:a},c&&He),x=!0===h?function(t,e){var i=t.x,n=t.y,s=e.devicePixelRatio||1;return{x:we(i*s)/s||0,y:we(n*s)/s||0}}({x:f,y:m},fe(i)):{x:f,y:m};return f=x.x,m=x.y,l?Object.assign({},O,((C={})[y]=b?"0":"",C[v]=_?"0":"",C.transform=(w.devicePixelRatio||1)<=1?"translate("+f+"px, "+m+"px)":"translate3d("+f+"px, "+m+"px, 0)",C)):Object.assign({},O,((e={})[y]=b?m+"px":"",e[v]=_?f+"px":"",e.transform="",e))}const Be={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:function(t){var e=t.state,i=t.options,n=i.gpuAcceleration,s=void 0===n||n,o=i.adaptive,r=void 0===o||o,a=i.roundOffsets,l=void 0===a||a,c={placement:be(e.placement),variation:Fe(e.placement),popper:e.elements.popper,popperRect:e.rects.popper,gpuAcceleration:s,isFixed:"fixed"===e.options.strategy};null!=e.modifiersData.popperOffsets&&(e.styles.popper=Object.assign({},e.styles.popper,We(Object.assign({},c,{offsets:e.modifiersData.popperOffsets,position:e.options.strategy,adaptive:r,roundOffsets:l})))),null!=e.modifiersData.arrow&&(e.styles.arrow=Object.assign({},e.styles.arrow,We(Object.assign({},c,{offsets:e.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:l})))),e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-placement":e.placement})},data:{}};var ze={passive:!0};const Re={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:function(t){var e=t.state,i=t.instance,n=t.options,s=n.scroll,o=void 0===s||s,r=n.resize,a=void 0===r||r,l=fe(e.elements.popper),c=[].concat(e.scrollParents.reference,e.scrollParents.popper);return o&&c.forEach((function(t){t.addEventListener("scroll",i.update,ze)})),a&&l.addEventListener("resize",i.update,ze),function(){o&&c.forEach((function(t){t.removeEventListener("scroll",i.update,ze)})),a&&l.removeEventListener("resize",i.update,ze)}},data:{}};var qe={left:"right",right:"left",bottom:"top",top:"bottom"};function Ve(t){return t.replace(/left|right|bottom|top/g,(function(t){return qe[t]}))}var Ke={start:"end",end:"start"};function Qe(t){return t.replace(/start|end/g,(function(t){return Ke[t]}))}function Xe(t){var e=fe(t);return{scrollLeft:e.pageXOffset,scrollTop:e.pageYOffset}}function Ye(t){return Te(Le(t)).left+Xe(t).scrollLeft}function Ue(t){var e=xe(t),i=e.overflow,n=e.overflowX,s=e.overflowY;return/auto|scroll|overlay|hidden/.test(i+s+n)}function Ge(t){return["html","body","#document"].indexOf(ue(t))>=0?t.ownerDocument.body:me(t)&&Ue(t)?t:Ge(Se(t))}function Je(t,e){var i;void 0===e&&(e=[]);var n=Ge(t),s=n===(null==(i=t.ownerDocument)?void 0:i.body),o=fe(n),r=s?[o].concat(o.visualViewport||[],Ue(n)?n:[]):n,a=e.concat(r);return s?a:a.concat(Je(Se(r)))}function Ze(t){return Object.assign({},t,{left:t.x,top:t.y,right:t.x+t.width,bottom:t.y+t.height})}function ti(t,e,i){return e===Gt?Ze(function(t,e){var i=fe(t),n=Le(t),s=i.visualViewport,o=n.clientWidth,r=n.clientHeight,a=0,l=0;if(s){o=s.width,r=s.height;var c=Ee();(c||!c&&"fixed"===e)&&(a=s.offsetLeft,l=s.offsetTop)}return{width:o,height:r,x:a+Ye(t),y:l}}(t,i)):pe(e)?function(t,e){var i=Te(t,!1,"fixed"===e);return i.top=i.top+t.clientTop,i.left=i.left+t.clientLeft,i.bottom=i.top+t.clientHeight,i.right=i.left+t.clientWidth,i.width=t.clientWidth,i.height=t.clientHeight,i.x=i.left,i.y=i.top,i}(e,i):Ze(function(t){var e,i=Le(t),n=Xe(t),s=null==(e=t.ownerDocument)?void 0:e.body,o=ve(i.scrollWidth,i.clientWidth,s?s.scrollWidth:0,s?s.clientWidth:0),r=ve(i.scrollHeight,i.clientHeight,s?s.scrollHeight:0,s?s.clientHeight:0),a=-n.scrollLeft+Ye(t),l=-n.scrollTop;return"rtl"===xe(s||i).direction&&(a+=ve(i.clientWidth,s?s.clientWidth:0)-o),{width:o,height:r,x:a,y:l}}(Le(t)))}function ei(t){var e,i=t.reference,n=t.element,s=t.placement,o=s?be(s):null,r=s?Fe(s):null,a=i.x+i.width/2-n.width/2,l=i.y+i.height/2-n.height/2;switch(o){case zt:e={x:a,y:i.y-n.height};break;case Rt:e={x:a,y:i.y+i.height};break;case qt:e={x:i.x+i.width,y:l};break;case Vt:e={x:i.x-n.width,y:l};break;default:e={x:i.x,y:i.y}}var c=o?Ie(o):null;if(null!=c){var h="y"===c?"height":"width";switch(r){case Xt:e[c]=e[c]-(i[h]/2-n[h]/2);break;case Yt:e[c]=e[c]+(i[h]/2-n[h]/2)}}return e}function ii(t,e){void 0===e&&(e={});var i=e,n=i.placement,s=void 0===n?t.placement:n,o=i.strategy,r=void 0===o?t.strategy:o,a=i.boundary,l=void 0===a?Ut:a,c=i.rootBoundary,h=void 0===c?Gt:c,d=i.elementContext,u=void 0===d?Jt:d,f=i.altBoundary,p=void 0!==f&&f,m=i.padding,g=void 0===m?0:m,_=Pe("number"!=typeof g?g:Me(g,Qt)),b=u===Jt?Zt:Jt,v=t.rects.popper,y=t.elements[p?b:u],w=function(t,e,i,n){var s="clippingParents"===e?function(t){var e=Je(Se(t)),i=["absolute","fixed"].indexOf(xe(t).position)>=0&&me(t)?$e(t):t;return pe(i)?e.filter((function(t){return pe(t)&&Oe(t,i)&&"body"!==ue(t)})):[]}(t):[].concat(e),o=[].concat(s,[i]),r=o[0],a=o.reduce((function(e,i){var s=ti(t,i,n);return e.top=ve(s.top,e.top),e.right=ye(s.right,e.right),e.bottom=ye(s.bottom,e.bottom),e.left=ve(s.left,e.left),e}),ti(t,r,n));return a.width=a.right-a.left,a.height=a.bottom-a.top,a.x=a.left,a.y=a.top,a}(pe(y)?y:y.contextElement||Le(t.elements.popper),l,h,r),A=Te(t.elements.reference),E=ei({reference:A,element:v,strategy:"absolute",placement:s}),T=Ze(Object.assign({},v,E)),C=u===Jt?T:A,O={top:w.top-C.top+_.top,bottom:C.bottom-w.bottom+_.bottom,left:w.left-C.left+_.left,right:C.right-w.right+_.right},x=t.modifiersData.offset;if(u===Jt&&x){var k=x[s];Object.keys(O).forEach((function(t){var e=[qt,Rt].indexOf(t)>=0?1:-1,i=[zt,Rt].indexOf(t)>=0?"y":"x";O[t]+=k[i]*e}))}return O}function ni(t,e){void 0===e&&(e={});var i=e,n=i.placement,s=i.boundary,o=i.rootBoundary,r=i.padding,a=i.flipVariations,l=i.allowedAutoPlacements,c=void 0===l?ee:l,h=Fe(n),d=h?a?te:te.filter((function(t){return Fe(t)===h})):Qt,u=d.filter((function(t){return c.indexOf(t)>=0}));0===u.length&&(u=d);var f=u.reduce((function(e,i){return e[i]=ii(t,{placement:i,boundary:s,rootBoundary:o,padding:r})[be(i)],e}),{});return Object.keys(f).sort((function(t,e){return f[t]-f[e]}))}const si={name:"flip",enabled:!0,phase:"main",fn:function(t){var e=t.state,i=t.options,n=t.name;if(!e.modifiersData[n]._skip){for(var s=i.mainAxis,o=void 0===s||s,r=i.altAxis,a=void 0===r||r,l=i.fallbackPlacements,c=i.padding,h=i.boundary,d=i.rootBoundary,u=i.altBoundary,f=i.flipVariations,p=void 0===f||f,m=i.allowedAutoPlacements,g=e.options.placement,_=be(g),b=l||(_!==g&&p?function(t){if(be(t)===Kt)return[];var e=Ve(t);return[Qe(t),e,Qe(e)]}(g):[Ve(g)]),v=[g].concat(b).reduce((function(t,i){return t.concat(be(i)===Kt?ni(e,{placement:i,boundary:h,rootBoundary:d,padding:c,flipVariations:p,allowedAutoPlacements:m}):i)}),[]),y=e.rects.reference,w=e.rects.popper,A=new Map,E=!0,T=v[0],C=0;C=0,S=L?"width":"height",D=ii(e,{placement:O,boundary:h,rootBoundary:d,altBoundary:u,padding:c}),$=L?k?qt:Vt:k?Rt:zt;y[S]>w[S]&&($=Ve($));var I=Ve($),N=[];if(o&&N.push(D[x]<=0),a&&N.push(D[$]<=0,D[I]<=0),N.every((function(t){return t}))){T=O,E=!1;break}A.set(O,N)}if(E)for(var P=function(t){var e=v.find((function(e){var i=A.get(e);if(i)return i.slice(0,t).every((function(t){return t}))}));if(e)return T=e,"break"},M=p?3:1;M>0&&"break"!==P(M);M--);e.placement!==T&&(e.modifiersData[n]._skip=!0,e.placement=T,e.reset=!0)}},requiresIfExists:["offset"],data:{_skip:!1}};function oi(t,e,i){return void 0===i&&(i={x:0,y:0}),{top:t.top-e.height-i.y,right:t.right-e.width+i.x,bottom:t.bottom-e.height+i.y,left:t.left-e.width-i.x}}function ri(t){return[zt,qt,Rt,Vt].some((function(e){return t[e]>=0}))}const ai={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:function(t){var e=t.state,i=t.name,n=e.rects.reference,s=e.rects.popper,o=e.modifiersData.preventOverflow,r=ii(e,{elementContext:"reference"}),a=ii(e,{altBoundary:!0}),l=oi(r,n),c=oi(a,s,o),h=ri(l),d=ri(c);e.modifiersData[i]={referenceClippingOffsets:l,popperEscapeOffsets:c,isReferenceHidden:h,hasPopperEscaped:d},e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-reference-hidden":h,"data-popper-escaped":d})}},li={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:function(t){var e=t.state,i=t.options,n=t.name,s=i.offset,o=void 0===s?[0,0]:s,r=ee.reduce((function(t,i){return t[i]=function(t,e,i){var n=be(t),s=[Vt,zt].indexOf(n)>=0?-1:1,o="function"==typeof i?i(Object.assign({},e,{placement:t})):i,r=o[0],a=o[1];return r=r||0,a=(a||0)*s,[Vt,qt].indexOf(n)>=0?{x:a,y:r}:{x:r,y:a}}(i,e.rects,o),t}),{}),a=r[e.placement],l=a.x,c=a.y;null!=e.modifiersData.popperOffsets&&(e.modifiersData.popperOffsets.x+=l,e.modifiersData.popperOffsets.y+=c),e.modifiersData[n]=r}},ci={name:"popperOffsets",enabled:!0,phase:"read",fn:function(t){var e=t.state,i=t.name;e.modifiersData[i]=ei({reference:e.rects.reference,element:e.rects.popper,strategy:"absolute",placement:e.placement})},data:{}},hi={name:"preventOverflow",enabled:!0,phase:"main",fn:function(t){var e=t.state,i=t.options,n=t.name,s=i.mainAxis,o=void 0===s||s,r=i.altAxis,a=void 0!==r&&r,l=i.boundary,c=i.rootBoundary,h=i.altBoundary,d=i.padding,u=i.tether,f=void 0===u||u,p=i.tetherOffset,m=void 0===p?0:p,g=ii(e,{boundary:l,rootBoundary:c,padding:d,altBoundary:h}),_=be(e.placement),b=Fe(e.placement),v=!b,y=Ie(_),w="x"===y?"y":"x",A=e.modifiersData.popperOffsets,E=e.rects.reference,T=e.rects.popper,C="function"==typeof m?m(Object.assign({},e.rects,{placement:e.placement})):m,O="number"==typeof C?{mainAxis:C,altAxis:C}:Object.assign({mainAxis:0,altAxis:0},C),x=e.modifiersData.offset?e.modifiersData.offset[e.placement]:null,k={x:0,y:0};if(A){if(o){var L,S="y"===y?zt:Vt,D="y"===y?Rt:qt,$="y"===y?"height":"width",I=A[y],N=I+g[S],P=I-g[D],M=f?-T[$]/2:0,j=b===Xt?E[$]:T[$],F=b===Xt?-T[$]:-E[$],H=e.elements.arrow,W=f&&H?Ce(H):{width:0,height:0},B=e.modifiersData["arrow#persistent"]?e.modifiersData["arrow#persistent"].padding:{top:0,right:0,bottom:0,left:0},z=B[S],R=B[D],q=Ne(0,E[$],W[$]),V=v?E[$]/2-M-q-z-O.mainAxis:j-q-z-O.mainAxis,K=v?-E[$]/2+M+q+R+O.mainAxis:F+q+R+O.mainAxis,Q=e.elements.arrow&&$e(e.elements.arrow),X=Q?"y"===y?Q.clientTop||0:Q.clientLeft||0:0,Y=null!=(L=null==x?void 0:x[y])?L:0,U=I+K-Y,G=Ne(f?ye(N,I+V-Y-X):N,I,f?ve(P,U):P);A[y]=G,k[y]=G-I}if(a){var J,Z="x"===y?zt:Vt,tt="x"===y?Rt:qt,et=A[w],it="y"===w?"height":"width",nt=et+g[Z],st=et-g[tt],ot=-1!==[zt,Vt].indexOf(_),rt=null!=(J=null==x?void 0:x[w])?J:0,at=ot?nt:et-E[it]-T[it]-rt+O.altAxis,lt=ot?et+E[it]+T[it]-rt-O.altAxis:st,ct=f&&ot?function(t,e,i){var n=Ne(t,e,i);return n>i?i:n}(at,et,lt):Ne(f?at:nt,et,f?lt:st);A[w]=ct,k[w]=ct-et}e.modifiersData[n]=k}},requiresIfExists:["offset"]};function di(t,e,i){void 0===i&&(i=!1);var n,s,o=me(e),r=me(e)&&function(t){var e=t.getBoundingClientRect(),i=we(e.width)/t.offsetWidth||1,n=we(e.height)/t.offsetHeight||1;return 1!==i||1!==n}(e),a=Le(e),l=Te(t,r,i),c={scrollLeft:0,scrollTop:0},h={x:0,y:0};return(o||!o&&!i)&&(("body"!==ue(e)||Ue(a))&&(c=(n=e)!==fe(n)&&me(n)?{scrollLeft:(s=n).scrollLeft,scrollTop:s.scrollTop}:Xe(n)),me(e)?((h=Te(e,!0)).x+=e.clientLeft,h.y+=e.clientTop):a&&(h.x=Ye(a))),{x:l.left+c.scrollLeft-h.x,y:l.top+c.scrollTop-h.y,width:l.width,height:l.height}}function ui(t){var e=new Map,i=new Set,n=[];function s(t){i.add(t.name),[].concat(t.requires||[],t.requiresIfExists||[]).forEach((function(t){if(!i.has(t)){var n=e.get(t);n&&s(n)}})),n.push(t)}return t.forEach((function(t){e.set(t.name,t)})),t.forEach((function(t){i.has(t.name)||s(t)})),n}var fi={placement:"bottom",modifiers:[],strategy:"absolute"};function pi(){for(var t=arguments.length,e=new Array(t),i=0;iNumber.parseInt(t,10))):"function"==typeof t?e=>t(e,this._element):t}_getPopperConfig(){const t={placement:this._getPlacement(),modifiers:[{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"offset",options:{offset:this._getOffset()}}]};return(this._inNavbar||"static"===this._config.display)&&(F.setDataAttribute(this._menu,"popper","static"),t.modifiers=[{name:"applyStyles",enabled:!1}]),{...t,...g(this._config.popperConfig,[t])}}_selectMenuItem({key:t,target:e}){const i=z.find(".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)",this._menu).filter((t=>a(t)));i.length&&b(i,e,t===Ti,!i.includes(e)).focus()}static jQueryInterface(t){return this.each((function(){const e=qi.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}static clearMenus(t){if(2===t.button||"keyup"===t.type&&"Tab"!==t.key)return;const e=z.find(Ni);for(const i of e){const e=qi.getInstance(i);if(!e||!1===e._config.autoClose)continue;const n=t.composedPath(),s=n.includes(e._menu);if(n.includes(e._element)||"inside"===e._config.autoClose&&!s||"outside"===e._config.autoClose&&s)continue;if(e._menu.contains(t.target)&&("keyup"===t.type&&"Tab"===t.key||/input|select|option|textarea|form/i.test(t.target.tagName)))continue;const o={relatedTarget:e._element};"click"===t.type&&(o.clickEvent=t),e._completeHide(o)}}static dataApiKeydownHandler(t){const e=/input|textarea/i.test(t.target.tagName),i="Escape"===t.key,n=[Ei,Ti].includes(t.key);if(!n&&!i)return;if(e&&!i)return;t.preventDefault();const s=this.matches(Ii)?this:z.prev(this,Ii)[0]||z.next(this,Ii)[0]||z.findOne(Ii,t.delegateTarget.parentNode),o=qi.getOrCreateInstance(s);if(n)return t.stopPropagation(),o.show(),void o._selectMenuItem(t);o._isShown()&&(t.stopPropagation(),o.hide(),s.focus())}}N.on(document,Si,Ii,qi.dataApiKeydownHandler),N.on(document,Si,Pi,qi.dataApiKeydownHandler),N.on(document,Li,qi.clearMenus),N.on(document,Di,qi.clearMenus),N.on(document,Li,Ii,(function(t){t.preventDefault(),qi.getOrCreateInstance(this).toggle()})),m(qi);const Vi="backdrop",Ki="show",Qi=`mousedown.bs.${Vi}`,Xi={className:"modal-backdrop",clickCallback:null,isAnimated:!1,isVisible:!0,rootElement:"body"},Yi={className:"string",clickCallback:"(function|null)",isAnimated:"boolean",isVisible:"boolean",rootElement:"(element|string)"};class Ui extends H{constructor(t){super(),this._config=this._getConfig(t),this._isAppended=!1,this._element=null}static get Default(){return Xi}static get DefaultType(){return Yi}static get NAME(){return Vi}show(t){if(!this._config.isVisible)return void g(t);this._append();const e=this._getElement();this._config.isAnimated&&d(e),e.classList.add(Ki),this._emulateAnimation((()=>{g(t)}))}hide(t){this._config.isVisible?(this._getElement().classList.remove(Ki),this._emulateAnimation((()=>{this.dispose(),g(t)}))):g(t)}dispose(){this._isAppended&&(N.off(this._element,Qi),this._element.remove(),this._isAppended=!1)}_getElement(){if(!this._element){const t=document.createElement("div");t.className=this._config.className,this._config.isAnimated&&t.classList.add("fade"),this._element=t}return this._element}_configAfterMerge(t){return t.rootElement=r(t.rootElement),t}_append(){if(this._isAppended)return;const t=this._getElement();this._config.rootElement.append(t),N.on(t,Qi,(()=>{g(this._config.clickCallback)})),this._isAppended=!0}_emulateAnimation(t){_(t,this._getElement(),this._config.isAnimated)}}const Gi=".bs.focustrap",Ji=`focusin${Gi}`,Zi=`keydown.tab${Gi}`,tn="backward",en={autofocus:!0,trapElement:null},nn={autofocus:"boolean",trapElement:"element"};class sn extends H{constructor(t){super(),this._config=this._getConfig(t),this._isActive=!1,this._lastTabNavDirection=null}static get Default(){return en}static get DefaultType(){return nn}static get NAME(){return"focustrap"}activate(){this._isActive||(this._config.autofocus&&this._config.trapElement.focus(),N.off(document,Gi),N.on(document,Ji,(t=>this._handleFocusin(t))),N.on(document,Zi,(t=>this._handleKeydown(t))),this._isActive=!0)}deactivate(){this._isActive&&(this._isActive=!1,N.off(document,Gi))}_handleFocusin(t){const{trapElement:e}=this._config;if(t.target===document||t.target===e||e.contains(t.target))return;const i=z.focusableChildren(e);0===i.length?e.focus():this._lastTabNavDirection===tn?i[i.length-1].focus():i[0].focus()}_handleKeydown(t){"Tab"===t.key&&(this._lastTabNavDirection=t.shiftKey?tn:"forward")}}const on=".fixed-top, .fixed-bottom, .is-fixed, .sticky-top",rn=".sticky-top",an="padding-right",ln="margin-right";class cn{constructor(){this._element=document.body}getWidth(){const t=document.documentElement.clientWidth;return Math.abs(window.innerWidth-t)}hide(){const t=this.getWidth();this._disableOverFlow(),this._setElementAttributes(this._element,an,(e=>e+t)),this._setElementAttributes(on,an,(e=>e+t)),this._setElementAttributes(rn,ln,(e=>e-t))}reset(){this._resetElementAttributes(this._element,"overflow"),this._resetElementAttributes(this._element,an),this._resetElementAttributes(on,an),this._resetElementAttributes(rn,ln)}isOverflowing(){return this.getWidth()>0}_disableOverFlow(){this._saveInitialAttribute(this._element,"overflow"),this._element.style.overflow="hidden"}_setElementAttributes(t,e,i){const n=this.getWidth();this._applyManipulationCallback(t,(t=>{if(t!==this._element&&window.innerWidth>t.clientWidth+n)return;this._saveInitialAttribute(t,e);const s=window.getComputedStyle(t).getPropertyValue(e);t.style.setProperty(e,`${i(Number.parseFloat(s))}px`)}))}_saveInitialAttribute(t,e){const i=t.style.getPropertyValue(e);i&&F.setDataAttribute(t,e,i)}_resetElementAttributes(t,e){this._applyManipulationCallback(t,(t=>{const i=F.getDataAttribute(t,e);null!==i?(F.removeDataAttribute(t,e),t.style.setProperty(e,i)):t.style.removeProperty(e)}))}_applyManipulationCallback(t,e){if(o(t))e(t);else for(const i of z.find(t,this._element))e(i)}}const hn=".bs.modal",dn=`hide${hn}`,un=`hidePrevented${hn}`,fn=`hidden${hn}`,pn=`show${hn}`,mn=`shown${hn}`,gn=`resize${hn}`,_n=`click.dismiss${hn}`,bn=`mousedown.dismiss${hn}`,vn=`keydown.dismiss${hn}`,yn=`click${hn}.data-api`,wn="modal-open",An="show",En="modal-static",Tn={backdrop:!0,focus:!0,keyboard:!0},Cn={backdrop:"(boolean|string)",focus:"boolean",keyboard:"boolean"};class On extends W{constructor(t,e){super(t,e),this._dialog=z.findOne(".modal-dialog",this._element),this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._isShown=!1,this._isTransitioning=!1,this._scrollBar=new cn,this._addEventListeners()}static get Default(){return Tn}static get DefaultType(){return Cn}static get NAME(){return"modal"}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||this._isTransitioning||N.trigger(this._element,pn,{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._isTransitioning=!0,this._scrollBar.hide(),document.body.classList.add(wn),this._adjustDialog(),this._backdrop.show((()=>this._showElement(t))))}hide(){this._isShown&&!this._isTransitioning&&(N.trigger(this._element,dn).defaultPrevented||(this._isShown=!1,this._isTransitioning=!0,this._focustrap.deactivate(),this._element.classList.remove(An),this._queueCallback((()=>this._hideModal()),this._element,this._isAnimated())))}dispose(){N.off(window,hn),N.off(this._dialog,hn),this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}handleUpdate(){this._adjustDialog()}_initializeBackDrop(){return new Ui({isVisible:Boolean(this._config.backdrop),isAnimated:this._isAnimated()})}_initializeFocusTrap(){return new sn({trapElement:this._element})}_showElement(t){document.body.contains(this._element)||document.body.append(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.scrollTop=0;const e=z.findOne(".modal-body",this._dialog);e&&(e.scrollTop=0),d(this._element),this._element.classList.add(An),this._queueCallback((()=>{this._config.focus&&this._focustrap.activate(),this._isTransitioning=!1,N.trigger(this._element,mn,{relatedTarget:t})}),this._dialog,this._isAnimated())}_addEventListeners(){N.on(this._element,vn,(t=>{"Escape"===t.key&&(this._config.keyboard?this.hide():this._triggerBackdropTransition())})),N.on(window,gn,(()=>{this._isShown&&!this._isTransitioning&&this._adjustDialog()})),N.on(this._element,bn,(t=>{N.one(this._element,_n,(e=>{this._element===t.target&&this._element===e.target&&("static"!==this._config.backdrop?this._config.backdrop&&this.hide():this._triggerBackdropTransition())}))}))}_hideModal(){this._element.style.display="none",this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._isTransitioning=!1,this._backdrop.hide((()=>{document.body.classList.remove(wn),this._resetAdjustments(),this._scrollBar.reset(),N.trigger(this._element,fn)}))}_isAnimated(){return this._element.classList.contains("fade")}_triggerBackdropTransition(){if(N.trigger(this._element,un).defaultPrevented)return;const t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._element.style.overflowY;"hidden"===e||this._element.classList.contains(En)||(t||(this._element.style.overflowY="hidden"),this._element.classList.add(En),this._queueCallback((()=>{this._element.classList.remove(En),this._queueCallback((()=>{this._element.style.overflowY=e}),this._dialog)}),this._dialog),this._element.focus())}_adjustDialog(){const t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._scrollBar.getWidth(),i=e>0;if(i&&!t){const t=p()?"paddingLeft":"paddingRight";this._element.style[t]=`${e}px`}if(!i&&t){const t=p()?"paddingRight":"paddingLeft";this._element.style[t]=`${e}px`}}_resetAdjustments(){this._element.style.paddingLeft="",this._element.style.paddingRight=""}static jQueryInterface(t,e){return this.each((function(){const i=On.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t](e)}}))}}N.on(document,yn,'[data-bs-toggle="modal"]',(function(t){const e=z.getElementFromSelector(this);["A","AREA"].includes(this.tagName)&&t.preventDefault(),N.one(e,pn,(t=>{t.defaultPrevented||N.one(e,fn,(()=>{a(this)&&this.focus()}))}));const i=z.findOne(".modal.show");i&&On.getInstance(i).hide(),On.getOrCreateInstance(e).toggle(this)})),R(On),m(On);const xn=".bs.offcanvas",kn=".data-api",Ln=`load${xn}${kn}`,Sn="show",Dn="showing",$n="hiding",In=".offcanvas.show",Nn=`show${xn}`,Pn=`shown${xn}`,Mn=`hide${xn}`,jn=`hidePrevented${xn}`,Fn=`hidden${xn}`,Hn=`resize${xn}`,Wn=`click${xn}${kn}`,Bn=`keydown.dismiss${xn}`,zn={backdrop:!0,keyboard:!0,scroll:!1},Rn={backdrop:"(boolean|string)",keyboard:"boolean",scroll:"boolean"};class qn extends W{constructor(t,e){super(t,e),this._isShown=!1,this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._addEventListeners()}static get Default(){return zn}static get DefaultType(){return Rn}static get NAME(){return"offcanvas"}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||N.trigger(this._element,Nn,{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._backdrop.show(),this._config.scroll||(new cn).hide(),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.classList.add(Dn),this._queueCallback((()=>{this._config.scroll&&!this._config.backdrop||this._focustrap.activate(),this._element.classList.add(Sn),this._element.classList.remove(Dn),N.trigger(this._element,Pn,{relatedTarget:t})}),this._element,!0))}hide(){this._isShown&&(N.trigger(this._element,Mn).defaultPrevented||(this._focustrap.deactivate(),this._element.blur(),this._isShown=!1,this._element.classList.add($n),this._backdrop.hide(),this._queueCallback((()=>{this._element.classList.remove(Sn,$n),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._config.scroll||(new cn).reset(),N.trigger(this._element,Fn)}),this._element,!0)))}dispose(){this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}_initializeBackDrop(){const t=Boolean(this._config.backdrop);return new Ui({className:"offcanvas-backdrop",isVisible:t,isAnimated:!0,rootElement:this._element.parentNode,clickCallback:t?()=>{"static"!==this._config.backdrop?this.hide():N.trigger(this._element,jn)}:null})}_initializeFocusTrap(){return new sn({trapElement:this._element})}_addEventListeners(){N.on(this._element,Bn,(t=>{"Escape"===t.key&&(this._config.keyboard?this.hide():N.trigger(this._element,jn))}))}static jQueryInterface(t){return this.each((function(){const e=qn.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}N.on(document,Wn,'[data-bs-toggle="offcanvas"]',(function(t){const e=z.getElementFromSelector(this);if(["A","AREA"].includes(this.tagName)&&t.preventDefault(),l(this))return;N.one(e,Fn,(()=>{a(this)&&this.focus()}));const i=z.findOne(In);i&&i!==e&&qn.getInstance(i).hide(),qn.getOrCreateInstance(e).toggle(this)})),N.on(window,Ln,(()=>{for(const t of z.find(In))qn.getOrCreateInstance(t).show()})),N.on(window,Hn,(()=>{for(const t of z.find("[aria-modal][class*=show][class*=offcanvas-]"))"fixed"!==getComputedStyle(t).position&&qn.getOrCreateInstance(t).hide()})),R(qn),m(qn);const Vn={"*":["class","dir","id","lang","role",/^aria-[\w-]*$/i],a:["target","href","title","rel"],area:[],b:[],br:[],col:[],code:[],div:[],em:[],hr:[],h1:[],h2:[],h3:[],h4:[],h5:[],h6:[],i:[],img:["src","srcset","alt","title","width","height"],li:[],ol:[],p:[],pre:[],s:[],small:[],span:[],sub:[],sup:[],strong:[],u:[],ul:[]},Kn=new Set(["background","cite","href","itemtype","longdesc","poster","src","xlink:href"]),Qn=/^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i,Xn=(t,e)=>{const i=t.nodeName.toLowerCase();return e.includes(i)?!Kn.has(i)||Boolean(Qn.test(t.nodeValue)):e.filter((t=>t instanceof RegExp)).some((t=>t.test(i)))},Yn={allowList:Vn,content:{},extraClass:"",html:!1,sanitize:!0,sanitizeFn:null,template:"
"},Un={allowList:"object",content:"object",extraClass:"(string|function)",html:"boolean",sanitize:"boolean",sanitizeFn:"(null|function)",template:"string"},Gn={entry:"(string|element|function|null)",selector:"(string|element)"};class Jn extends H{constructor(t){super(),this._config=this._getConfig(t)}static get Default(){return Yn}static get DefaultType(){return Un}static get NAME(){return"TemplateFactory"}getContent(){return Object.values(this._config.content).map((t=>this._resolvePossibleFunction(t))).filter(Boolean)}hasContent(){return this.getContent().length>0}changeContent(t){return this._checkContent(t),this._config.content={...this._config.content,...t},this}toHtml(){const t=document.createElement("div");t.innerHTML=this._maybeSanitize(this._config.template);for(const[e,i]of Object.entries(this._config.content))this._setContent(t,i,e);const e=t.children[0],i=this._resolvePossibleFunction(this._config.extraClass);return i&&e.classList.add(...i.split(" ")),e}_typeCheckConfig(t){super._typeCheckConfig(t),this._checkContent(t.content)}_checkContent(t){for(const[e,i]of Object.entries(t))super._typeCheckConfig({selector:e,entry:i},Gn)}_setContent(t,e,i){const n=z.findOne(i,t);n&&((e=this._resolvePossibleFunction(e))?o(e)?this._putElementInTemplate(r(e),n):this._config.html?n.innerHTML=this._maybeSanitize(e):n.textContent=e:n.remove())}_maybeSanitize(t){return this._config.sanitize?function(t,e,i){if(!t.length)return t;if(i&&"function"==typeof i)return i(t);const n=(new window.DOMParser).parseFromString(t,"text/html"),s=[].concat(...n.body.querySelectorAll("*"));for(const t of s){const i=t.nodeName.toLowerCase();if(!Object.keys(e).includes(i)){t.remove();continue}const n=[].concat(...t.attributes),s=[].concat(e["*"]||[],e[i]||[]);for(const e of n)Xn(e,s)||t.removeAttribute(e.nodeName)}return n.body.innerHTML}(t,this._config.allowList,this._config.sanitizeFn):t}_resolvePossibleFunction(t){return g(t,[this])}_putElementInTemplate(t,e){if(this._config.html)return e.innerHTML="",void e.append(t);e.textContent=t.textContent}}const Zn=new Set(["sanitize","allowList","sanitizeFn"]),ts="fade",es="show",is=".modal",ns="hide.bs.modal",ss="hover",os="focus",rs={AUTO:"auto",TOP:"top",RIGHT:p()?"left":"right",BOTTOM:"bottom",LEFT:p()?"right":"left"},as={allowList:Vn,animation:!0,boundary:"clippingParents",container:!1,customClass:"",delay:0,fallbackPlacements:["top","right","bottom","left"],html:!1,offset:[0,6],placement:"top",popperConfig:null,sanitize:!0,sanitizeFn:null,selector:!1,template:'',title:"",trigger:"hover focus"},ls={allowList:"object",animation:"boolean",boundary:"(string|element)",container:"(string|element|boolean)",customClass:"(string|function)",delay:"(number|object)",fallbackPlacements:"array",html:"boolean",offset:"(array|string|function)",placement:"(string|function)",popperConfig:"(null|object|function)",sanitize:"boolean",sanitizeFn:"(null|function)",selector:"(string|boolean)",template:"string",title:"(string|element|function)",trigger:"string"};class cs extends W{constructor(t,e){if(void 0===vi)throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)");super(t,e),this._isEnabled=!0,this._timeout=0,this._isHovered=null,this._activeTrigger={},this._popper=null,this._templateFactory=null,this._newContent=null,this.tip=null,this._setListeners(),this._config.selector||this._fixTitle()}static get Default(){return as}static get DefaultType(){return ls}static get NAME(){return"tooltip"}enable(){this._isEnabled=!0}disable(){this._isEnabled=!1}toggleEnabled(){this._isEnabled=!this._isEnabled}toggle(){this._isEnabled&&(this._activeTrigger.click=!this._activeTrigger.click,this._isShown()?this._leave():this._enter())}dispose(){clearTimeout(this._timeout),N.off(this._element.closest(is),ns,this._hideModalHandler),this._element.getAttribute("data-bs-original-title")&&this._element.setAttribute("title",this._element.getAttribute("data-bs-original-title")),this._disposePopper(),super.dispose()}show(){if("none"===this._element.style.display)throw new Error("Please use show on visible elements");if(!this._isWithContent()||!this._isEnabled)return;const t=N.trigger(this._element,this.constructor.eventName("show")),e=(c(this._element)||this._element.ownerDocument.documentElement).contains(this._element);if(t.defaultPrevented||!e)return;this._disposePopper();const i=this._getTipElement();this._element.setAttribute("aria-describedby",i.getAttribute("id"));const{container:n}=this._config;if(this._element.ownerDocument.documentElement.contains(this.tip)||(n.append(i),N.trigger(this._element,this.constructor.eventName("inserted"))),this._popper=this._createPopper(i),i.classList.add(es),"ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))N.on(t,"mouseover",h);this._queueCallback((()=>{N.trigger(this._element,this.constructor.eventName("shown")),!1===this._isHovered&&this._leave(),this._isHovered=!1}),this.tip,this._isAnimated())}hide(){if(this._isShown()&&!N.trigger(this._element,this.constructor.eventName("hide")).defaultPrevented){if(this._getTipElement().classList.remove(es),"ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))N.off(t,"mouseover",h);this._activeTrigger.click=!1,this._activeTrigger[os]=!1,this._activeTrigger[ss]=!1,this._isHovered=null,this._queueCallback((()=>{this._isWithActiveTrigger()||(this._isHovered||this._disposePopper(),this._element.removeAttribute("aria-describedby"),N.trigger(this._element,this.constructor.eventName("hidden")))}),this.tip,this._isAnimated())}}update(){this._popper&&this._popper.update()}_isWithContent(){return Boolean(this._getTitle())}_getTipElement(){return this.tip||(this.tip=this._createTipElement(this._newContent||this._getContentForTemplate())),this.tip}_createTipElement(t){const e=this._getTemplateFactory(t).toHtml();if(!e)return null;e.classList.remove(ts,es),e.classList.add(`bs-${this.constructor.NAME}-auto`);const i=(t=>{do{t+=Math.floor(1e6*Math.random())}while(document.getElementById(t));return t})(this.constructor.NAME).toString();return e.setAttribute("id",i),this._isAnimated()&&e.classList.add(ts),e}setContent(t){this._newContent=t,this._isShown()&&(this._disposePopper(),this.show())}_getTemplateFactory(t){return this._templateFactory?this._templateFactory.changeContent(t):this._templateFactory=new Jn({...this._config,content:t,extraClass:this._resolvePossibleFunction(this._config.customClass)}),this._templateFactory}_getContentForTemplate(){return{".tooltip-inner":this._getTitle()}}_getTitle(){return this._resolvePossibleFunction(this._config.title)||this._element.getAttribute("data-bs-original-title")}_initializeOnDelegatedTarget(t){return this.constructor.getOrCreateInstance(t.delegateTarget,this._getDelegateConfig())}_isAnimated(){return this._config.animation||this.tip&&this.tip.classList.contains(ts)}_isShown(){return this.tip&&this.tip.classList.contains(es)}_createPopper(t){const e=g(this._config.placement,[this,t,this._element]),i=rs[e.toUpperCase()];return bi(this._element,t,this._getPopperConfig(i))}_getOffset(){const{offset:t}=this._config;return"string"==typeof t?t.split(",").map((t=>Number.parseInt(t,10))):"function"==typeof t?e=>t(e,this._element):t}_resolvePossibleFunction(t){return g(t,[this._element])}_getPopperConfig(t){const e={placement:t,modifiers:[{name:"flip",options:{fallbackPlacements:this._config.fallbackPlacements}},{name:"offset",options:{offset:this._getOffset()}},{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"arrow",options:{element:`.${this.constructor.NAME}-arrow`}},{name:"preSetPlacement",enabled:!0,phase:"beforeMain",fn:t=>{this._getTipElement().setAttribute("data-popper-placement",t.state.placement)}}]};return{...e,...g(this._config.popperConfig,[e])}}_setListeners(){const t=this._config.trigger.split(" ");for(const e of t)if("click"===e)N.on(this._element,this.constructor.eventName("click"),this._config.selector,(t=>{this._initializeOnDelegatedTarget(t).toggle()}));else if("manual"!==e){const t=e===ss?this.constructor.eventName("mouseenter"):this.constructor.eventName("focusin"),i=e===ss?this.constructor.eventName("mouseleave"):this.constructor.eventName("focusout");N.on(this._element,t,this._config.selector,(t=>{const e=this._initializeOnDelegatedTarget(t);e._activeTrigger["focusin"===t.type?os:ss]=!0,e._enter()})),N.on(this._element,i,this._config.selector,(t=>{const e=this._initializeOnDelegatedTarget(t);e._activeTrigger["focusout"===t.type?os:ss]=e._element.contains(t.relatedTarget),e._leave()}))}this._hideModalHandler=()=>{this._element&&this.hide()},N.on(this._element.closest(is),ns,this._hideModalHandler)}_fixTitle(){const t=this._element.getAttribute("title");t&&(this._element.getAttribute("aria-label")||this._element.textContent.trim()||this._element.setAttribute("aria-label",t),this._element.setAttribute("data-bs-original-title",t),this._element.removeAttribute("title"))}_enter(){this._isShown()||this._isHovered?this._isHovered=!0:(this._isHovered=!0,this._setTimeout((()=>{this._isHovered&&this.show()}),this._config.delay.show))}_leave(){this._isWithActiveTrigger()||(this._isHovered=!1,this._setTimeout((()=>{this._isHovered||this.hide()}),this._config.delay.hide))}_setTimeout(t,e){clearTimeout(this._timeout),this._timeout=setTimeout(t,e)}_isWithActiveTrigger(){return Object.values(this._activeTrigger).includes(!0)}_getConfig(t){const e=F.getDataAttributes(this._element);for(const t of Object.keys(e))Zn.has(t)&&delete e[t];return t={...e,..."object"==typeof t&&t?t:{}},t=this._mergeConfigObj(t),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}_configAfterMerge(t){return t.container=!1===t.container?document.body:r(t.container),"number"==typeof t.delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),t}_getDelegateConfig(){const t={};for(const[e,i]of Object.entries(this._config))this.constructor.Default[e]!==i&&(t[e]=i);return t.selector=!1,t.trigger="manual",t}_disposePopper(){this._popper&&(this._popper.destroy(),this._popper=null),this.tip&&(this.tip.remove(),this.tip=null)}static jQueryInterface(t){return this.each((function(){const e=cs.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}m(cs);const hs={...cs.Default,content:"",offset:[0,8],placement:"right",template:'',trigger:"click"},ds={...cs.DefaultType,content:"(null|string|element|function)"};class us extends cs{static get Default(){return hs}static get DefaultType(){return ds}static get NAME(){return"popover"}_isWithContent(){return this._getTitle()||this._getContent()}_getContentForTemplate(){return{".popover-header":this._getTitle(),".popover-body":this._getContent()}}_getContent(){return this._resolvePossibleFunction(this._config.content)}static jQueryInterface(t){return this.each((function(){const e=us.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}m(us);const fs=".bs.scrollspy",ps=`activate${fs}`,ms=`click${fs}`,gs=`load${fs}.data-api`,_s="active",bs="[href]",vs=".nav-link",ys=`${vs}, .nav-item > ${vs}, .list-group-item`,ws={offset:null,rootMargin:"0px 0px -25%",smoothScroll:!1,target:null,threshold:[.1,.5,1]},As={offset:"(number|null)",rootMargin:"string",smoothScroll:"boolean",target:"element",threshold:"array"};class Es extends W{constructor(t,e){super(t,e),this._targetLinks=new Map,this._observableSections=new Map,this._rootElement="visible"===getComputedStyle(this._element).overflowY?null:this._element,this._activeTarget=null,this._observer=null,this._previousScrollData={visibleEntryTop:0,parentScrollTop:0},this.refresh()}static get Default(){return ws}static get DefaultType(){return As}static get NAME(){return"scrollspy"}refresh(){this._initializeTargetsAndObservables(),this._maybeEnableSmoothScroll(),this._observer?this._observer.disconnect():this._observer=this._getNewObserver();for(const t of this._observableSections.values())this._observer.observe(t)}dispose(){this._observer.disconnect(),super.dispose()}_configAfterMerge(t){return t.target=r(t.target)||document.body,t.rootMargin=t.offset?`${t.offset}px 0px -30%`:t.rootMargin,"string"==typeof t.threshold&&(t.threshold=t.threshold.split(",").map((t=>Number.parseFloat(t)))),t}_maybeEnableSmoothScroll(){this._config.smoothScroll&&(N.off(this._config.target,ms),N.on(this._config.target,ms,bs,(t=>{const e=this._observableSections.get(t.target.hash);if(e){t.preventDefault();const i=this._rootElement||window,n=e.offsetTop-this._element.offsetTop;if(i.scrollTo)return void i.scrollTo({top:n,behavior:"smooth"});i.scrollTop=n}})))}_getNewObserver(){const t={root:this._rootElement,threshold:this._config.threshold,rootMargin:this._config.rootMargin};return new IntersectionObserver((t=>this._observerCallback(t)),t)}_observerCallback(t){const e=t=>this._targetLinks.get(`#${t.target.id}`),i=t=>{this._previousScrollData.visibleEntryTop=t.target.offsetTop,this._process(e(t))},n=(this._rootElement||document.documentElement).scrollTop,s=n>=this._previousScrollData.parentScrollTop;this._previousScrollData.parentScrollTop=n;for(const o of t){if(!o.isIntersecting){this._activeTarget=null,this._clearActiveClass(e(o));continue}const t=o.target.offsetTop>=this._previousScrollData.visibleEntryTop;if(s&&t){if(i(o),!n)return}else s||t||i(o)}}_initializeTargetsAndObservables(){this._targetLinks=new Map,this._observableSections=new Map;const t=z.find(bs,this._config.target);for(const e of t){if(!e.hash||l(e))continue;const t=z.findOne(decodeURI(e.hash),this._element);a(t)&&(this._targetLinks.set(decodeURI(e.hash),e),this._observableSections.set(e.hash,t))}}_process(t){this._activeTarget!==t&&(this._clearActiveClass(this._config.target),this._activeTarget=t,t.classList.add(_s),this._activateParents(t),N.trigger(this._element,ps,{relatedTarget:t}))}_activateParents(t){if(t.classList.contains("dropdown-item"))z.findOne(".dropdown-toggle",t.closest(".dropdown")).classList.add(_s);else for(const e of z.parents(t,".nav, .list-group"))for(const t of z.prev(e,ys))t.classList.add(_s)}_clearActiveClass(t){t.classList.remove(_s);const e=z.find(`${bs}.${_s}`,t);for(const t of e)t.classList.remove(_s)}static jQueryInterface(t){return this.each((function(){const e=Es.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}))}}N.on(window,gs,(()=>{for(const t of z.find('[data-bs-spy="scroll"]'))Es.getOrCreateInstance(t)})),m(Es);const Ts=".bs.tab",Cs=`hide${Ts}`,Os=`hidden${Ts}`,xs=`show${Ts}`,ks=`shown${Ts}`,Ls=`click${Ts}`,Ss=`keydown${Ts}`,Ds=`load${Ts}`,$s="ArrowLeft",Is="ArrowRight",Ns="ArrowUp",Ps="ArrowDown",Ms="Home",js="End",Fs="active",Hs="fade",Ws="show",Bs=":not(.dropdown-toggle)",zs='[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]',Rs=`.nav-link${Bs}, .list-group-item${Bs}, [role="tab"]${Bs}, ${zs}`,qs=`.${Fs}[data-bs-toggle="tab"], .${Fs}[data-bs-toggle="pill"], .${Fs}[data-bs-toggle="list"]`;class Vs extends W{constructor(t){super(t),this._parent=this._element.closest('.list-group, .nav, [role="tablist"]'),this._parent&&(this._setInitialAttributes(this._parent,this._getChildren()),N.on(this._element,Ss,(t=>this._keydown(t))))}static get NAME(){return"tab"}show(){const t=this._element;if(this._elemIsActive(t))return;const e=this._getActiveElem(),i=e?N.trigger(e,Cs,{relatedTarget:t}):null;N.trigger(t,xs,{relatedTarget:e}).defaultPrevented||i&&i.defaultPrevented||(this._deactivate(e,t),this._activate(t,e))}_activate(t,e){t&&(t.classList.add(Fs),this._activate(z.getElementFromSelector(t)),this._queueCallback((()=>{"tab"===t.getAttribute("role")?(t.removeAttribute("tabindex"),t.setAttribute("aria-selected",!0),this._toggleDropDown(t,!0),N.trigger(t,ks,{relatedTarget:e})):t.classList.add(Ws)}),t,t.classList.contains(Hs)))}_deactivate(t,e){t&&(t.classList.remove(Fs),t.blur(),this._deactivate(z.getElementFromSelector(t)),this._queueCallback((()=>{"tab"===t.getAttribute("role")?(t.setAttribute("aria-selected",!1),t.setAttribute("tabindex","-1"),this._toggleDropDown(t,!1),N.trigger(t,Os,{relatedTarget:e})):t.classList.remove(Ws)}),t,t.classList.contains(Hs)))}_keydown(t){if(![$s,Is,Ns,Ps,Ms,js].includes(t.key))return;t.stopPropagation(),t.preventDefault();const e=this._getChildren().filter((t=>!l(t)));let i;if([Ms,js].includes(t.key))i=e[t.key===Ms?0:e.length-1];else{const n=[Is,Ps].includes(t.key);i=b(e,t.target,n,!0)}i&&(i.focus({preventScroll:!0}),Vs.getOrCreateInstance(i).show())}_getChildren(){return z.find(Rs,this._parent)}_getActiveElem(){return this._getChildren().find((t=>this._elemIsActive(t)))||null}_setInitialAttributes(t,e){this._setAttributeIfNotExists(t,"role","tablist");for(const t of e)this._setInitialAttributesOnChild(t)}_setInitialAttributesOnChild(t){t=this._getInnerElement(t);const e=this._elemIsActive(t),i=this._getOuterElement(t);t.setAttribute("aria-selected",e),i!==t&&this._setAttributeIfNotExists(i,"role","presentation"),e||t.setAttribute("tabindex","-1"),this._setAttributeIfNotExists(t,"role","tab"),this._setInitialAttributesOnTargetPanel(t)}_setInitialAttributesOnTargetPanel(t){const e=z.getElementFromSelector(t);e&&(this._setAttributeIfNotExists(e,"role","tabpanel"),t.id&&this._setAttributeIfNotExists(e,"aria-labelledby",`${t.id}`))}_toggleDropDown(t,e){const i=this._getOuterElement(t);if(!i.classList.contains("dropdown"))return;const n=(t,n)=>{const s=z.findOne(t,i);s&&s.classList.toggle(n,e)};n(".dropdown-toggle",Fs),n(".dropdown-menu",Ws),i.setAttribute("aria-expanded",e)}_setAttributeIfNotExists(t,e,i){t.hasAttribute(e)||t.setAttribute(e,i)}_elemIsActive(t){return t.classList.contains(Fs)}_getInnerElement(t){return t.matches(Rs)?t:z.findOne(Rs,t)}_getOuterElement(t){return t.closest(".nav-item, .list-group-item")||t}static jQueryInterface(t){return this.each((function(){const e=Vs.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}))}}N.on(document,Ls,zs,(function(t){["A","AREA"].includes(this.tagName)&&t.preventDefault(),l(this)||Vs.getOrCreateInstance(this).show()})),N.on(window,Ds,(()=>{for(const t of z.find(qs))Vs.getOrCreateInstance(t)})),m(Vs);const Ks=".bs.toast",Qs=`mouseover${Ks}`,Xs=`mouseout${Ks}`,Ys=`focusin${Ks}`,Us=`focusout${Ks}`,Gs=`hide${Ks}`,Js=`hidden${Ks}`,Zs=`show${Ks}`,to=`shown${Ks}`,eo="hide",io="show",no="showing",so={animation:"boolean",autohide:"boolean",delay:"number"},oo={animation:!0,autohide:!0,delay:5e3};class ro extends W{constructor(t,e){super(t,e),this._timeout=null,this._hasMouseInteraction=!1,this._hasKeyboardInteraction=!1,this._setListeners()}static get Default(){return oo}static get DefaultType(){return so}static get NAME(){return"toast"}show(){N.trigger(this._element,Zs).defaultPrevented||(this._clearTimeout(),this._config.animation&&this._element.classList.add("fade"),this._element.classList.remove(eo),d(this._element),this._element.classList.add(io,no),this._queueCallback((()=>{this._element.classList.remove(no),N.trigger(this._element,to),this._maybeScheduleHide()}),this._element,this._config.animation))}hide(){this.isShown()&&(N.trigger(this._element,Gs).defaultPrevented||(this._element.classList.add(no),this._queueCallback((()=>{this._element.classList.add(eo),this._element.classList.remove(no,io),N.trigger(this._element,Js)}),this._element,this._config.animation)))}dispose(){this._clearTimeout(),this.isShown()&&this._element.classList.remove(io),super.dispose()}isShown(){return this._element.classList.contains(io)}_maybeScheduleHide(){this._config.autohide&&(this._hasMouseInteraction||this._hasKeyboardInteraction||(this._timeout=setTimeout((()=>{this.hide()}),this._config.delay)))}_onInteraction(t,e){switch(t.type){case"mouseover":case"mouseout":this._hasMouseInteraction=e;break;case"focusin":case"focusout":this._hasKeyboardInteraction=e}if(e)return void this._clearTimeout();const i=t.relatedTarget;this._element===i||this._element.contains(i)||this._maybeScheduleHide()}_setListeners(){N.on(this._element,Qs,(t=>this._onInteraction(t,!0))),N.on(this._element,Xs,(t=>this._onInteraction(t,!1))),N.on(this._element,Ys,(t=>this._onInteraction(t,!0))),N.on(this._element,Us,(t=>this._onInteraction(t,!1)))}_clearTimeout(){clearTimeout(this._timeout),this._timeout=null}static jQueryInterface(t){return this.each((function(){const e=ro.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}return R(ro),m(ro),{Alert:Q,Button:Y,Carousel:xt,Collapse:Bt,Dropdown:qi,Modal:On,Offcanvas:qn,Popover:us,ScrollSpy:Es,Tab:Vs,Toast:ro,Tooltip:cs}}));
+//# sourceMappingURL=bootstrap.bundle.min.js.map
\ No newline at end of file
diff --git a/docs/deps/bootstrap-5.3.1/bootstrap.bundle.min.js.map b/docs/deps/bootstrap-5.3.1/bootstrap.bundle.min.js.map
new file mode 100644
index 00000000..3863da8b
--- /dev/null
+++ b/docs/deps/bootstrap-5.3.1/bootstrap.bundle.min.js.map
@@ -0,0 +1 @@
+{"version":3,"names":["elementMap","Map","Data","set","element","key","instance","has","instanceMap","get","size","console","error","Array","from","keys","remove","delete","TRANSITION_END","parseSelector","selector","window","CSS","escape","replace","match","id","triggerTransitionEnd","dispatchEvent","Event","isElement","object","jquery","nodeType","getElement","length","document","querySelector","isVisible","getClientRects","elementIsVisible","getComputedStyle","getPropertyValue","closedDetails","closest","summary","parentNode","isDisabled","Node","ELEMENT_NODE","classList","contains","disabled","hasAttribute","getAttribute","findShadowRoot","documentElement","attachShadow","getRootNode","root","ShadowRoot","noop","reflow","offsetHeight","getjQuery","jQuery","body","DOMContentLoadedCallbacks","isRTL","dir","defineJQueryPlugin","plugin","callback","$","name","NAME","JQUERY_NO_CONFLICT","fn","jQueryInterface","Constructor","noConflict","readyState","addEventListener","push","execute","possibleCallback","args","defaultValue","executeAfterTransition","transitionElement","waitForTransition","emulatedDuration","transitionDuration","transitionDelay","floatTransitionDuration","Number","parseFloat","floatTransitionDelay","split","getTransitionDurationFromElement","called","handler","target","removeEventListener","setTimeout","getNextActiveElement","list","activeElement","shouldGetNext","isCycleAllowed","listLength","index","indexOf","Math","max","min","namespaceRegex","stripNameRegex","stripUidRegex","eventRegistry","uidEvent","customEvents","mouseenter","mouseleave","nativeEvents","Set","makeEventUid","uid","getElementEvents","findHandler","events","callable","delegationSelector","Object","values","find","event","normalizeParameters","originalTypeEvent","delegationFunction","isDelegated","typeEvent","getTypeEvent","addHandler","oneOff","wrapFunction","relatedTarget","delegateTarget","call","this","handlers","previousFunction","domElements","querySelectorAll","domElement","hydrateObj","EventHandler","off","type","apply","bootstrapDelegationHandler","bootstrapHandler","removeHandler","Boolean","removeNamespacedHandlers","namespace","storeElementEvent","handlerKey","entries","includes","on","one","inNamespace","isNamespace","startsWith","elementEvent","slice","keyHandlers","trigger","jQueryEvent","bubbles","nativeDispatch","defaultPrevented","isPropagationStopped","isImmediatePropagationStopped","isDefaultPrevented","evt","cancelable","preventDefault","obj","meta","value","_unused","defineProperty","configurable","normalizeData","toString","JSON","parse","decodeURIComponent","normalizeDataKey","chr","toLowerCase","Manipulator","setDataAttribute","setAttribute","removeDataAttribute","removeAttribute","getDataAttributes","attributes","bsKeys","dataset","filter","pureKey","charAt","getDataAttribute","Config","Default","DefaultType","Error","_getConfig","config","_mergeConfigObj","_configAfterMerge","_typeCheckConfig","jsonConfig","constructor","configTypes","property","expectedTypes","valueType","prototype","RegExp","test","TypeError","toUpperCase","BaseComponent","super","_element","_config","DATA_KEY","dispose","EVENT_KEY","propertyName","getOwnPropertyNames","_queueCallback","isAnimated","getInstance","getOrCreateInstance","VERSION","eventName","getSelector","hrefAttribute","trim","SelectorEngine","concat","Element","findOne","children","child","matches","parents","ancestor","prev","previous","previousElementSibling","next","nextElementSibling","focusableChildren","focusables","map","join","el","getSelectorFromElement","getElementFromSelector","getMultipleElementsFromSelector","enableDismissTrigger","component","method","clickEvent","tagName","EVENT_CLOSE","EVENT_CLOSED","Alert","close","_destroyElement","each","data","undefined","SELECTOR_DATA_TOGGLE","Button","toggle","button","EVENT_TOUCHSTART","EVENT_TOUCHMOVE","EVENT_TOUCHEND","EVENT_POINTERDOWN","EVENT_POINTERUP","endCallback","leftCallback","rightCallback","Swipe","isSupported","_deltaX","_supportPointerEvents","PointerEvent","_initEvents","_start","_eventIsPointerPenTouch","clientX","touches","_end","_handleSwipe","_move","absDeltaX","abs","direction","add","pointerType","navigator","maxTouchPoints","DATA_API_KEY","ORDER_NEXT","ORDER_PREV","DIRECTION_LEFT","DIRECTION_RIGHT","EVENT_SLIDE","EVENT_SLID","EVENT_KEYDOWN","EVENT_MOUSEENTER","EVENT_MOUSELEAVE","EVENT_DRAG_START","EVENT_LOAD_DATA_API","EVENT_CLICK_DATA_API","CLASS_NAME_CAROUSEL","CLASS_NAME_ACTIVE","SELECTOR_ACTIVE","SELECTOR_ITEM","SELECTOR_ACTIVE_ITEM","KEY_TO_DIRECTION","ArrowLeft","ArrowRight","interval","keyboard","pause","ride","touch","wrap","Carousel","_interval","_activeElement","_isSliding","touchTimeout","_swipeHelper","_indicatorsElement","_addEventListeners","cycle","_slide","nextWhenVisible","hidden","_clearInterval","_updateInterval","setInterval","_maybeEnableCycle","to","items","_getItems","activeIndex","_getItemIndex","_getActive","order","defaultInterval","_keydown","_addTouchEventListeners","img","swipeConfig","_directionToOrder","endCallBack","clearTimeout","_setActiveIndicatorElement","activeIndicator","newActiveIndicator","elementInterval","parseInt","isNext","nextElement","nextElementIndex","triggerEvent","_orderToDirection","isCycling","directionalClassName","orderClassName","completeCallBack","_isAnimated","clearInterval","carousel","slideIndex","carousels","EVENT_SHOW","EVENT_SHOWN","EVENT_HIDE","EVENT_HIDDEN","CLASS_NAME_SHOW","CLASS_NAME_COLLAPSE","CLASS_NAME_COLLAPSING","CLASS_NAME_DEEPER_CHILDREN","parent","Collapse","_isTransitioning","_triggerArray","toggleList","elem","filterElement","foundElement","_initializeChildren","_addAriaAndCollapsedClass","_isShown","hide","show","activeChildren","_getFirstLevelChildren","activeInstance","dimension","_getDimension","style","scrollSize","complete","getBoundingClientRect","selected","triggerArray","isOpen","top","bottom","right","left","auto","basePlacements","start","end","clippingParents","viewport","popper","reference","variationPlacements","reduce","acc","placement","placements","beforeRead","read","afterRead","beforeMain","main","afterMain","beforeWrite","write","afterWrite","modifierPhases","getNodeName","nodeName","getWindow","node","ownerDocument","defaultView","isHTMLElement","HTMLElement","isShadowRoot","applyStyles$1","enabled","phase","_ref","state","elements","forEach","styles","assign","effect","_ref2","initialStyles","position","options","strategy","margin","arrow","hasOwnProperty","attribute","requires","getBasePlacement","round","getUAString","uaData","userAgentData","brands","isArray","item","brand","version","userAgent","isLayoutViewport","includeScale","isFixedStrategy","clientRect","scaleX","scaleY","offsetWidth","width","height","visualViewport","addVisualOffsets","x","offsetLeft","y","offsetTop","getLayoutRect","rootNode","isSameNode","host","isTableElement","getDocumentElement","getParentNode","assignedSlot","getTrueOffsetParent","offsetParent","getOffsetParent","isFirefox","currentNode","css","transform","perspective","contain","willChange","getContainingBlock","getMainAxisFromPlacement","within","mathMax","mathMin","mergePaddingObject","paddingObject","expandToHashMap","hashMap","arrow$1","_state$modifiersData$","arrowElement","popperOffsets","modifiersData","basePlacement","axis","len","padding","rects","toPaddingObject","arrowRect","minProp","maxProp","endDiff","startDiff","arrowOffsetParent","clientSize","clientHeight","clientWidth","centerToReference","center","offset","axisProp","centerOffset","_options$element","requiresIfExists","getVariation","unsetSides","mapToStyles","_Object$assign2","popperRect","variation","offsets","gpuAcceleration","adaptive","roundOffsets","isFixed","_offsets$x","_offsets$y","_ref3","hasX","hasY","sideX","sideY","win","heightProp","widthProp","_Object$assign","commonStyles","_ref4","dpr","devicePixelRatio","roundOffsetsByDPR","computeStyles$1","_ref5","_options$gpuAccelerat","_options$adaptive","_options$roundOffsets","passive","eventListeners","_options$scroll","scroll","_options$resize","resize","scrollParents","scrollParent","update","hash","getOppositePlacement","matched","getOppositeVariationPlacement","getWindowScroll","scrollLeft","pageXOffset","scrollTop","pageYOffset","getWindowScrollBarX","isScrollParent","_getComputedStyle","overflow","overflowX","overflowY","getScrollParent","listScrollParents","_element$ownerDocumen","isBody","updatedList","rectToClientRect","rect","getClientRectFromMixedType","clippingParent","html","layoutViewport","getViewportRect","clientTop","clientLeft","getInnerBoundingClientRect","winScroll","scrollWidth","scrollHeight","getDocumentRect","computeOffsets","commonX","commonY","mainAxis","detectOverflow","_options","_options$placement","_options$strategy","_options$boundary","boundary","_options$rootBoundary","rootBoundary","_options$elementConte","elementContext","_options$altBoundary","altBoundary","_options$padding","altContext","clippingClientRect","mainClippingParents","clipperElement","getClippingParents","firstClippingParent","clippingRect","accRect","getClippingRect","contextElement","referenceClientRect","popperClientRect","elementClientRect","overflowOffsets","offsetData","multiply","computeAutoPlacement","flipVariations","_options$allowedAutoP","allowedAutoPlacements","allPlacements","allowedPlacements","overflows","sort","a","b","flip$1","_skip","_options$mainAxis","checkMainAxis","_options$altAxis","altAxis","checkAltAxis","specifiedFallbackPlacements","fallbackPlacements","_options$flipVariatio","preferredPlacement","oppositePlacement","getExpandedFallbackPlacements","referenceRect","checksMap","makeFallbackChecks","firstFittingPlacement","i","_basePlacement","isStartVariation","isVertical","mainVariationSide","altVariationSide","checks","every","check","_loop","_i","fittingPlacement","reset","getSideOffsets","preventedOffsets","isAnySideFullyClipped","some","side","hide$1","preventOverflow","referenceOverflow","popperAltOverflow","referenceClippingOffsets","popperEscapeOffsets","isReferenceHidden","hasPopperEscaped","offset$1","_options$offset","invertDistance","skidding","distance","distanceAndSkiddingToXY","_data$state$placement","popperOffsets$1","preventOverflow$1","_options$tether","tether","_options$tetherOffset","tetherOffset","isBasePlacement","tetherOffsetValue","normalizedTetherOffsetValue","offsetModifierState","_offsetModifierState$","mainSide","altSide","additive","minLen","maxLen","arrowPaddingObject","arrowPaddingMin","arrowPaddingMax","arrowLen","minOffset","maxOffset","clientOffset","offsetModifierValue","tetherMax","preventedOffset","_offsetModifierState$2","_mainSide","_altSide","_offset","_len","_min","_max","isOriginSide","_offsetModifierValue","_tetherMin","_tetherMax","_preventedOffset","v","withinMaxClamp","getCompositeRect","elementOrVirtualElement","isOffsetParentAnElement","offsetParentIsScaled","isElementScaled","modifiers","visited","result","modifier","dep","depModifier","DEFAULT_OPTIONS","areValidElements","arguments","_key","popperGenerator","generatorOptions","_generatorOptions","_generatorOptions$def","defaultModifiers","_generatorOptions$def2","defaultOptions","pending","orderedModifiers","effectCleanupFns","isDestroyed","setOptions","setOptionsAction","cleanupModifierEffects","merged","orderModifiers","current","existing","m","_ref$options","cleanupFn","forceUpdate","_state$elements","_state$orderedModifie","_state$orderedModifie2","Promise","resolve","then","destroy","onFirstUpdate","createPopper","computeStyles","applyStyles","flip","ARROW_UP_KEY","ARROW_DOWN_KEY","EVENT_KEYDOWN_DATA_API","EVENT_KEYUP_DATA_API","SELECTOR_DATA_TOGGLE_SHOWN","SELECTOR_MENU","PLACEMENT_TOP","PLACEMENT_TOPEND","PLACEMENT_BOTTOM","PLACEMENT_BOTTOMEND","PLACEMENT_RIGHT","PLACEMENT_LEFT","autoClose","display","popperConfig","Dropdown","_popper","_parent","_menu","_inNavbar","_detectNavbar","_createPopper","focus","_completeHide","Popper","referenceElement","_getPopperConfig","_getPlacement","parentDropdown","isEnd","_getOffset","popperData","defaultBsPopperConfig","_selectMenuItem","clearMenus","openToggles","context","composedPath","isMenuTarget","dataApiKeydownHandler","isInput","isEscapeEvent","isUpOrDownEvent","getToggleButton","stopPropagation","EVENT_MOUSEDOWN","className","clickCallback","rootElement","Backdrop","_isAppended","_append","_getElement","_emulateAnimation","backdrop","createElement","append","EVENT_FOCUSIN","EVENT_KEYDOWN_TAB","TAB_NAV_BACKWARD","autofocus","trapElement","FocusTrap","_isActive","_lastTabNavDirection","activate","_handleFocusin","_handleKeydown","deactivate","shiftKey","SELECTOR_FIXED_CONTENT","SELECTOR_STICKY_CONTENT","PROPERTY_PADDING","PROPERTY_MARGIN","ScrollBarHelper","getWidth","documentWidth","innerWidth","_disableOverFlow","_setElementAttributes","calculatedValue","_resetElementAttributes","isOverflowing","_saveInitialAttribute","styleProperty","scrollbarWidth","_applyManipulationCallback","setProperty","actualValue","removeProperty","callBack","sel","EVENT_HIDE_PREVENTED","EVENT_RESIZE","EVENT_CLICK_DISMISS","EVENT_MOUSEDOWN_DISMISS","EVENT_KEYDOWN_DISMISS","CLASS_NAME_OPEN","CLASS_NAME_STATIC","Modal","_dialog","_backdrop","_initializeBackDrop","_focustrap","_initializeFocusTrap","_scrollBar","_adjustDialog","_showElement","_hideModal","handleUpdate","modalBody","transitionComplete","_triggerBackdropTransition","event2","_resetAdjustments","isModalOverflowing","initialOverflowY","isBodyOverflowing","paddingLeft","paddingRight","showEvent","alreadyOpen","CLASS_NAME_SHOWING","CLASS_NAME_HIDING","OPEN_SELECTOR","Offcanvas","blur","completeCallback","DefaultAllowlist","area","br","col","code","div","em","hr","h1","h2","h3","h4","h5","h6","li","ol","p","pre","s","small","span","sub","sup","strong","u","ul","uriAttributes","SAFE_URL_PATTERN","allowedAttribute","allowedAttributeList","attributeName","nodeValue","attributeRegex","regex","allowList","content","extraClass","sanitize","sanitizeFn","template","DefaultContentType","entry","TemplateFactory","getContent","_resolvePossibleFunction","hasContent","changeContent","_checkContent","toHtml","templateWrapper","innerHTML","_maybeSanitize","text","_setContent","arg","templateElement","_putElementInTemplate","textContent","unsafeHtml","sanitizeFunction","createdDocument","DOMParser","parseFromString","elementName","attributeList","allowedAttributes","sanitizeHtml","DISALLOWED_ATTRIBUTES","CLASS_NAME_FADE","SELECTOR_MODAL","EVENT_MODAL_HIDE","TRIGGER_HOVER","TRIGGER_FOCUS","AttachmentMap","AUTO","TOP","RIGHT","BOTTOM","LEFT","animation","container","customClass","delay","title","Tooltip","_isEnabled","_timeout","_isHovered","_activeTrigger","_templateFactory","_newContent","tip","_setListeners","_fixTitle","enable","disable","toggleEnabled","click","_leave","_enter","_hideModalHandler","_disposePopper","_isWithContent","isInTheDom","_getTipElement","_isWithActiveTrigger","_getTitle","_createTipElement","_getContentForTemplate","_getTemplateFactory","tipId","prefix","floor","random","getElementById","getUID","setContent","_initializeOnDelegatedTarget","_getDelegateConfig","attachment","triggers","eventIn","eventOut","_setTimeout","timeout","dataAttributes","dataAttribute","Popover","_getContent","EVENT_ACTIVATE","EVENT_CLICK","SELECTOR_TARGET_LINKS","SELECTOR_NAV_LINKS","SELECTOR_LINK_ITEMS","rootMargin","smoothScroll","threshold","ScrollSpy","_targetLinks","_observableSections","_rootElement","_activeTarget","_observer","_previousScrollData","visibleEntryTop","parentScrollTop","refresh","_initializeTargetsAndObservables","_maybeEnableSmoothScroll","disconnect","_getNewObserver","section","observe","observableSection","scrollTo","behavior","IntersectionObserver","_observerCallback","targetElement","_process","userScrollsDown","isIntersecting","_clearActiveClass","entryIsLowerThanPrevious","targetLinks","anchor","decodeURI","_activateParents","listGroup","activeNodes","spy","ARROW_LEFT_KEY","ARROW_RIGHT_KEY","HOME_KEY","END_KEY","NOT_SELECTOR_DROPDOWN_TOGGLE","SELECTOR_INNER_ELEM","SELECTOR_DATA_TOGGLE_ACTIVE","Tab","_setInitialAttributes","_getChildren","innerElem","_elemIsActive","active","_getActiveElem","hideEvent","_deactivate","_activate","relatedElem","_toggleDropDown","nextActiveElement","preventScroll","_setAttributeIfNotExists","_setInitialAttributesOnChild","_getInnerElement","isActive","outerElem","_getOuterElement","_setInitialAttributesOnTargetPanel","open","EVENT_MOUSEOVER","EVENT_MOUSEOUT","EVENT_FOCUSOUT","CLASS_NAME_HIDE","autohide","Toast","_hasMouseInteraction","_hasKeyboardInteraction","_clearTimeout","_maybeScheduleHide","isShown","_onInteraction","isInteracting"],"sources":["../../js/src/dom/data.js","../../js/src/util/index.js","../../js/src/dom/event-handler.js","../../js/src/dom/manipulator.js","../../js/src/util/config.js","../../js/src/base-component.js","../../js/src/dom/selector-engine.js","../../js/src/util/component-functions.js","../../js/src/alert.js","../../js/src/button.js","../../js/src/util/swipe.js","../../js/src/carousel.js","../../js/src/collapse.js","../../node_modules/@popperjs/core/lib/enums.js","../../node_modules/@popperjs/core/lib/dom-utils/getNodeName.js","../../node_modules/@popperjs/core/lib/dom-utils/getWindow.js","../../node_modules/@popperjs/core/lib/dom-utils/instanceOf.js","../../node_modules/@popperjs/core/lib/modifiers/applyStyles.js","../../node_modules/@popperjs/core/lib/utils/getBasePlacement.js","../../node_modules/@popperjs/core/lib/utils/math.js","../../node_modules/@popperjs/core/lib/utils/userAgent.js","../../node_modules/@popperjs/core/lib/dom-utils/isLayoutViewport.js","../../node_modules/@popperjs/core/lib/dom-utils/getBoundingClientRect.js","../../node_modules/@popperjs/core/lib/dom-utils/getLayoutRect.js","../../node_modules/@popperjs/core/lib/dom-utils/contains.js","../../node_modules/@popperjs/core/lib/dom-utils/getComputedStyle.js","../../node_modules/@popperjs/core/lib/dom-utils/isTableElement.js","../../node_modules/@popperjs/core/lib/dom-utils/getDocumentElement.js","../../node_modules/@popperjs/core/lib/dom-utils/getParentNode.js","../../node_modules/@popperjs/core/lib/dom-utils/getOffsetParent.js","../../node_modules/@popperjs/core/lib/utils/getMainAxisFromPlacement.js","../../node_modules/@popperjs/core/lib/utils/within.js","../../node_modules/@popperjs/core/lib/utils/mergePaddingObject.js","../../node_modules/@popperjs/core/lib/utils/getFreshSideObject.js","../../node_modules/@popperjs/core/lib/utils/expandToHashMap.js","../../node_modules/@popperjs/core/lib/modifiers/arrow.js","../../node_modules/@popperjs/core/lib/utils/getVariation.js","../../node_modules/@popperjs/core/lib/modifiers/computeStyles.js","../../node_modules/@popperjs/core/lib/modifiers/eventListeners.js","../../node_modules/@popperjs/core/lib/utils/getOppositePlacement.js","../../node_modules/@popperjs/core/lib/utils/getOppositeVariationPlacement.js","../../node_modules/@popperjs/core/lib/dom-utils/getWindowScroll.js","../../node_modules/@popperjs/core/lib/dom-utils/getWindowScrollBarX.js","../../node_modules/@popperjs/core/lib/dom-utils/isScrollParent.js","../../node_modules/@popperjs/core/lib/dom-utils/getScrollParent.js","../../node_modules/@popperjs/core/lib/dom-utils/listScrollParents.js","../../node_modules/@popperjs/core/lib/utils/rectToClientRect.js","../../node_modules/@popperjs/core/lib/dom-utils/getClippingRect.js","../../node_modules/@popperjs/core/lib/dom-utils/getViewportRect.js","../../node_modules/@popperjs/core/lib/dom-utils/getDocumentRect.js","../../node_modules/@popperjs/core/lib/utils/computeOffsets.js","../../node_modules/@popperjs/core/lib/utils/detectOverflow.js","../../node_modules/@popperjs/core/lib/utils/computeAutoPlacement.js","../../node_modules/@popperjs/core/lib/modifiers/flip.js","../../node_modules/@popperjs/core/lib/modifiers/hide.js","../../node_modules/@popperjs/core/lib/modifiers/offset.js","../../node_modules/@popperjs/core/lib/modifiers/popperOffsets.js","../../node_modules/@popperjs/core/lib/modifiers/preventOverflow.js","../../node_modules/@popperjs/core/lib/utils/getAltAxis.js","../../node_modules/@popperjs/core/lib/dom-utils/getCompositeRect.js","../../node_modules/@popperjs/core/lib/dom-utils/getNodeScroll.js","../../node_modules/@popperjs/core/lib/dom-utils/getHTMLElementScroll.js","../../node_modules/@popperjs/core/lib/utils/orderModifiers.js","../../node_modules/@popperjs/core/lib/createPopper.js","../../node_modules/@popperjs/core/lib/utils/debounce.js","../../node_modules/@popperjs/core/lib/utils/mergeByName.js","../../node_modules/@popperjs/core/lib/popper-lite.js","../../node_modules/@popperjs/core/lib/popper.js","../../js/src/dropdown.js","../../js/src/util/backdrop.js","../../js/src/util/focustrap.js","../../js/src/util/scrollbar.js","../../js/src/modal.js","../../js/src/offcanvas.js","../../js/src/util/sanitizer.js","../../js/src/util/template-factory.js","../../js/src/tooltip.js","../../js/src/popover.js","../../js/src/scrollspy.js","../../js/src/tab.js","../../js/src/toast.js","../../js/index.umd.js"],"sourcesContent":["/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/data.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n/**\n * Constants\n */\n\nconst elementMap = new Map()\n\nexport default {\n set(element, key, instance) {\n if (!elementMap.has(element)) {\n elementMap.set(element, new Map())\n }\n\n const instanceMap = elementMap.get(element)\n\n // make it clear we only want one instance per element\n // can be removed later when multiple key/instances are fine to be used\n if (!instanceMap.has(key) && instanceMap.size !== 0) {\n // eslint-disable-next-line no-console\n console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(instanceMap.keys())[0]}.`)\n return\n }\n\n instanceMap.set(key, instance)\n },\n\n get(element, key) {\n if (elementMap.has(element)) {\n return elementMap.get(element).get(key) || null\n }\n\n return null\n },\n\n remove(element, key) {\n if (!elementMap.has(element)) {\n return\n }\n\n const instanceMap = elementMap.get(element)\n\n instanceMap.delete(key)\n\n // free up element references if there are no instances left for an element\n if (instanceMap.size === 0) {\n elementMap.delete(element)\n }\n }\n}\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/index.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nconst MAX_UID = 1_000_000\nconst MILLISECONDS_MULTIPLIER = 1000\nconst TRANSITION_END = 'transitionend'\n\n/**\n * Properly escape IDs selectors to handle weird IDs\n * @param {string} selector\n * @returns {string}\n */\nconst parseSelector = selector => {\n if (selector && window.CSS && window.CSS.escape) {\n // document.querySelector needs escaping to handle IDs (html5+) containing for instance /\n selector = selector.replace(/#([^\\s\"#']+)/g, (match, id) => `#${CSS.escape(id)}`)\n }\n\n return selector\n}\n\n// Shout-out Angus Croll (https://goo.gl/pxwQGp)\nconst toType = object => {\n if (object === null || object === undefined) {\n return `${object}`\n }\n\n return Object.prototype.toString.call(object).match(/\\s([a-z]+)/i)[1].toLowerCase()\n}\n\n/**\n * Public Util API\n */\n\nconst getUID = prefix => {\n do {\n prefix += Math.floor(Math.random() * MAX_UID)\n } while (document.getElementById(prefix))\n\n return prefix\n}\n\nconst getTransitionDurationFromElement = element => {\n if (!element) {\n return 0\n }\n\n // Get transition-duration of the element\n let { transitionDuration, transitionDelay } = window.getComputedStyle(element)\n\n const floatTransitionDuration = Number.parseFloat(transitionDuration)\n const floatTransitionDelay = Number.parseFloat(transitionDelay)\n\n // Return 0 if element or transition duration is not found\n if (!floatTransitionDuration && !floatTransitionDelay) {\n return 0\n }\n\n // If multiple durations are defined, take the first\n transitionDuration = transitionDuration.split(',')[0]\n transitionDelay = transitionDelay.split(',')[0]\n\n return (Number.parseFloat(transitionDuration) + Number.parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER\n}\n\nconst triggerTransitionEnd = element => {\n element.dispatchEvent(new Event(TRANSITION_END))\n}\n\nconst isElement = object => {\n if (!object || typeof object !== 'object') {\n return false\n }\n\n if (typeof object.jquery !== 'undefined') {\n object = object[0]\n }\n\n return typeof object.nodeType !== 'undefined'\n}\n\nconst getElement = object => {\n // it's a jQuery object or a node element\n if (isElement(object)) {\n return object.jquery ? object[0] : object\n }\n\n if (typeof object === 'string' && object.length > 0) {\n return document.querySelector(parseSelector(object))\n }\n\n return null\n}\n\nconst isVisible = element => {\n if (!isElement(element) || element.getClientRects().length === 0) {\n return false\n }\n\n const elementIsVisible = getComputedStyle(element).getPropertyValue('visibility') === 'visible'\n // Handle `details` element as its content may falsie appear visible when it is closed\n const closedDetails = element.closest('details:not([open])')\n\n if (!closedDetails) {\n return elementIsVisible\n }\n\n if (closedDetails !== element) {\n const summary = element.closest('summary')\n if (summary && summary.parentNode !== closedDetails) {\n return false\n }\n\n if (summary === null) {\n return false\n }\n }\n\n return elementIsVisible\n}\n\nconst isDisabled = element => {\n if (!element || element.nodeType !== Node.ELEMENT_NODE) {\n return true\n }\n\n if (element.classList.contains('disabled')) {\n return true\n }\n\n if (typeof element.disabled !== 'undefined') {\n return element.disabled\n }\n\n return element.hasAttribute('disabled') && element.getAttribute('disabled') !== 'false'\n}\n\nconst findShadowRoot = element => {\n if (!document.documentElement.attachShadow) {\n return null\n }\n\n // Can find the shadow root otherwise it'll return the document\n if (typeof element.getRootNode === 'function') {\n const root = element.getRootNode()\n return root instanceof ShadowRoot ? root : null\n }\n\n if (element instanceof ShadowRoot) {\n return element\n }\n\n // when we don't find a shadow root\n if (!element.parentNode) {\n return null\n }\n\n return findShadowRoot(element.parentNode)\n}\n\nconst noop = () => {}\n\n/**\n * Trick to restart an element's animation\n *\n * @param {HTMLElement} element\n * @return void\n *\n * @see https://www.charistheo.io/blog/2021/02/restart-a-css-animation-with-javascript/#restarting-a-css-animation\n */\nconst reflow = element => {\n element.offsetHeight // eslint-disable-line no-unused-expressions\n}\n\nconst getjQuery = () => {\n if (window.jQuery && !document.body.hasAttribute('data-bs-no-jquery')) {\n return window.jQuery\n }\n\n return null\n}\n\nconst DOMContentLoadedCallbacks = []\n\nconst onDOMContentLoaded = callback => {\n if (document.readyState === 'loading') {\n // add listener on the first call when the document is in loading state\n if (!DOMContentLoadedCallbacks.length) {\n document.addEventListener('DOMContentLoaded', () => {\n for (const callback of DOMContentLoadedCallbacks) {\n callback()\n }\n })\n }\n\n DOMContentLoadedCallbacks.push(callback)\n } else {\n callback()\n }\n}\n\nconst isRTL = () => document.documentElement.dir === 'rtl'\n\nconst defineJQueryPlugin = plugin => {\n onDOMContentLoaded(() => {\n const $ = getjQuery()\n /* istanbul ignore if */\n if ($) {\n const name = plugin.NAME\n const JQUERY_NO_CONFLICT = $.fn[name]\n $.fn[name] = plugin.jQueryInterface\n $.fn[name].Constructor = plugin\n $.fn[name].noConflict = () => {\n $.fn[name] = JQUERY_NO_CONFLICT\n return plugin.jQueryInterface\n }\n }\n })\n}\n\nconst execute = (possibleCallback, args = [], defaultValue = possibleCallback) => {\n return typeof possibleCallback === 'function' ? possibleCallback(...args) : defaultValue\n}\n\nconst executeAfterTransition = (callback, transitionElement, waitForTransition = true) => {\n if (!waitForTransition) {\n execute(callback)\n return\n }\n\n const durationPadding = 5\n const emulatedDuration = getTransitionDurationFromElement(transitionElement) + durationPadding\n\n let called = false\n\n const handler = ({ target }) => {\n if (target !== transitionElement) {\n return\n }\n\n called = true\n transitionElement.removeEventListener(TRANSITION_END, handler)\n execute(callback)\n }\n\n transitionElement.addEventListener(TRANSITION_END, handler)\n setTimeout(() => {\n if (!called) {\n triggerTransitionEnd(transitionElement)\n }\n }, emulatedDuration)\n}\n\n/**\n * Return the previous/next element of a list.\n *\n * @param {array} list The list of elements\n * @param activeElement The active element\n * @param shouldGetNext Choose to get next or previous element\n * @param isCycleAllowed\n * @return {Element|elem} The proper element\n */\nconst getNextActiveElement = (list, activeElement, shouldGetNext, isCycleAllowed) => {\n const listLength = list.length\n let index = list.indexOf(activeElement)\n\n // if the element does not exist in the list return an element\n // depending on the direction and if cycle is allowed\n if (index === -1) {\n return !shouldGetNext && isCycleAllowed ? list[listLength - 1] : list[0]\n }\n\n index += shouldGetNext ? 1 : -1\n\n if (isCycleAllowed) {\n index = (index + listLength) % listLength\n }\n\n return list[Math.max(0, Math.min(index, listLength - 1))]\n}\n\nexport {\n defineJQueryPlugin,\n execute,\n executeAfterTransition,\n findShadowRoot,\n getElement,\n getjQuery,\n getNextActiveElement,\n getTransitionDurationFromElement,\n getUID,\n isDisabled,\n isElement,\n isRTL,\n isVisible,\n noop,\n onDOMContentLoaded,\n parseSelector,\n reflow,\n triggerTransitionEnd,\n toType\n}\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/event-handler.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport { getjQuery } from '../util/index.js'\n\n/**\n * Constants\n */\n\nconst namespaceRegex = /[^.]*(?=\\..*)\\.|.*/\nconst stripNameRegex = /\\..*/\nconst stripUidRegex = /::\\d+$/\nconst eventRegistry = {} // Events storage\nlet uidEvent = 1\nconst customEvents = {\n mouseenter: 'mouseover',\n mouseleave: 'mouseout'\n}\n\nconst nativeEvents = new Set([\n 'click',\n 'dblclick',\n 'mouseup',\n 'mousedown',\n 'contextmenu',\n 'mousewheel',\n 'DOMMouseScroll',\n 'mouseover',\n 'mouseout',\n 'mousemove',\n 'selectstart',\n 'selectend',\n 'keydown',\n 'keypress',\n 'keyup',\n 'orientationchange',\n 'touchstart',\n 'touchmove',\n 'touchend',\n 'touchcancel',\n 'pointerdown',\n 'pointermove',\n 'pointerup',\n 'pointerleave',\n 'pointercancel',\n 'gesturestart',\n 'gesturechange',\n 'gestureend',\n 'focus',\n 'blur',\n 'change',\n 'reset',\n 'select',\n 'submit',\n 'focusin',\n 'focusout',\n 'load',\n 'unload',\n 'beforeunload',\n 'resize',\n 'move',\n 'DOMContentLoaded',\n 'readystatechange',\n 'error',\n 'abort',\n 'scroll'\n])\n\n/**\n * Private methods\n */\n\nfunction makeEventUid(element, uid) {\n return (uid && `${uid}::${uidEvent++}`) || element.uidEvent || uidEvent++\n}\n\nfunction getElementEvents(element) {\n const uid = makeEventUid(element)\n\n element.uidEvent = uid\n eventRegistry[uid] = eventRegistry[uid] || {}\n\n return eventRegistry[uid]\n}\n\nfunction bootstrapHandler(element, fn) {\n return function handler(event) {\n hydrateObj(event, { delegateTarget: element })\n\n if (handler.oneOff) {\n EventHandler.off(element, event.type, fn)\n }\n\n return fn.apply(element, [event])\n }\n}\n\nfunction bootstrapDelegationHandler(element, selector, fn) {\n return function handler(event) {\n const domElements = element.querySelectorAll(selector)\n\n for (let { target } = event; target && target !== this; target = target.parentNode) {\n for (const domElement of domElements) {\n if (domElement !== target) {\n continue\n }\n\n hydrateObj(event, { delegateTarget: target })\n\n if (handler.oneOff) {\n EventHandler.off(element, event.type, selector, fn)\n }\n\n return fn.apply(target, [event])\n }\n }\n }\n}\n\nfunction findHandler(events, callable, delegationSelector = null) {\n return Object.values(events)\n .find(event => event.callable === callable && event.delegationSelector === delegationSelector)\n}\n\nfunction normalizeParameters(originalTypeEvent, handler, delegationFunction) {\n const isDelegated = typeof handler === 'string'\n // TODO: tooltip passes `false` instead of selector, so we need to check\n const callable = isDelegated ? delegationFunction : (handler || delegationFunction)\n let typeEvent = getTypeEvent(originalTypeEvent)\n\n if (!nativeEvents.has(typeEvent)) {\n typeEvent = originalTypeEvent\n }\n\n return [isDelegated, callable, typeEvent]\n}\n\nfunction addHandler(element, originalTypeEvent, handler, delegationFunction, oneOff) {\n if (typeof originalTypeEvent !== 'string' || !element) {\n return\n }\n\n let [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction)\n\n // in case of mouseenter or mouseleave wrap the handler within a function that checks for its DOM position\n // this prevents the handler from being dispatched the same way as mouseover or mouseout does\n if (originalTypeEvent in customEvents) {\n const wrapFunction = fn => {\n return function (event) {\n if (!event.relatedTarget || (event.relatedTarget !== event.delegateTarget && !event.delegateTarget.contains(event.relatedTarget))) {\n return fn.call(this, event)\n }\n }\n }\n\n callable = wrapFunction(callable)\n }\n\n const events = getElementEvents(element)\n const handlers = events[typeEvent] || (events[typeEvent] = {})\n const previousFunction = findHandler(handlers, callable, isDelegated ? handler : null)\n\n if (previousFunction) {\n previousFunction.oneOff = previousFunction.oneOff && oneOff\n\n return\n }\n\n const uid = makeEventUid(callable, originalTypeEvent.replace(namespaceRegex, ''))\n const fn = isDelegated ?\n bootstrapDelegationHandler(element, handler, callable) :\n bootstrapHandler(element, callable)\n\n fn.delegationSelector = isDelegated ? handler : null\n fn.callable = callable\n fn.oneOff = oneOff\n fn.uidEvent = uid\n handlers[uid] = fn\n\n element.addEventListener(typeEvent, fn, isDelegated)\n}\n\nfunction removeHandler(element, events, typeEvent, handler, delegationSelector) {\n const fn = findHandler(events[typeEvent], handler, delegationSelector)\n\n if (!fn) {\n return\n }\n\n element.removeEventListener(typeEvent, fn, Boolean(delegationSelector))\n delete events[typeEvent][fn.uidEvent]\n}\n\nfunction removeNamespacedHandlers(element, events, typeEvent, namespace) {\n const storeElementEvent = events[typeEvent] || {}\n\n for (const [handlerKey, event] of Object.entries(storeElementEvent)) {\n if (handlerKey.includes(namespace)) {\n removeHandler(element, events, typeEvent, event.callable, event.delegationSelector)\n }\n }\n}\n\nfunction getTypeEvent(event) {\n // allow to get the native events from namespaced events ('click.bs.button' --> 'click')\n event = event.replace(stripNameRegex, '')\n return customEvents[event] || event\n}\n\nconst EventHandler = {\n on(element, event, handler, delegationFunction) {\n addHandler(element, event, handler, delegationFunction, false)\n },\n\n one(element, event, handler, delegationFunction) {\n addHandler(element, event, handler, delegationFunction, true)\n },\n\n off(element, originalTypeEvent, handler, delegationFunction) {\n if (typeof originalTypeEvent !== 'string' || !element) {\n return\n }\n\n const [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction)\n const inNamespace = typeEvent !== originalTypeEvent\n const events = getElementEvents(element)\n const storeElementEvent = events[typeEvent] || {}\n const isNamespace = originalTypeEvent.startsWith('.')\n\n if (typeof callable !== 'undefined') {\n // Simplest case: handler is passed, remove that listener ONLY.\n if (!Object.keys(storeElementEvent).length) {\n return\n }\n\n removeHandler(element, events, typeEvent, callable, isDelegated ? handler : null)\n return\n }\n\n if (isNamespace) {\n for (const elementEvent of Object.keys(events)) {\n removeNamespacedHandlers(element, events, elementEvent, originalTypeEvent.slice(1))\n }\n }\n\n for (const [keyHandlers, event] of Object.entries(storeElementEvent)) {\n const handlerKey = keyHandlers.replace(stripUidRegex, '')\n\n if (!inNamespace || originalTypeEvent.includes(handlerKey)) {\n removeHandler(element, events, typeEvent, event.callable, event.delegationSelector)\n }\n }\n },\n\n trigger(element, event, args) {\n if (typeof event !== 'string' || !element) {\n return null\n }\n\n const $ = getjQuery()\n const typeEvent = getTypeEvent(event)\n const inNamespace = event !== typeEvent\n\n let jQueryEvent = null\n let bubbles = true\n let nativeDispatch = true\n let defaultPrevented = false\n\n if (inNamespace && $) {\n jQueryEvent = $.Event(event, args)\n\n $(element).trigger(jQueryEvent)\n bubbles = !jQueryEvent.isPropagationStopped()\n nativeDispatch = !jQueryEvent.isImmediatePropagationStopped()\n defaultPrevented = jQueryEvent.isDefaultPrevented()\n }\n\n const evt = hydrateObj(new Event(event, { bubbles, cancelable: true }), args)\n\n if (defaultPrevented) {\n evt.preventDefault()\n }\n\n if (nativeDispatch) {\n element.dispatchEvent(evt)\n }\n\n if (evt.defaultPrevented && jQueryEvent) {\n jQueryEvent.preventDefault()\n }\n\n return evt\n }\n}\n\nfunction hydrateObj(obj, meta = {}) {\n for (const [key, value] of Object.entries(meta)) {\n try {\n obj[key] = value\n } catch {\n Object.defineProperty(obj, key, {\n configurable: true,\n get() {\n return value\n }\n })\n }\n }\n\n return obj\n}\n\nexport default EventHandler\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/manipulator.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nfunction normalizeData(value) {\n if (value === 'true') {\n return true\n }\n\n if (value === 'false') {\n return false\n }\n\n if (value === Number(value).toString()) {\n return Number(value)\n }\n\n if (value === '' || value === 'null') {\n return null\n }\n\n if (typeof value !== 'string') {\n return value\n }\n\n try {\n return JSON.parse(decodeURIComponent(value))\n } catch {\n return value\n }\n}\n\nfunction normalizeDataKey(key) {\n return key.replace(/[A-Z]/g, chr => `-${chr.toLowerCase()}`)\n}\n\nconst Manipulator = {\n setDataAttribute(element, key, value) {\n element.setAttribute(`data-bs-${normalizeDataKey(key)}`, value)\n },\n\n removeDataAttribute(element, key) {\n element.removeAttribute(`data-bs-${normalizeDataKey(key)}`)\n },\n\n getDataAttributes(element) {\n if (!element) {\n return {}\n }\n\n const attributes = {}\n const bsKeys = Object.keys(element.dataset).filter(key => key.startsWith('bs') && !key.startsWith('bsConfig'))\n\n for (const key of bsKeys) {\n let pureKey = key.replace(/^bs/, '')\n pureKey = pureKey.charAt(0).toLowerCase() + pureKey.slice(1, pureKey.length)\n attributes[pureKey] = normalizeData(element.dataset[key])\n }\n\n return attributes\n },\n\n getDataAttribute(element, key) {\n return normalizeData(element.getAttribute(`data-bs-${normalizeDataKey(key)}`))\n }\n}\n\nexport default Manipulator\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/config.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport Manipulator from '../dom/manipulator.js'\nimport { isElement, toType } from './index.js'\n\n/**\n * Class definition\n */\n\nclass Config {\n // Getters\n static get Default() {\n return {}\n }\n\n static get DefaultType() {\n return {}\n }\n\n static get NAME() {\n throw new Error('You have to implement the static method \"NAME\", for each component!')\n }\n\n _getConfig(config) {\n config = this._mergeConfigObj(config)\n config = this._configAfterMerge(config)\n this._typeCheckConfig(config)\n return config\n }\n\n _configAfterMerge(config) {\n return config\n }\n\n _mergeConfigObj(config, element) {\n const jsonConfig = isElement(element) ? Manipulator.getDataAttribute(element, 'config') : {} // try to parse\n\n return {\n ...this.constructor.Default,\n ...(typeof jsonConfig === 'object' ? jsonConfig : {}),\n ...(isElement(element) ? Manipulator.getDataAttributes(element) : {}),\n ...(typeof config === 'object' ? config : {})\n }\n }\n\n _typeCheckConfig(config, configTypes = this.constructor.DefaultType) {\n for (const [property, expectedTypes] of Object.entries(configTypes)) {\n const value = config[property]\n const valueType = isElement(value) ? 'element' : toType(value)\n\n if (!new RegExp(expectedTypes).test(valueType)) {\n throw new TypeError(\n `${this.constructor.NAME.toUpperCase()}: Option \"${property}\" provided type \"${valueType}\" but expected type \"${expectedTypes}\".`\n )\n }\n }\n }\n}\n\nexport default Config\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap base-component.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport Data from './dom/data.js'\nimport EventHandler from './dom/event-handler.js'\nimport Config from './util/config.js'\nimport { executeAfterTransition, getElement } from './util/index.js'\n\n/**\n * Constants\n */\n\nconst VERSION = '5.3.1'\n\n/**\n * Class definition\n */\n\nclass BaseComponent extends Config {\n constructor(element, config) {\n super()\n\n element = getElement(element)\n if (!element) {\n return\n }\n\n this._element = element\n this._config = this._getConfig(config)\n\n Data.set(this._element, this.constructor.DATA_KEY, this)\n }\n\n // Public\n dispose() {\n Data.remove(this._element, this.constructor.DATA_KEY)\n EventHandler.off(this._element, this.constructor.EVENT_KEY)\n\n for (const propertyName of Object.getOwnPropertyNames(this)) {\n this[propertyName] = null\n }\n }\n\n _queueCallback(callback, element, isAnimated = true) {\n executeAfterTransition(callback, element, isAnimated)\n }\n\n _getConfig(config) {\n config = this._mergeConfigObj(config, this._element)\n config = this._configAfterMerge(config)\n this._typeCheckConfig(config)\n return config\n }\n\n // Static\n static getInstance(element) {\n return Data.get(getElement(element), this.DATA_KEY)\n }\n\n static getOrCreateInstance(element, config = {}) {\n return this.getInstance(element) || new this(element, typeof config === 'object' ? config : null)\n }\n\n static get VERSION() {\n return VERSION\n }\n\n static get DATA_KEY() {\n return `bs.${this.NAME}`\n }\n\n static get EVENT_KEY() {\n return `.${this.DATA_KEY}`\n }\n\n static eventName(name) {\n return `${name}${this.EVENT_KEY}`\n }\n}\n\nexport default BaseComponent\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/selector-engine.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport { isDisabled, isVisible, parseSelector } from '../util/index.js'\n\nconst getSelector = element => {\n let selector = element.getAttribute('data-bs-target')\n\n if (!selector || selector === '#') {\n let hrefAttribute = element.getAttribute('href')\n\n // The only valid content that could double as a selector are IDs or classes,\n // so everything starting with `#` or `.`. If a \"real\" URL is used as the selector,\n // `document.querySelector` will rightfully complain it is invalid.\n // See https://github.com/twbs/bootstrap/issues/32273\n if (!hrefAttribute || (!hrefAttribute.includes('#') && !hrefAttribute.startsWith('.'))) {\n return null\n }\n\n // Just in case some CMS puts out a full URL with the anchor appended\n if (hrefAttribute.includes('#') && !hrefAttribute.startsWith('#')) {\n hrefAttribute = `#${hrefAttribute.split('#')[1]}`\n }\n\n selector = hrefAttribute && hrefAttribute !== '#' ? hrefAttribute.trim() : null\n }\n\n return parseSelector(selector)\n}\n\nconst SelectorEngine = {\n find(selector, element = document.documentElement) {\n return [].concat(...Element.prototype.querySelectorAll.call(element, selector))\n },\n\n findOne(selector, element = document.documentElement) {\n return Element.prototype.querySelector.call(element, selector)\n },\n\n children(element, selector) {\n return [].concat(...element.children).filter(child => child.matches(selector))\n },\n\n parents(element, selector) {\n const parents = []\n let ancestor = element.parentNode.closest(selector)\n\n while (ancestor) {\n parents.push(ancestor)\n ancestor = ancestor.parentNode.closest(selector)\n }\n\n return parents\n },\n\n prev(element, selector) {\n let previous = element.previousElementSibling\n\n while (previous) {\n if (previous.matches(selector)) {\n return [previous]\n }\n\n previous = previous.previousElementSibling\n }\n\n return []\n },\n // TODO: this is now unused; remove later along with prev()\n next(element, selector) {\n let next = element.nextElementSibling\n\n while (next) {\n if (next.matches(selector)) {\n return [next]\n }\n\n next = next.nextElementSibling\n }\n\n return []\n },\n\n focusableChildren(element) {\n const focusables = [\n 'a',\n 'button',\n 'input',\n 'textarea',\n 'select',\n 'details',\n '[tabindex]',\n '[contenteditable=\"true\"]'\n ].map(selector => `${selector}:not([tabindex^=\"-\"])`).join(',')\n\n return this.find(focusables, element).filter(el => !isDisabled(el) && isVisible(el))\n },\n\n getSelectorFromElement(element) {\n const selector = getSelector(element)\n\n if (selector) {\n return SelectorEngine.findOne(selector) ? selector : null\n }\n\n return null\n },\n\n getElementFromSelector(element) {\n const selector = getSelector(element)\n\n return selector ? SelectorEngine.findOne(selector) : null\n },\n\n getMultipleElementsFromSelector(element) {\n const selector = getSelector(element)\n\n return selector ? SelectorEngine.find(selector) : []\n }\n}\n\nexport default SelectorEngine\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/component-functions.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport EventHandler from '../dom/event-handler.js'\nimport SelectorEngine from '../dom/selector-engine.js'\nimport { isDisabled } from './index.js'\n\nconst enableDismissTrigger = (component, method = 'hide') => {\n const clickEvent = `click.dismiss${component.EVENT_KEY}`\n const name = component.NAME\n\n EventHandler.on(document, clickEvent, `[data-bs-dismiss=\"${name}\"]`, function (event) {\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault()\n }\n\n if (isDisabled(this)) {\n return\n }\n\n const target = SelectorEngine.getElementFromSelector(this) || this.closest(`.${name}`)\n const instance = component.getOrCreateInstance(target)\n\n // Method argument is left, for Alert and only, as it doesn't implement the 'hide' method\n instance[method]()\n })\n}\n\nexport {\n enableDismissTrigger\n}\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap alert.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport { enableDismissTrigger } from './util/component-functions.js'\nimport { defineJQueryPlugin } from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'alert'\nconst DATA_KEY = 'bs.alert'\nconst EVENT_KEY = `.${DATA_KEY}`\n\nconst EVENT_CLOSE = `close${EVENT_KEY}`\nconst EVENT_CLOSED = `closed${EVENT_KEY}`\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\n\n/**\n * Class definition\n */\n\nclass Alert extends BaseComponent {\n // Getters\n static get NAME() {\n return NAME\n }\n\n // Public\n close() {\n const closeEvent = EventHandler.trigger(this._element, EVENT_CLOSE)\n\n if (closeEvent.defaultPrevented) {\n return\n }\n\n this._element.classList.remove(CLASS_NAME_SHOW)\n\n const isAnimated = this._element.classList.contains(CLASS_NAME_FADE)\n this._queueCallback(() => this._destroyElement(), this._element, isAnimated)\n }\n\n // Private\n _destroyElement() {\n this._element.remove()\n EventHandler.trigger(this._element, EVENT_CLOSED)\n this.dispose()\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Alert.getOrCreateInstance(this)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config](this)\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nenableDismissTrigger(Alert, 'close')\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Alert)\n\nexport default Alert\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap button.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport { defineJQueryPlugin } from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'button'\nconst DATA_KEY = 'bs.button'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst CLASS_NAME_ACTIVE = 'active'\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"button\"]'\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\n/**\n * Class definition\n */\n\nclass Button extends BaseComponent {\n // Getters\n static get NAME() {\n return NAME\n }\n\n // Public\n toggle() {\n // Toggle class and sync the `aria-pressed` attribute with the return value of the `.toggle()` method\n this._element.setAttribute('aria-pressed', this._element.classList.toggle(CLASS_NAME_ACTIVE))\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Button.getOrCreateInstance(this)\n\n if (config === 'toggle') {\n data[config]()\n }\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, event => {\n event.preventDefault()\n\n const button = event.target.closest(SELECTOR_DATA_TOGGLE)\n const data = Button.getOrCreateInstance(button)\n\n data.toggle()\n})\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Button)\n\nexport default Button\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/swipe.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport EventHandler from '../dom/event-handler.js'\nimport Config from './config.js'\nimport { execute } from './index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'swipe'\nconst EVENT_KEY = '.bs.swipe'\nconst EVENT_TOUCHSTART = `touchstart${EVENT_KEY}`\nconst EVENT_TOUCHMOVE = `touchmove${EVENT_KEY}`\nconst EVENT_TOUCHEND = `touchend${EVENT_KEY}`\nconst EVENT_POINTERDOWN = `pointerdown${EVENT_KEY}`\nconst EVENT_POINTERUP = `pointerup${EVENT_KEY}`\nconst POINTER_TYPE_TOUCH = 'touch'\nconst POINTER_TYPE_PEN = 'pen'\nconst CLASS_NAME_POINTER_EVENT = 'pointer-event'\nconst SWIPE_THRESHOLD = 40\n\nconst Default = {\n endCallback: null,\n leftCallback: null,\n rightCallback: null\n}\n\nconst DefaultType = {\n endCallback: '(function|null)',\n leftCallback: '(function|null)',\n rightCallback: '(function|null)'\n}\n\n/**\n * Class definition\n */\n\nclass Swipe extends Config {\n constructor(element, config) {\n super()\n this._element = element\n\n if (!element || !Swipe.isSupported()) {\n return\n }\n\n this._config = this._getConfig(config)\n this._deltaX = 0\n this._supportPointerEvents = Boolean(window.PointerEvent)\n this._initEvents()\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n dispose() {\n EventHandler.off(this._element, EVENT_KEY)\n }\n\n // Private\n _start(event) {\n if (!this._supportPointerEvents) {\n this._deltaX = event.touches[0].clientX\n\n return\n }\n\n if (this._eventIsPointerPenTouch(event)) {\n this._deltaX = event.clientX\n }\n }\n\n _end(event) {\n if (this._eventIsPointerPenTouch(event)) {\n this._deltaX = event.clientX - this._deltaX\n }\n\n this._handleSwipe()\n execute(this._config.endCallback)\n }\n\n _move(event) {\n this._deltaX = event.touches && event.touches.length > 1 ?\n 0 :\n event.touches[0].clientX - this._deltaX\n }\n\n _handleSwipe() {\n const absDeltaX = Math.abs(this._deltaX)\n\n if (absDeltaX <= SWIPE_THRESHOLD) {\n return\n }\n\n const direction = absDeltaX / this._deltaX\n\n this._deltaX = 0\n\n if (!direction) {\n return\n }\n\n execute(direction > 0 ? this._config.rightCallback : this._config.leftCallback)\n }\n\n _initEvents() {\n if (this._supportPointerEvents) {\n EventHandler.on(this._element, EVENT_POINTERDOWN, event => this._start(event))\n EventHandler.on(this._element, EVENT_POINTERUP, event => this._end(event))\n\n this._element.classList.add(CLASS_NAME_POINTER_EVENT)\n } else {\n EventHandler.on(this._element, EVENT_TOUCHSTART, event => this._start(event))\n EventHandler.on(this._element, EVENT_TOUCHMOVE, event => this._move(event))\n EventHandler.on(this._element, EVENT_TOUCHEND, event => this._end(event))\n }\n }\n\n _eventIsPointerPenTouch(event) {\n return this._supportPointerEvents && (event.pointerType === POINTER_TYPE_PEN || event.pointerType === POINTER_TYPE_TOUCH)\n }\n\n // Static\n static isSupported() {\n return 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0\n }\n}\n\nexport default Swipe\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap carousel.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport Manipulator from './dom/manipulator.js'\nimport SelectorEngine from './dom/selector-engine.js'\nimport {\n defineJQueryPlugin,\n getNextActiveElement,\n isRTL,\n isVisible,\n reflow,\n triggerTransitionEnd\n} from './util/index.js'\nimport Swipe from './util/swipe.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'carousel'\nconst DATA_KEY = 'bs.carousel'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst ARROW_LEFT_KEY = 'ArrowLeft'\nconst ARROW_RIGHT_KEY = 'ArrowRight'\nconst TOUCHEVENT_COMPAT_WAIT = 500 // Time for mouse compat events to fire after touch\n\nconst ORDER_NEXT = 'next'\nconst ORDER_PREV = 'prev'\nconst DIRECTION_LEFT = 'left'\nconst DIRECTION_RIGHT = 'right'\n\nconst EVENT_SLIDE = `slide${EVENT_KEY}`\nconst EVENT_SLID = `slid${EVENT_KEY}`\nconst EVENT_KEYDOWN = `keydown${EVENT_KEY}`\nconst EVENT_MOUSEENTER = `mouseenter${EVENT_KEY}`\nconst EVENT_MOUSELEAVE = `mouseleave${EVENT_KEY}`\nconst EVENT_DRAG_START = `dragstart${EVENT_KEY}`\nconst EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_CAROUSEL = 'carousel'\nconst CLASS_NAME_ACTIVE = 'active'\nconst CLASS_NAME_SLIDE = 'slide'\nconst CLASS_NAME_END = 'carousel-item-end'\nconst CLASS_NAME_START = 'carousel-item-start'\nconst CLASS_NAME_NEXT = 'carousel-item-next'\nconst CLASS_NAME_PREV = 'carousel-item-prev'\n\nconst SELECTOR_ACTIVE = '.active'\nconst SELECTOR_ITEM = '.carousel-item'\nconst SELECTOR_ACTIVE_ITEM = SELECTOR_ACTIVE + SELECTOR_ITEM\nconst SELECTOR_ITEM_IMG = '.carousel-item img'\nconst SELECTOR_INDICATORS = '.carousel-indicators'\nconst SELECTOR_DATA_SLIDE = '[data-bs-slide], [data-bs-slide-to]'\nconst SELECTOR_DATA_RIDE = '[data-bs-ride=\"carousel\"]'\n\nconst KEY_TO_DIRECTION = {\n [ARROW_LEFT_KEY]: DIRECTION_RIGHT,\n [ARROW_RIGHT_KEY]: DIRECTION_LEFT\n}\n\nconst Default = {\n interval: 5000,\n keyboard: true,\n pause: 'hover',\n ride: false,\n touch: true,\n wrap: true\n}\n\nconst DefaultType = {\n interval: '(number|boolean)', // TODO:v6 remove boolean support\n keyboard: 'boolean',\n pause: '(string|boolean)',\n ride: '(boolean|string)',\n touch: 'boolean',\n wrap: 'boolean'\n}\n\n/**\n * Class definition\n */\n\nclass Carousel extends BaseComponent {\n constructor(element, config) {\n super(element, config)\n\n this._interval = null\n this._activeElement = null\n this._isSliding = false\n this.touchTimeout = null\n this._swipeHelper = null\n\n this._indicatorsElement = SelectorEngine.findOne(SELECTOR_INDICATORS, this._element)\n this._addEventListeners()\n\n if (this._config.ride === CLASS_NAME_CAROUSEL) {\n this.cycle()\n }\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n next() {\n this._slide(ORDER_NEXT)\n }\n\n nextWhenVisible() {\n // FIXME TODO use `document.visibilityState`\n // Don't call next when the page isn't visible\n // or the carousel or its parent isn't visible\n if (!document.hidden && isVisible(this._element)) {\n this.next()\n }\n }\n\n prev() {\n this._slide(ORDER_PREV)\n }\n\n pause() {\n if (this._isSliding) {\n triggerTransitionEnd(this._element)\n }\n\n this._clearInterval()\n }\n\n cycle() {\n this._clearInterval()\n this._updateInterval()\n\n this._interval = setInterval(() => this.nextWhenVisible(), this._config.interval)\n }\n\n _maybeEnableCycle() {\n if (!this._config.ride) {\n return\n }\n\n if (this._isSliding) {\n EventHandler.one(this._element, EVENT_SLID, () => this.cycle())\n return\n }\n\n this.cycle()\n }\n\n to(index) {\n const items = this._getItems()\n if (index > items.length - 1 || index < 0) {\n return\n }\n\n if (this._isSliding) {\n EventHandler.one(this._element, EVENT_SLID, () => this.to(index))\n return\n }\n\n const activeIndex = this._getItemIndex(this._getActive())\n if (activeIndex === index) {\n return\n }\n\n const order = index > activeIndex ? ORDER_NEXT : ORDER_PREV\n\n this._slide(order, items[index])\n }\n\n dispose() {\n if (this._swipeHelper) {\n this._swipeHelper.dispose()\n }\n\n super.dispose()\n }\n\n // Private\n _configAfterMerge(config) {\n config.defaultInterval = config.interval\n return config\n }\n\n _addEventListeners() {\n if (this._config.keyboard) {\n EventHandler.on(this._element, EVENT_KEYDOWN, event => this._keydown(event))\n }\n\n if (this._config.pause === 'hover') {\n EventHandler.on(this._element, EVENT_MOUSEENTER, () => this.pause())\n EventHandler.on(this._element, EVENT_MOUSELEAVE, () => this._maybeEnableCycle())\n }\n\n if (this._config.touch && Swipe.isSupported()) {\n this._addTouchEventListeners()\n }\n }\n\n _addTouchEventListeners() {\n for (const img of SelectorEngine.find(SELECTOR_ITEM_IMG, this._element)) {\n EventHandler.on(img, EVENT_DRAG_START, event => event.preventDefault())\n }\n\n const endCallBack = () => {\n if (this._config.pause !== 'hover') {\n return\n }\n\n // If it's a touch-enabled device, mouseenter/leave are fired as\n // part of the mouse compatibility events on first tap - the carousel\n // would stop cycling until user tapped out of it;\n // here, we listen for touchend, explicitly pause the carousel\n // (as if it's the second time we tap on it, mouseenter compat event\n // is NOT fired) and after a timeout (to allow for mouse compatibility\n // events to fire) we explicitly restart cycling\n\n this.pause()\n if (this.touchTimeout) {\n clearTimeout(this.touchTimeout)\n }\n\n this.touchTimeout = setTimeout(() => this._maybeEnableCycle(), TOUCHEVENT_COMPAT_WAIT + this._config.interval)\n }\n\n const swipeConfig = {\n leftCallback: () => this._slide(this._directionToOrder(DIRECTION_LEFT)),\n rightCallback: () => this._slide(this._directionToOrder(DIRECTION_RIGHT)),\n endCallback: endCallBack\n }\n\n this._swipeHelper = new Swipe(this._element, swipeConfig)\n }\n\n _keydown(event) {\n if (/input|textarea/i.test(event.target.tagName)) {\n return\n }\n\n const direction = KEY_TO_DIRECTION[event.key]\n if (direction) {\n event.preventDefault()\n this._slide(this._directionToOrder(direction))\n }\n }\n\n _getItemIndex(element) {\n return this._getItems().indexOf(element)\n }\n\n _setActiveIndicatorElement(index) {\n if (!this._indicatorsElement) {\n return\n }\n\n const activeIndicator = SelectorEngine.findOne(SELECTOR_ACTIVE, this._indicatorsElement)\n\n activeIndicator.classList.remove(CLASS_NAME_ACTIVE)\n activeIndicator.removeAttribute('aria-current')\n\n const newActiveIndicator = SelectorEngine.findOne(`[data-bs-slide-to=\"${index}\"]`, this._indicatorsElement)\n\n if (newActiveIndicator) {\n newActiveIndicator.classList.add(CLASS_NAME_ACTIVE)\n newActiveIndicator.setAttribute('aria-current', 'true')\n }\n }\n\n _updateInterval() {\n const element = this._activeElement || this._getActive()\n\n if (!element) {\n return\n }\n\n const elementInterval = Number.parseInt(element.getAttribute('data-bs-interval'), 10)\n\n this._config.interval = elementInterval || this._config.defaultInterval\n }\n\n _slide(order, element = null) {\n if (this._isSliding) {\n return\n }\n\n const activeElement = this._getActive()\n const isNext = order === ORDER_NEXT\n const nextElement = element || getNextActiveElement(this._getItems(), activeElement, isNext, this._config.wrap)\n\n if (nextElement === activeElement) {\n return\n }\n\n const nextElementIndex = this._getItemIndex(nextElement)\n\n const triggerEvent = eventName => {\n return EventHandler.trigger(this._element, eventName, {\n relatedTarget: nextElement,\n direction: this._orderToDirection(order),\n from: this._getItemIndex(activeElement),\n to: nextElementIndex\n })\n }\n\n const slideEvent = triggerEvent(EVENT_SLIDE)\n\n if (slideEvent.defaultPrevented) {\n return\n }\n\n if (!activeElement || !nextElement) {\n // Some weirdness is happening, so we bail\n // TODO: change tests that use empty divs to avoid this check\n return\n }\n\n const isCycling = Boolean(this._interval)\n this.pause()\n\n this._isSliding = true\n\n this._setActiveIndicatorElement(nextElementIndex)\n this._activeElement = nextElement\n\n const directionalClassName = isNext ? CLASS_NAME_START : CLASS_NAME_END\n const orderClassName = isNext ? CLASS_NAME_NEXT : CLASS_NAME_PREV\n\n nextElement.classList.add(orderClassName)\n\n reflow(nextElement)\n\n activeElement.classList.add(directionalClassName)\n nextElement.classList.add(directionalClassName)\n\n const completeCallBack = () => {\n nextElement.classList.remove(directionalClassName, orderClassName)\n nextElement.classList.add(CLASS_NAME_ACTIVE)\n\n activeElement.classList.remove(CLASS_NAME_ACTIVE, orderClassName, directionalClassName)\n\n this._isSliding = false\n\n triggerEvent(EVENT_SLID)\n }\n\n this._queueCallback(completeCallBack, activeElement, this._isAnimated())\n\n if (isCycling) {\n this.cycle()\n }\n }\n\n _isAnimated() {\n return this._element.classList.contains(CLASS_NAME_SLIDE)\n }\n\n _getActive() {\n return SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element)\n }\n\n _getItems() {\n return SelectorEngine.find(SELECTOR_ITEM, this._element)\n }\n\n _clearInterval() {\n if (this._interval) {\n clearInterval(this._interval)\n this._interval = null\n }\n }\n\n _directionToOrder(direction) {\n if (isRTL()) {\n return direction === DIRECTION_LEFT ? ORDER_PREV : ORDER_NEXT\n }\n\n return direction === DIRECTION_LEFT ? ORDER_NEXT : ORDER_PREV\n }\n\n _orderToDirection(order) {\n if (isRTL()) {\n return order === ORDER_PREV ? DIRECTION_LEFT : DIRECTION_RIGHT\n }\n\n return order === ORDER_PREV ? DIRECTION_RIGHT : DIRECTION_LEFT\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Carousel.getOrCreateInstance(this, config)\n\n if (typeof config === 'number') {\n data.to(config)\n return\n }\n\n if (typeof config === 'string') {\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n }\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_SLIDE, function (event) {\n const target = SelectorEngine.getElementFromSelector(this)\n\n if (!target || !target.classList.contains(CLASS_NAME_CAROUSEL)) {\n return\n }\n\n event.preventDefault()\n\n const carousel = Carousel.getOrCreateInstance(target)\n const slideIndex = this.getAttribute('data-bs-slide-to')\n\n if (slideIndex) {\n carousel.to(slideIndex)\n carousel._maybeEnableCycle()\n return\n }\n\n if (Manipulator.getDataAttribute(this, 'slide') === 'next') {\n carousel.next()\n carousel._maybeEnableCycle()\n return\n }\n\n carousel.prev()\n carousel._maybeEnableCycle()\n})\n\nEventHandler.on(window, EVENT_LOAD_DATA_API, () => {\n const carousels = SelectorEngine.find(SELECTOR_DATA_RIDE)\n\n for (const carousel of carousels) {\n Carousel.getOrCreateInstance(carousel)\n }\n})\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Carousel)\n\nexport default Carousel\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap collapse.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport SelectorEngine from './dom/selector-engine.js'\nimport {\n defineJQueryPlugin,\n getElement,\n reflow\n} from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'collapse'\nconst DATA_KEY = 'bs.collapse'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_COLLAPSE = 'collapse'\nconst CLASS_NAME_COLLAPSING = 'collapsing'\nconst CLASS_NAME_COLLAPSED = 'collapsed'\nconst CLASS_NAME_DEEPER_CHILDREN = `:scope .${CLASS_NAME_COLLAPSE} .${CLASS_NAME_COLLAPSE}`\nconst CLASS_NAME_HORIZONTAL = 'collapse-horizontal'\n\nconst WIDTH = 'width'\nconst HEIGHT = 'height'\n\nconst SELECTOR_ACTIVES = '.collapse.show, .collapse.collapsing'\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"collapse\"]'\n\nconst Default = {\n parent: null,\n toggle: true\n}\n\nconst DefaultType = {\n parent: '(null|element)',\n toggle: 'boolean'\n}\n\n/**\n * Class definition\n */\n\nclass Collapse extends BaseComponent {\n constructor(element, config) {\n super(element, config)\n\n this._isTransitioning = false\n this._triggerArray = []\n\n const toggleList = SelectorEngine.find(SELECTOR_DATA_TOGGLE)\n\n for (const elem of toggleList) {\n const selector = SelectorEngine.getSelectorFromElement(elem)\n const filterElement = SelectorEngine.find(selector)\n .filter(foundElement => foundElement === this._element)\n\n if (selector !== null && filterElement.length) {\n this._triggerArray.push(elem)\n }\n }\n\n this._initializeChildren()\n\n if (!this._config.parent) {\n this._addAriaAndCollapsedClass(this._triggerArray, this._isShown())\n }\n\n if (this._config.toggle) {\n this.toggle()\n }\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n toggle() {\n if (this._isShown()) {\n this.hide()\n } else {\n this.show()\n }\n }\n\n show() {\n if (this._isTransitioning || this._isShown()) {\n return\n }\n\n let activeChildren = []\n\n // find active children\n if (this._config.parent) {\n activeChildren = this._getFirstLevelChildren(SELECTOR_ACTIVES)\n .filter(element => element !== this._element)\n .map(element => Collapse.getOrCreateInstance(element, { toggle: false }))\n }\n\n if (activeChildren.length && activeChildren[0]._isTransitioning) {\n return\n }\n\n const startEvent = EventHandler.trigger(this._element, EVENT_SHOW)\n if (startEvent.defaultPrevented) {\n return\n }\n\n for (const activeInstance of activeChildren) {\n activeInstance.hide()\n }\n\n const dimension = this._getDimension()\n\n this._element.classList.remove(CLASS_NAME_COLLAPSE)\n this._element.classList.add(CLASS_NAME_COLLAPSING)\n\n this._element.style[dimension] = 0\n\n this._addAriaAndCollapsedClass(this._triggerArray, true)\n this._isTransitioning = true\n\n const complete = () => {\n this._isTransitioning = false\n\n this._element.classList.remove(CLASS_NAME_COLLAPSING)\n this._element.classList.add(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW)\n\n this._element.style[dimension] = ''\n\n EventHandler.trigger(this._element, EVENT_SHOWN)\n }\n\n const capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1)\n const scrollSize = `scroll${capitalizedDimension}`\n\n this._queueCallback(complete, this._element, true)\n this._element.style[dimension] = `${this._element[scrollSize]}px`\n }\n\n hide() {\n if (this._isTransitioning || !this._isShown()) {\n return\n }\n\n const startEvent = EventHandler.trigger(this._element, EVENT_HIDE)\n if (startEvent.defaultPrevented) {\n return\n }\n\n const dimension = this._getDimension()\n\n this._element.style[dimension] = `${this._element.getBoundingClientRect()[dimension]}px`\n\n reflow(this._element)\n\n this._element.classList.add(CLASS_NAME_COLLAPSING)\n this._element.classList.remove(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW)\n\n for (const trigger of this._triggerArray) {\n const element = SelectorEngine.getElementFromSelector(trigger)\n\n if (element && !this._isShown(element)) {\n this._addAriaAndCollapsedClass([trigger], false)\n }\n }\n\n this._isTransitioning = true\n\n const complete = () => {\n this._isTransitioning = false\n this._element.classList.remove(CLASS_NAME_COLLAPSING)\n this._element.classList.add(CLASS_NAME_COLLAPSE)\n EventHandler.trigger(this._element, EVENT_HIDDEN)\n }\n\n this._element.style[dimension] = ''\n\n this._queueCallback(complete, this._element, true)\n }\n\n _isShown(element = this._element) {\n return element.classList.contains(CLASS_NAME_SHOW)\n }\n\n // Private\n _configAfterMerge(config) {\n config.toggle = Boolean(config.toggle) // Coerce string values\n config.parent = getElement(config.parent)\n return config\n }\n\n _getDimension() {\n return this._element.classList.contains(CLASS_NAME_HORIZONTAL) ? WIDTH : HEIGHT\n }\n\n _initializeChildren() {\n if (!this._config.parent) {\n return\n }\n\n const children = this._getFirstLevelChildren(SELECTOR_DATA_TOGGLE)\n\n for (const element of children) {\n const selected = SelectorEngine.getElementFromSelector(element)\n\n if (selected) {\n this._addAriaAndCollapsedClass([element], this._isShown(selected))\n }\n }\n }\n\n _getFirstLevelChildren(selector) {\n const children = SelectorEngine.find(CLASS_NAME_DEEPER_CHILDREN, this._config.parent)\n // remove children if greater depth\n return SelectorEngine.find(selector, this._config.parent).filter(element => !children.includes(element))\n }\n\n _addAriaAndCollapsedClass(triggerArray, isOpen) {\n if (!triggerArray.length) {\n return\n }\n\n for (const element of triggerArray) {\n element.classList.toggle(CLASS_NAME_COLLAPSED, !isOpen)\n element.setAttribute('aria-expanded', isOpen)\n }\n }\n\n // Static\n static jQueryInterface(config) {\n const _config = {}\n if (typeof config === 'string' && /show|hide/.test(config)) {\n _config.toggle = false\n }\n\n return this.each(function () {\n const data = Collapse.getOrCreateInstance(this, _config)\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n }\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n // preventDefault only for elements (which change the URL) not inside the collapsible element\n if (event.target.tagName === 'A' || (event.delegateTarget && event.delegateTarget.tagName === 'A')) {\n event.preventDefault()\n }\n\n for (const element of SelectorEngine.getMultipleElementsFromSelector(this)) {\n Collapse.getOrCreateInstance(element, { toggle: false }).toggle()\n }\n})\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Collapse)\n\nexport default Collapse\n","export var top = 'top';\nexport var bottom = 'bottom';\nexport var right = 'right';\nexport var left = 'left';\nexport var auto = 'auto';\nexport var basePlacements = [top, bottom, right, left];\nexport var start = 'start';\nexport var end = 'end';\nexport var clippingParents = 'clippingParents';\nexport var viewport = 'viewport';\nexport var popper = 'popper';\nexport var reference = 'reference';\nexport var variationPlacements = /*#__PURE__*/basePlacements.reduce(function (acc, placement) {\n return acc.concat([placement + \"-\" + start, placement + \"-\" + end]);\n}, []);\nexport var placements = /*#__PURE__*/[].concat(basePlacements, [auto]).reduce(function (acc, placement) {\n return acc.concat([placement, placement + \"-\" + start, placement + \"-\" + end]);\n}, []); // modifiers that need to read the DOM\n\nexport var beforeRead = 'beforeRead';\nexport var read = 'read';\nexport var afterRead = 'afterRead'; // pure-logic modifiers\n\nexport var beforeMain = 'beforeMain';\nexport var main = 'main';\nexport var afterMain = 'afterMain'; // modifier with the purpose to write to the DOM (or write into a framework state)\n\nexport var beforeWrite = 'beforeWrite';\nexport var write = 'write';\nexport var afterWrite = 'afterWrite';\nexport var modifierPhases = [beforeRead, read, afterRead, beforeMain, main, afterMain, beforeWrite, write, afterWrite];","export default function getNodeName(element) {\n return element ? (element.nodeName || '').toLowerCase() : null;\n}","export default function getWindow(node) {\n if (node == null) {\n return window;\n }\n\n if (node.toString() !== '[object Window]') {\n var ownerDocument = node.ownerDocument;\n return ownerDocument ? ownerDocument.defaultView || window : window;\n }\n\n return node;\n}","import getWindow from \"./getWindow.js\";\n\nfunction isElement(node) {\n var OwnElement = getWindow(node).Element;\n return node instanceof OwnElement || node instanceof Element;\n}\n\nfunction isHTMLElement(node) {\n var OwnElement = getWindow(node).HTMLElement;\n return node instanceof OwnElement || node instanceof HTMLElement;\n}\n\nfunction isShadowRoot(node) {\n // IE 11 has no ShadowRoot\n if (typeof ShadowRoot === 'undefined') {\n return false;\n }\n\n var OwnElement = getWindow(node).ShadowRoot;\n return node instanceof OwnElement || node instanceof ShadowRoot;\n}\n\nexport { isElement, isHTMLElement, isShadowRoot };","import getNodeName from \"../dom-utils/getNodeName.js\";\nimport { isHTMLElement } from \"../dom-utils/instanceOf.js\"; // This modifier takes the styles prepared by the `computeStyles` modifier\n// and applies them to the HTMLElements such as popper and arrow\n\nfunction applyStyles(_ref) {\n var state = _ref.state;\n Object.keys(state.elements).forEach(function (name) {\n var style = state.styles[name] || {};\n var attributes = state.attributes[name] || {};\n var element = state.elements[name]; // arrow is optional + virtual elements\n\n if (!isHTMLElement(element) || !getNodeName(element)) {\n return;\n } // Flow doesn't support to extend this property, but it's the most\n // effective way to apply styles to an HTMLElement\n // $FlowFixMe[cannot-write]\n\n\n Object.assign(element.style, style);\n Object.keys(attributes).forEach(function (name) {\n var value = attributes[name];\n\n if (value === false) {\n element.removeAttribute(name);\n } else {\n element.setAttribute(name, value === true ? '' : value);\n }\n });\n });\n}\n\nfunction effect(_ref2) {\n var state = _ref2.state;\n var initialStyles = {\n popper: {\n position: state.options.strategy,\n left: '0',\n top: '0',\n margin: '0'\n },\n arrow: {\n position: 'absolute'\n },\n reference: {}\n };\n Object.assign(state.elements.popper.style, initialStyles.popper);\n state.styles = initialStyles;\n\n if (state.elements.arrow) {\n Object.assign(state.elements.arrow.style, initialStyles.arrow);\n }\n\n return function () {\n Object.keys(state.elements).forEach(function (name) {\n var element = state.elements[name];\n var attributes = state.attributes[name] || {};\n var styleProperties = Object.keys(state.styles.hasOwnProperty(name) ? state.styles[name] : initialStyles[name]); // Set all values to an empty string to unset them\n\n var style = styleProperties.reduce(function (style, property) {\n style[property] = '';\n return style;\n }, {}); // arrow is optional + virtual elements\n\n if (!isHTMLElement(element) || !getNodeName(element)) {\n return;\n }\n\n Object.assign(element.style, style);\n Object.keys(attributes).forEach(function (attribute) {\n element.removeAttribute(attribute);\n });\n });\n };\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'applyStyles',\n enabled: true,\n phase: 'write',\n fn: applyStyles,\n effect: effect,\n requires: ['computeStyles']\n};","import { auto } from \"../enums.js\";\nexport default function getBasePlacement(placement) {\n return placement.split('-')[0];\n}","export var max = Math.max;\nexport var min = Math.min;\nexport var round = Math.round;","export default function getUAString() {\n var uaData = navigator.userAgentData;\n\n if (uaData != null && uaData.brands && Array.isArray(uaData.brands)) {\n return uaData.brands.map(function (item) {\n return item.brand + \"/\" + item.version;\n }).join(' ');\n }\n\n return navigator.userAgent;\n}","import getUAString from \"../utils/userAgent.js\";\nexport default function isLayoutViewport() {\n return !/^((?!chrome|android).)*safari/i.test(getUAString());\n}","import { isElement, isHTMLElement } from \"./instanceOf.js\";\nimport { round } from \"../utils/math.js\";\nimport getWindow from \"./getWindow.js\";\nimport isLayoutViewport from \"./isLayoutViewport.js\";\nexport default function getBoundingClientRect(element, includeScale, isFixedStrategy) {\n if (includeScale === void 0) {\n includeScale = false;\n }\n\n if (isFixedStrategy === void 0) {\n isFixedStrategy = false;\n }\n\n var clientRect = element.getBoundingClientRect();\n var scaleX = 1;\n var scaleY = 1;\n\n if (includeScale && isHTMLElement(element)) {\n scaleX = element.offsetWidth > 0 ? round(clientRect.width) / element.offsetWidth || 1 : 1;\n scaleY = element.offsetHeight > 0 ? round(clientRect.height) / element.offsetHeight || 1 : 1;\n }\n\n var _ref = isElement(element) ? getWindow(element) : window,\n visualViewport = _ref.visualViewport;\n\n var addVisualOffsets = !isLayoutViewport() && isFixedStrategy;\n var x = (clientRect.left + (addVisualOffsets && visualViewport ? visualViewport.offsetLeft : 0)) / scaleX;\n var y = (clientRect.top + (addVisualOffsets && visualViewport ? visualViewport.offsetTop : 0)) / scaleY;\n var width = clientRect.width / scaleX;\n var height = clientRect.height / scaleY;\n return {\n width: width,\n height: height,\n top: y,\n right: x + width,\n bottom: y + height,\n left: x,\n x: x,\n y: y\n };\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\"; // Returns the layout rect of an element relative to its offsetParent. Layout\n// means it doesn't take into account transforms.\n\nexport default function getLayoutRect(element) {\n var clientRect = getBoundingClientRect(element); // Use the clientRect sizes if it's not been transformed.\n // Fixes https://github.com/popperjs/popper-core/issues/1223\n\n var width = element.offsetWidth;\n var height = element.offsetHeight;\n\n if (Math.abs(clientRect.width - width) <= 1) {\n width = clientRect.width;\n }\n\n if (Math.abs(clientRect.height - height) <= 1) {\n height = clientRect.height;\n }\n\n return {\n x: element.offsetLeft,\n y: element.offsetTop,\n width: width,\n height: height\n };\n}","import { isShadowRoot } from \"./instanceOf.js\";\nexport default function contains(parent, child) {\n var rootNode = child.getRootNode && child.getRootNode(); // First, attempt with faster native method\n\n if (parent.contains(child)) {\n return true;\n } // then fallback to custom implementation with Shadow DOM support\n else if (rootNode && isShadowRoot(rootNode)) {\n var next = child;\n\n do {\n if (next && parent.isSameNode(next)) {\n return true;\n } // $FlowFixMe[prop-missing]: need a better way to handle this...\n\n\n next = next.parentNode || next.host;\n } while (next);\n } // Give up, the result is false\n\n\n return false;\n}","import getWindow from \"./getWindow.js\";\nexport default function getComputedStyle(element) {\n return getWindow(element).getComputedStyle(element);\n}","import getNodeName from \"./getNodeName.js\";\nexport default function isTableElement(element) {\n return ['table', 'td', 'th'].indexOf(getNodeName(element)) >= 0;\n}","import { isElement } from \"./instanceOf.js\";\nexport default function getDocumentElement(element) {\n // $FlowFixMe[incompatible-return]: assume body is always available\n return ((isElement(element) ? element.ownerDocument : // $FlowFixMe[prop-missing]\n element.document) || window.document).documentElement;\n}","import getNodeName from \"./getNodeName.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport { isShadowRoot } from \"./instanceOf.js\";\nexport default function getParentNode(element) {\n if (getNodeName(element) === 'html') {\n return element;\n }\n\n return (// this is a quicker (but less type safe) way to save quite some bytes from the bundle\n // $FlowFixMe[incompatible-return]\n // $FlowFixMe[prop-missing]\n element.assignedSlot || // step into the shadow DOM of the parent of a slotted node\n element.parentNode || ( // DOM Element detected\n isShadowRoot(element) ? element.host : null) || // ShadowRoot detected\n // $FlowFixMe[incompatible-call]: HTMLElement is a Node\n getDocumentElement(element) // fallback\n\n );\n}","import getWindow from \"./getWindow.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport { isHTMLElement, isShadowRoot } from \"./instanceOf.js\";\nimport isTableElement from \"./isTableElement.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport getUAString from \"../utils/userAgent.js\";\n\nfunction getTrueOffsetParent(element) {\n if (!isHTMLElement(element) || // https://github.com/popperjs/popper-core/issues/837\n getComputedStyle(element).position === 'fixed') {\n return null;\n }\n\n return element.offsetParent;\n} // `.offsetParent` reports `null` for fixed elements, while absolute elements\n// return the containing block\n\n\nfunction getContainingBlock(element) {\n var isFirefox = /firefox/i.test(getUAString());\n var isIE = /Trident/i.test(getUAString());\n\n if (isIE && isHTMLElement(element)) {\n // In IE 9, 10 and 11 fixed elements containing block is always established by the viewport\n var elementCss = getComputedStyle(element);\n\n if (elementCss.position === 'fixed') {\n return null;\n }\n }\n\n var currentNode = getParentNode(element);\n\n if (isShadowRoot(currentNode)) {\n currentNode = currentNode.host;\n }\n\n while (isHTMLElement(currentNode) && ['html', 'body'].indexOf(getNodeName(currentNode)) < 0) {\n var css = getComputedStyle(currentNode); // This is non-exhaustive but covers the most common CSS properties that\n // create a containing block.\n // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n\n if (css.transform !== 'none' || css.perspective !== 'none' || css.contain === 'paint' || ['transform', 'perspective'].indexOf(css.willChange) !== -1 || isFirefox && css.willChange === 'filter' || isFirefox && css.filter && css.filter !== 'none') {\n return currentNode;\n } else {\n currentNode = currentNode.parentNode;\n }\n }\n\n return null;\n} // Gets the closest ancestor positioned element. Handles some edge cases,\n// such as table ancestors and cross browser bugs.\n\n\nexport default function getOffsetParent(element) {\n var window = getWindow(element);\n var offsetParent = getTrueOffsetParent(element);\n\n while (offsetParent && isTableElement(offsetParent) && getComputedStyle(offsetParent).position === 'static') {\n offsetParent = getTrueOffsetParent(offsetParent);\n }\n\n if (offsetParent && (getNodeName(offsetParent) === 'html' || getNodeName(offsetParent) === 'body' && getComputedStyle(offsetParent).position === 'static')) {\n return window;\n }\n\n return offsetParent || getContainingBlock(element) || window;\n}","export default function getMainAxisFromPlacement(placement) {\n return ['top', 'bottom'].indexOf(placement) >= 0 ? 'x' : 'y';\n}","import { max as mathMax, min as mathMin } from \"./math.js\";\nexport function within(min, value, max) {\n return mathMax(min, mathMin(value, max));\n}\nexport function withinMaxClamp(min, value, max) {\n var v = within(min, value, max);\n return v > max ? max : v;\n}","import getFreshSideObject from \"./getFreshSideObject.js\";\nexport default function mergePaddingObject(paddingObject) {\n return Object.assign({}, getFreshSideObject(), paddingObject);\n}","export default function getFreshSideObject() {\n return {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0\n };\n}","export default function expandToHashMap(value, keys) {\n return keys.reduce(function (hashMap, key) {\n hashMap[key] = value;\n return hashMap;\n }, {});\n}","import getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getLayoutRect from \"../dom-utils/getLayoutRect.js\";\nimport contains from \"../dom-utils/contains.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport getMainAxisFromPlacement from \"../utils/getMainAxisFromPlacement.js\";\nimport { within } from \"../utils/within.js\";\nimport mergePaddingObject from \"../utils/mergePaddingObject.js\";\nimport expandToHashMap from \"../utils/expandToHashMap.js\";\nimport { left, right, basePlacements, top, bottom } from \"../enums.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar toPaddingObject = function toPaddingObject(padding, state) {\n padding = typeof padding === 'function' ? padding(Object.assign({}, state.rects, {\n placement: state.placement\n })) : padding;\n return mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements));\n};\n\nfunction arrow(_ref) {\n var _state$modifiersData$;\n\n var state = _ref.state,\n name = _ref.name,\n options = _ref.options;\n var arrowElement = state.elements.arrow;\n var popperOffsets = state.modifiersData.popperOffsets;\n var basePlacement = getBasePlacement(state.placement);\n var axis = getMainAxisFromPlacement(basePlacement);\n var isVertical = [left, right].indexOf(basePlacement) >= 0;\n var len = isVertical ? 'height' : 'width';\n\n if (!arrowElement || !popperOffsets) {\n return;\n }\n\n var paddingObject = toPaddingObject(options.padding, state);\n var arrowRect = getLayoutRect(arrowElement);\n var minProp = axis === 'y' ? top : left;\n var maxProp = axis === 'y' ? bottom : right;\n var endDiff = state.rects.reference[len] + state.rects.reference[axis] - popperOffsets[axis] - state.rects.popper[len];\n var startDiff = popperOffsets[axis] - state.rects.reference[axis];\n var arrowOffsetParent = getOffsetParent(arrowElement);\n var clientSize = arrowOffsetParent ? axis === 'y' ? arrowOffsetParent.clientHeight || 0 : arrowOffsetParent.clientWidth || 0 : 0;\n var centerToReference = endDiff / 2 - startDiff / 2; // Make sure the arrow doesn't overflow the popper if the center point is\n // outside of the popper bounds\n\n var min = paddingObject[minProp];\n var max = clientSize - arrowRect[len] - paddingObject[maxProp];\n var center = clientSize / 2 - arrowRect[len] / 2 + centerToReference;\n var offset = within(min, center, max); // Prevents breaking syntax highlighting...\n\n var axisProp = axis;\n state.modifiersData[name] = (_state$modifiersData$ = {}, _state$modifiersData$[axisProp] = offset, _state$modifiersData$.centerOffset = offset - center, _state$modifiersData$);\n}\n\nfunction effect(_ref2) {\n var state = _ref2.state,\n options = _ref2.options;\n var _options$element = options.element,\n arrowElement = _options$element === void 0 ? '[data-popper-arrow]' : _options$element;\n\n if (arrowElement == null) {\n return;\n } // CSS selector\n\n\n if (typeof arrowElement === 'string') {\n arrowElement = state.elements.popper.querySelector(arrowElement);\n\n if (!arrowElement) {\n return;\n }\n }\n\n if (!contains(state.elements.popper, arrowElement)) {\n return;\n }\n\n state.elements.arrow = arrowElement;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'arrow',\n enabled: true,\n phase: 'main',\n fn: arrow,\n effect: effect,\n requires: ['popperOffsets'],\n requiresIfExists: ['preventOverflow']\n};","export default function getVariation(placement) {\n return placement.split('-')[1];\n}","import { top, left, right, bottom, end } from \"../enums.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport getWindow from \"../dom-utils/getWindow.js\";\nimport getDocumentElement from \"../dom-utils/getDocumentElement.js\";\nimport getComputedStyle from \"../dom-utils/getComputedStyle.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getVariation from \"../utils/getVariation.js\";\nimport { round } from \"../utils/math.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar unsetSides = {\n top: 'auto',\n right: 'auto',\n bottom: 'auto',\n left: 'auto'\n}; // Round the offsets to the nearest suitable subpixel based on the DPR.\n// Zooming can change the DPR, but it seems to report a value that will\n// cleanly divide the values into the appropriate subpixels.\n\nfunction roundOffsetsByDPR(_ref, win) {\n var x = _ref.x,\n y = _ref.y;\n var dpr = win.devicePixelRatio || 1;\n return {\n x: round(x * dpr) / dpr || 0,\n y: round(y * dpr) / dpr || 0\n };\n}\n\nexport function mapToStyles(_ref2) {\n var _Object$assign2;\n\n var popper = _ref2.popper,\n popperRect = _ref2.popperRect,\n placement = _ref2.placement,\n variation = _ref2.variation,\n offsets = _ref2.offsets,\n position = _ref2.position,\n gpuAcceleration = _ref2.gpuAcceleration,\n adaptive = _ref2.adaptive,\n roundOffsets = _ref2.roundOffsets,\n isFixed = _ref2.isFixed;\n var _offsets$x = offsets.x,\n x = _offsets$x === void 0 ? 0 : _offsets$x,\n _offsets$y = offsets.y,\n y = _offsets$y === void 0 ? 0 : _offsets$y;\n\n var _ref3 = typeof roundOffsets === 'function' ? roundOffsets({\n x: x,\n y: y\n }) : {\n x: x,\n y: y\n };\n\n x = _ref3.x;\n y = _ref3.y;\n var hasX = offsets.hasOwnProperty('x');\n var hasY = offsets.hasOwnProperty('y');\n var sideX = left;\n var sideY = top;\n var win = window;\n\n if (adaptive) {\n var offsetParent = getOffsetParent(popper);\n var heightProp = 'clientHeight';\n var widthProp = 'clientWidth';\n\n if (offsetParent === getWindow(popper)) {\n offsetParent = getDocumentElement(popper);\n\n if (getComputedStyle(offsetParent).position !== 'static' && position === 'absolute') {\n heightProp = 'scrollHeight';\n widthProp = 'scrollWidth';\n }\n } // $FlowFixMe[incompatible-cast]: force type refinement, we compare offsetParent with window above, but Flow doesn't detect it\n\n\n offsetParent = offsetParent;\n\n if (placement === top || (placement === left || placement === right) && variation === end) {\n sideY = bottom;\n var offsetY = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.height : // $FlowFixMe[prop-missing]\n offsetParent[heightProp];\n y -= offsetY - popperRect.height;\n y *= gpuAcceleration ? 1 : -1;\n }\n\n if (placement === left || (placement === top || placement === bottom) && variation === end) {\n sideX = right;\n var offsetX = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.width : // $FlowFixMe[prop-missing]\n offsetParent[widthProp];\n x -= offsetX - popperRect.width;\n x *= gpuAcceleration ? 1 : -1;\n }\n }\n\n var commonStyles = Object.assign({\n position: position\n }, adaptive && unsetSides);\n\n var _ref4 = roundOffsets === true ? roundOffsetsByDPR({\n x: x,\n y: y\n }, getWindow(popper)) : {\n x: x,\n y: y\n };\n\n x = _ref4.x;\n y = _ref4.y;\n\n if (gpuAcceleration) {\n var _Object$assign;\n\n return Object.assign({}, commonStyles, (_Object$assign = {}, _Object$assign[sideY] = hasY ? '0' : '', _Object$assign[sideX] = hasX ? '0' : '', _Object$assign.transform = (win.devicePixelRatio || 1) <= 1 ? \"translate(\" + x + \"px, \" + y + \"px)\" : \"translate3d(\" + x + \"px, \" + y + \"px, 0)\", _Object$assign));\n }\n\n return Object.assign({}, commonStyles, (_Object$assign2 = {}, _Object$assign2[sideY] = hasY ? y + \"px\" : '', _Object$assign2[sideX] = hasX ? x + \"px\" : '', _Object$assign2.transform = '', _Object$assign2));\n}\n\nfunction computeStyles(_ref5) {\n var state = _ref5.state,\n options = _ref5.options;\n var _options$gpuAccelerat = options.gpuAcceleration,\n gpuAcceleration = _options$gpuAccelerat === void 0 ? true : _options$gpuAccelerat,\n _options$adaptive = options.adaptive,\n adaptive = _options$adaptive === void 0 ? true : _options$adaptive,\n _options$roundOffsets = options.roundOffsets,\n roundOffsets = _options$roundOffsets === void 0 ? true : _options$roundOffsets;\n var commonStyles = {\n placement: getBasePlacement(state.placement),\n variation: getVariation(state.placement),\n popper: state.elements.popper,\n popperRect: state.rects.popper,\n gpuAcceleration: gpuAcceleration,\n isFixed: state.options.strategy === 'fixed'\n };\n\n if (state.modifiersData.popperOffsets != null) {\n state.styles.popper = Object.assign({}, state.styles.popper, mapToStyles(Object.assign({}, commonStyles, {\n offsets: state.modifiersData.popperOffsets,\n position: state.options.strategy,\n adaptive: adaptive,\n roundOffsets: roundOffsets\n })));\n }\n\n if (state.modifiersData.arrow != null) {\n state.styles.arrow = Object.assign({}, state.styles.arrow, mapToStyles(Object.assign({}, commonStyles, {\n offsets: state.modifiersData.arrow,\n position: 'absolute',\n adaptive: false,\n roundOffsets: roundOffsets\n })));\n }\n\n state.attributes.popper = Object.assign({}, state.attributes.popper, {\n 'data-popper-placement': state.placement\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'computeStyles',\n enabled: true,\n phase: 'beforeWrite',\n fn: computeStyles,\n data: {}\n};","import getWindow from \"../dom-utils/getWindow.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar passive = {\n passive: true\n};\n\nfunction effect(_ref) {\n var state = _ref.state,\n instance = _ref.instance,\n options = _ref.options;\n var _options$scroll = options.scroll,\n scroll = _options$scroll === void 0 ? true : _options$scroll,\n _options$resize = options.resize,\n resize = _options$resize === void 0 ? true : _options$resize;\n var window = getWindow(state.elements.popper);\n var scrollParents = [].concat(state.scrollParents.reference, state.scrollParents.popper);\n\n if (scroll) {\n scrollParents.forEach(function (scrollParent) {\n scrollParent.addEventListener('scroll', instance.update, passive);\n });\n }\n\n if (resize) {\n window.addEventListener('resize', instance.update, passive);\n }\n\n return function () {\n if (scroll) {\n scrollParents.forEach(function (scrollParent) {\n scrollParent.removeEventListener('scroll', instance.update, passive);\n });\n }\n\n if (resize) {\n window.removeEventListener('resize', instance.update, passive);\n }\n };\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'eventListeners',\n enabled: true,\n phase: 'write',\n fn: function fn() {},\n effect: effect,\n data: {}\n};","var hash = {\n left: 'right',\n right: 'left',\n bottom: 'top',\n top: 'bottom'\n};\nexport default function getOppositePlacement(placement) {\n return placement.replace(/left|right|bottom|top/g, function (matched) {\n return hash[matched];\n });\n}","var hash = {\n start: 'end',\n end: 'start'\n};\nexport default function getOppositeVariationPlacement(placement) {\n return placement.replace(/start|end/g, function (matched) {\n return hash[matched];\n });\n}","import getWindow from \"./getWindow.js\";\nexport default function getWindowScroll(node) {\n var win = getWindow(node);\n var scrollLeft = win.pageXOffset;\n var scrollTop = win.pageYOffset;\n return {\n scrollLeft: scrollLeft,\n scrollTop: scrollTop\n };\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getWindowScroll from \"./getWindowScroll.js\";\nexport default function getWindowScrollBarX(element) {\n // If has a CSS width greater than the viewport, then this will be\n // incorrect for RTL.\n // Popper 1 is broken in this case and never had a bug report so let's assume\n // it's not an issue. I don't think anyone ever specifies width on \n // anyway.\n // Browsers where the left scrollbar doesn't cause an issue report `0` for\n // this (e.g. Edge 2019, IE11, Safari)\n return getBoundingClientRect(getDocumentElement(element)).left + getWindowScroll(element).scrollLeft;\n}","import getComputedStyle from \"./getComputedStyle.js\";\nexport default function isScrollParent(element) {\n // Firefox wants us to check `-x` and `-y` variations as well\n var _getComputedStyle = getComputedStyle(element),\n overflow = _getComputedStyle.overflow,\n overflowX = _getComputedStyle.overflowX,\n overflowY = _getComputedStyle.overflowY;\n\n return /auto|scroll|overlay|hidden/.test(overflow + overflowY + overflowX);\n}","import getParentNode from \"./getParentNode.js\";\nimport isScrollParent from \"./isScrollParent.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nexport default function getScrollParent(node) {\n if (['html', 'body', '#document'].indexOf(getNodeName(node)) >= 0) {\n // $FlowFixMe[incompatible-return]: assume body is always available\n return node.ownerDocument.body;\n }\n\n if (isHTMLElement(node) && isScrollParent(node)) {\n return node;\n }\n\n return getScrollParent(getParentNode(node));\n}","import getScrollParent from \"./getScrollParent.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport getWindow from \"./getWindow.js\";\nimport isScrollParent from \"./isScrollParent.js\";\n/*\ngiven a DOM element, return the list of all scroll parents, up the list of ancesors\nuntil we get to the top window object. This list is what we attach scroll listeners\nto, because if any of these parent elements scroll, we'll need to re-calculate the\nreference element's position.\n*/\n\nexport default function listScrollParents(element, list) {\n var _element$ownerDocumen;\n\n if (list === void 0) {\n list = [];\n }\n\n var scrollParent = getScrollParent(element);\n var isBody = scrollParent === ((_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body);\n var win = getWindow(scrollParent);\n var target = isBody ? [win].concat(win.visualViewport || [], isScrollParent(scrollParent) ? scrollParent : []) : scrollParent;\n var updatedList = list.concat(target);\n return isBody ? updatedList : // $FlowFixMe[incompatible-call]: isBody tells us target will be an HTMLElement here\n updatedList.concat(listScrollParents(getParentNode(target)));\n}","export default function rectToClientRect(rect) {\n return Object.assign({}, rect, {\n left: rect.x,\n top: rect.y,\n right: rect.x + rect.width,\n bottom: rect.y + rect.height\n });\n}","import { viewport } from \"../enums.js\";\nimport getViewportRect from \"./getViewportRect.js\";\nimport getDocumentRect from \"./getDocumentRect.js\";\nimport listScrollParents from \"./listScrollParents.js\";\nimport getOffsetParent from \"./getOffsetParent.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport { isElement, isHTMLElement } from \"./instanceOf.js\";\nimport getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport contains from \"./contains.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport rectToClientRect from \"../utils/rectToClientRect.js\";\nimport { max, min } from \"../utils/math.js\";\n\nfunction getInnerBoundingClientRect(element, strategy) {\n var rect = getBoundingClientRect(element, false, strategy === 'fixed');\n rect.top = rect.top + element.clientTop;\n rect.left = rect.left + element.clientLeft;\n rect.bottom = rect.top + element.clientHeight;\n rect.right = rect.left + element.clientWidth;\n rect.width = element.clientWidth;\n rect.height = element.clientHeight;\n rect.x = rect.left;\n rect.y = rect.top;\n return rect;\n}\n\nfunction getClientRectFromMixedType(element, clippingParent, strategy) {\n return clippingParent === viewport ? rectToClientRect(getViewportRect(element, strategy)) : isElement(clippingParent) ? getInnerBoundingClientRect(clippingParent, strategy) : rectToClientRect(getDocumentRect(getDocumentElement(element)));\n} // A \"clipping parent\" is an overflowable container with the characteristic of\n// clipping (or hiding) overflowing elements with a position different from\n// `initial`\n\n\nfunction getClippingParents(element) {\n var clippingParents = listScrollParents(getParentNode(element));\n var canEscapeClipping = ['absolute', 'fixed'].indexOf(getComputedStyle(element).position) >= 0;\n var clipperElement = canEscapeClipping && isHTMLElement(element) ? getOffsetParent(element) : element;\n\n if (!isElement(clipperElement)) {\n return [];\n } // $FlowFixMe[incompatible-return]: https://github.com/facebook/flow/issues/1414\n\n\n return clippingParents.filter(function (clippingParent) {\n return isElement(clippingParent) && contains(clippingParent, clipperElement) && getNodeName(clippingParent) !== 'body';\n });\n} // Gets the maximum area that the element is visible in due to any number of\n// clipping parents\n\n\nexport default function getClippingRect(element, boundary, rootBoundary, strategy) {\n var mainClippingParents = boundary === 'clippingParents' ? getClippingParents(element) : [].concat(boundary);\n var clippingParents = [].concat(mainClippingParents, [rootBoundary]);\n var firstClippingParent = clippingParents[0];\n var clippingRect = clippingParents.reduce(function (accRect, clippingParent) {\n var rect = getClientRectFromMixedType(element, clippingParent, strategy);\n accRect.top = max(rect.top, accRect.top);\n accRect.right = min(rect.right, accRect.right);\n accRect.bottom = min(rect.bottom, accRect.bottom);\n accRect.left = max(rect.left, accRect.left);\n return accRect;\n }, getClientRectFromMixedType(element, firstClippingParent, strategy));\n clippingRect.width = clippingRect.right - clippingRect.left;\n clippingRect.height = clippingRect.bottom - clippingRect.top;\n clippingRect.x = clippingRect.left;\n clippingRect.y = clippingRect.top;\n return clippingRect;\n}","import getWindow from \"./getWindow.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport isLayoutViewport from \"./isLayoutViewport.js\";\nexport default function getViewportRect(element, strategy) {\n var win = getWindow(element);\n var html = getDocumentElement(element);\n var visualViewport = win.visualViewport;\n var width = html.clientWidth;\n var height = html.clientHeight;\n var x = 0;\n var y = 0;\n\n if (visualViewport) {\n width = visualViewport.width;\n height = visualViewport.height;\n var layoutViewport = isLayoutViewport();\n\n if (layoutViewport || !layoutViewport && strategy === 'fixed') {\n x = visualViewport.offsetLeft;\n y = visualViewport.offsetTop;\n }\n }\n\n return {\n width: width,\n height: height,\n x: x + getWindowScrollBarX(element),\n y: y\n };\n}","import getDocumentElement from \"./getDocumentElement.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport getWindowScroll from \"./getWindowScroll.js\";\nimport { max } from \"../utils/math.js\"; // Gets the entire size of the scrollable document area, even extending outside\n// of the `` and `` rect bounds if horizontally scrollable\n\nexport default function getDocumentRect(element) {\n var _element$ownerDocumen;\n\n var html = getDocumentElement(element);\n var winScroll = getWindowScroll(element);\n var body = (_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body;\n var width = max(html.scrollWidth, html.clientWidth, body ? body.scrollWidth : 0, body ? body.clientWidth : 0);\n var height = max(html.scrollHeight, html.clientHeight, body ? body.scrollHeight : 0, body ? body.clientHeight : 0);\n var x = -winScroll.scrollLeft + getWindowScrollBarX(element);\n var y = -winScroll.scrollTop;\n\n if (getComputedStyle(body || html).direction === 'rtl') {\n x += max(html.clientWidth, body ? body.clientWidth : 0) - width;\n }\n\n return {\n width: width,\n height: height,\n x: x,\n y: y\n };\n}","import getBasePlacement from \"./getBasePlacement.js\";\nimport getVariation from \"./getVariation.js\";\nimport getMainAxisFromPlacement from \"./getMainAxisFromPlacement.js\";\nimport { top, right, bottom, left, start, end } from \"../enums.js\";\nexport default function computeOffsets(_ref) {\n var reference = _ref.reference,\n element = _ref.element,\n placement = _ref.placement;\n var basePlacement = placement ? getBasePlacement(placement) : null;\n var variation = placement ? getVariation(placement) : null;\n var commonX = reference.x + reference.width / 2 - element.width / 2;\n var commonY = reference.y + reference.height / 2 - element.height / 2;\n var offsets;\n\n switch (basePlacement) {\n case top:\n offsets = {\n x: commonX,\n y: reference.y - element.height\n };\n break;\n\n case bottom:\n offsets = {\n x: commonX,\n y: reference.y + reference.height\n };\n break;\n\n case right:\n offsets = {\n x: reference.x + reference.width,\n y: commonY\n };\n break;\n\n case left:\n offsets = {\n x: reference.x - element.width,\n y: commonY\n };\n break;\n\n default:\n offsets = {\n x: reference.x,\n y: reference.y\n };\n }\n\n var mainAxis = basePlacement ? getMainAxisFromPlacement(basePlacement) : null;\n\n if (mainAxis != null) {\n var len = mainAxis === 'y' ? 'height' : 'width';\n\n switch (variation) {\n case start:\n offsets[mainAxis] = offsets[mainAxis] - (reference[len] / 2 - element[len] / 2);\n break;\n\n case end:\n offsets[mainAxis] = offsets[mainAxis] + (reference[len] / 2 - element[len] / 2);\n break;\n\n default:\n }\n }\n\n return offsets;\n}","import getClippingRect from \"../dom-utils/getClippingRect.js\";\nimport getDocumentElement from \"../dom-utils/getDocumentElement.js\";\nimport getBoundingClientRect from \"../dom-utils/getBoundingClientRect.js\";\nimport computeOffsets from \"./computeOffsets.js\";\nimport rectToClientRect from \"./rectToClientRect.js\";\nimport { clippingParents, reference, popper, bottom, top, right, basePlacements, viewport } from \"../enums.js\";\nimport { isElement } from \"../dom-utils/instanceOf.js\";\nimport mergePaddingObject from \"./mergePaddingObject.js\";\nimport expandToHashMap from \"./expandToHashMap.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport default function detectOverflow(state, options) {\n if (options === void 0) {\n options = {};\n }\n\n var _options = options,\n _options$placement = _options.placement,\n placement = _options$placement === void 0 ? state.placement : _options$placement,\n _options$strategy = _options.strategy,\n strategy = _options$strategy === void 0 ? state.strategy : _options$strategy,\n _options$boundary = _options.boundary,\n boundary = _options$boundary === void 0 ? clippingParents : _options$boundary,\n _options$rootBoundary = _options.rootBoundary,\n rootBoundary = _options$rootBoundary === void 0 ? viewport : _options$rootBoundary,\n _options$elementConte = _options.elementContext,\n elementContext = _options$elementConte === void 0 ? popper : _options$elementConte,\n _options$altBoundary = _options.altBoundary,\n altBoundary = _options$altBoundary === void 0 ? false : _options$altBoundary,\n _options$padding = _options.padding,\n padding = _options$padding === void 0 ? 0 : _options$padding;\n var paddingObject = mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements));\n var altContext = elementContext === popper ? reference : popper;\n var popperRect = state.rects.popper;\n var element = state.elements[altBoundary ? altContext : elementContext];\n var clippingClientRect = getClippingRect(isElement(element) ? element : element.contextElement || getDocumentElement(state.elements.popper), boundary, rootBoundary, strategy);\n var referenceClientRect = getBoundingClientRect(state.elements.reference);\n var popperOffsets = computeOffsets({\n reference: referenceClientRect,\n element: popperRect,\n strategy: 'absolute',\n placement: placement\n });\n var popperClientRect = rectToClientRect(Object.assign({}, popperRect, popperOffsets));\n var elementClientRect = elementContext === popper ? popperClientRect : referenceClientRect; // positive = overflowing the clipping rect\n // 0 or negative = within the clipping rect\n\n var overflowOffsets = {\n top: clippingClientRect.top - elementClientRect.top + paddingObject.top,\n bottom: elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom,\n left: clippingClientRect.left - elementClientRect.left + paddingObject.left,\n right: elementClientRect.right - clippingClientRect.right + paddingObject.right\n };\n var offsetData = state.modifiersData.offset; // Offsets can be applied only to the popper element\n\n if (elementContext === popper && offsetData) {\n var offset = offsetData[placement];\n Object.keys(overflowOffsets).forEach(function (key) {\n var multiply = [right, bottom].indexOf(key) >= 0 ? 1 : -1;\n var axis = [top, bottom].indexOf(key) >= 0 ? 'y' : 'x';\n overflowOffsets[key] += offset[axis] * multiply;\n });\n }\n\n return overflowOffsets;\n}","import getVariation from \"./getVariation.js\";\nimport { variationPlacements, basePlacements, placements as allPlacements } from \"../enums.js\";\nimport detectOverflow from \"./detectOverflow.js\";\nimport getBasePlacement from \"./getBasePlacement.js\";\nexport default function computeAutoPlacement(state, options) {\n if (options === void 0) {\n options = {};\n }\n\n var _options = options,\n placement = _options.placement,\n boundary = _options.boundary,\n rootBoundary = _options.rootBoundary,\n padding = _options.padding,\n flipVariations = _options.flipVariations,\n _options$allowedAutoP = _options.allowedAutoPlacements,\n allowedAutoPlacements = _options$allowedAutoP === void 0 ? allPlacements : _options$allowedAutoP;\n var variation = getVariation(placement);\n var placements = variation ? flipVariations ? variationPlacements : variationPlacements.filter(function (placement) {\n return getVariation(placement) === variation;\n }) : basePlacements;\n var allowedPlacements = placements.filter(function (placement) {\n return allowedAutoPlacements.indexOf(placement) >= 0;\n });\n\n if (allowedPlacements.length === 0) {\n allowedPlacements = placements;\n } // $FlowFixMe[incompatible-type]: Flow seems to have problems with two array unions...\n\n\n var overflows = allowedPlacements.reduce(function (acc, placement) {\n acc[placement] = detectOverflow(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding\n })[getBasePlacement(placement)];\n return acc;\n }, {});\n return Object.keys(overflows).sort(function (a, b) {\n return overflows[a] - overflows[b];\n });\n}","import getOppositePlacement from \"../utils/getOppositePlacement.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getOppositeVariationPlacement from \"../utils/getOppositeVariationPlacement.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\nimport computeAutoPlacement from \"../utils/computeAutoPlacement.js\";\nimport { bottom, top, start, right, left, auto } from \"../enums.js\";\nimport getVariation from \"../utils/getVariation.js\"; // eslint-disable-next-line import/no-unused-modules\n\nfunction getExpandedFallbackPlacements(placement) {\n if (getBasePlacement(placement) === auto) {\n return [];\n }\n\n var oppositePlacement = getOppositePlacement(placement);\n return [getOppositeVariationPlacement(placement), oppositePlacement, getOppositeVariationPlacement(oppositePlacement)];\n}\n\nfunction flip(_ref) {\n var state = _ref.state,\n options = _ref.options,\n name = _ref.name;\n\n if (state.modifiersData[name]._skip) {\n return;\n }\n\n var _options$mainAxis = options.mainAxis,\n checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,\n _options$altAxis = options.altAxis,\n checkAltAxis = _options$altAxis === void 0 ? true : _options$altAxis,\n specifiedFallbackPlacements = options.fallbackPlacements,\n padding = options.padding,\n boundary = options.boundary,\n rootBoundary = options.rootBoundary,\n altBoundary = options.altBoundary,\n _options$flipVariatio = options.flipVariations,\n flipVariations = _options$flipVariatio === void 0 ? true : _options$flipVariatio,\n allowedAutoPlacements = options.allowedAutoPlacements;\n var preferredPlacement = state.options.placement;\n var basePlacement = getBasePlacement(preferredPlacement);\n var isBasePlacement = basePlacement === preferredPlacement;\n var fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipVariations ? [getOppositePlacement(preferredPlacement)] : getExpandedFallbackPlacements(preferredPlacement));\n var placements = [preferredPlacement].concat(fallbackPlacements).reduce(function (acc, placement) {\n return acc.concat(getBasePlacement(placement) === auto ? computeAutoPlacement(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding,\n flipVariations: flipVariations,\n allowedAutoPlacements: allowedAutoPlacements\n }) : placement);\n }, []);\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var checksMap = new Map();\n var makeFallbackChecks = true;\n var firstFittingPlacement = placements[0];\n\n for (var i = 0; i < placements.length; i++) {\n var placement = placements[i];\n\n var _basePlacement = getBasePlacement(placement);\n\n var isStartVariation = getVariation(placement) === start;\n var isVertical = [top, bottom].indexOf(_basePlacement) >= 0;\n var len = isVertical ? 'width' : 'height';\n var overflow = detectOverflow(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n altBoundary: altBoundary,\n padding: padding\n });\n var mainVariationSide = isVertical ? isStartVariation ? right : left : isStartVariation ? bottom : top;\n\n if (referenceRect[len] > popperRect[len]) {\n mainVariationSide = getOppositePlacement(mainVariationSide);\n }\n\n var altVariationSide = getOppositePlacement(mainVariationSide);\n var checks = [];\n\n if (checkMainAxis) {\n checks.push(overflow[_basePlacement] <= 0);\n }\n\n if (checkAltAxis) {\n checks.push(overflow[mainVariationSide] <= 0, overflow[altVariationSide] <= 0);\n }\n\n if (checks.every(function (check) {\n return check;\n })) {\n firstFittingPlacement = placement;\n makeFallbackChecks = false;\n break;\n }\n\n checksMap.set(placement, checks);\n }\n\n if (makeFallbackChecks) {\n // `2` may be desired in some cases – research later\n var numberOfChecks = flipVariations ? 3 : 1;\n\n var _loop = function _loop(_i) {\n var fittingPlacement = placements.find(function (placement) {\n var checks = checksMap.get(placement);\n\n if (checks) {\n return checks.slice(0, _i).every(function (check) {\n return check;\n });\n }\n });\n\n if (fittingPlacement) {\n firstFittingPlacement = fittingPlacement;\n return \"break\";\n }\n };\n\n for (var _i = numberOfChecks; _i > 0; _i--) {\n var _ret = _loop(_i);\n\n if (_ret === \"break\") break;\n }\n }\n\n if (state.placement !== firstFittingPlacement) {\n state.modifiersData[name]._skip = true;\n state.placement = firstFittingPlacement;\n state.reset = true;\n }\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'flip',\n enabled: true,\n phase: 'main',\n fn: flip,\n requiresIfExists: ['offset'],\n data: {\n _skip: false\n }\n};","import { top, bottom, left, right } from \"../enums.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\n\nfunction getSideOffsets(overflow, rect, preventedOffsets) {\n if (preventedOffsets === void 0) {\n preventedOffsets = {\n x: 0,\n y: 0\n };\n }\n\n return {\n top: overflow.top - rect.height - preventedOffsets.y,\n right: overflow.right - rect.width + preventedOffsets.x,\n bottom: overflow.bottom - rect.height + preventedOffsets.y,\n left: overflow.left - rect.width - preventedOffsets.x\n };\n}\n\nfunction isAnySideFullyClipped(overflow) {\n return [top, right, bottom, left].some(function (side) {\n return overflow[side] >= 0;\n });\n}\n\nfunction hide(_ref) {\n var state = _ref.state,\n name = _ref.name;\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var preventedOffsets = state.modifiersData.preventOverflow;\n var referenceOverflow = detectOverflow(state, {\n elementContext: 'reference'\n });\n var popperAltOverflow = detectOverflow(state, {\n altBoundary: true\n });\n var referenceClippingOffsets = getSideOffsets(referenceOverflow, referenceRect);\n var popperEscapeOffsets = getSideOffsets(popperAltOverflow, popperRect, preventedOffsets);\n var isReferenceHidden = isAnySideFullyClipped(referenceClippingOffsets);\n var hasPopperEscaped = isAnySideFullyClipped(popperEscapeOffsets);\n state.modifiersData[name] = {\n referenceClippingOffsets: referenceClippingOffsets,\n popperEscapeOffsets: popperEscapeOffsets,\n isReferenceHidden: isReferenceHidden,\n hasPopperEscaped: hasPopperEscaped\n };\n state.attributes.popper = Object.assign({}, state.attributes.popper, {\n 'data-popper-reference-hidden': isReferenceHidden,\n 'data-popper-escaped': hasPopperEscaped\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'hide',\n enabled: true,\n phase: 'main',\n requiresIfExists: ['preventOverflow'],\n fn: hide\n};","import getBasePlacement from \"../utils/getBasePlacement.js\";\nimport { top, left, right, placements } from \"../enums.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport function distanceAndSkiddingToXY(placement, rects, offset) {\n var basePlacement = getBasePlacement(placement);\n var invertDistance = [left, top].indexOf(basePlacement) >= 0 ? -1 : 1;\n\n var _ref = typeof offset === 'function' ? offset(Object.assign({}, rects, {\n placement: placement\n })) : offset,\n skidding = _ref[0],\n distance = _ref[1];\n\n skidding = skidding || 0;\n distance = (distance || 0) * invertDistance;\n return [left, right].indexOf(basePlacement) >= 0 ? {\n x: distance,\n y: skidding\n } : {\n x: skidding,\n y: distance\n };\n}\n\nfunction offset(_ref2) {\n var state = _ref2.state,\n options = _ref2.options,\n name = _ref2.name;\n var _options$offset = options.offset,\n offset = _options$offset === void 0 ? [0, 0] : _options$offset;\n var data = placements.reduce(function (acc, placement) {\n acc[placement] = distanceAndSkiddingToXY(placement, state.rects, offset);\n return acc;\n }, {});\n var _data$state$placement = data[state.placement],\n x = _data$state$placement.x,\n y = _data$state$placement.y;\n\n if (state.modifiersData.popperOffsets != null) {\n state.modifiersData.popperOffsets.x += x;\n state.modifiersData.popperOffsets.y += y;\n }\n\n state.modifiersData[name] = data;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'offset',\n enabled: true,\n phase: 'main',\n requires: ['popperOffsets'],\n fn: offset\n};","import computeOffsets from \"../utils/computeOffsets.js\";\n\nfunction popperOffsets(_ref) {\n var state = _ref.state,\n name = _ref.name;\n // Offsets are the actual position the popper needs to have to be\n // properly positioned near its reference element\n // This is the most basic placement, and will be adjusted by\n // the modifiers in the next step\n state.modifiersData[name] = computeOffsets({\n reference: state.rects.reference,\n element: state.rects.popper,\n strategy: 'absolute',\n placement: state.placement\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'popperOffsets',\n enabled: true,\n phase: 'read',\n fn: popperOffsets,\n data: {}\n};","import { top, left, right, bottom, start } from \"../enums.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getMainAxisFromPlacement from \"../utils/getMainAxisFromPlacement.js\";\nimport getAltAxis from \"../utils/getAltAxis.js\";\nimport { within, withinMaxClamp } from \"../utils/within.js\";\nimport getLayoutRect from \"../dom-utils/getLayoutRect.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\nimport getVariation from \"../utils/getVariation.js\";\nimport getFreshSideObject from \"../utils/getFreshSideObject.js\";\nimport { min as mathMin, max as mathMax } from \"../utils/math.js\";\n\nfunction preventOverflow(_ref) {\n var state = _ref.state,\n options = _ref.options,\n name = _ref.name;\n var _options$mainAxis = options.mainAxis,\n checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,\n _options$altAxis = options.altAxis,\n checkAltAxis = _options$altAxis === void 0 ? false : _options$altAxis,\n boundary = options.boundary,\n rootBoundary = options.rootBoundary,\n altBoundary = options.altBoundary,\n padding = options.padding,\n _options$tether = options.tether,\n tether = _options$tether === void 0 ? true : _options$tether,\n _options$tetherOffset = options.tetherOffset,\n tetherOffset = _options$tetherOffset === void 0 ? 0 : _options$tetherOffset;\n var overflow = detectOverflow(state, {\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding,\n altBoundary: altBoundary\n });\n var basePlacement = getBasePlacement(state.placement);\n var variation = getVariation(state.placement);\n var isBasePlacement = !variation;\n var mainAxis = getMainAxisFromPlacement(basePlacement);\n var altAxis = getAltAxis(mainAxis);\n var popperOffsets = state.modifiersData.popperOffsets;\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var tetherOffsetValue = typeof tetherOffset === 'function' ? tetherOffset(Object.assign({}, state.rects, {\n placement: state.placement\n })) : tetherOffset;\n var normalizedTetherOffsetValue = typeof tetherOffsetValue === 'number' ? {\n mainAxis: tetherOffsetValue,\n altAxis: tetherOffsetValue\n } : Object.assign({\n mainAxis: 0,\n altAxis: 0\n }, tetherOffsetValue);\n var offsetModifierState = state.modifiersData.offset ? state.modifiersData.offset[state.placement] : null;\n var data = {\n x: 0,\n y: 0\n };\n\n if (!popperOffsets) {\n return;\n }\n\n if (checkMainAxis) {\n var _offsetModifierState$;\n\n var mainSide = mainAxis === 'y' ? top : left;\n var altSide = mainAxis === 'y' ? bottom : right;\n var len = mainAxis === 'y' ? 'height' : 'width';\n var offset = popperOffsets[mainAxis];\n var min = offset + overflow[mainSide];\n var max = offset - overflow[altSide];\n var additive = tether ? -popperRect[len] / 2 : 0;\n var minLen = variation === start ? referenceRect[len] : popperRect[len];\n var maxLen = variation === start ? -popperRect[len] : -referenceRect[len]; // We need to include the arrow in the calculation so the arrow doesn't go\n // outside the reference bounds\n\n var arrowElement = state.elements.arrow;\n var arrowRect = tether && arrowElement ? getLayoutRect(arrowElement) : {\n width: 0,\n height: 0\n };\n var arrowPaddingObject = state.modifiersData['arrow#persistent'] ? state.modifiersData['arrow#persistent'].padding : getFreshSideObject();\n var arrowPaddingMin = arrowPaddingObject[mainSide];\n var arrowPaddingMax = arrowPaddingObject[altSide]; // If the reference length is smaller than the arrow length, we don't want\n // to include its full size in the calculation. If the reference is small\n // and near the edge of a boundary, the popper can overflow even if the\n // reference is not overflowing as well (e.g. virtual elements with no\n // width or height)\n\n var arrowLen = within(0, referenceRect[len], arrowRect[len]);\n var minOffset = isBasePlacement ? referenceRect[len] / 2 - additive - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis : minLen - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis;\n var maxOffset = isBasePlacement ? -referenceRect[len] / 2 + additive + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis : maxLen + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis;\n var arrowOffsetParent = state.elements.arrow && getOffsetParent(state.elements.arrow);\n var clientOffset = arrowOffsetParent ? mainAxis === 'y' ? arrowOffsetParent.clientTop || 0 : arrowOffsetParent.clientLeft || 0 : 0;\n var offsetModifierValue = (_offsetModifierState$ = offsetModifierState == null ? void 0 : offsetModifierState[mainAxis]) != null ? _offsetModifierState$ : 0;\n var tetherMin = offset + minOffset - offsetModifierValue - clientOffset;\n var tetherMax = offset + maxOffset - offsetModifierValue;\n var preventedOffset = within(tether ? mathMin(min, tetherMin) : min, offset, tether ? mathMax(max, tetherMax) : max);\n popperOffsets[mainAxis] = preventedOffset;\n data[mainAxis] = preventedOffset - offset;\n }\n\n if (checkAltAxis) {\n var _offsetModifierState$2;\n\n var _mainSide = mainAxis === 'x' ? top : left;\n\n var _altSide = mainAxis === 'x' ? bottom : right;\n\n var _offset = popperOffsets[altAxis];\n\n var _len = altAxis === 'y' ? 'height' : 'width';\n\n var _min = _offset + overflow[_mainSide];\n\n var _max = _offset - overflow[_altSide];\n\n var isOriginSide = [top, left].indexOf(basePlacement) !== -1;\n\n var _offsetModifierValue = (_offsetModifierState$2 = offsetModifierState == null ? void 0 : offsetModifierState[altAxis]) != null ? _offsetModifierState$2 : 0;\n\n var _tetherMin = isOriginSide ? _min : _offset - referenceRect[_len] - popperRect[_len] - _offsetModifierValue + normalizedTetherOffsetValue.altAxis;\n\n var _tetherMax = isOriginSide ? _offset + referenceRect[_len] + popperRect[_len] - _offsetModifierValue - normalizedTetherOffsetValue.altAxis : _max;\n\n var _preventedOffset = tether && isOriginSide ? withinMaxClamp(_tetherMin, _offset, _tetherMax) : within(tether ? _tetherMin : _min, _offset, tether ? _tetherMax : _max);\n\n popperOffsets[altAxis] = _preventedOffset;\n data[altAxis] = _preventedOffset - _offset;\n }\n\n state.modifiersData[name] = data;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'preventOverflow',\n enabled: true,\n phase: 'main',\n fn: preventOverflow,\n requiresIfExists: ['offset']\n};","export default function getAltAxis(axis) {\n return axis === 'x' ? 'y' : 'x';\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getNodeScroll from \"./getNodeScroll.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport isScrollParent from \"./isScrollParent.js\";\nimport { round } from \"../utils/math.js\";\n\nfunction isElementScaled(element) {\n var rect = element.getBoundingClientRect();\n var scaleX = round(rect.width) / element.offsetWidth || 1;\n var scaleY = round(rect.height) / element.offsetHeight || 1;\n return scaleX !== 1 || scaleY !== 1;\n} // Returns the composite rect of an element relative to its offsetParent.\n// Composite means it takes into account transforms as well as layout.\n\n\nexport default function getCompositeRect(elementOrVirtualElement, offsetParent, isFixed) {\n if (isFixed === void 0) {\n isFixed = false;\n }\n\n var isOffsetParentAnElement = isHTMLElement(offsetParent);\n var offsetParentIsScaled = isHTMLElement(offsetParent) && isElementScaled(offsetParent);\n var documentElement = getDocumentElement(offsetParent);\n var rect = getBoundingClientRect(elementOrVirtualElement, offsetParentIsScaled, isFixed);\n var scroll = {\n scrollLeft: 0,\n scrollTop: 0\n };\n var offsets = {\n x: 0,\n y: 0\n };\n\n if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {\n if (getNodeName(offsetParent) !== 'body' || // https://github.com/popperjs/popper-core/issues/1078\n isScrollParent(documentElement)) {\n scroll = getNodeScroll(offsetParent);\n }\n\n if (isHTMLElement(offsetParent)) {\n offsets = getBoundingClientRect(offsetParent, true);\n offsets.x += offsetParent.clientLeft;\n offsets.y += offsetParent.clientTop;\n } else if (documentElement) {\n offsets.x = getWindowScrollBarX(documentElement);\n }\n }\n\n return {\n x: rect.left + scroll.scrollLeft - offsets.x,\n y: rect.top + scroll.scrollTop - offsets.y,\n width: rect.width,\n height: rect.height\n };\n}","import getWindowScroll from \"./getWindowScroll.js\";\nimport getWindow from \"./getWindow.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nimport getHTMLElementScroll from \"./getHTMLElementScroll.js\";\nexport default function getNodeScroll(node) {\n if (node === getWindow(node) || !isHTMLElement(node)) {\n return getWindowScroll(node);\n } else {\n return getHTMLElementScroll(node);\n }\n}","export default function getHTMLElementScroll(element) {\n return {\n scrollLeft: element.scrollLeft,\n scrollTop: element.scrollTop\n };\n}","import { modifierPhases } from \"../enums.js\"; // source: https://stackoverflow.com/questions/49875255\n\nfunction order(modifiers) {\n var map = new Map();\n var visited = new Set();\n var result = [];\n modifiers.forEach(function (modifier) {\n map.set(modifier.name, modifier);\n }); // On visiting object, check for its dependencies and visit them recursively\n\n function sort(modifier) {\n visited.add(modifier.name);\n var requires = [].concat(modifier.requires || [], modifier.requiresIfExists || []);\n requires.forEach(function (dep) {\n if (!visited.has(dep)) {\n var depModifier = map.get(dep);\n\n if (depModifier) {\n sort(depModifier);\n }\n }\n });\n result.push(modifier);\n }\n\n modifiers.forEach(function (modifier) {\n if (!visited.has(modifier.name)) {\n // check for visited object\n sort(modifier);\n }\n });\n return result;\n}\n\nexport default function orderModifiers(modifiers) {\n // order based on dependencies\n var orderedModifiers = order(modifiers); // order based on phase\n\n return modifierPhases.reduce(function (acc, phase) {\n return acc.concat(orderedModifiers.filter(function (modifier) {\n return modifier.phase === phase;\n }));\n }, []);\n}","import getCompositeRect from \"./dom-utils/getCompositeRect.js\";\nimport getLayoutRect from \"./dom-utils/getLayoutRect.js\";\nimport listScrollParents from \"./dom-utils/listScrollParents.js\";\nimport getOffsetParent from \"./dom-utils/getOffsetParent.js\";\nimport orderModifiers from \"./utils/orderModifiers.js\";\nimport debounce from \"./utils/debounce.js\";\nimport mergeByName from \"./utils/mergeByName.js\";\nimport detectOverflow from \"./utils/detectOverflow.js\";\nimport { isElement } from \"./dom-utils/instanceOf.js\";\nvar DEFAULT_OPTIONS = {\n placement: 'bottom',\n modifiers: [],\n strategy: 'absolute'\n};\n\nfunction areValidElements() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n return !args.some(function (element) {\n return !(element && typeof element.getBoundingClientRect === 'function');\n });\n}\n\nexport function popperGenerator(generatorOptions) {\n if (generatorOptions === void 0) {\n generatorOptions = {};\n }\n\n var _generatorOptions = generatorOptions,\n _generatorOptions$def = _generatorOptions.defaultModifiers,\n defaultModifiers = _generatorOptions$def === void 0 ? [] : _generatorOptions$def,\n _generatorOptions$def2 = _generatorOptions.defaultOptions,\n defaultOptions = _generatorOptions$def2 === void 0 ? DEFAULT_OPTIONS : _generatorOptions$def2;\n return function createPopper(reference, popper, options) {\n if (options === void 0) {\n options = defaultOptions;\n }\n\n var state = {\n placement: 'bottom',\n orderedModifiers: [],\n options: Object.assign({}, DEFAULT_OPTIONS, defaultOptions),\n modifiersData: {},\n elements: {\n reference: reference,\n popper: popper\n },\n attributes: {},\n styles: {}\n };\n var effectCleanupFns = [];\n var isDestroyed = false;\n var instance = {\n state: state,\n setOptions: function setOptions(setOptionsAction) {\n var options = typeof setOptionsAction === 'function' ? setOptionsAction(state.options) : setOptionsAction;\n cleanupModifierEffects();\n state.options = Object.assign({}, defaultOptions, state.options, options);\n state.scrollParents = {\n reference: isElement(reference) ? listScrollParents(reference) : reference.contextElement ? listScrollParents(reference.contextElement) : [],\n popper: listScrollParents(popper)\n }; // Orders the modifiers based on their dependencies and `phase`\n // properties\n\n var orderedModifiers = orderModifiers(mergeByName([].concat(defaultModifiers, state.options.modifiers))); // Strip out disabled modifiers\n\n state.orderedModifiers = orderedModifiers.filter(function (m) {\n return m.enabled;\n });\n runModifierEffects();\n return instance.update();\n },\n // Sync update – it will always be executed, even if not necessary. This\n // is useful for low frequency updates where sync behavior simplifies the\n // logic.\n // For high frequency updates (e.g. `resize` and `scroll` events), always\n // prefer the async Popper#update method\n forceUpdate: function forceUpdate() {\n if (isDestroyed) {\n return;\n }\n\n var _state$elements = state.elements,\n reference = _state$elements.reference,\n popper = _state$elements.popper; // Don't proceed if `reference` or `popper` are not valid elements\n // anymore\n\n if (!areValidElements(reference, popper)) {\n return;\n } // Store the reference and popper rects to be read by modifiers\n\n\n state.rects = {\n reference: getCompositeRect(reference, getOffsetParent(popper), state.options.strategy === 'fixed'),\n popper: getLayoutRect(popper)\n }; // Modifiers have the ability to reset the current update cycle. The\n // most common use case for this is the `flip` modifier changing the\n // placement, which then needs to re-run all the modifiers, because the\n // logic was previously ran for the previous placement and is therefore\n // stale/incorrect\n\n state.reset = false;\n state.placement = state.options.placement; // On each update cycle, the `modifiersData` property for each modifier\n // is filled with the initial data specified by the modifier. This means\n // it doesn't persist and is fresh on each update.\n // To ensure persistent data, use `${name}#persistent`\n\n state.orderedModifiers.forEach(function (modifier) {\n return state.modifiersData[modifier.name] = Object.assign({}, modifier.data);\n });\n\n for (var index = 0; index < state.orderedModifiers.length; index++) {\n if (state.reset === true) {\n state.reset = false;\n index = -1;\n continue;\n }\n\n var _state$orderedModifie = state.orderedModifiers[index],\n fn = _state$orderedModifie.fn,\n _state$orderedModifie2 = _state$orderedModifie.options,\n _options = _state$orderedModifie2 === void 0 ? {} : _state$orderedModifie2,\n name = _state$orderedModifie.name;\n\n if (typeof fn === 'function') {\n state = fn({\n state: state,\n options: _options,\n name: name,\n instance: instance\n }) || state;\n }\n }\n },\n // Async and optimistically optimized update – it will not be executed if\n // not necessary (debounced to run at most once-per-tick)\n update: debounce(function () {\n return new Promise(function (resolve) {\n instance.forceUpdate();\n resolve(state);\n });\n }),\n destroy: function destroy() {\n cleanupModifierEffects();\n isDestroyed = true;\n }\n };\n\n if (!areValidElements(reference, popper)) {\n return instance;\n }\n\n instance.setOptions(options).then(function (state) {\n if (!isDestroyed && options.onFirstUpdate) {\n options.onFirstUpdate(state);\n }\n }); // Modifiers have the ability to execute arbitrary code before the first\n // update cycle runs. They will be executed in the same order as the update\n // cycle. This is useful when a modifier adds some persistent data that\n // other modifiers need to use, but the modifier is run after the dependent\n // one.\n\n function runModifierEffects() {\n state.orderedModifiers.forEach(function (_ref) {\n var name = _ref.name,\n _ref$options = _ref.options,\n options = _ref$options === void 0 ? {} : _ref$options,\n effect = _ref.effect;\n\n if (typeof effect === 'function') {\n var cleanupFn = effect({\n state: state,\n name: name,\n instance: instance,\n options: options\n });\n\n var noopFn = function noopFn() {};\n\n effectCleanupFns.push(cleanupFn || noopFn);\n }\n });\n }\n\n function cleanupModifierEffects() {\n effectCleanupFns.forEach(function (fn) {\n return fn();\n });\n effectCleanupFns = [];\n }\n\n return instance;\n };\n}\nexport var createPopper = /*#__PURE__*/popperGenerator(); // eslint-disable-next-line import/no-unused-modules\n\nexport { detectOverflow };","export default function debounce(fn) {\n var pending;\n return function () {\n if (!pending) {\n pending = new Promise(function (resolve) {\n Promise.resolve().then(function () {\n pending = undefined;\n resolve(fn());\n });\n });\n }\n\n return pending;\n };\n}","export default function mergeByName(modifiers) {\n var merged = modifiers.reduce(function (merged, current) {\n var existing = merged[current.name];\n merged[current.name] = existing ? Object.assign({}, existing, current, {\n options: Object.assign({}, existing.options, current.options),\n data: Object.assign({}, existing.data, current.data)\n }) : current;\n return merged;\n }, {}); // IE11 does not support Object.values\n\n return Object.keys(merged).map(function (key) {\n return merged[key];\n });\n}","import { popperGenerator, detectOverflow } from \"./createPopper.js\";\nimport eventListeners from \"./modifiers/eventListeners.js\";\nimport popperOffsets from \"./modifiers/popperOffsets.js\";\nimport computeStyles from \"./modifiers/computeStyles.js\";\nimport applyStyles from \"./modifiers/applyStyles.js\";\nvar defaultModifiers = [eventListeners, popperOffsets, computeStyles, applyStyles];\nvar createPopper = /*#__PURE__*/popperGenerator({\n defaultModifiers: defaultModifiers\n}); // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper, popperGenerator, defaultModifiers, detectOverflow };","import { popperGenerator, detectOverflow } from \"./createPopper.js\";\nimport eventListeners from \"./modifiers/eventListeners.js\";\nimport popperOffsets from \"./modifiers/popperOffsets.js\";\nimport computeStyles from \"./modifiers/computeStyles.js\";\nimport applyStyles from \"./modifiers/applyStyles.js\";\nimport offset from \"./modifiers/offset.js\";\nimport flip from \"./modifiers/flip.js\";\nimport preventOverflow from \"./modifiers/preventOverflow.js\";\nimport arrow from \"./modifiers/arrow.js\";\nimport hide from \"./modifiers/hide.js\";\nvar defaultModifiers = [eventListeners, popperOffsets, computeStyles, applyStyles, offset, flip, preventOverflow, arrow, hide];\nvar createPopper = /*#__PURE__*/popperGenerator({\n defaultModifiers: defaultModifiers\n}); // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper, popperGenerator, defaultModifiers, detectOverflow }; // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper as createPopperLite } from \"./popper-lite.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport * from \"./modifiers/index.js\";","/**\n * --------------------------------------------------------------------------\n * Bootstrap dropdown.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport * as Popper from '@popperjs/core'\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport Manipulator from './dom/manipulator.js'\nimport SelectorEngine from './dom/selector-engine.js'\nimport {\n defineJQueryPlugin,\n execute,\n getElement,\n getNextActiveElement,\n isDisabled,\n isElement,\n isRTL,\n isVisible,\n noop\n} from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'dropdown'\nconst DATA_KEY = 'bs.dropdown'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst ESCAPE_KEY = 'Escape'\nconst TAB_KEY = 'Tab'\nconst ARROW_UP_KEY = 'ArrowUp'\nconst ARROW_DOWN_KEY = 'ArrowDown'\nconst RIGHT_MOUSE_BUTTON = 2 // MouseEvent.button value for the secondary button, usually the right button\n\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_KEYDOWN_DATA_API = `keydown${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_KEYUP_DATA_API = `keyup${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_DROPUP = 'dropup'\nconst CLASS_NAME_DROPEND = 'dropend'\nconst CLASS_NAME_DROPSTART = 'dropstart'\nconst CLASS_NAME_DROPUP_CENTER = 'dropup-center'\nconst CLASS_NAME_DROPDOWN_CENTER = 'dropdown-center'\n\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"dropdown\"]:not(.disabled):not(:disabled)'\nconst SELECTOR_DATA_TOGGLE_SHOWN = `${SELECTOR_DATA_TOGGLE}.${CLASS_NAME_SHOW}`\nconst SELECTOR_MENU = '.dropdown-menu'\nconst SELECTOR_NAVBAR = '.navbar'\nconst SELECTOR_NAVBAR_NAV = '.navbar-nav'\nconst SELECTOR_VISIBLE_ITEMS = '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)'\n\nconst PLACEMENT_TOP = isRTL() ? 'top-end' : 'top-start'\nconst PLACEMENT_TOPEND = isRTL() ? 'top-start' : 'top-end'\nconst PLACEMENT_BOTTOM = isRTL() ? 'bottom-end' : 'bottom-start'\nconst PLACEMENT_BOTTOMEND = isRTL() ? 'bottom-start' : 'bottom-end'\nconst PLACEMENT_RIGHT = isRTL() ? 'left-start' : 'right-start'\nconst PLACEMENT_LEFT = isRTL() ? 'right-start' : 'left-start'\nconst PLACEMENT_TOPCENTER = 'top'\nconst PLACEMENT_BOTTOMCENTER = 'bottom'\n\nconst Default = {\n autoClose: true,\n boundary: 'clippingParents',\n display: 'dynamic',\n offset: [0, 2],\n popperConfig: null,\n reference: 'toggle'\n}\n\nconst DefaultType = {\n autoClose: '(boolean|string)',\n boundary: '(string|element)',\n display: 'string',\n offset: '(array|string|function)',\n popperConfig: '(null|object|function)',\n reference: '(string|element|object)'\n}\n\n/**\n * Class definition\n */\n\nclass Dropdown extends BaseComponent {\n constructor(element, config) {\n super(element, config)\n\n this._popper = null\n this._parent = this._element.parentNode // dropdown wrapper\n // TODO: v6 revert #37011 & change markup https://getbootstrap.com/docs/5.3/forms/input-group/\n this._menu = SelectorEngine.next(this._element, SELECTOR_MENU)[0] ||\n SelectorEngine.prev(this._element, SELECTOR_MENU)[0] ||\n SelectorEngine.findOne(SELECTOR_MENU, this._parent)\n this._inNavbar = this._detectNavbar()\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n toggle() {\n return this._isShown() ? this.hide() : this.show()\n }\n\n show() {\n if (isDisabled(this._element) || this._isShown()) {\n return\n }\n\n const relatedTarget = {\n relatedTarget: this._element\n }\n\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, relatedTarget)\n\n if (showEvent.defaultPrevented) {\n return\n }\n\n this._createPopper()\n\n // If this is a touch-enabled device we add extra\n // empty mouseover listeners to the body's immediate children;\n // only needed because of broken event delegation on iOS\n // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n if ('ontouchstart' in document.documentElement && !this._parent.closest(SELECTOR_NAVBAR_NAV)) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.on(element, 'mouseover', noop)\n }\n }\n\n this._element.focus()\n this._element.setAttribute('aria-expanded', true)\n\n this._menu.classList.add(CLASS_NAME_SHOW)\n this._element.classList.add(CLASS_NAME_SHOW)\n EventHandler.trigger(this._element, EVENT_SHOWN, relatedTarget)\n }\n\n hide() {\n if (isDisabled(this._element) || !this._isShown()) {\n return\n }\n\n const relatedTarget = {\n relatedTarget: this._element\n }\n\n this._completeHide(relatedTarget)\n }\n\n dispose() {\n if (this._popper) {\n this._popper.destroy()\n }\n\n super.dispose()\n }\n\n update() {\n this._inNavbar = this._detectNavbar()\n if (this._popper) {\n this._popper.update()\n }\n }\n\n // Private\n _completeHide(relatedTarget) {\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE, relatedTarget)\n if (hideEvent.defaultPrevented) {\n return\n }\n\n // If this is a touch-enabled device we remove the extra\n // empty mouseover listeners we added for iOS support\n if ('ontouchstart' in document.documentElement) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.off(element, 'mouseover', noop)\n }\n }\n\n if (this._popper) {\n this._popper.destroy()\n }\n\n this._menu.classList.remove(CLASS_NAME_SHOW)\n this._element.classList.remove(CLASS_NAME_SHOW)\n this._element.setAttribute('aria-expanded', 'false')\n Manipulator.removeDataAttribute(this._menu, 'popper')\n EventHandler.trigger(this._element, EVENT_HIDDEN, relatedTarget)\n }\n\n _getConfig(config) {\n config = super._getConfig(config)\n\n if (typeof config.reference === 'object' && !isElement(config.reference) &&\n typeof config.reference.getBoundingClientRect !== 'function'\n ) {\n // Popper virtual elements require a getBoundingClientRect method\n throw new TypeError(`${NAME.toUpperCase()}: Option \"reference\" provided type \"object\" without a required \"getBoundingClientRect\" method.`)\n }\n\n return config\n }\n\n _createPopper() {\n if (typeof Popper === 'undefined') {\n throw new TypeError('Bootstrap\\'s dropdowns require Popper (https://popper.js.org)')\n }\n\n let referenceElement = this._element\n\n if (this._config.reference === 'parent') {\n referenceElement = this._parent\n } else if (isElement(this._config.reference)) {\n referenceElement = getElement(this._config.reference)\n } else if (typeof this._config.reference === 'object') {\n referenceElement = this._config.reference\n }\n\n const popperConfig = this._getPopperConfig()\n this._popper = Popper.createPopper(referenceElement, this._menu, popperConfig)\n }\n\n _isShown() {\n return this._menu.classList.contains(CLASS_NAME_SHOW)\n }\n\n _getPlacement() {\n const parentDropdown = this._parent\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPEND)) {\n return PLACEMENT_RIGHT\n }\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPSTART)) {\n return PLACEMENT_LEFT\n }\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPUP_CENTER)) {\n return PLACEMENT_TOPCENTER\n }\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPDOWN_CENTER)) {\n return PLACEMENT_BOTTOMCENTER\n }\n\n // We need to trim the value because custom properties can also include spaces\n const isEnd = getComputedStyle(this._menu).getPropertyValue('--bs-position').trim() === 'end'\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPUP)) {\n return isEnd ? PLACEMENT_TOPEND : PLACEMENT_TOP\n }\n\n return isEnd ? PLACEMENT_BOTTOMEND : PLACEMENT_BOTTOM\n }\n\n _detectNavbar() {\n return this._element.closest(SELECTOR_NAVBAR) !== null\n }\n\n _getOffset() {\n const { offset } = this._config\n\n if (typeof offset === 'string') {\n return offset.split(',').map(value => Number.parseInt(value, 10))\n }\n\n if (typeof offset === 'function') {\n return popperData => offset(popperData, this._element)\n }\n\n return offset\n }\n\n _getPopperConfig() {\n const defaultBsPopperConfig = {\n placement: this._getPlacement(),\n modifiers: [{\n name: 'preventOverflow',\n options: {\n boundary: this._config.boundary\n }\n },\n {\n name: 'offset',\n options: {\n offset: this._getOffset()\n }\n }]\n }\n\n // Disable Popper if we have a static display or Dropdown is in Navbar\n if (this._inNavbar || this._config.display === 'static') {\n Manipulator.setDataAttribute(this._menu, 'popper', 'static') // TODO: v6 remove\n defaultBsPopperConfig.modifiers = [{\n name: 'applyStyles',\n enabled: false\n }]\n }\n\n return {\n ...defaultBsPopperConfig,\n ...execute(this._config.popperConfig, [defaultBsPopperConfig])\n }\n }\n\n _selectMenuItem({ key, target }) {\n const items = SelectorEngine.find(SELECTOR_VISIBLE_ITEMS, this._menu).filter(element => isVisible(element))\n\n if (!items.length) {\n return\n }\n\n // if target isn't included in items (e.g. when expanding the dropdown)\n // allow cycling to get the last item in case key equals ARROW_UP_KEY\n getNextActiveElement(items, target, key === ARROW_DOWN_KEY, !items.includes(target)).focus()\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Dropdown.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n })\n }\n\n static clearMenus(event) {\n if (event.button === RIGHT_MOUSE_BUTTON || (event.type === 'keyup' && event.key !== TAB_KEY)) {\n return\n }\n\n const openToggles = SelectorEngine.find(SELECTOR_DATA_TOGGLE_SHOWN)\n\n for (const toggle of openToggles) {\n const context = Dropdown.getInstance(toggle)\n if (!context || context._config.autoClose === false) {\n continue\n }\n\n const composedPath = event.composedPath()\n const isMenuTarget = composedPath.includes(context._menu)\n if (\n composedPath.includes(context._element) ||\n (context._config.autoClose === 'inside' && !isMenuTarget) ||\n (context._config.autoClose === 'outside' && isMenuTarget)\n ) {\n continue\n }\n\n // Tab navigation through the dropdown menu or events from contained inputs shouldn't close the menu\n if (context._menu.contains(event.target) && ((event.type === 'keyup' && event.key === TAB_KEY) || /input|select|option|textarea|form/i.test(event.target.tagName))) {\n continue\n }\n\n const relatedTarget = { relatedTarget: context._element }\n\n if (event.type === 'click') {\n relatedTarget.clickEvent = event\n }\n\n context._completeHide(relatedTarget)\n }\n }\n\n static dataApiKeydownHandler(event) {\n // If not an UP | DOWN | ESCAPE key => not a dropdown command\n // If input/textarea && if key is other than ESCAPE => not a dropdown command\n\n const isInput = /input|textarea/i.test(event.target.tagName)\n const isEscapeEvent = event.key === ESCAPE_KEY\n const isUpOrDownEvent = [ARROW_UP_KEY, ARROW_DOWN_KEY].includes(event.key)\n\n if (!isUpOrDownEvent && !isEscapeEvent) {\n return\n }\n\n if (isInput && !isEscapeEvent) {\n return\n }\n\n event.preventDefault()\n\n // TODO: v6 revert #37011 & change markup https://getbootstrap.com/docs/5.3/forms/input-group/\n const getToggleButton = this.matches(SELECTOR_DATA_TOGGLE) ?\n this :\n (SelectorEngine.prev(this, SELECTOR_DATA_TOGGLE)[0] ||\n SelectorEngine.next(this, SELECTOR_DATA_TOGGLE)[0] ||\n SelectorEngine.findOne(SELECTOR_DATA_TOGGLE, event.delegateTarget.parentNode))\n\n const instance = Dropdown.getOrCreateInstance(getToggleButton)\n\n if (isUpOrDownEvent) {\n event.stopPropagation()\n instance.show()\n instance._selectMenuItem(event)\n return\n }\n\n if (instance._isShown()) { // else is escape and we check if it is shown\n event.stopPropagation()\n instance.hide()\n getToggleButton.focus()\n }\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_DATA_TOGGLE, Dropdown.dataApiKeydownHandler)\nEventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_MENU, Dropdown.dataApiKeydownHandler)\nEventHandler.on(document, EVENT_CLICK_DATA_API, Dropdown.clearMenus)\nEventHandler.on(document, EVENT_KEYUP_DATA_API, Dropdown.clearMenus)\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n event.preventDefault()\n Dropdown.getOrCreateInstance(this).toggle()\n})\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Dropdown)\n\nexport default Dropdown\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/backdrop.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport EventHandler from '../dom/event-handler.js'\nimport Config from './config.js'\nimport { execute, executeAfterTransition, getElement, reflow } from './index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'backdrop'\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\nconst EVENT_MOUSEDOWN = `mousedown.bs.${NAME}`\n\nconst Default = {\n className: 'modal-backdrop',\n clickCallback: null,\n isAnimated: false,\n isVisible: true, // if false, we use the backdrop helper without adding any element to the dom\n rootElement: 'body' // give the choice to place backdrop under different elements\n}\n\nconst DefaultType = {\n className: 'string',\n clickCallback: '(function|null)',\n isAnimated: 'boolean',\n isVisible: 'boolean',\n rootElement: '(element|string)'\n}\n\n/**\n * Class definition\n */\n\nclass Backdrop extends Config {\n constructor(config) {\n super()\n this._config = this._getConfig(config)\n this._isAppended = false\n this._element = null\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n show(callback) {\n if (!this._config.isVisible) {\n execute(callback)\n return\n }\n\n this._append()\n\n const element = this._getElement()\n if (this._config.isAnimated) {\n reflow(element)\n }\n\n element.classList.add(CLASS_NAME_SHOW)\n\n this._emulateAnimation(() => {\n execute(callback)\n })\n }\n\n hide(callback) {\n if (!this._config.isVisible) {\n execute(callback)\n return\n }\n\n this._getElement().classList.remove(CLASS_NAME_SHOW)\n\n this._emulateAnimation(() => {\n this.dispose()\n execute(callback)\n })\n }\n\n dispose() {\n if (!this._isAppended) {\n return\n }\n\n EventHandler.off(this._element, EVENT_MOUSEDOWN)\n\n this._element.remove()\n this._isAppended = false\n }\n\n // Private\n _getElement() {\n if (!this._element) {\n const backdrop = document.createElement('div')\n backdrop.className = this._config.className\n if (this._config.isAnimated) {\n backdrop.classList.add(CLASS_NAME_FADE)\n }\n\n this._element = backdrop\n }\n\n return this._element\n }\n\n _configAfterMerge(config) {\n // use getElement() with the default \"body\" to get a fresh Element on each instantiation\n config.rootElement = getElement(config.rootElement)\n return config\n }\n\n _append() {\n if (this._isAppended) {\n return\n }\n\n const element = this._getElement()\n this._config.rootElement.append(element)\n\n EventHandler.on(element, EVENT_MOUSEDOWN, () => {\n execute(this._config.clickCallback)\n })\n\n this._isAppended = true\n }\n\n _emulateAnimation(callback) {\n executeAfterTransition(callback, this._getElement(), this._config.isAnimated)\n }\n}\n\nexport default Backdrop\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/focustrap.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport EventHandler from '../dom/event-handler.js'\nimport SelectorEngine from '../dom/selector-engine.js'\nimport Config from './config.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'focustrap'\nconst DATA_KEY = 'bs.focustrap'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst EVENT_FOCUSIN = `focusin${EVENT_KEY}`\nconst EVENT_KEYDOWN_TAB = `keydown.tab${EVENT_KEY}`\n\nconst TAB_KEY = 'Tab'\nconst TAB_NAV_FORWARD = 'forward'\nconst TAB_NAV_BACKWARD = 'backward'\n\nconst Default = {\n autofocus: true,\n trapElement: null // The element to trap focus inside of\n}\n\nconst DefaultType = {\n autofocus: 'boolean',\n trapElement: 'element'\n}\n\n/**\n * Class definition\n */\n\nclass FocusTrap extends Config {\n constructor(config) {\n super()\n this._config = this._getConfig(config)\n this._isActive = false\n this._lastTabNavDirection = null\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n activate() {\n if (this._isActive) {\n return\n }\n\n if (this._config.autofocus) {\n this._config.trapElement.focus()\n }\n\n EventHandler.off(document, EVENT_KEY) // guard against infinite focus loop\n EventHandler.on(document, EVENT_FOCUSIN, event => this._handleFocusin(event))\n EventHandler.on(document, EVENT_KEYDOWN_TAB, event => this._handleKeydown(event))\n\n this._isActive = true\n }\n\n deactivate() {\n if (!this._isActive) {\n return\n }\n\n this._isActive = false\n EventHandler.off(document, EVENT_KEY)\n }\n\n // Private\n _handleFocusin(event) {\n const { trapElement } = this._config\n\n if (event.target === document || event.target === trapElement || trapElement.contains(event.target)) {\n return\n }\n\n const elements = SelectorEngine.focusableChildren(trapElement)\n\n if (elements.length === 0) {\n trapElement.focus()\n } else if (this._lastTabNavDirection === TAB_NAV_BACKWARD) {\n elements[elements.length - 1].focus()\n } else {\n elements[0].focus()\n }\n }\n\n _handleKeydown(event) {\n if (event.key !== TAB_KEY) {\n return\n }\n\n this._lastTabNavDirection = event.shiftKey ? TAB_NAV_BACKWARD : TAB_NAV_FORWARD\n }\n}\n\nexport default FocusTrap\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/scrollBar.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport Manipulator from '../dom/manipulator.js'\nimport SelectorEngine from '../dom/selector-engine.js'\nimport { isElement } from './index.js'\n\n/**\n * Constants\n */\n\nconst SELECTOR_FIXED_CONTENT = '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top'\nconst SELECTOR_STICKY_CONTENT = '.sticky-top'\nconst PROPERTY_PADDING = 'padding-right'\nconst PROPERTY_MARGIN = 'margin-right'\n\n/**\n * Class definition\n */\n\nclass ScrollBarHelper {\n constructor() {\n this._element = document.body\n }\n\n // Public\n getWidth() {\n // https://developer.mozilla.org/en-US/docs/Web/API/Window/innerWidth#usage_notes\n const documentWidth = document.documentElement.clientWidth\n return Math.abs(window.innerWidth - documentWidth)\n }\n\n hide() {\n const width = this.getWidth()\n this._disableOverFlow()\n // give padding to element to balance the hidden scrollbar width\n this._setElementAttributes(this._element, PROPERTY_PADDING, calculatedValue => calculatedValue + width)\n // trick: We adjust positive paddingRight and negative marginRight to sticky-top elements to keep showing fullwidth\n this._setElementAttributes(SELECTOR_FIXED_CONTENT, PROPERTY_PADDING, calculatedValue => calculatedValue + width)\n this._setElementAttributes(SELECTOR_STICKY_CONTENT, PROPERTY_MARGIN, calculatedValue => calculatedValue - width)\n }\n\n reset() {\n this._resetElementAttributes(this._element, 'overflow')\n this._resetElementAttributes(this._element, PROPERTY_PADDING)\n this._resetElementAttributes(SELECTOR_FIXED_CONTENT, PROPERTY_PADDING)\n this._resetElementAttributes(SELECTOR_STICKY_CONTENT, PROPERTY_MARGIN)\n }\n\n isOverflowing() {\n return this.getWidth() > 0\n }\n\n // Private\n _disableOverFlow() {\n this._saveInitialAttribute(this._element, 'overflow')\n this._element.style.overflow = 'hidden'\n }\n\n _setElementAttributes(selector, styleProperty, callback) {\n const scrollbarWidth = this.getWidth()\n const manipulationCallBack = element => {\n if (element !== this._element && window.innerWidth > element.clientWidth + scrollbarWidth) {\n return\n }\n\n this._saveInitialAttribute(element, styleProperty)\n const calculatedValue = window.getComputedStyle(element).getPropertyValue(styleProperty)\n element.style.setProperty(styleProperty, `${callback(Number.parseFloat(calculatedValue))}px`)\n }\n\n this._applyManipulationCallback(selector, manipulationCallBack)\n }\n\n _saveInitialAttribute(element, styleProperty) {\n const actualValue = element.style.getPropertyValue(styleProperty)\n if (actualValue) {\n Manipulator.setDataAttribute(element, styleProperty, actualValue)\n }\n }\n\n _resetElementAttributes(selector, styleProperty) {\n const manipulationCallBack = element => {\n const value = Manipulator.getDataAttribute(element, styleProperty)\n // We only want to remove the property if the value is `null`; the value can also be zero\n if (value === null) {\n element.style.removeProperty(styleProperty)\n return\n }\n\n Manipulator.removeDataAttribute(element, styleProperty)\n element.style.setProperty(styleProperty, value)\n }\n\n this._applyManipulationCallback(selector, manipulationCallBack)\n }\n\n _applyManipulationCallback(selector, callBack) {\n if (isElement(selector)) {\n callBack(selector)\n return\n }\n\n for (const sel of SelectorEngine.find(selector, this._element)) {\n callBack(sel)\n }\n }\n}\n\nexport default ScrollBarHelper\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap modal.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport SelectorEngine from './dom/selector-engine.js'\nimport Backdrop from './util/backdrop.js'\nimport { enableDismissTrigger } from './util/component-functions.js'\nimport FocusTrap from './util/focustrap.js'\nimport { defineJQueryPlugin, isRTL, isVisible, reflow } from './util/index.js'\nimport ScrollBarHelper from './util/scrollbar.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'modal'\nconst DATA_KEY = 'bs.modal'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst ESCAPE_KEY = 'Escape'\n\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_RESIZE = `resize${EVENT_KEY}`\nconst EVENT_CLICK_DISMISS = `click.dismiss${EVENT_KEY}`\nconst EVENT_MOUSEDOWN_DISMISS = `mousedown.dismiss${EVENT_KEY}`\nconst EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_OPEN = 'modal-open'\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_STATIC = 'modal-static'\n\nconst OPEN_SELECTOR = '.modal.show'\nconst SELECTOR_DIALOG = '.modal-dialog'\nconst SELECTOR_MODAL_BODY = '.modal-body'\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"modal\"]'\n\nconst Default = {\n backdrop: true,\n focus: true,\n keyboard: true\n}\n\nconst DefaultType = {\n backdrop: '(boolean|string)',\n focus: 'boolean',\n keyboard: 'boolean'\n}\n\n/**\n * Class definition\n */\n\nclass Modal extends BaseComponent {\n constructor(element, config) {\n super(element, config)\n\n this._dialog = SelectorEngine.findOne(SELECTOR_DIALOG, this._element)\n this._backdrop = this._initializeBackDrop()\n this._focustrap = this._initializeFocusTrap()\n this._isShown = false\n this._isTransitioning = false\n this._scrollBar = new ScrollBarHelper()\n\n this._addEventListeners()\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n toggle(relatedTarget) {\n return this._isShown ? this.hide() : this.show(relatedTarget)\n }\n\n show(relatedTarget) {\n if (this._isShown || this._isTransitioning) {\n return\n }\n\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, {\n relatedTarget\n })\n\n if (showEvent.defaultPrevented) {\n return\n }\n\n this._isShown = true\n this._isTransitioning = true\n\n this._scrollBar.hide()\n\n document.body.classList.add(CLASS_NAME_OPEN)\n\n this._adjustDialog()\n\n this._backdrop.show(() => this._showElement(relatedTarget))\n }\n\n hide() {\n if (!this._isShown || this._isTransitioning) {\n return\n }\n\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE)\n\n if (hideEvent.defaultPrevented) {\n return\n }\n\n this._isShown = false\n this._isTransitioning = true\n this._focustrap.deactivate()\n\n this._element.classList.remove(CLASS_NAME_SHOW)\n\n this._queueCallback(() => this._hideModal(), this._element, this._isAnimated())\n }\n\n dispose() {\n EventHandler.off(window, EVENT_KEY)\n EventHandler.off(this._dialog, EVENT_KEY)\n\n this._backdrop.dispose()\n this._focustrap.deactivate()\n\n super.dispose()\n }\n\n handleUpdate() {\n this._adjustDialog()\n }\n\n // Private\n _initializeBackDrop() {\n return new Backdrop({\n isVisible: Boolean(this._config.backdrop), // 'static' option will be translated to true, and booleans will keep their value,\n isAnimated: this._isAnimated()\n })\n }\n\n _initializeFocusTrap() {\n return new FocusTrap({\n trapElement: this._element\n })\n }\n\n _showElement(relatedTarget) {\n // try to append dynamic modal\n if (!document.body.contains(this._element)) {\n document.body.append(this._element)\n }\n\n this._element.style.display = 'block'\n this._element.removeAttribute('aria-hidden')\n this._element.setAttribute('aria-modal', true)\n this._element.setAttribute('role', 'dialog')\n this._element.scrollTop = 0\n\n const modalBody = SelectorEngine.findOne(SELECTOR_MODAL_BODY, this._dialog)\n if (modalBody) {\n modalBody.scrollTop = 0\n }\n\n reflow(this._element)\n\n this._element.classList.add(CLASS_NAME_SHOW)\n\n const transitionComplete = () => {\n if (this._config.focus) {\n this._focustrap.activate()\n }\n\n this._isTransitioning = false\n EventHandler.trigger(this._element, EVENT_SHOWN, {\n relatedTarget\n })\n }\n\n this._queueCallback(transitionComplete, this._dialog, this._isAnimated())\n }\n\n _addEventListeners() {\n EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, event => {\n if (event.key !== ESCAPE_KEY) {\n return\n }\n\n if (this._config.keyboard) {\n this.hide()\n return\n }\n\n this._triggerBackdropTransition()\n })\n\n EventHandler.on(window, EVENT_RESIZE, () => {\n if (this._isShown && !this._isTransitioning) {\n this._adjustDialog()\n }\n })\n\n EventHandler.on(this._element, EVENT_MOUSEDOWN_DISMISS, event => {\n // a bad trick to segregate clicks that may start inside dialog but end outside, and avoid listen to scrollbar clicks\n EventHandler.one(this._element, EVENT_CLICK_DISMISS, event2 => {\n if (this._element !== event.target || this._element !== event2.target) {\n return\n }\n\n if (this._config.backdrop === 'static') {\n this._triggerBackdropTransition()\n return\n }\n\n if (this._config.backdrop) {\n this.hide()\n }\n })\n })\n }\n\n _hideModal() {\n this._element.style.display = 'none'\n this._element.setAttribute('aria-hidden', true)\n this._element.removeAttribute('aria-modal')\n this._element.removeAttribute('role')\n this._isTransitioning = false\n\n this._backdrop.hide(() => {\n document.body.classList.remove(CLASS_NAME_OPEN)\n this._resetAdjustments()\n this._scrollBar.reset()\n EventHandler.trigger(this._element, EVENT_HIDDEN)\n })\n }\n\n _isAnimated() {\n return this._element.classList.contains(CLASS_NAME_FADE)\n }\n\n _triggerBackdropTransition() {\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED)\n if (hideEvent.defaultPrevented) {\n return\n }\n\n const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight\n const initialOverflowY = this._element.style.overflowY\n // return if the following background transition hasn't yet completed\n if (initialOverflowY === 'hidden' || this._element.classList.contains(CLASS_NAME_STATIC)) {\n return\n }\n\n if (!isModalOverflowing) {\n this._element.style.overflowY = 'hidden'\n }\n\n this._element.classList.add(CLASS_NAME_STATIC)\n this._queueCallback(() => {\n this._element.classList.remove(CLASS_NAME_STATIC)\n this._queueCallback(() => {\n this._element.style.overflowY = initialOverflowY\n }, this._dialog)\n }, this._dialog)\n\n this._element.focus()\n }\n\n /**\n * The following methods are used to handle overflowing modals\n */\n\n _adjustDialog() {\n const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight\n const scrollbarWidth = this._scrollBar.getWidth()\n const isBodyOverflowing = scrollbarWidth > 0\n\n if (isBodyOverflowing && !isModalOverflowing) {\n const property = isRTL() ? 'paddingLeft' : 'paddingRight'\n this._element.style[property] = `${scrollbarWidth}px`\n }\n\n if (!isBodyOverflowing && isModalOverflowing) {\n const property = isRTL() ? 'paddingRight' : 'paddingLeft'\n this._element.style[property] = `${scrollbarWidth}px`\n }\n }\n\n _resetAdjustments() {\n this._element.style.paddingLeft = ''\n this._element.style.paddingRight = ''\n }\n\n // Static\n static jQueryInterface(config, relatedTarget) {\n return this.each(function () {\n const data = Modal.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config](relatedTarget)\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n const target = SelectorEngine.getElementFromSelector(this)\n\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault()\n }\n\n EventHandler.one(target, EVENT_SHOW, showEvent => {\n if (showEvent.defaultPrevented) {\n // only register focus restorer if modal will actually get shown\n return\n }\n\n EventHandler.one(target, EVENT_HIDDEN, () => {\n if (isVisible(this)) {\n this.focus()\n }\n })\n })\n\n // avoid conflict when clicking modal toggler while another one is open\n const alreadyOpen = SelectorEngine.findOne(OPEN_SELECTOR)\n if (alreadyOpen) {\n Modal.getInstance(alreadyOpen).hide()\n }\n\n const data = Modal.getOrCreateInstance(target)\n\n data.toggle(this)\n})\n\nenableDismissTrigger(Modal)\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Modal)\n\nexport default Modal\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap offcanvas.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport SelectorEngine from './dom/selector-engine.js'\nimport Backdrop from './util/backdrop.js'\nimport { enableDismissTrigger } from './util/component-functions.js'\nimport FocusTrap from './util/focustrap.js'\nimport {\n defineJQueryPlugin,\n isDisabled,\n isVisible\n} from './util/index.js'\nimport ScrollBarHelper from './util/scrollbar.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'offcanvas'\nconst DATA_KEY = 'bs.offcanvas'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`\nconst ESCAPE_KEY = 'Escape'\n\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_SHOWING = 'showing'\nconst CLASS_NAME_HIDING = 'hiding'\nconst CLASS_NAME_BACKDROP = 'offcanvas-backdrop'\nconst OPEN_SELECTOR = '.offcanvas.show'\n\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_RESIZE = `resize${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY}`\n\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"offcanvas\"]'\n\nconst Default = {\n backdrop: true,\n keyboard: true,\n scroll: false\n}\n\nconst DefaultType = {\n backdrop: '(boolean|string)',\n keyboard: 'boolean',\n scroll: 'boolean'\n}\n\n/**\n * Class definition\n */\n\nclass Offcanvas extends BaseComponent {\n constructor(element, config) {\n super(element, config)\n\n this._isShown = false\n this._backdrop = this._initializeBackDrop()\n this._focustrap = this._initializeFocusTrap()\n this._addEventListeners()\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n toggle(relatedTarget) {\n return this._isShown ? this.hide() : this.show(relatedTarget)\n }\n\n show(relatedTarget) {\n if (this._isShown) {\n return\n }\n\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, { relatedTarget })\n\n if (showEvent.defaultPrevented) {\n return\n }\n\n this._isShown = true\n this._backdrop.show()\n\n if (!this._config.scroll) {\n new ScrollBarHelper().hide()\n }\n\n this._element.setAttribute('aria-modal', true)\n this._element.setAttribute('role', 'dialog')\n this._element.classList.add(CLASS_NAME_SHOWING)\n\n const completeCallBack = () => {\n if (!this._config.scroll || this._config.backdrop) {\n this._focustrap.activate()\n }\n\n this._element.classList.add(CLASS_NAME_SHOW)\n this._element.classList.remove(CLASS_NAME_SHOWING)\n EventHandler.trigger(this._element, EVENT_SHOWN, { relatedTarget })\n }\n\n this._queueCallback(completeCallBack, this._element, true)\n }\n\n hide() {\n if (!this._isShown) {\n return\n }\n\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE)\n\n if (hideEvent.defaultPrevented) {\n return\n }\n\n this._focustrap.deactivate()\n this._element.blur()\n this._isShown = false\n this._element.classList.add(CLASS_NAME_HIDING)\n this._backdrop.hide()\n\n const completeCallback = () => {\n this._element.classList.remove(CLASS_NAME_SHOW, CLASS_NAME_HIDING)\n this._element.removeAttribute('aria-modal')\n this._element.removeAttribute('role')\n\n if (!this._config.scroll) {\n new ScrollBarHelper().reset()\n }\n\n EventHandler.trigger(this._element, EVENT_HIDDEN)\n }\n\n this._queueCallback(completeCallback, this._element, true)\n }\n\n dispose() {\n this._backdrop.dispose()\n this._focustrap.deactivate()\n super.dispose()\n }\n\n // Private\n _initializeBackDrop() {\n const clickCallback = () => {\n if (this._config.backdrop === 'static') {\n EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED)\n return\n }\n\n this.hide()\n }\n\n // 'static' option will be translated to true, and booleans will keep their value\n const isVisible = Boolean(this._config.backdrop)\n\n return new Backdrop({\n className: CLASS_NAME_BACKDROP,\n isVisible,\n isAnimated: true,\n rootElement: this._element.parentNode,\n clickCallback: isVisible ? clickCallback : null\n })\n }\n\n _initializeFocusTrap() {\n return new FocusTrap({\n trapElement: this._element\n })\n }\n\n _addEventListeners() {\n EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, event => {\n if (event.key !== ESCAPE_KEY) {\n return\n }\n\n if (this._config.keyboard) {\n this.hide()\n return\n }\n\n EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED)\n })\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Offcanvas.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config](this)\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n const target = SelectorEngine.getElementFromSelector(this)\n\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault()\n }\n\n if (isDisabled(this)) {\n return\n }\n\n EventHandler.one(target, EVENT_HIDDEN, () => {\n // focus on trigger when it is closed\n if (isVisible(this)) {\n this.focus()\n }\n })\n\n // avoid conflict when clicking a toggler of an offcanvas, while another is open\n const alreadyOpen = SelectorEngine.findOne(OPEN_SELECTOR)\n if (alreadyOpen && alreadyOpen !== target) {\n Offcanvas.getInstance(alreadyOpen).hide()\n }\n\n const data = Offcanvas.getOrCreateInstance(target)\n data.toggle(this)\n})\n\nEventHandler.on(window, EVENT_LOAD_DATA_API, () => {\n for (const selector of SelectorEngine.find(OPEN_SELECTOR)) {\n Offcanvas.getOrCreateInstance(selector).show()\n }\n})\n\nEventHandler.on(window, EVENT_RESIZE, () => {\n for (const element of SelectorEngine.find('[aria-modal][class*=show][class*=offcanvas-]')) {\n if (getComputedStyle(element).position !== 'fixed') {\n Offcanvas.getOrCreateInstance(element).hide()\n }\n }\n})\n\nenableDismissTrigger(Offcanvas)\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Offcanvas)\n\nexport default Offcanvas\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/sanitizer.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n// js-docs-start allow-list\nconst ARIA_ATTRIBUTE_PATTERN = /^aria-[\\w-]*$/i\n\nexport const DefaultAllowlist = {\n // Global attributes allowed on any supplied element below.\n '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],\n a: ['target', 'href', 'title', 'rel'],\n area: [],\n b: [],\n br: [],\n col: [],\n code: [],\n div: [],\n em: [],\n hr: [],\n h1: [],\n h2: [],\n h3: [],\n h4: [],\n h5: [],\n h6: [],\n i: [],\n img: ['src', 'srcset', 'alt', 'title', 'width', 'height'],\n li: [],\n ol: [],\n p: [],\n pre: [],\n s: [],\n small: [],\n span: [],\n sub: [],\n sup: [],\n strong: [],\n u: [],\n ul: []\n}\n// js-docs-end allow-list\n\nconst uriAttributes = new Set([\n 'background',\n 'cite',\n 'href',\n 'itemtype',\n 'longdesc',\n 'poster',\n 'src',\n 'xlink:href'\n])\n\n/**\n * A pattern that recognizes URLs that are safe wrt. XSS in URL navigation\n * contexts.\n *\n * Shout-out to Angular https://github.com/angular/angular/blob/15.2.8/packages/core/src/sanitization/url_sanitizer.ts#L38\n */\n// eslint-disable-next-line unicorn/better-regex\nconst SAFE_URL_PATTERN = /^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i\n\nconst allowedAttribute = (attribute, allowedAttributeList) => {\n const attributeName = attribute.nodeName.toLowerCase()\n\n if (allowedAttributeList.includes(attributeName)) {\n if (uriAttributes.has(attributeName)) {\n return Boolean(SAFE_URL_PATTERN.test(attribute.nodeValue))\n }\n\n return true\n }\n\n // Check if a regular expression validates the attribute.\n return allowedAttributeList.filter(attributeRegex => attributeRegex instanceof RegExp)\n .some(regex => regex.test(attributeName))\n}\n\nexport function sanitizeHtml(unsafeHtml, allowList, sanitizeFunction) {\n if (!unsafeHtml.length) {\n return unsafeHtml\n }\n\n if (sanitizeFunction && typeof sanitizeFunction === 'function') {\n return sanitizeFunction(unsafeHtml)\n }\n\n const domParser = new window.DOMParser()\n const createdDocument = domParser.parseFromString(unsafeHtml, 'text/html')\n const elements = [].concat(...createdDocument.body.querySelectorAll('*'))\n\n for (const element of elements) {\n const elementName = element.nodeName.toLowerCase()\n\n if (!Object.keys(allowList).includes(elementName)) {\n element.remove()\n continue\n }\n\n const attributeList = [].concat(...element.attributes)\n const allowedAttributes = [].concat(allowList['*'] || [], allowList[elementName] || [])\n\n for (const attribute of attributeList) {\n if (!allowedAttribute(attribute, allowedAttributes)) {\n element.removeAttribute(attribute.nodeName)\n }\n }\n }\n\n return createdDocument.body.innerHTML\n}\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/template-factory.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport SelectorEngine from '../dom/selector-engine.js'\nimport Config from './config.js'\nimport { DefaultAllowlist, sanitizeHtml } from './sanitizer.js'\nimport { execute, getElement, isElement } from './index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'TemplateFactory'\n\nconst Default = {\n allowList: DefaultAllowlist,\n content: {}, // { selector : text , selector2 : text2 , }\n extraClass: '',\n html: false,\n sanitize: true,\n sanitizeFn: null,\n template: '
'\n}\n\nconst DefaultType = {\n allowList: 'object',\n content: 'object',\n extraClass: '(string|function)',\n html: 'boolean',\n sanitize: 'boolean',\n sanitizeFn: '(null|function)',\n template: 'string'\n}\n\nconst DefaultContentType = {\n entry: '(string|element|function|null)',\n selector: '(string|element)'\n}\n\n/**\n * Class definition\n */\n\nclass TemplateFactory extends Config {\n constructor(config) {\n super()\n this._config = this._getConfig(config)\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n getContent() {\n return Object.values(this._config.content)\n .map(config => this._resolvePossibleFunction(config))\n .filter(Boolean)\n }\n\n hasContent() {\n return this.getContent().length > 0\n }\n\n changeContent(content) {\n this._checkContent(content)\n this._config.content = { ...this._config.content, ...content }\n return this\n }\n\n toHtml() {\n const templateWrapper = document.createElement('div')\n templateWrapper.innerHTML = this._maybeSanitize(this._config.template)\n\n for (const [selector, text] of Object.entries(this._config.content)) {\n this._setContent(templateWrapper, text, selector)\n }\n\n const template = templateWrapper.children[0]\n const extraClass = this._resolvePossibleFunction(this._config.extraClass)\n\n if (extraClass) {\n template.classList.add(...extraClass.split(' '))\n }\n\n return template\n }\n\n // Private\n _typeCheckConfig(config) {\n super._typeCheckConfig(config)\n this._checkContent(config.content)\n }\n\n _checkContent(arg) {\n for (const [selector, content] of Object.entries(arg)) {\n super._typeCheckConfig({ selector, entry: content }, DefaultContentType)\n }\n }\n\n _setContent(template, content, selector) {\n const templateElement = SelectorEngine.findOne(selector, template)\n\n if (!templateElement) {\n return\n }\n\n content = this._resolvePossibleFunction(content)\n\n if (!content) {\n templateElement.remove()\n return\n }\n\n if (isElement(content)) {\n this._putElementInTemplate(getElement(content), templateElement)\n return\n }\n\n if (this._config.html) {\n templateElement.innerHTML = this._maybeSanitize(content)\n return\n }\n\n templateElement.textContent = content\n }\n\n _maybeSanitize(arg) {\n return this._config.sanitize ? sanitizeHtml(arg, this._config.allowList, this._config.sanitizeFn) : arg\n }\n\n _resolvePossibleFunction(arg) {\n return execute(arg, [this])\n }\n\n _putElementInTemplate(element, templateElement) {\n if (this._config.html) {\n templateElement.innerHTML = ''\n templateElement.append(element)\n return\n }\n\n templateElement.textContent = element.textContent\n }\n}\n\nexport default TemplateFactory\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap tooltip.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport * as Popper from '@popperjs/core'\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport Manipulator from './dom/manipulator.js'\nimport { defineJQueryPlugin, execute, findShadowRoot, getElement, getUID, isRTL, noop } from './util/index.js'\nimport { DefaultAllowlist } from './util/sanitizer.js'\nimport TemplateFactory from './util/template-factory.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'tooltip'\nconst DISALLOWED_ATTRIBUTES = new Set(['sanitize', 'allowList', 'sanitizeFn'])\n\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_MODAL = 'modal'\nconst CLASS_NAME_SHOW = 'show'\n\nconst SELECTOR_TOOLTIP_INNER = '.tooltip-inner'\nconst SELECTOR_MODAL = `.${CLASS_NAME_MODAL}`\n\nconst EVENT_MODAL_HIDE = 'hide.bs.modal'\n\nconst TRIGGER_HOVER = 'hover'\nconst TRIGGER_FOCUS = 'focus'\nconst TRIGGER_CLICK = 'click'\nconst TRIGGER_MANUAL = 'manual'\n\nconst EVENT_HIDE = 'hide'\nconst EVENT_HIDDEN = 'hidden'\nconst EVENT_SHOW = 'show'\nconst EVENT_SHOWN = 'shown'\nconst EVENT_INSERTED = 'inserted'\nconst EVENT_CLICK = 'click'\nconst EVENT_FOCUSIN = 'focusin'\nconst EVENT_FOCUSOUT = 'focusout'\nconst EVENT_MOUSEENTER = 'mouseenter'\nconst EVENT_MOUSELEAVE = 'mouseleave'\n\nconst AttachmentMap = {\n AUTO: 'auto',\n TOP: 'top',\n RIGHT: isRTL() ? 'left' : 'right',\n BOTTOM: 'bottom',\n LEFT: isRTL() ? 'right' : 'left'\n}\n\nconst Default = {\n allowList: DefaultAllowlist,\n animation: true,\n boundary: 'clippingParents',\n container: false,\n customClass: '',\n delay: 0,\n fallbackPlacements: ['top', 'right', 'bottom', 'left'],\n html: false,\n offset: [0, 6],\n placement: 'top',\n popperConfig: null,\n sanitize: true,\n sanitizeFn: null,\n selector: false,\n template: '',\n title: '',\n trigger: 'hover focus'\n}\n\nconst DefaultType = {\n allowList: 'object',\n animation: 'boolean',\n boundary: '(string|element)',\n container: '(string|element|boolean)',\n customClass: '(string|function)',\n delay: '(number|object)',\n fallbackPlacements: 'array',\n html: 'boolean',\n offset: '(array|string|function)',\n placement: '(string|function)',\n popperConfig: '(null|object|function)',\n sanitize: 'boolean',\n sanitizeFn: '(null|function)',\n selector: '(string|boolean)',\n template: 'string',\n title: '(string|element|function)',\n trigger: 'string'\n}\n\n/**\n * Class definition\n */\n\nclass Tooltip extends BaseComponent {\n constructor(element, config) {\n if (typeof Popper === 'undefined') {\n throw new TypeError('Bootstrap\\'s tooltips require Popper (https://popper.js.org)')\n }\n\n super(element, config)\n\n // Private\n this._isEnabled = true\n this._timeout = 0\n this._isHovered = null\n this._activeTrigger = {}\n this._popper = null\n this._templateFactory = null\n this._newContent = null\n\n // Protected\n this.tip = null\n\n this._setListeners()\n\n if (!this._config.selector) {\n this._fixTitle()\n }\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n enable() {\n this._isEnabled = true\n }\n\n disable() {\n this._isEnabled = false\n }\n\n toggleEnabled() {\n this._isEnabled = !this._isEnabled\n }\n\n toggle() {\n if (!this._isEnabled) {\n return\n }\n\n this._activeTrigger.click = !this._activeTrigger.click\n if (this._isShown()) {\n this._leave()\n return\n }\n\n this._enter()\n }\n\n dispose() {\n clearTimeout(this._timeout)\n\n EventHandler.off(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler)\n\n if (this._element.getAttribute('data-bs-original-title')) {\n this._element.setAttribute('title', this._element.getAttribute('data-bs-original-title'))\n }\n\n this._disposePopper()\n super.dispose()\n }\n\n show() {\n if (this._element.style.display === 'none') {\n throw new Error('Please use show on visible elements')\n }\n\n if (!(this._isWithContent() && this._isEnabled)) {\n return\n }\n\n const showEvent = EventHandler.trigger(this._element, this.constructor.eventName(EVENT_SHOW))\n const shadowRoot = findShadowRoot(this._element)\n const isInTheDom = (shadowRoot || this._element.ownerDocument.documentElement).contains(this._element)\n\n if (showEvent.defaultPrevented || !isInTheDom) {\n return\n }\n\n // TODO: v6 remove this or make it optional\n this._disposePopper()\n\n const tip = this._getTipElement()\n\n this._element.setAttribute('aria-describedby', tip.getAttribute('id'))\n\n const { container } = this._config\n\n if (!this._element.ownerDocument.documentElement.contains(this.tip)) {\n container.append(tip)\n EventHandler.trigger(this._element, this.constructor.eventName(EVENT_INSERTED))\n }\n\n this._popper = this._createPopper(tip)\n\n tip.classList.add(CLASS_NAME_SHOW)\n\n // If this is a touch-enabled device we add extra\n // empty mouseover listeners to the body's immediate children;\n // only needed because of broken event delegation on iOS\n // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n if ('ontouchstart' in document.documentElement) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.on(element, 'mouseover', noop)\n }\n }\n\n const complete = () => {\n EventHandler.trigger(this._element, this.constructor.eventName(EVENT_SHOWN))\n\n if (this._isHovered === false) {\n this._leave()\n }\n\n this._isHovered = false\n }\n\n this._queueCallback(complete, this.tip, this._isAnimated())\n }\n\n hide() {\n if (!this._isShown()) {\n return\n }\n\n const hideEvent = EventHandler.trigger(this._element, this.constructor.eventName(EVENT_HIDE))\n if (hideEvent.defaultPrevented) {\n return\n }\n\n const tip = this._getTipElement()\n tip.classList.remove(CLASS_NAME_SHOW)\n\n // If this is a touch-enabled device we remove the extra\n // empty mouseover listeners we added for iOS support\n if ('ontouchstart' in document.documentElement) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.off(element, 'mouseover', noop)\n }\n }\n\n this._activeTrigger[TRIGGER_CLICK] = false\n this._activeTrigger[TRIGGER_FOCUS] = false\n this._activeTrigger[TRIGGER_HOVER] = false\n this._isHovered = null // it is a trick to support manual triggering\n\n const complete = () => {\n if (this._isWithActiveTrigger()) {\n return\n }\n\n if (!this._isHovered) {\n this._disposePopper()\n }\n\n this._element.removeAttribute('aria-describedby')\n EventHandler.trigger(this._element, this.constructor.eventName(EVENT_HIDDEN))\n }\n\n this._queueCallback(complete, this.tip, this._isAnimated())\n }\n\n update() {\n if (this._popper) {\n this._popper.update()\n }\n }\n\n // Protected\n _isWithContent() {\n return Boolean(this._getTitle())\n }\n\n _getTipElement() {\n if (!this.tip) {\n this.tip = this._createTipElement(this._newContent || this._getContentForTemplate())\n }\n\n return this.tip\n }\n\n _createTipElement(content) {\n const tip = this._getTemplateFactory(content).toHtml()\n\n // TODO: remove this check in v6\n if (!tip) {\n return null\n }\n\n tip.classList.remove(CLASS_NAME_FADE, CLASS_NAME_SHOW)\n // TODO: v6 the following can be achieved with CSS only\n tip.classList.add(`bs-${this.constructor.NAME}-auto`)\n\n const tipId = getUID(this.constructor.NAME).toString()\n\n tip.setAttribute('id', tipId)\n\n if (this._isAnimated()) {\n tip.classList.add(CLASS_NAME_FADE)\n }\n\n return tip\n }\n\n setContent(content) {\n this._newContent = content\n if (this._isShown()) {\n this._disposePopper()\n this.show()\n }\n }\n\n _getTemplateFactory(content) {\n if (this._templateFactory) {\n this._templateFactory.changeContent(content)\n } else {\n this._templateFactory = new TemplateFactory({\n ...this._config,\n // the `content` var has to be after `this._config`\n // to override config.content in case of popover\n content,\n extraClass: this._resolvePossibleFunction(this._config.customClass)\n })\n }\n\n return this._templateFactory\n }\n\n _getContentForTemplate() {\n return {\n [SELECTOR_TOOLTIP_INNER]: this._getTitle()\n }\n }\n\n _getTitle() {\n return this._resolvePossibleFunction(this._config.title) || this._element.getAttribute('data-bs-original-title')\n }\n\n // Private\n _initializeOnDelegatedTarget(event) {\n return this.constructor.getOrCreateInstance(event.delegateTarget, this._getDelegateConfig())\n }\n\n _isAnimated() {\n return this._config.animation || (this.tip && this.tip.classList.contains(CLASS_NAME_FADE))\n }\n\n _isShown() {\n return this.tip && this.tip.classList.contains(CLASS_NAME_SHOW)\n }\n\n _createPopper(tip) {\n const placement = execute(this._config.placement, [this, tip, this._element])\n const attachment = AttachmentMap[placement.toUpperCase()]\n return Popper.createPopper(this._element, tip, this._getPopperConfig(attachment))\n }\n\n _getOffset() {\n const { offset } = this._config\n\n if (typeof offset === 'string') {\n return offset.split(',').map(value => Number.parseInt(value, 10))\n }\n\n if (typeof offset === 'function') {\n return popperData => offset(popperData, this._element)\n }\n\n return offset\n }\n\n _resolvePossibleFunction(arg) {\n return execute(arg, [this._element])\n }\n\n _getPopperConfig(attachment) {\n const defaultBsPopperConfig = {\n placement: attachment,\n modifiers: [\n {\n name: 'flip',\n options: {\n fallbackPlacements: this._config.fallbackPlacements\n }\n },\n {\n name: 'offset',\n options: {\n offset: this._getOffset()\n }\n },\n {\n name: 'preventOverflow',\n options: {\n boundary: this._config.boundary\n }\n },\n {\n name: 'arrow',\n options: {\n element: `.${this.constructor.NAME}-arrow`\n }\n },\n {\n name: 'preSetPlacement',\n enabled: true,\n phase: 'beforeMain',\n fn: data => {\n // Pre-set Popper's placement attribute in order to read the arrow sizes properly.\n // Otherwise, Popper mixes up the width and height dimensions since the initial arrow style is for top placement\n this._getTipElement().setAttribute('data-popper-placement', data.state.placement)\n }\n }\n ]\n }\n\n return {\n ...defaultBsPopperConfig,\n ...execute(this._config.popperConfig, [defaultBsPopperConfig])\n }\n }\n\n _setListeners() {\n const triggers = this._config.trigger.split(' ')\n\n for (const trigger of triggers) {\n if (trigger === 'click') {\n EventHandler.on(this._element, this.constructor.eventName(EVENT_CLICK), this._config.selector, event => {\n const context = this._initializeOnDelegatedTarget(event)\n context.toggle()\n })\n } else if (trigger !== TRIGGER_MANUAL) {\n const eventIn = trigger === TRIGGER_HOVER ?\n this.constructor.eventName(EVENT_MOUSEENTER) :\n this.constructor.eventName(EVENT_FOCUSIN)\n const eventOut = trigger === TRIGGER_HOVER ?\n this.constructor.eventName(EVENT_MOUSELEAVE) :\n this.constructor.eventName(EVENT_FOCUSOUT)\n\n EventHandler.on(this._element, eventIn, this._config.selector, event => {\n const context = this._initializeOnDelegatedTarget(event)\n context._activeTrigger[event.type === 'focusin' ? TRIGGER_FOCUS : TRIGGER_HOVER] = true\n context._enter()\n })\n EventHandler.on(this._element, eventOut, this._config.selector, event => {\n const context = this._initializeOnDelegatedTarget(event)\n context._activeTrigger[event.type === 'focusout' ? TRIGGER_FOCUS : TRIGGER_HOVER] =\n context._element.contains(event.relatedTarget)\n\n context._leave()\n })\n }\n }\n\n this._hideModalHandler = () => {\n if (this._element) {\n this.hide()\n }\n }\n\n EventHandler.on(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler)\n }\n\n _fixTitle() {\n const title = this._element.getAttribute('title')\n\n if (!title) {\n return\n }\n\n if (!this._element.getAttribute('aria-label') && !this._element.textContent.trim()) {\n this._element.setAttribute('aria-label', title)\n }\n\n this._element.setAttribute('data-bs-original-title', title) // DO NOT USE IT. Is only for backwards compatibility\n this._element.removeAttribute('title')\n }\n\n _enter() {\n if (this._isShown() || this._isHovered) {\n this._isHovered = true\n return\n }\n\n this._isHovered = true\n\n this._setTimeout(() => {\n if (this._isHovered) {\n this.show()\n }\n }, this._config.delay.show)\n }\n\n _leave() {\n if (this._isWithActiveTrigger()) {\n return\n }\n\n this._isHovered = false\n\n this._setTimeout(() => {\n if (!this._isHovered) {\n this.hide()\n }\n }, this._config.delay.hide)\n }\n\n _setTimeout(handler, timeout) {\n clearTimeout(this._timeout)\n this._timeout = setTimeout(handler, timeout)\n }\n\n _isWithActiveTrigger() {\n return Object.values(this._activeTrigger).includes(true)\n }\n\n _getConfig(config) {\n const dataAttributes = Manipulator.getDataAttributes(this._element)\n\n for (const dataAttribute of Object.keys(dataAttributes)) {\n if (DISALLOWED_ATTRIBUTES.has(dataAttribute)) {\n delete dataAttributes[dataAttribute]\n }\n }\n\n config = {\n ...dataAttributes,\n ...(typeof config === 'object' && config ? config : {})\n }\n config = this._mergeConfigObj(config)\n config = this._configAfterMerge(config)\n this._typeCheckConfig(config)\n return config\n }\n\n _configAfterMerge(config) {\n config.container = config.container === false ? document.body : getElement(config.container)\n\n if (typeof config.delay === 'number') {\n config.delay = {\n show: config.delay,\n hide: config.delay\n }\n }\n\n if (typeof config.title === 'number') {\n config.title = config.title.toString()\n }\n\n if (typeof config.content === 'number') {\n config.content = config.content.toString()\n }\n\n return config\n }\n\n _getDelegateConfig() {\n const config = {}\n\n for (const [key, value] of Object.entries(this._config)) {\n if (this.constructor.Default[key] !== value) {\n config[key] = value\n }\n }\n\n config.selector = false\n config.trigger = 'manual'\n\n // In the future can be replaced with:\n // const keysWithDifferentValues = Object.entries(this._config).filter(entry => this.constructor.Default[entry[0]] !== this._config[entry[0]])\n // `Object.fromEntries(keysWithDifferentValues)`\n return config\n }\n\n _disposePopper() {\n if (this._popper) {\n this._popper.destroy()\n this._popper = null\n }\n\n if (this.tip) {\n this.tip.remove()\n this.tip = null\n }\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Tooltip.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n })\n }\n}\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Tooltip)\n\nexport default Tooltip\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap popover.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport Tooltip from './tooltip.js'\nimport { defineJQueryPlugin } from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'popover'\n\nconst SELECTOR_TITLE = '.popover-header'\nconst SELECTOR_CONTENT = '.popover-body'\n\nconst Default = {\n ...Tooltip.Default,\n content: '',\n offset: [0, 8],\n placement: 'right',\n template: '' +\n '
' +\n '' +\n '
' +\n '
',\n trigger: 'click'\n}\n\nconst DefaultType = {\n ...Tooltip.DefaultType,\n content: '(null|string|element|function)'\n}\n\n/**\n * Class definition\n */\n\nclass Popover extends Tooltip {\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Overrides\n _isWithContent() {\n return this._getTitle() || this._getContent()\n }\n\n // Private\n _getContentForTemplate() {\n return {\n [SELECTOR_TITLE]: this._getTitle(),\n [SELECTOR_CONTENT]: this._getContent()\n }\n }\n\n _getContent() {\n return this._resolvePossibleFunction(this._config.content)\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Popover.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n })\n }\n}\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Popover)\n\nexport default Popover\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap scrollspy.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport SelectorEngine from './dom/selector-engine.js'\nimport { defineJQueryPlugin, getElement, isDisabled, isVisible } from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'scrollspy'\nconst DATA_KEY = 'bs.scrollspy'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst EVENT_ACTIVATE = `activate${EVENT_KEY}`\nconst EVENT_CLICK = `click${EVENT_KEY}`\nconst EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_DROPDOWN_ITEM = 'dropdown-item'\nconst CLASS_NAME_ACTIVE = 'active'\n\nconst SELECTOR_DATA_SPY = '[data-bs-spy=\"scroll\"]'\nconst SELECTOR_TARGET_LINKS = '[href]'\nconst SELECTOR_NAV_LIST_GROUP = '.nav, .list-group'\nconst SELECTOR_NAV_LINKS = '.nav-link'\nconst SELECTOR_NAV_ITEMS = '.nav-item'\nconst SELECTOR_LIST_ITEMS = '.list-group-item'\nconst SELECTOR_LINK_ITEMS = `${SELECTOR_NAV_LINKS}, ${SELECTOR_NAV_ITEMS} > ${SELECTOR_NAV_LINKS}, ${SELECTOR_LIST_ITEMS}`\nconst SELECTOR_DROPDOWN = '.dropdown'\nconst SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle'\n\nconst Default = {\n offset: null, // TODO: v6 @deprecated, keep it for backwards compatibility reasons\n rootMargin: '0px 0px -25%',\n smoothScroll: false,\n target: null,\n threshold: [0.1, 0.5, 1]\n}\n\nconst DefaultType = {\n offset: '(number|null)', // TODO v6 @deprecated, keep it for backwards compatibility reasons\n rootMargin: 'string',\n smoothScroll: 'boolean',\n target: 'element',\n threshold: 'array'\n}\n\n/**\n * Class definition\n */\n\nclass ScrollSpy extends BaseComponent {\n constructor(element, config) {\n super(element, config)\n\n // this._element is the observablesContainer and config.target the menu links wrapper\n this._targetLinks = new Map()\n this._observableSections = new Map()\n this._rootElement = getComputedStyle(this._element).overflowY === 'visible' ? null : this._element\n this._activeTarget = null\n this._observer = null\n this._previousScrollData = {\n visibleEntryTop: 0,\n parentScrollTop: 0\n }\n this.refresh() // initialize\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n refresh() {\n this._initializeTargetsAndObservables()\n this._maybeEnableSmoothScroll()\n\n if (this._observer) {\n this._observer.disconnect()\n } else {\n this._observer = this._getNewObserver()\n }\n\n for (const section of this._observableSections.values()) {\n this._observer.observe(section)\n }\n }\n\n dispose() {\n this._observer.disconnect()\n super.dispose()\n }\n\n // Private\n _configAfterMerge(config) {\n // TODO: on v6 target should be given explicitly & remove the {target: 'ss-target'} case\n config.target = getElement(config.target) || document.body\n\n // TODO: v6 Only for backwards compatibility reasons. Use rootMargin only\n config.rootMargin = config.offset ? `${config.offset}px 0px -30%` : config.rootMargin\n\n if (typeof config.threshold === 'string') {\n config.threshold = config.threshold.split(',').map(value => Number.parseFloat(value))\n }\n\n return config\n }\n\n _maybeEnableSmoothScroll() {\n if (!this._config.smoothScroll) {\n return\n }\n\n // unregister any previous listeners\n EventHandler.off(this._config.target, EVENT_CLICK)\n\n EventHandler.on(this._config.target, EVENT_CLICK, SELECTOR_TARGET_LINKS, event => {\n const observableSection = this._observableSections.get(event.target.hash)\n if (observableSection) {\n event.preventDefault()\n const root = this._rootElement || window\n const height = observableSection.offsetTop - this._element.offsetTop\n if (root.scrollTo) {\n root.scrollTo({ top: height, behavior: 'smooth' })\n return\n }\n\n // Chrome 60 doesn't support `scrollTo`\n root.scrollTop = height\n }\n })\n }\n\n _getNewObserver() {\n const options = {\n root: this._rootElement,\n threshold: this._config.threshold,\n rootMargin: this._config.rootMargin\n }\n\n return new IntersectionObserver(entries => this._observerCallback(entries), options)\n }\n\n // The logic of selection\n _observerCallback(entries) {\n const targetElement = entry => this._targetLinks.get(`#${entry.target.id}`)\n const activate = entry => {\n this._previousScrollData.visibleEntryTop = entry.target.offsetTop\n this._process(targetElement(entry))\n }\n\n const parentScrollTop = (this._rootElement || document.documentElement).scrollTop\n const userScrollsDown = parentScrollTop >= this._previousScrollData.parentScrollTop\n this._previousScrollData.parentScrollTop = parentScrollTop\n\n for (const entry of entries) {\n if (!entry.isIntersecting) {\n this._activeTarget = null\n this._clearActiveClass(targetElement(entry))\n\n continue\n }\n\n const entryIsLowerThanPrevious = entry.target.offsetTop >= this._previousScrollData.visibleEntryTop\n // if we are scrolling down, pick the bigger offsetTop\n if (userScrollsDown && entryIsLowerThanPrevious) {\n activate(entry)\n // if parent isn't scrolled, let's keep the first visible item, breaking the iteration\n if (!parentScrollTop) {\n return\n }\n\n continue\n }\n\n // if we are scrolling up, pick the smallest offsetTop\n if (!userScrollsDown && !entryIsLowerThanPrevious) {\n activate(entry)\n }\n }\n }\n\n _initializeTargetsAndObservables() {\n this._targetLinks = new Map()\n this._observableSections = new Map()\n\n const targetLinks = SelectorEngine.find(SELECTOR_TARGET_LINKS, this._config.target)\n\n for (const anchor of targetLinks) {\n // ensure that the anchor has an id and is not disabled\n if (!anchor.hash || isDisabled(anchor)) {\n continue\n }\n\n const observableSection = SelectorEngine.findOne(decodeURI(anchor.hash), this._element)\n\n // ensure that the observableSection exists & is visible\n if (isVisible(observableSection)) {\n this._targetLinks.set(decodeURI(anchor.hash), anchor)\n this._observableSections.set(anchor.hash, observableSection)\n }\n }\n }\n\n _process(target) {\n if (this._activeTarget === target) {\n return\n }\n\n this._clearActiveClass(this._config.target)\n this._activeTarget = target\n target.classList.add(CLASS_NAME_ACTIVE)\n this._activateParents(target)\n\n EventHandler.trigger(this._element, EVENT_ACTIVATE, { relatedTarget: target })\n }\n\n _activateParents(target) {\n // Activate dropdown parents\n if (target.classList.contains(CLASS_NAME_DROPDOWN_ITEM)) {\n SelectorEngine.findOne(SELECTOR_DROPDOWN_TOGGLE, target.closest(SELECTOR_DROPDOWN))\n .classList.add(CLASS_NAME_ACTIVE)\n return\n }\n\n for (const listGroup of SelectorEngine.parents(target, SELECTOR_NAV_LIST_GROUP)) {\n // Set triggered links parents as active\n // With both and markup a parent is the previous sibling of any nav ancestor\n for (const item of SelectorEngine.prev(listGroup, SELECTOR_LINK_ITEMS)) {\n item.classList.add(CLASS_NAME_ACTIVE)\n }\n }\n }\n\n _clearActiveClass(parent) {\n parent.classList.remove(CLASS_NAME_ACTIVE)\n\n const activeNodes = SelectorEngine.find(`${SELECTOR_TARGET_LINKS}.${CLASS_NAME_ACTIVE}`, parent)\n for (const node of activeNodes) {\n node.classList.remove(CLASS_NAME_ACTIVE)\n }\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = ScrollSpy.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(window, EVENT_LOAD_DATA_API, () => {\n for (const spy of SelectorEngine.find(SELECTOR_DATA_SPY)) {\n ScrollSpy.getOrCreateInstance(spy)\n }\n})\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(ScrollSpy)\n\nexport default ScrollSpy\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap tab.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport SelectorEngine from './dom/selector-engine.js'\nimport { defineJQueryPlugin, getNextActiveElement, isDisabled } from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'tab'\nconst DATA_KEY = 'bs.tab'\nconst EVENT_KEY = `.${DATA_KEY}`\n\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}`\nconst EVENT_KEYDOWN = `keydown${EVENT_KEY}`\nconst EVENT_LOAD_DATA_API = `load${EVENT_KEY}`\n\nconst ARROW_LEFT_KEY = 'ArrowLeft'\nconst ARROW_RIGHT_KEY = 'ArrowRight'\nconst ARROW_UP_KEY = 'ArrowUp'\nconst ARROW_DOWN_KEY = 'ArrowDown'\nconst HOME_KEY = 'Home'\nconst END_KEY = 'End'\n\nconst CLASS_NAME_ACTIVE = 'active'\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_DROPDOWN = 'dropdown'\n\nconst SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle'\nconst SELECTOR_DROPDOWN_MENU = '.dropdown-menu'\nconst NOT_SELECTOR_DROPDOWN_TOGGLE = ':not(.dropdown-toggle)'\n\nconst SELECTOR_TAB_PANEL = '.list-group, .nav, [role=\"tablist\"]'\nconst SELECTOR_OUTER = '.nav-item, .list-group-item'\nconst SELECTOR_INNER = `.nav-link${NOT_SELECTOR_DROPDOWN_TOGGLE}, .list-group-item${NOT_SELECTOR_DROPDOWN_TOGGLE}, [role=\"tab\"]${NOT_SELECTOR_DROPDOWN_TOGGLE}`\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"tab\"], [data-bs-toggle=\"pill\"], [data-bs-toggle=\"list\"]' // TODO: could only be `tab` in v6\nconst SELECTOR_INNER_ELEM = `${SELECTOR_INNER}, ${SELECTOR_DATA_TOGGLE}`\n\nconst SELECTOR_DATA_TOGGLE_ACTIVE = `.${CLASS_NAME_ACTIVE}[data-bs-toggle=\"tab\"], .${CLASS_NAME_ACTIVE}[data-bs-toggle=\"pill\"], .${CLASS_NAME_ACTIVE}[data-bs-toggle=\"list\"]`\n\n/**\n * Class definition\n */\n\nclass Tab extends BaseComponent {\n constructor(element) {\n super(element)\n this._parent = this._element.closest(SELECTOR_TAB_PANEL)\n\n if (!this._parent) {\n return\n // TODO: should throw exception in v6\n // throw new TypeError(`${element.outerHTML} has not a valid parent ${SELECTOR_INNER_ELEM}`)\n }\n\n // Set up initial aria attributes\n this._setInitialAttributes(this._parent, this._getChildren())\n\n EventHandler.on(this._element, EVENT_KEYDOWN, event => this._keydown(event))\n }\n\n // Getters\n static get NAME() {\n return NAME\n }\n\n // Public\n show() { // Shows this elem and deactivate the active sibling if exists\n const innerElem = this._element\n if (this._elemIsActive(innerElem)) {\n return\n }\n\n // Search for active tab on same parent to deactivate it\n const active = this._getActiveElem()\n\n const hideEvent = active ?\n EventHandler.trigger(active, EVENT_HIDE, { relatedTarget: innerElem }) :\n null\n\n const showEvent = EventHandler.trigger(innerElem, EVENT_SHOW, { relatedTarget: active })\n\n if (showEvent.defaultPrevented || (hideEvent && hideEvent.defaultPrevented)) {\n return\n }\n\n this._deactivate(active, innerElem)\n this._activate(innerElem, active)\n }\n\n // Private\n _activate(element, relatedElem) {\n if (!element) {\n return\n }\n\n element.classList.add(CLASS_NAME_ACTIVE)\n\n this._activate(SelectorEngine.getElementFromSelector(element)) // Search and activate/show the proper section\n\n const complete = () => {\n if (element.getAttribute('role') !== 'tab') {\n element.classList.add(CLASS_NAME_SHOW)\n return\n }\n\n element.removeAttribute('tabindex')\n element.setAttribute('aria-selected', true)\n this._toggleDropDown(element, true)\n EventHandler.trigger(element, EVENT_SHOWN, {\n relatedTarget: relatedElem\n })\n }\n\n this._queueCallback(complete, element, element.classList.contains(CLASS_NAME_FADE))\n }\n\n _deactivate(element, relatedElem) {\n if (!element) {\n return\n }\n\n element.classList.remove(CLASS_NAME_ACTIVE)\n element.blur()\n\n this._deactivate(SelectorEngine.getElementFromSelector(element)) // Search and deactivate the shown section too\n\n const complete = () => {\n if (element.getAttribute('role') !== 'tab') {\n element.classList.remove(CLASS_NAME_SHOW)\n return\n }\n\n element.setAttribute('aria-selected', false)\n element.setAttribute('tabindex', '-1')\n this._toggleDropDown(element, false)\n EventHandler.trigger(element, EVENT_HIDDEN, { relatedTarget: relatedElem })\n }\n\n this._queueCallback(complete, element, element.classList.contains(CLASS_NAME_FADE))\n }\n\n _keydown(event) {\n if (!([ARROW_LEFT_KEY, ARROW_RIGHT_KEY, ARROW_UP_KEY, ARROW_DOWN_KEY, HOME_KEY, END_KEY].includes(event.key))) {\n return\n }\n\n event.stopPropagation()// stopPropagation/preventDefault both added to support up/down keys without scrolling the page\n event.preventDefault()\n\n const children = this._getChildren().filter(element => !isDisabled(element))\n let nextActiveElement\n\n if ([HOME_KEY, END_KEY].includes(event.key)) {\n nextActiveElement = children[event.key === HOME_KEY ? 0 : children.length - 1]\n } else {\n const isNext = [ARROW_RIGHT_KEY, ARROW_DOWN_KEY].includes(event.key)\n nextActiveElement = getNextActiveElement(children, event.target, isNext, true)\n }\n\n if (nextActiveElement) {\n nextActiveElement.focus({ preventScroll: true })\n Tab.getOrCreateInstance(nextActiveElement).show()\n }\n }\n\n _getChildren() { // collection of inner elements\n return SelectorEngine.find(SELECTOR_INNER_ELEM, this._parent)\n }\n\n _getActiveElem() {\n return this._getChildren().find(child => this._elemIsActive(child)) || null\n }\n\n _setInitialAttributes(parent, children) {\n this._setAttributeIfNotExists(parent, 'role', 'tablist')\n\n for (const child of children) {\n this._setInitialAttributesOnChild(child)\n }\n }\n\n _setInitialAttributesOnChild(child) {\n child = this._getInnerElement(child)\n const isActive = this._elemIsActive(child)\n const outerElem = this._getOuterElement(child)\n child.setAttribute('aria-selected', isActive)\n\n if (outerElem !== child) {\n this._setAttributeIfNotExists(outerElem, 'role', 'presentation')\n }\n\n if (!isActive) {\n child.setAttribute('tabindex', '-1')\n }\n\n this._setAttributeIfNotExists(child, 'role', 'tab')\n\n // set attributes to the related panel too\n this._setInitialAttributesOnTargetPanel(child)\n }\n\n _setInitialAttributesOnTargetPanel(child) {\n const target = SelectorEngine.getElementFromSelector(child)\n\n if (!target) {\n return\n }\n\n this._setAttributeIfNotExists(target, 'role', 'tabpanel')\n\n if (child.id) {\n this._setAttributeIfNotExists(target, 'aria-labelledby', `${child.id}`)\n }\n }\n\n _toggleDropDown(element, open) {\n const outerElem = this._getOuterElement(element)\n if (!outerElem.classList.contains(CLASS_DROPDOWN)) {\n return\n }\n\n const toggle = (selector, className) => {\n const element = SelectorEngine.findOne(selector, outerElem)\n if (element) {\n element.classList.toggle(className, open)\n }\n }\n\n toggle(SELECTOR_DROPDOWN_TOGGLE, CLASS_NAME_ACTIVE)\n toggle(SELECTOR_DROPDOWN_MENU, CLASS_NAME_SHOW)\n outerElem.setAttribute('aria-expanded', open)\n }\n\n _setAttributeIfNotExists(element, attribute, value) {\n if (!element.hasAttribute(attribute)) {\n element.setAttribute(attribute, value)\n }\n }\n\n _elemIsActive(elem) {\n return elem.classList.contains(CLASS_NAME_ACTIVE)\n }\n\n // Try to get the inner element (usually the .nav-link)\n _getInnerElement(elem) {\n return elem.matches(SELECTOR_INNER_ELEM) ? elem : SelectorEngine.findOne(SELECTOR_INNER_ELEM, elem)\n }\n\n // Try to get the outer element (usually the .nav-item)\n _getOuterElement(elem) {\n return elem.closest(SELECTOR_OUTER) || elem\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Tab.getOrCreateInstance(this)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault()\n }\n\n if (isDisabled(this)) {\n return\n }\n\n Tab.getOrCreateInstance(this).show()\n})\n\n/**\n * Initialize on focus\n */\nEventHandler.on(window, EVENT_LOAD_DATA_API, () => {\n for (const element of SelectorEngine.find(SELECTOR_DATA_TOGGLE_ACTIVE)) {\n Tab.getOrCreateInstance(element)\n }\n})\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Tab)\n\nexport default Tab\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap toast.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport { enableDismissTrigger } from './util/component-functions.js'\nimport { defineJQueryPlugin, reflow } from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'toast'\nconst DATA_KEY = 'bs.toast'\nconst EVENT_KEY = `.${DATA_KEY}`\n\nconst EVENT_MOUSEOVER = `mouseover${EVENT_KEY}`\nconst EVENT_MOUSEOUT = `mouseout${EVENT_KEY}`\nconst EVENT_FOCUSIN = `focusin${EVENT_KEY}`\nconst EVENT_FOCUSOUT = `focusout${EVENT_KEY}`\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\n\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_HIDE = 'hide' // @deprecated - kept here only for backwards compatibility\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_SHOWING = 'showing'\n\nconst DefaultType = {\n animation: 'boolean',\n autohide: 'boolean',\n delay: 'number'\n}\n\nconst Default = {\n animation: true,\n autohide: true,\n delay: 5000\n}\n\n/**\n * Class definition\n */\n\nclass Toast extends BaseComponent {\n constructor(element, config) {\n super(element, config)\n\n this._timeout = null\n this._hasMouseInteraction = false\n this._hasKeyboardInteraction = false\n this._setListeners()\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n show() {\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW)\n\n if (showEvent.defaultPrevented) {\n return\n }\n\n this._clearTimeout()\n\n if (this._config.animation) {\n this._element.classList.add(CLASS_NAME_FADE)\n }\n\n const complete = () => {\n this._element.classList.remove(CLASS_NAME_SHOWING)\n EventHandler.trigger(this._element, EVENT_SHOWN)\n\n this._maybeScheduleHide()\n }\n\n this._element.classList.remove(CLASS_NAME_HIDE) // @deprecated\n reflow(this._element)\n this._element.classList.add(CLASS_NAME_SHOW, CLASS_NAME_SHOWING)\n\n this._queueCallback(complete, this._element, this._config.animation)\n }\n\n hide() {\n if (!this.isShown()) {\n return\n }\n\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE)\n\n if (hideEvent.defaultPrevented) {\n return\n }\n\n const complete = () => {\n this._element.classList.add(CLASS_NAME_HIDE) // @deprecated\n this._element.classList.remove(CLASS_NAME_SHOWING, CLASS_NAME_SHOW)\n EventHandler.trigger(this._element, EVENT_HIDDEN)\n }\n\n this._element.classList.add(CLASS_NAME_SHOWING)\n this._queueCallback(complete, this._element, this._config.animation)\n }\n\n dispose() {\n this._clearTimeout()\n\n if (this.isShown()) {\n this._element.classList.remove(CLASS_NAME_SHOW)\n }\n\n super.dispose()\n }\n\n isShown() {\n return this._element.classList.contains(CLASS_NAME_SHOW)\n }\n\n // Private\n\n _maybeScheduleHide() {\n if (!this._config.autohide) {\n return\n }\n\n if (this._hasMouseInteraction || this._hasKeyboardInteraction) {\n return\n }\n\n this._timeout = setTimeout(() => {\n this.hide()\n }, this._config.delay)\n }\n\n _onInteraction(event, isInteracting) {\n switch (event.type) {\n case 'mouseover':\n case 'mouseout': {\n this._hasMouseInteraction = isInteracting\n break\n }\n\n case 'focusin':\n case 'focusout': {\n this._hasKeyboardInteraction = isInteracting\n break\n }\n\n default: {\n break\n }\n }\n\n if (isInteracting) {\n this._clearTimeout()\n return\n }\n\n const nextElement = event.relatedTarget\n if (this._element === nextElement || this._element.contains(nextElement)) {\n return\n }\n\n this._maybeScheduleHide()\n }\n\n _setListeners() {\n EventHandler.on(this._element, EVENT_MOUSEOVER, event => this._onInteraction(event, true))\n EventHandler.on(this._element, EVENT_MOUSEOUT, event => this._onInteraction(event, false))\n EventHandler.on(this._element, EVENT_FOCUSIN, event => this._onInteraction(event, true))\n EventHandler.on(this._element, EVENT_FOCUSOUT, event => this._onInteraction(event, false))\n }\n\n _clearTimeout() {\n clearTimeout(this._timeout)\n this._timeout = null\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Toast.getOrCreateInstance(this, config)\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config](this)\n }\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nenableDismissTrigger(Toast)\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Toast)\n\nexport default Toast\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap index.umd.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport Alert from './src/alert.js'\nimport Button from './src/button.js'\nimport Carousel from './src/carousel.js'\nimport Collapse from './src/collapse.js'\nimport Dropdown from './src/dropdown.js'\nimport Modal from './src/modal.js'\nimport Offcanvas from './src/offcanvas.js'\nimport Popover from './src/popover.js'\nimport ScrollSpy from './src/scrollspy.js'\nimport Tab from './src/tab.js'\nimport Toast from './src/toast.js'\nimport Tooltip from './src/tooltip.js'\n\nexport default {\n Alert,\n Button,\n Carousel,\n Collapse,\n Dropdown,\n Modal,\n Offcanvas,\n Popover,\n ScrollSpy,\n Tab,\n Toast,\n Tooltip\n}\n"],"mappings":"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"}
\ No newline at end of file
diff --git a/docs/deps/bootstrap-5.3.1/bootstrap.min.css b/docs/deps/bootstrap-5.3.1/bootstrap.min.css
new file mode 100644
index 00000000..1be3b573
--- /dev/null
+++ b/docs/deps/bootstrap-5.3.1/bootstrap.min.css
@@ -0,0 +1,5 @@
+@import url("font.css");:root{--bslib-bootstrap-version: 5;--bslib-preset-name: flatly;--bslib-preset-type: bootswatch}/*!
+ * Bootstrap v5.3.1 (https://getbootstrap.com/)
+ * Copyright 2011-2023 The Bootstrap Authors
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
+ */:root,[data-bs-theme="light"]{--bs-blue: #2c3e50;--bs-indigo: #6610f2;--bs-purple: #6f42c1;--bs-pink: #e83e8c;--bs-red: #e74c3c;--bs-orange: #fd7e14;--bs-yellow: #f39c12;--bs-green: #18bc9c;--bs-teal: #20c997;--bs-cyan: #3498db;--bs-black: #000;--bs-white: #fff;--bs-gray: #95a5a6;--bs-gray-dark: #343a40;--bs-gray-100: #f8f9fa;--bs-gray-200: #ecf0f1;--bs-gray-300: #dee2e6;--bs-gray-400: #ced4da;--bs-gray-500: #b4bcc2;--bs-gray-600: #95a5a6;--bs-gray-700: #7b8a8b;--bs-gray-800: #343a40;--bs-gray-900: #212529;--bs-default: #95a5a6;--bs-primary: #2c3e50;--bs-secondary: #95a5a6;--bs-success: #18bc9c;--bs-info: #3498db;--bs-warning: #f39c12;--bs-danger: #e74c3c;--bs-light: #ecf0f1;--bs-dark: #7b8a8b;--bs-default-rgb: 149,165,166;--bs-primary-rgb: 44,62,80;--bs-secondary-rgb: 149,165,166;--bs-success-rgb: 24,188,156;--bs-info-rgb: 52,152,219;--bs-warning-rgb: 243,156,18;--bs-danger-rgb: 231,76,60;--bs-light-rgb: 236,240,241;--bs-dark-rgb: 123,138,139;--bs-primary-text-emphasis: #121920;--bs-secondary-text-emphasis: #3c4242;--bs-success-text-emphasis: #0a4b3e;--bs-info-text-emphasis: #153d58;--bs-warning-text-emphasis: #613e07;--bs-danger-text-emphasis: #5c1e18;--bs-light-text-emphasis: #7b8a8b;--bs-dark-text-emphasis: #7b8a8b;--bs-primary-bg-subtle: #d5d8dc;--bs-secondary-bg-subtle: #eaeded;--bs-success-bg-subtle: #d1f2eb;--bs-info-bg-subtle: #d6eaf8;--bs-warning-bg-subtle: #fdebd0;--bs-danger-bg-subtle: #fadbd8;--bs-light-bg-subtle: #fcfcfd;--bs-dark-bg-subtle: #ced4da;--bs-primary-border-subtle: #abb2b9;--bs-secondary-border-subtle: #d5dbdb;--bs-success-border-subtle: #a3e4d7;--bs-info-border-subtle: #aed6f1;--bs-warning-border-subtle: #fad7a0;--bs-danger-border-subtle: #f5b7b1;--bs-light-border-subtle: #ecf0f1;--bs-dark-border-subtle: #b4bcc2;--bs-white-rgb: 255,255,255;--bs-black-rgb: 0,0,0;--bs-font-sans-serif: Lato, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";--bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--bs-gradient: linear-gradient(180deg, rgba(255,255,255,0.15), rgba(255,255,255,0));--bs-body-font-family: var(--bs-font-sans-serif);--bs-body-font-size:1rem;--bs-body-font-weight: 400;--bs-body-line-height: 1.5;--bs-body-color: #212529;--bs-body-color-rgb: 33,37,41;--bs-body-bg: #fff;--bs-body-bg-rgb: 255,255,255;--bs-emphasis-color: #000;--bs-emphasis-color-rgb: 0,0,0;--bs-secondary-color: rgba(33,37,41,0.75);--bs-secondary-color-rgb: 33,37,41;--bs-secondary-bg: #ecf0f1;--bs-secondary-bg-rgb: 236,240,241;--bs-tertiary-color: rgba(33,37,41,0.5);--bs-tertiary-color-rgb: 33,37,41;--bs-tertiary-bg: #f8f9fa;--bs-tertiary-bg-rgb: 248,249,250;--bs-heading-color: inherit;--bs-link-color: #18bc9c;--bs-link-color-rgb: 24,188,156;--bs-link-decoration: underline;--bs-link-hover-color: #13967d;--bs-link-hover-color-rgb: 19,150,125;--bs-code-color: RGB(var(--bs-emphasis-color-rgb, 0, 0, 0));--bs-highlight-bg: #fdebd0;--bs-border-width: 1px;--bs-border-style: solid;--bs-border-color: #dee2e6;--bs-border-color-translucent: rgba(0,0,0,0.175);--bs-border-radius: .375rem;--bs-border-radius-sm: .25rem;--bs-border-radius-lg: .5rem;--bs-border-radius-xl: 1rem;--bs-border-radius-xxl: 2rem;--bs-border-radius-2xl: var(--bs-border-radius-xxl);--bs-border-radius-pill: 50rem;--bs-box-shadow: 0 0.5rem 1rem rgba(0,0,0,0.15);--bs-box-shadow-sm: 0 0.125rem 0.25rem rgba(0,0,0,0.075);--bs-box-shadow-lg: 0 1rem 3rem rgba(0,0,0,0.175);--bs-box-shadow-inset: inset 0 1px 2px rgba(0,0,0,0.075);--bs-focus-ring-width: .25rem;--bs-focus-ring-opacity: .25;--bs-focus-ring-color: rgba(44,62,80,0.25);--bs-form-valid-color: #18bc9c;--bs-form-valid-border-color: #18bc9c;--bs-form-invalid-color: #e74c3c;--bs-form-invalid-border-color: #e74c3c}[data-bs-theme="dark"]{color-scheme:dark;--bs-body-color: #dee2e6;--bs-body-color-rgb: 222,226,230;--bs-body-bg: #212529;--bs-body-bg-rgb: 33,37,41;--bs-emphasis-color: #fff;--bs-emphasis-color-rgb: 255,255,255;--bs-secondary-color: rgba(222,226,230,0.75);--bs-secondary-color-rgb: 222,226,230;--bs-secondary-bg: #343a40;--bs-secondary-bg-rgb: 52,58,64;--bs-tertiary-color: rgba(222,226,230,0.5);--bs-tertiary-color-rgb: 222,226,230;--bs-tertiary-bg: #2b3035;--bs-tertiary-bg-rgb: 43,48,53;--bs-primary-text-emphasis: #808b96;--bs-secondary-text-emphasis: #bfc9ca;--bs-success-text-emphasis: #74d7c4;--bs-info-text-emphasis: #85c1e9;--bs-warning-text-emphasis: #f8c471;--bs-danger-text-emphasis: #f1948a;--bs-light-text-emphasis: #f8f9fa;--bs-dark-text-emphasis: #dee2e6;--bs-primary-bg-subtle: #090c10;--bs-secondary-bg-subtle: #1e2121;--bs-success-bg-subtle: #05261f;--bs-info-bg-subtle: #0a1e2c;--bs-warning-bg-subtle: #311f04;--bs-danger-bg-subtle: #2e0f0c;--bs-light-bg-subtle: #343a40;--bs-dark-bg-subtle: #1a1d20;--bs-primary-border-subtle: #1a2530;--bs-secondary-border-subtle: #596364;--bs-success-border-subtle: #0e715e;--bs-info-border-subtle: #1f5b83;--bs-warning-border-subtle: #925e0b;--bs-danger-border-subtle: #8b2e24;--bs-light-border-subtle: #7b8a8b;--bs-dark-border-subtle: #343a40;--bs-heading-color: inherit;--bs-link-color: #808b96;--bs-link-hover-color: #99a2ab;--bs-link-color-rgb: 128,139,150;--bs-link-hover-color-rgb: 153,162,171;--bs-code-color: RGB(var(--bs-emphasis-color-rgb, 0, 0, 0));--bs-border-color: #7b8a8b;--bs-border-color-translucent: rgba(255,255,255,0.15);--bs-form-valid-color: #74d7c4;--bs-form-valid-border-color: #74d7c4;--bs-form-invalid-color: #f1948a;--bs-form-invalid-border-color: #f1948a}*,*::before,*::after{box-sizing:border-box}@media (prefers-reduced-motion: no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:var(--bs-body-font-family);font-size:var(--bs-body-font-size);font-weight:var(--bs-body-font-weight);line-height:var(--bs-body-line-height);color:var(--bs-body-color);text-align:var(--bs-body-text-align);background-color:var(--bs-body-bg);-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0)}hr{margin:1rem 0;color:inherit;border:0;border-top:var(--bs-border-width) solid;opacity:.25}h6,.h6,h5,.h5,h4,.h4,h3,.h3,h2,.h2,h1,.h1{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2;color:var(--bs-heading-color)}h1,.h1{font-size:calc(1.425rem + 2.1vw)}@media (min-width: 1200px){h1,.h1{font-size:3rem}}h2,.h2{font-size:calc(1.375rem + 1.5vw)}@media (min-width: 1200px){h2,.h2{font-size:2.5rem}}h3,.h3{font-size:calc(1.325rem + .9vw)}@media (min-width: 1200px){h3,.h3{font-size:2rem}}h4,.h4{font-size:calc(1.275rem + .3vw)}@media (min-width: 1200px){h4,.h4{font-size:1.5rem}}h5,.h5{font-size:1.25rem}h6,.h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[title]{text-decoration:underline dotted;-webkit-text-decoration:underline dotted;-moz-text-decoration:underline dotted;-ms-text-decoration:underline dotted;-o-text-decoration:underline dotted;cursor:help;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}ol,ul,dl{margin-top:0;margin-bottom:1rem}ol ol,ul ul,ol ul,ul ol{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem;padding:.625rem 1.25rem;border-left:.25rem solid #ecf0f1}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}b,strong{font-weight:bolder}small,.small{font-size:.875em}mark,.mark{padding:.1875em;background-color:var(--bs-highlight-bg)}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 1));text-decoration:underline;-webkit-text-decoration:underline;-moz-text-decoration:underline;-ms-text-decoration:underline;-o-text-decoration:underline}a:hover{--bs-link-color-rgb: var(--bs-link-hover-color-rgb)}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}pre,code,kbd,samp{font-family:var(--bs-font-monospace);font-size:1em}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em;color:RGB(var(--bs-emphasis-color-rgb, 0, 0, 0));background-color:RGBA(var(--bs-emphasis-color-rgb, 0, 0, 0), 0.04);padding:.5rem;border:1px solid var(--bs-border-color, #dee2e6);border-radius:.375rem}pre code{background-color:transparent;font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:var(--bs-code-color);background-color:RGBA(var(--bs-emphasis-color-rgb, 0, 0, 0), 0.04);border-radius:.375rem;padding:.125rem .25rem;word-wrap:break-word}a>code{color:inherit}kbd{padding:.1875rem .375rem;font-size:.875em;color:var(--bs-body-bg);background-color:var(--bs-body-color);border-radius:.25rem}kbd kbd{padding:0;font-size:1em}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:var(--bs-secondary-color);text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}thead,tbody,tfoot,tr,td,th{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}input,button,select,optgroup,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role="button"]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]:not([type="date"]):not([type="datetime-local"]):not([type="month"]):not([type="week"]):not([type="time"])::-webkit-calendar-picker-indicator{display:none !important}button,[type="button"],[type="reset"],[type="submit"]{-webkit-appearance:button}button:not(:disabled),[type="button"]:not(:disabled),[type="reset"]:not(:disabled),[type="submit"]:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + .3vw);line-height:inherit}@media (min-width: 1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-text,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type="search"]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none !important}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:calc(1.625rem + 4.5vw);font-weight:300;line-height:1.2}@media (min-width: 1200px){.display-1{font-size:5rem}}.display-2{font-size:calc(1.575rem + 3.9vw);font-weight:300;line-height:1.2}@media (min-width: 1200px){.display-2{font-size:4.5rem}}.display-3{font-size:calc(1.525rem + 3.3vw);font-weight:300;line-height:1.2}@media (min-width: 1200px){.display-3{font-size:4rem}}.display-4{font-size:calc(1.475rem + 2.7vw);font-weight:300;line-height:1.2}@media (min-width: 1200px){.display-4{font-size:3.5rem}}.display-5{font-size:calc(1.425rem + 2.1vw);font-weight:300;line-height:1.2}@media (min-width: 1200px){.display-5{font-size:3rem}}.display-6{font-size:calc(1.375rem + 1.5vw);font-weight:300;line-height:1.2}@media (min-width: 1200px){.display-6{font-size:2.5rem}}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:.875em;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote>:last-child{margin-bottom:0}.blockquote-footer{margin-top:-1rem;margin-bottom:1rem;font-size:.875em;color:#95a5a6}.blockquote-footer::before{content:"\2014\00A0"}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:var(--bs-body-bg);border:var(--bs-border-width) solid var(--bs-border-color);border-radius:var(--bs-border-radius);max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:.875em;color:var(--bs-secondary-color)}.container,.container-fluid,.container-xxl,.container-xl,.container-lg,.container-md,.container-sm{--bs-gutter-x: 1.5rem;--bs-gutter-y: 0;width:100%;padding-right:calc(var(--bs-gutter-x) * .5);padding-left:calc(var(--bs-gutter-x) * .5);margin-right:auto;margin-left:auto}@media (min-width: 576px){.container-sm,.container{max-width:540px}}@media (min-width: 768px){.container-md,.container-sm,.container{max-width:720px}}@media (min-width: 992px){.container-lg,.container-md,.container-sm,.container{max-width:960px}}@media (min-width: 1200px){.container-xl,.container-lg,.container-md,.container-sm,.container{max-width:1140px}}@media (min-width: 1400px){.container-xxl,.container-xl,.container-lg,.container-md,.container-sm,.container{max-width:1320px}}:root{--bs-breakpoint-xs: 0;--bs-breakpoint-sm: 576px;--bs-breakpoint-md: 768px;--bs-breakpoint-lg: 992px;--bs-breakpoint-xl: 1200px;--bs-breakpoint-xxl: 1400px}.row{--bs-gutter-x: 1.5rem;--bs-gutter-y: 0;display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;margin-top:calc(-1 * var(--bs-gutter-y));margin-right:calc(-.5 * var(--bs-gutter-x));margin-left:calc(-.5 * var(--bs-gutter-x))}.row>*{flex-shrink:0;-webkit-flex-shrink:0;width:100%;max-width:100%;padding-right:calc(var(--bs-gutter-x) * .5);padding-left:calc(var(--bs-gutter-x) * .5);margin-top:var(--bs-gutter-y)}.grid{display:grid;grid-template-rows:repeat(var(--bs-rows, 1), 1fr);grid-template-columns:repeat(var(--bs-columns, 12), 1fr);gap:var(--bs-gap, 1.5rem)}.grid .g-col-1{grid-column:auto/span 1}.grid .g-col-2{grid-column:auto/span 2}.grid .g-col-3{grid-column:auto/span 3}.grid .g-col-4{grid-column:auto/span 4}.grid .g-col-5{grid-column:auto/span 5}.grid .g-col-6{grid-column:auto/span 6}.grid .g-col-7{grid-column:auto/span 7}.grid .g-col-8{grid-column:auto/span 8}.grid .g-col-9{grid-column:auto/span 9}.grid .g-col-10{grid-column:auto/span 10}.grid .g-col-11{grid-column:auto/span 11}.grid .g-col-12{grid-column:auto/span 12}.grid .g-start-1{grid-column-start:1}.grid .g-start-2{grid-column-start:2}.grid .g-start-3{grid-column-start:3}.grid .g-start-4{grid-column-start:4}.grid .g-start-5{grid-column-start:5}.grid .g-start-6{grid-column-start:6}.grid .g-start-7{grid-column-start:7}.grid .g-start-8{grid-column-start:8}.grid .g-start-9{grid-column-start:9}.grid .g-start-10{grid-column-start:10}.grid .g-start-11{grid-column-start:11}@media (min-width: 576px){.grid .g-col-sm-1{grid-column:auto/span 1}.grid .g-col-sm-2{grid-column:auto/span 2}.grid .g-col-sm-3{grid-column:auto/span 3}.grid .g-col-sm-4{grid-column:auto/span 4}.grid .g-col-sm-5{grid-column:auto/span 5}.grid .g-col-sm-6{grid-column:auto/span 6}.grid .g-col-sm-7{grid-column:auto/span 7}.grid .g-col-sm-8{grid-column:auto/span 8}.grid .g-col-sm-9{grid-column:auto/span 9}.grid .g-col-sm-10{grid-column:auto/span 10}.grid .g-col-sm-11{grid-column:auto/span 11}.grid .g-col-sm-12{grid-column:auto/span 12}.grid .g-start-sm-1{grid-column-start:1}.grid .g-start-sm-2{grid-column-start:2}.grid .g-start-sm-3{grid-column-start:3}.grid .g-start-sm-4{grid-column-start:4}.grid .g-start-sm-5{grid-column-start:5}.grid .g-start-sm-6{grid-column-start:6}.grid .g-start-sm-7{grid-column-start:7}.grid .g-start-sm-8{grid-column-start:8}.grid .g-start-sm-9{grid-column-start:9}.grid .g-start-sm-10{grid-column-start:10}.grid .g-start-sm-11{grid-column-start:11}}@media (min-width: 768px){.grid .g-col-md-1{grid-column:auto/span 1}.grid .g-col-md-2{grid-column:auto/span 2}.grid .g-col-md-3{grid-column:auto/span 3}.grid .g-col-md-4{grid-column:auto/span 4}.grid .g-col-md-5{grid-column:auto/span 5}.grid .g-col-md-6{grid-column:auto/span 6}.grid .g-col-md-7{grid-column:auto/span 7}.grid .g-col-md-8{grid-column:auto/span 8}.grid .g-col-md-9{grid-column:auto/span 9}.grid .g-col-md-10{grid-column:auto/span 10}.grid .g-col-md-11{grid-column:auto/span 11}.grid .g-col-md-12{grid-column:auto/span 12}.grid .g-start-md-1{grid-column-start:1}.grid .g-start-md-2{grid-column-start:2}.grid .g-start-md-3{grid-column-start:3}.grid .g-start-md-4{grid-column-start:4}.grid .g-start-md-5{grid-column-start:5}.grid .g-start-md-6{grid-column-start:6}.grid .g-start-md-7{grid-column-start:7}.grid .g-start-md-8{grid-column-start:8}.grid .g-start-md-9{grid-column-start:9}.grid .g-start-md-10{grid-column-start:10}.grid .g-start-md-11{grid-column-start:11}}@media (min-width: 992px){.grid .g-col-lg-1{grid-column:auto/span 1}.grid .g-col-lg-2{grid-column:auto/span 2}.grid .g-col-lg-3{grid-column:auto/span 3}.grid .g-col-lg-4{grid-column:auto/span 4}.grid .g-col-lg-5{grid-column:auto/span 5}.grid .g-col-lg-6{grid-column:auto/span 6}.grid .g-col-lg-7{grid-column:auto/span 7}.grid .g-col-lg-8{grid-column:auto/span 8}.grid .g-col-lg-9{grid-column:auto/span 9}.grid .g-col-lg-10{grid-column:auto/span 10}.grid .g-col-lg-11{grid-column:auto/span 11}.grid .g-col-lg-12{grid-column:auto/span 12}.grid .g-start-lg-1{grid-column-start:1}.grid .g-start-lg-2{grid-column-start:2}.grid .g-start-lg-3{grid-column-start:3}.grid .g-start-lg-4{grid-column-start:4}.grid .g-start-lg-5{grid-column-start:5}.grid .g-start-lg-6{grid-column-start:6}.grid .g-start-lg-7{grid-column-start:7}.grid .g-start-lg-8{grid-column-start:8}.grid .g-start-lg-9{grid-column-start:9}.grid .g-start-lg-10{grid-column-start:10}.grid .g-start-lg-11{grid-column-start:11}}@media (min-width: 1200px){.grid .g-col-xl-1{grid-column:auto/span 1}.grid .g-col-xl-2{grid-column:auto/span 2}.grid .g-col-xl-3{grid-column:auto/span 3}.grid .g-col-xl-4{grid-column:auto/span 4}.grid .g-col-xl-5{grid-column:auto/span 5}.grid .g-col-xl-6{grid-column:auto/span 6}.grid .g-col-xl-7{grid-column:auto/span 7}.grid .g-col-xl-8{grid-column:auto/span 8}.grid .g-col-xl-9{grid-column:auto/span 9}.grid .g-col-xl-10{grid-column:auto/span 10}.grid .g-col-xl-11{grid-column:auto/span 11}.grid .g-col-xl-12{grid-column:auto/span 12}.grid .g-start-xl-1{grid-column-start:1}.grid .g-start-xl-2{grid-column-start:2}.grid .g-start-xl-3{grid-column-start:3}.grid .g-start-xl-4{grid-column-start:4}.grid .g-start-xl-5{grid-column-start:5}.grid .g-start-xl-6{grid-column-start:6}.grid .g-start-xl-7{grid-column-start:7}.grid .g-start-xl-8{grid-column-start:8}.grid .g-start-xl-9{grid-column-start:9}.grid .g-start-xl-10{grid-column-start:10}.grid .g-start-xl-11{grid-column-start:11}}@media (min-width: 1400px){.grid .g-col-xxl-1{grid-column:auto/span 1}.grid .g-col-xxl-2{grid-column:auto/span 2}.grid .g-col-xxl-3{grid-column:auto/span 3}.grid .g-col-xxl-4{grid-column:auto/span 4}.grid .g-col-xxl-5{grid-column:auto/span 5}.grid .g-col-xxl-6{grid-column:auto/span 6}.grid .g-col-xxl-7{grid-column:auto/span 7}.grid .g-col-xxl-8{grid-column:auto/span 8}.grid .g-col-xxl-9{grid-column:auto/span 9}.grid .g-col-xxl-10{grid-column:auto/span 10}.grid .g-col-xxl-11{grid-column:auto/span 11}.grid .g-col-xxl-12{grid-column:auto/span 12}.grid .g-start-xxl-1{grid-column-start:1}.grid .g-start-xxl-2{grid-column-start:2}.grid .g-start-xxl-3{grid-column-start:3}.grid .g-start-xxl-4{grid-column-start:4}.grid .g-start-xxl-5{grid-column-start:5}.grid .g-start-xxl-6{grid-column-start:6}.grid .g-start-xxl-7{grid-column-start:7}.grid .g-start-xxl-8{grid-column-start:8}.grid .g-start-xxl-9{grid-column-start:9}.grid .g-start-xxl-10{grid-column-start:10}.grid .g-start-xxl-11{grid-column-start:11}}.col{flex:1 0 0%;-webkit-flex:1 0 0%}.row-cols-auto>*{flex:0 0 auto;-webkit-flex:0 0 auto;width:auto}.row-cols-1>*{flex:0 0 auto;-webkit-flex:0 0 auto;width:100%}.row-cols-2>*{flex:0 0 auto;-webkit-flex:0 0 auto;width:50%}.row-cols-3>*{flex:0 0 auto;-webkit-flex:0 0 auto;width:33.33333%}.row-cols-4>*{flex:0 0 auto;-webkit-flex:0 0 auto;width:25%}.row-cols-5>*{flex:0 0 auto;-webkit-flex:0 0 auto;width:20%}.row-cols-6>*{flex:0 0 auto;-webkit-flex:0 0 auto;width:16.66667%}.col-auto{flex:0 0 auto;-webkit-flex:0 0 auto;width:auto}.col-1{flex:0 0 auto;-webkit-flex:0 0 auto;width:8.33333%}.col-2{flex:0 0 auto;-webkit-flex:0 0 auto;width:16.66667%}.col-3{flex:0 0 auto;-webkit-flex:0 0 auto;width:25%}.col-4{flex:0 0 auto;-webkit-flex:0 0 auto;width:33.33333%}.col-5{flex:0 0 auto;-webkit-flex:0 0 auto;width:41.66667%}.col-6{flex:0 0 auto;-webkit-flex:0 0 auto;width:50%}.col-7{flex:0 0 auto;-webkit-flex:0 0 auto;width:58.33333%}.col-8{flex:0 0 auto;-webkit-flex:0 0 auto;width:66.66667%}.col-9{flex:0 0 auto;-webkit-flex:0 0 auto;width:75%}.col-10{flex:0 0 auto;-webkit-flex:0 0 auto;width:83.33333%}.col-11{flex:0 0 auto;-webkit-flex:0 0 auto;width:91.66667%}.col-12{flex:0 0 auto;-webkit-flex:0 0 auto;width:100%}.offset-1{margin-left:8.33333%}.offset-2{margin-left:16.66667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.33333%}.offset-5{margin-left:41.66667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.33333%}.offset-8{margin-left:66.66667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.33333%}.offset-11{margin-left:91.66667%}.g-0,.gx-0{--bs-gutter-x: 0}.g-0,.gy-0{--bs-gutter-y: 0}.g-1,.gx-1{--bs-gutter-x: .25rem}.g-1,.gy-1{--bs-gutter-y: .25rem}.g-2,.gx-2{--bs-gutter-x: .5rem}.g-2,.gy-2{--bs-gutter-y: .5rem}.g-3,.gx-3{--bs-gutter-x: 1rem}.g-3,.gy-3{--bs-gutter-y: 1rem}.g-4,.gx-4{--bs-gutter-x: 1.5rem}.g-4,.gy-4{--bs-gutter-y: 1.5rem}.g-5,.gx-5{--bs-gutter-x: 3rem}.g-5,.gy-5{--bs-gutter-y: 3rem}@media (min-width: 576px){.col-sm{flex:1 0 0%;-webkit-flex:1 0 0%}.row-cols-sm-auto>*{flex:0 0 auto;-webkit-flex:0 0 auto;width:auto}.row-cols-sm-1>*{flex:0 0 auto;-webkit-flex:0 0 auto;width:100%}.row-cols-sm-2>*{flex:0 0 auto;-webkit-flex:0 0 auto;width:50%}.row-cols-sm-3>*{flex:0 0 auto;-webkit-flex:0 0 auto;width:33.33333%}.row-cols-sm-4>*{flex:0 0 auto;-webkit-flex:0 0 auto;width:25%}.row-cols-sm-5>*{flex:0 0 auto;-webkit-flex:0 0 auto;width:20%}.row-cols-sm-6>*{flex:0 0 auto;-webkit-flex:0 0 auto;width:16.66667%}.col-sm-auto{flex:0 0 auto;-webkit-flex:0 0 auto;width:auto}.col-sm-1{flex:0 0 auto;-webkit-flex:0 0 auto;width:8.33333%}.col-sm-2{flex:0 0 auto;-webkit-flex:0 0 auto;width:16.66667%}.col-sm-3{flex:0 0 auto;-webkit-flex:0 0 auto;width:25%}.col-sm-4{flex:0 0 auto;-webkit-flex:0 0 auto;width:33.33333%}.col-sm-5{flex:0 0 auto;-webkit-flex:0 0 auto;width:41.66667%}.col-sm-6{flex:0 0 auto;-webkit-flex:0 0 auto;width:50%}.col-sm-7{flex:0 0 auto;-webkit-flex:0 0 auto;width:58.33333%}.col-sm-8{flex:0 0 auto;-webkit-flex:0 0 auto;width:66.66667%}.col-sm-9{flex:0 0 auto;-webkit-flex:0 0 auto;width:75%}.col-sm-10{flex:0 0 auto;-webkit-flex:0 0 auto;width:83.33333%}.col-sm-11{flex:0 0 auto;-webkit-flex:0 0 auto;width:91.66667%}.col-sm-12{flex:0 0 auto;-webkit-flex:0 0 auto;width:100%}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.33333%}.offset-sm-2{margin-left:16.66667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.33333%}.offset-sm-5{margin-left:41.66667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.33333%}.offset-sm-8{margin-left:66.66667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.33333%}.offset-sm-11{margin-left:91.66667%}.g-sm-0,.gx-sm-0{--bs-gutter-x: 0}.g-sm-0,.gy-sm-0{--bs-gutter-y: 0}.g-sm-1,.gx-sm-1{--bs-gutter-x: .25rem}.g-sm-1,.gy-sm-1{--bs-gutter-y: .25rem}.g-sm-2,.gx-sm-2{--bs-gutter-x: .5rem}.g-sm-2,.gy-sm-2{--bs-gutter-y: .5rem}.g-sm-3,.gx-sm-3{--bs-gutter-x: 1rem}.g-sm-3,.gy-sm-3{--bs-gutter-y: 1rem}.g-sm-4,.gx-sm-4{--bs-gutter-x: 1.5rem}.g-sm-4,.gy-sm-4{--bs-gutter-y: 1.5rem}.g-sm-5,.gx-sm-5{--bs-gutter-x: 3rem}.g-sm-5,.gy-sm-5{--bs-gutter-y: 3rem}}@media (min-width: 768px){.col-md{flex:1 0 0%;-webkit-flex:1 0 0%}.row-cols-md-auto>*{flex:0 0 auto;-webkit-flex:0 0 auto;width:auto}.row-cols-md-1>*{flex:0 0 auto;-webkit-flex:0 0 auto;width:100%}.row-cols-md-2>*{flex:0 0 auto;-webkit-flex:0 0 auto;width:50%}.row-cols-md-3>*{flex:0 0 auto;-webkit-flex:0 0 auto;width:33.33333%}.row-cols-md-4>*{flex:0 0 auto;-webkit-flex:0 0 auto;width:25%}.row-cols-md-5>*{flex:0 0 auto;-webkit-flex:0 0 auto;width:20%}.row-cols-md-6>*{flex:0 0 auto;-webkit-flex:0 0 auto;width:16.66667%}.col-md-auto{flex:0 0 auto;-webkit-flex:0 0 auto;width:auto}.col-md-1{flex:0 0 auto;-webkit-flex:0 0 auto;width:8.33333%}.col-md-2{flex:0 0 auto;-webkit-flex:0 0 auto;width:16.66667%}.col-md-3{flex:0 0 auto;-webkit-flex:0 0 auto;width:25%}.col-md-4{flex:0 0 auto;-webkit-flex:0 0 auto;width:33.33333%}.col-md-5{flex:0 0 auto;-webkit-flex:0 0 auto;width:41.66667%}.col-md-6{flex:0 0 auto;-webkit-flex:0 0 auto;width:50%}.col-md-7{flex:0 0 auto;-webkit-flex:0 0 auto;width:58.33333%}.col-md-8{flex:0 0 auto;-webkit-flex:0 0 auto;width:66.66667%}.col-md-9{flex:0 0 auto;-webkit-flex:0 0 auto;width:75%}.col-md-10{flex:0 0 auto;-webkit-flex:0 0 auto;width:83.33333%}.col-md-11{flex:0 0 auto;-webkit-flex:0 0 auto;width:91.66667%}.col-md-12{flex:0 0 auto;-webkit-flex:0 0 auto;width:100%}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.33333%}.offset-md-2{margin-left:16.66667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.33333%}.offset-md-5{margin-left:41.66667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.33333%}.offset-md-8{margin-left:66.66667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.33333%}.offset-md-11{margin-left:91.66667%}.g-md-0,.gx-md-0{--bs-gutter-x: 0}.g-md-0,.gy-md-0{--bs-gutter-y: 0}.g-md-1,.gx-md-1{--bs-gutter-x: .25rem}.g-md-1,.gy-md-1{--bs-gutter-y: .25rem}.g-md-2,.gx-md-2{--bs-gutter-x: .5rem}.g-md-2,.gy-md-2{--bs-gutter-y: .5rem}.g-md-3,.gx-md-3{--bs-gutter-x: 1rem}.g-md-3,.gy-md-3{--bs-gutter-y: 1rem}.g-md-4,.gx-md-4{--bs-gutter-x: 1.5rem}.g-md-4,.gy-md-4{--bs-gutter-y: 1.5rem}.g-md-5,.gx-md-5{--bs-gutter-x: 3rem}.g-md-5,.gy-md-5{--bs-gutter-y: 3rem}}@media (min-width: 992px){.col-lg{flex:1 0 0%;-webkit-flex:1 0 0%}.row-cols-lg-auto>*{flex:0 0 auto;-webkit-flex:0 0 auto;width:auto}.row-cols-lg-1>*{flex:0 0 auto;-webkit-flex:0 0 auto;width:100%}.row-cols-lg-2>*{flex:0 0 auto;-webkit-flex:0 0 auto;width:50%}.row-cols-lg-3>*{flex:0 0 auto;-webkit-flex:0 0 auto;width:33.33333%}.row-cols-lg-4>*{flex:0 0 auto;-webkit-flex:0 0 auto;width:25%}.row-cols-lg-5>*{flex:0 0 auto;-webkit-flex:0 0 auto;width:20%}.row-cols-lg-6>*{flex:0 0 auto;-webkit-flex:0 0 auto;width:16.66667%}.col-lg-auto{flex:0 0 auto;-webkit-flex:0 0 auto;width:auto}.col-lg-1{flex:0 0 auto;-webkit-flex:0 0 auto;width:8.33333%}.col-lg-2{flex:0 0 auto;-webkit-flex:0 0 auto;width:16.66667%}.col-lg-3{flex:0 0 auto;-webkit-flex:0 0 auto;width:25%}.col-lg-4{flex:0 0 auto;-webkit-flex:0 0 auto;width:33.33333%}.col-lg-5{flex:0 0 auto;-webkit-flex:0 0 auto;width:41.66667%}.col-lg-6{flex:0 0 auto;-webkit-flex:0 0 auto;width:50%}.col-lg-7{flex:0 0 auto;-webkit-flex:0 0 auto;width:58.33333%}.col-lg-8{flex:0 0 auto;-webkit-flex:0 0 auto;width:66.66667%}.col-lg-9{flex:0 0 auto;-webkit-flex:0 0 auto;width:75%}.col-lg-10{flex:0 0 auto;-webkit-flex:0 0 auto;width:83.33333%}.col-lg-11{flex:0 0 auto;-webkit-flex:0 0 auto;width:91.66667%}.col-lg-12{flex:0 0 auto;-webkit-flex:0 0 auto;width:100%}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.33333%}.offset-lg-2{margin-left:16.66667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.33333%}.offset-lg-5{margin-left:41.66667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.33333%}.offset-lg-8{margin-left:66.66667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.33333%}.offset-lg-11{margin-left:91.66667%}.g-lg-0,.gx-lg-0{--bs-gutter-x: 0}.g-lg-0,.gy-lg-0{--bs-gutter-y: 0}.g-lg-1,.gx-lg-1{--bs-gutter-x: .25rem}.g-lg-1,.gy-lg-1{--bs-gutter-y: .25rem}.g-lg-2,.gx-lg-2{--bs-gutter-x: .5rem}.g-lg-2,.gy-lg-2{--bs-gutter-y: .5rem}.g-lg-3,.gx-lg-3{--bs-gutter-x: 1rem}.g-lg-3,.gy-lg-3{--bs-gutter-y: 1rem}.g-lg-4,.gx-lg-4{--bs-gutter-x: 1.5rem}.g-lg-4,.gy-lg-4{--bs-gutter-y: 1.5rem}.g-lg-5,.gx-lg-5{--bs-gutter-x: 3rem}.g-lg-5,.gy-lg-5{--bs-gutter-y: 3rem}}@media (min-width: 1200px){.col-xl{flex:1 0 0%;-webkit-flex:1 0 0%}.row-cols-xl-auto>*{flex:0 0 auto;-webkit-flex:0 0 auto;width:auto}.row-cols-xl-1>*{flex:0 0 auto;-webkit-flex:0 0 auto;width:100%}.row-cols-xl-2>*{flex:0 0 auto;-webkit-flex:0 0 auto;width:50%}.row-cols-xl-3>*{flex:0 0 auto;-webkit-flex:0 0 auto;width:33.33333%}.row-cols-xl-4>*{flex:0 0 auto;-webkit-flex:0 0 auto;width:25%}.row-cols-xl-5>*{flex:0 0 auto;-webkit-flex:0 0 auto;width:20%}.row-cols-xl-6>*{flex:0 0 auto;-webkit-flex:0 0 auto;width:16.66667%}.col-xl-auto{flex:0 0 auto;-webkit-flex:0 0 auto;width:auto}.col-xl-1{flex:0 0 auto;-webkit-flex:0 0 auto;width:8.33333%}.col-xl-2{flex:0 0 auto;-webkit-flex:0 0 auto;width:16.66667%}.col-xl-3{flex:0 0 auto;-webkit-flex:0 0 auto;width:25%}.col-xl-4{flex:0 0 auto;-webkit-flex:0 0 auto;width:33.33333%}.col-xl-5{flex:0 0 auto;-webkit-flex:0 0 auto;width:41.66667%}.col-xl-6{flex:0 0 auto;-webkit-flex:0 0 auto;width:50%}.col-xl-7{flex:0 0 auto;-webkit-flex:0 0 auto;width:58.33333%}.col-xl-8{flex:0 0 auto;-webkit-flex:0 0 auto;width:66.66667%}.col-xl-9{flex:0 0 auto;-webkit-flex:0 0 auto;width:75%}.col-xl-10{flex:0 0 auto;-webkit-flex:0 0 auto;width:83.33333%}.col-xl-11{flex:0 0 auto;-webkit-flex:0 0 auto;width:91.66667%}.col-xl-12{flex:0 0 auto;-webkit-flex:0 0 auto;width:100%}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.33333%}.offset-xl-2{margin-left:16.66667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.33333%}.offset-xl-5{margin-left:41.66667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.33333%}.offset-xl-8{margin-left:66.66667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.33333%}.offset-xl-11{margin-left:91.66667%}.g-xl-0,.gx-xl-0{--bs-gutter-x: 0}.g-xl-0,.gy-xl-0{--bs-gutter-y: 0}.g-xl-1,.gx-xl-1{--bs-gutter-x: .25rem}.g-xl-1,.gy-xl-1{--bs-gutter-y: .25rem}.g-xl-2,.gx-xl-2{--bs-gutter-x: .5rem}.g-xl-2,.gy-xl-2{--bs-gutter-y: .5rem}.g-xl-3,.gx-xl-3{--bs-gutter-x: 1rem}.g-xl-3,.gy-xl-3{--bs-gutter-y: 1rem}.g-xl-4,.gx-xl-4{--bs-gutter-x: 1.5rem}.g-xl-4,.gy-xl-4{--bs-gutter-y: 1.5rem}.g-xl-5,.gx-xl-5{--bs-gutter-x: 3rem}.g-xl-5,.gy-xl-5{--bs-gutter-y: 3rem}}@media (min-width: 1400px){.col-xxl{flex:1 0 0%;-webkit-flex:1 0 0%}.row-cols-xxl-auto>*{flex:0 0 auto;-webkit-flex:0 0 auto;width:auto}.row-cols-xxl-1>*{flex:0 0 auto;-webkit-flex:0 0 auto;width:100%}.row-cols-xxl-2>*{flex:0 0 auto;-webkit-flex:0 0 auto;width:50%}.row-cols-xxl-3>*{flex:0 0 auto;-webkit-flex:0 0 auto;width:33.33333%}.row-cols-xxl-4>*{flex:0 0 auto;-webkit-flex:0 0 auto;width:25%}.row-cols-xxl-5>*{flex:0 0 auto;-webkit-flex:0 0 auto;width:20%}.row-cols-xxl-6>*{flex:0 0 auto;-webkit-flex:0 0 auto;width:16.66667%}.col-xxl-auto{flex:0 0 auto;-webkit-flex:0 0 auto;width:auto}.col-xxl-1{flex:0 0 auto;-webkit-flex:0 0 auto;width:8.33333%}.col-xxl-2{flex:0 0 auto;-webkit-flex:0 0 auto;width:16.66667%}.col-xxl-3{flex:0 0 auto;-webkit-flex:0 0 auto;width:25%}.col-xxl-4{flex:0 0 auto;-webkit-flex:0 0 auto;width:33.33333%}.col-xxl-5{flex:0 0 auto;-webkit-flex:0 0 auto;width:41.66667%}.col-xxl-6{flex:0 0 auto;-webkit-flex:0 0 auto;width:50%}.col-xxl-7{flex:0 0 auto;-webkit-flex:0 0 auto;width:58.33333%}.col-xxl-8{flex:0 0 auto;-webkit-flex:0 0 auto;width:66.66667%}.col-xxl-9{flex:0 0 auto;-webkit-flex:0 0 auto;width:75%}.col-xxl-10{flex:0 0 auto;-webkit-flex:0 0 auto;width:83.33333%}.col-xxl-11{flex:0 0 auto;-webkit-flex:0 0 auto;width:91.66667%}.col-xxl-12{flex:0 0 auto;-webkit-flex:0 0 auto;width:100%}.offset-xxl-0{margin-left:0}.offset-xxl-1{margin-left:8.33333%}.offset-xxl-2{margin-left:16.66667%}.offset-xxl-3{margin-left:25%}.offset-xxl-4{margin-left:33.33333%}.offset-xxl-5{margin-left:41.66667%}.offset-xxl-6{margin-left:50%}.offset-xxl-7{margin-left:58.33333%}.offset-xxl-8{margin-left:66.66667%}.offset-xxl-9{margin-left:75%}.offset-xxl-10{margin-left:83.33333%}.offset-xxl-11{margin-left:91.66667%}.g-xxl-0,.gx-xxl-0{--bs-gutter-x: 0}.g-xxl-0,.gy-xxl-0{--bs-gutter-y: 0}.g-xxl-1,.gx-xxl-1{--bs-gutter-x: .25rem}.g-xxl-1,.gy-xxl-1{--bs-gutter-y: .25rem}.g-xxl-2,.gx-xxl-2{--bs-gutter-x: .5rem}.g-xxl-2,.gy-xxl-2{--bs-gutter-y: .5rem}.g-xxl-3,.gx-xxl-3{--bs-gutter-x: 1rem}.g-xxl-3,.gy-xxl-3{--bs-gutter-y: 1rem}.g-xxl-4,.gx-xxl-4{--bs-gutter-x: 1.5rem}.g-xxl-4,.gy-xxl-4{--bs-gutter-y: 1.5rem}.g-xxl-5,.gx-xxl-5{--bs-gutter-x: 3rem}.g-xxl-5,.gy-xxl-5{--bs-gutter-y: 3rem}}.table{--bs-table-color-type: initial;--bs-table-bg-type: initial;--bs-table-color-state: initial;--bs-table-bg-state: initial;--bs-table-color: var(--bs-body-color);--bs-table-bg: var(--bs-body-bg);--bs-table-border-color: var(--bs-border-color);--bs-table-accent-bg: rgba(0,0,0,0);--bs-table-striped-color: var(--bs-body-color);--bs-table-striped-bg: rgba(0,0,0,0.05);--bs-table-active-color: var(--bs-body-color);--bs-table-active-bg: rgba(0,0,0,0.1);--bs-table-hover-color: var(--bs-body-color);--bs-table-hover-bg: rgba(0,0,0,0.075);width:100%;margin-bottom:1rem;vertical-align:top;border-color:var(--bs-table-border-color)}.table>:not(caption)>*>*{padding:.5rem .5rem;color:var(--bs-table-color-state, var(--bs-table-color-type, var(--bs-table-color)));background-color:var(--bs-table-bg);border-bottom-width:var(--bs-border-width);box-shadow:inset 0 0 0 9999px var(--bs-table-bg-state, var(--bs-table-bg-type, var(--bs-table-accent-bg)))}.table>tbody{vertical-align:inherit}.table>thead{vertical-align:bottom}.table-group-divider{border-top:calc(var(--bs-border-width) * 2) solid currentcolor}.caption-top{caption-side:top}.table-sm>:not(caption)>*>*{padding:.25rem .25rem}.table-bordered>:not(caption)>*{border-width:var(--bs-border-width) 0}.table-bordered>:not(caption)>*>*{border-width:0 var(--bs-border-width)}.table-borderless>:not(caption)>*>*{border-bottom-width:0}.table-borderless>:not(:first-child){border-top-width:0}.table-striped>tbody>tr:nth-of-type(odd)>*{--bs-table-color-type: var(--bs-table-striped-color);--bs-table-bg-type: var(--bs-table-striped-bg)}.table-striped-columns>:not(caption)>tr>:nth-child(even){--bs-table-color-type: var(--bs-table-striped-color);--bs-table-bg-type: var(--bs-table-striped-bg)}.table-active{--bs-table-color-state: var(--bs-table-active-color);--bs-table-bg-state: var(--bs-table-active-bg)}.table-hover>tbody>tr:hover>*{--bs-table-color-state: var(--bs-table-hover-color);--bs-table-bg-state: var(--bs-table-hover-bg)}.table-primary{--bs-table-color: #fff;--bs-table-bg: #2c3e50;--bs-table-border-color: #415162;--bs-table-striped-bg: #374859;--bs-table-striped-color: #fff;--bs-table-active-bg: #415162;--bs-table-active-color: #fff;--bs-table-hover-bg: #3c4c5d;--bs-table-hover-color: #fff;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-secondary{--bs-table-color: #fff;--bs-table-bg: #95a5a6;--bs-table-border-color: #a0aeaf;--bs-table-striped-bg: #9aaaaa;--bs-table-striped-color: #fff;--bs-table-active-bg: #a0aeaf;--bs-table-active-color: #fff;--bs-table-hover-bg: #9dacad;--bs-table-hover-color: #fff;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-success{--bs-table-color: #fff;--bs-table-bg: #18bc9c;--bs-table-border-color: #2fc3a6;--bs-table-striped-bg: #24bfa1;--bs-table-striped-color: #fff;--bs-table-active-bg: #2fc3a6;--bs-table-active-color: #fff;--bs-table-hover-bg: #29c1a3;--bs-table-hover-color: #fff;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-info{--bs-table-color: #fff;--bs-table-bg: #3498db;--bs-table-border-color: #48a2df;--bs-table-striped-bg: #3e9ddd;--bs-table-striped-color: #fff;--bs-table-active-bg: #48a2df;--bs-table-active-color: #fff;--bs-table-hover-bg: #43a0de;--bs-table-hover-color: #fff;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-warning{--bs-table-color: #fff;--bs-table-bg: #f39c12;--bs-table-border-color: #f4a62a;--bs-table-striped-bg: #f4a11e;--bs-table-striped-color: #fff;--bs-table-active-bg: #f4a62a;--bs-table-active-color: #000;--bs-table-hover-bg: #f4a324;--bs-table-hover-color: #fff;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-danger{--bs-table-color: #fff;--bs-table-bg: #e74c3c;--bs-table-border-color: #e95e50;--bs-table-striped-bg: #e85546;--bs-table-striped-color: #fff;--bs-table-active-bg: #e95e50;--bs-table-active-color: #fff;--bs-table-hover-bg: #e9594b;--bs-table-hover-color: #fff;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-light{--bs-table-color: #000;--bs-table-bg: #ecf0f1;--bs-table-border-color: #d4d8d9;--bs-table-striped-bg: #e0e4e5;--bs-table-striped-color: #000;--bs-table-active-bg: #d4d8d9;--bs-table-active-color: #000;--bs-table-hover-bg: #dadedf;--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-dark{--bs-table-color: #fff;--bs-table-bg: #7b8a8b;--bs-table-border-color: #889697;--bs-table-striped-bg: #829091;--bs-table-striped-color: #fff;--bs-table-active-bg: #889697;--bs-table-active-color: #fff;--bs-table-hover-bg: #859394;--bs-table-hover-color: #fff;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-responsive{overflow-x:auto;-webkit-overflow-scrolling:touch}@media (max-width: 575.98px){.table-responsive-sm{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width: 767.98px){.table-responsive-md{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width: 991.98px){.table-responsive-lg{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width: 1199.98px){.table-responsive-xl{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width: 1399.98px){.table-responsive-xxl{overflow-x:auto;-webkit-overflow-scrolling:touch}}.form-label,.shiny-input-container .control-label{margin-bottom:.5rem}.col-form-label{padding-top:calc(.375rem + var(--bs-border-width));padding-bottom:calc(.375rem + var(--bs-border-width));margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + var(--bs-border-width));padding-bottom:calc(.5rem + var(--bs-border-width));font-size:1.25rem}.col-form-label-sm{padding-top:calc(.25rem + var(--bs-border-width));padding-bottom:calc(.25rem + var(--bs-border-width));font-size:.875rem}.form-text{margin-top:.25rem;font-size:.875em;color:var(--bs-secondary-color)}.form-control{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:var(--bs-body-color);appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:var(--bs-body-bg);background-clip:padding-box;border:var(--bs-border-width) solid var(--bs-border-color);border-radius:var(--bs-border-radius);transition:border-color 0.15s ease-in-out,box-shadow 0.15s ease-in-out}@media (prefers-reduced-motion: reduce){.form-control{transition:none}}.form-control[type="file"]{overflow:hidden}.form-control[type="file"]:not(:disabled):not([readonly]){cursor:pointer}.form-control:focus{color:var(--bs-body-color);background-color:var(--bs-body-bg);border-color:#969fa8;outline:0;box-shadow:0 0 0 .25rem rgba(44,62,80,0.25)}.form-control::-webkit-date-and-time-value{min-width:85px;height:1.5em;margin:0}.form-control::-webkit-datetime-edit{display:block;padding:0}.form-control::placeholder{color:var(--bs-secondary-color);opacity:1}.form-control:disabled{background-color:var(--bs-secondary-bg);opacity:1}.form-control::file-selector-button{padding:.375rem .75rem;margin:-.375rem -.75rem;margin-inline-end:.75rem;color:var(--bs-body-color);background-color:var(--bs-tertiary-bg);pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:var(--bs-border-width);border-radius:0;transition:color 0.15s ease-in-out,background-color 0.15s ease-in-out,border-color 0.15s ease-in-out,box-shadow 0.15s ease-in-out}@media (prefers-reduced-motion: reduce){.form-control::file-selector-button{transition:none}}.form-control:hover:not(:disabled):not([readonly])::file-selector-button{background-color:var(--bs-secondary-bg)}.form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;line-height:1.5;color:var(--bs-body-color);background-color:transparent;border:solid transparent;border-width:var(--bs-border-width) 0}.form-control-plaintext:focus{outline:0}.form-control-plaintext.form-control-sm,.form-control-plaintext.form-control-lg{padding-right:0;padding-left:0}.form-control-sm{min-height:calc(1.5em + .5rem + calc(var(--bs-border-width) * 2));padding:.25rem .5rem;font-size:.875rem;border-radius:var(--bs-border-radius-sm)}.form-control-sm::file-selector-button{padding:.25rem .5rem;margin:-.25rem -.5rem;margin-inline-end:.5rem}.form-control-lg{min-height:calc(1.5em + 1rem + calc(var(--bs-border-width) * 2));padding:.5rem 1rem;font-size:1.25rem;border-radius:var(--bs-border-radius-lg)}.form-control-lg::file-selector-button{padding:.5rem 1rem;margin:-.5rem -1rem;margin-inline-end:1rem}textarea.form-control{min-height:calc(1.5em + .75rem + calc(var(--bs-border-width) * 2))}textarea.form-control-sm{min-height:calc(1.5em + .5rem + calc(var(--bs-border-width) * 2))}textarea.form-control-lg{min-height:calc(1.5em + 1rem + calc(var(--bs-border-width) * 2))}.form-control-color{width:3rem;height:calc(1.5em + .75rem + calc(var(--bs-border-width) * 2));padding:.375rem}.form-control-color:not(:disabled):not([readonly]){cursor:pointer}.form-control-color::-moz-color-swatch{border:0 !important;border-radius:var(--bs-border-radius)}.form-control-color::-webkit-color-swatch{border:0 !important;border-radius:var(--bs-border-radius)}.form-control-color.form-control-sm{height:calc(1.5em + .5rem + calc(var(--bs-border-width) * 2))}.form-control-color.form-control-lg{height:calc(1.5em + 1rem + calc(var(--bs-border-width) * 2))}.form-select{--bs-form-select-bg-img: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e");display:block;width:100%;padding:.375rem 2.25rem .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:var(--bs-body-color);appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:var(--bs-body-bg);background-image:var(--bs-form-select-bg-img),var(--bs-form-select-bg-icon, none);background-repeat:no-repeat;background-position:right .75rem center;background-size:16px 12px;border:var(--bs-border-width) solid var(--bs-border-color);border-radius:var(--bs-border-radius);transition:border-color 0.15s ease-in-out,box-shadow 0.15s ease-in-out}@media (prefers-reduced-motion: reduce){.form-select{transition:none}}.form-select:focus{border-color:#969fa8;outline:0;box-shadow:0 0 0 .25rem rgba(44,62,80,0.25)}.form-select[multiple],.form-select[size]:not([size="1"]){padding-right:.75rem;background-image:none}.form-select:disabled{background-color:var(--bs-secondary-bg)}.form-select:-moz-focusring{color:transparent;text-shadow:0 0 0 var(--bs-body-color)}.form-select-sm{padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.875rem;border-radius:var(--bs-border-radius-sm)}.form-select-lg{padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem;border-radius:var(--bs-border-radius-lg)}[data-bs-theme="dark"] .form-select{--bs-form-select-bg-img: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23dee2e6' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e")}.form-check,.shiny-input-container .checkbox,.shiny-input-container .radio{display:block;min-height:1.5rem;padding-left:0;margin-bottom:.125rem}.form-check .form-check-input,.form-check .shiny-input-container .checkbox input,.form-check .shiny-input-container .radio input,.shiny-input-container .checkbox .form-check-input,.shiny-input-container .checkbox .shiny-input-container .checkbox input,.shiny-input-container .checkbox .shiny-input-container .radio input,.shiny-input-container .radio .form-check-input,.shiny-input-container .radio .shiny-input-container .checkbox input,.shiny-input-container .radio .shiny-input-container .radio input{float:left;margin-left:0}.form-check-reverse{padding-right:0;padding-left:0;text-align:right}.form-check-reverse .form-check-input{float:right;margin-right:0;margin-left:0}.form-check-input,.shiny-input-container .checkbox input,.shiny-input-container .checkbox-inline input,.shiny-input-container .radio input,.shiny-input-container .radio-inline input{--bs-form-check-bg: var(--bs-body-bg);width:1em;height:1em;margin-top:.25em;vertical-align:top;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:var(--bs-form-check-bg);background-image:var(--bs-form-check-bg-image);background-repeat:no-repeat;background-position:center;background-size:contain;border:var(--bs-border-width) solid var(--bs-border-color);print-color-adjust:exact}.form-check-input[type="checkbox"],.shiny-input-container .checkbox input[type="checkbox"],.shiny-input-container .checkbox-inline input[type="checkbox"],.shiny-input-container .radio input[type="checkbox"],.shiny-input-container .radio-inline input[type="checkbox"]{border-radius:.25em}.form-check-input[type="radio"],.shiny-input-container .checkbox input[type="radio"],.shiny-input-container .checkbox-inline input[type="radio"],.shiny-input-container .radio input[type="radio"],.shiny-input-container .radio-inline input[type="radio"]{border-radius:50%}.form-check-input:active,.shiny-input-container .checkbox input:active,.shiny-input-container .checkbox-inline input:active,.shiny-input-container .radio input:active,.shiny-input-container .radio-inline input:active{filter:brightness(90%)}.form-check-input:focus,.shiny-input-container .checkbox input:focus,.shiny-input-container .checkbox-inline input:focus,.shiny-input-container .radio input:focus,.shiny-input-container .radio-inline input:focus{border-color:#969fa8;outline:0;box-shadow:0 0 0 .25rem rgba(44,62,80,0.25)}.form-check-input:checked,.shiny-input-container .checkbox input:checked,.shiny-input-container .checkbox-inline input:checked,.shiny-input-container .radio input:checked,.shiny-input-container .radio-inline input:checked{background-color:#2c3e50;border-color:#2c3e50}.form-check-input:checked[type="checkbox"],.shiny-input-container .checkbox input:checked[type="checkbox"],.shiny-input-container .checkbox-inline input:checked[type="checkbox"],.shiny-input-container .radio input:checked[type="checkbox"],.shiny-input-container .radio-inline input:checked[type="checkbox"]{--bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/%3e%3c/svg%3e")}.form-check-input:checked[type="radio"],.shiny-input-container .checkbox input:checked[type="radio"],.shiny-input-container .checkbox-inline input:checked[type="radio"],.shiny-input-container .radio input:checked[type="radio"],.shiny-input-container .radio-inline input:checked[type="radio"]{--bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e")}.form-check-input[type="checkbox"]:indeterminate,.shiny-input-container .checkbox input[type="checkbox"]:indeterminate,.shiny-input-container .checkbox-inline input[type="checkbox"]:indeterminate,.shiny-input-container .radio input[type="checkbox"]:indeterminate,.shiny-input-container .radio-inline input[type="checkbox"]:indeterminate{background-color:#2c3e50;border-color:#2c3e50;--bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e")}.form-check-input:disabled,.shiny-input-container .checkbox input:disabled,.shiny-input-container .checkbox-inline input:disabled,.shiny-input-container .radio input:disabled,.shiny-input-container .radio-inline input:disabled{pointer-events:none;filter:none;opacity:.5}.form-check-input[disabled]~.form-check-label,.form-check-input[disabled]~span,.form-check-input:disabled~.form-check-label,.form-check-input:disabled~span,.shiny-input-container .checkbox input[disabled]~.form-check-label,.shiny-input-container .checkbox input[disabled]~span,.shiny-input-container .checkbox input:disabled~.form-check-label,.shiny-input-container .checkbox input:disabled~span,.shiny-input-container .checkbox-inline input[disabled]~.form-check-label,.shiny-input-container .checkbox-inline input[disabled]~span,.shiny-input-container .checkbox-inline input:disabled~.form-check-label,.shiny-input-container .checkbox-inline input:disabled~span,.shiny-input-container .radio input[disabled]~.form-check-label,.shiny-input-container .radio input[disabled]~span,.shiny-input-container .radio input:disabled~.form-check-label,.shiny-input-container .radio input:disabled~span,.shiny-input-container .radio-inline input[disabled]~.form-check-label,.shiny-input-container .radio-inline input[disabled]~span,.shiny-input-container .radio-inline input:disabled~.form-check-label,.shiny-input-container .radio-inline input:disabled~span{cursor:default;opacity:.5}.form-check-label,.shiny-input-container .checkbox label,.shiny-input-container .checkbox-inline label,.shiny-input-container .radio label,.shiny-input-container .radio-inline label{cursor:pointer}.form-switch{padding-left:2.5em}.form-switch .form-check-input{--bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280,0,0,0.25%29'/%3e%3c/svg%3e");width:2em;margin-left:-2.5em;background-image:var(--bs-form-switch-bg);background-position:left center;border-radius:2em;transition:background-position 0.15s ease-in-out}@media (prefers-reduced-motion: reduce){.form-switch .form-check-input{transition:none}}.form-switch .form-check-input:focus{--bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23969fa8'/%3e%3c/svg%3e")}.form-switch .form-check-input:checked{background-position:right center;--bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}.form-switch.form-check-reverse{padding-right:2.5em;padding-left:0}.form-switch.form-check-reverse .form-check-input{margin-right:-2.5em;margin-left:0}.form-check-inline{display:inline-block;margin-right:1rem}.btn-check{position:absolute;clip:rect(0, 0, 0, 0);pointer-events:none}.btn-check[disabled]+.btn,.btn-check:disabled+.btn{pointer-events:none;filter:none;opacity:.65}[data-bs-theme="dark"] .form-switch .form-check-input:not(:checked):not(:focus){--bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%28255,255,255,0.25%29'/%3e%3c/svg%3e")}.form-range{width:100%;height:1.5rem;padding:0;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:transparent}.form-range:focus{outline:0}.form-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(44,62,80,0.25)}.form-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(44,62,80,0.25)}.form-range::-moz-focus-outer{border:0}.form-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:#2c3e50;border:0;border-radius:1rem;transition:background-color 0.15s ease-in-out,border-color 0.15s ease-in-out,box-shadow 0.15s ease-in-out}@media (prefers-reduced-motion: reduce){.form-range::-webkit-slider-thumb{transition:none}}.form-range::-webkit-slider-thumb:active{background-color:#c0c5cb}.form-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:var(--bs-tertiary-bg);border-color:transparent;border-radius:1rem}.form-range::-moz-range-thumb{width:1rem;height:1rem;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:#2c3e50;border:0;border-radius:1rem;transition:background-color 0.15s ease-in-out,border-color 0.15s ease-in-out,box-shadow 0.15s ease-in-out}@media (prefers-reduced-motion: reduce){.form-range::-moz-range-thumb{transition:none}}.form-range::-moz-range-thumb:active{background-color:#c0c5cb}.form-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:var(--bs-tertiary-bg);border-color:transparent;border-radius:1rem}.form-range:disabled{pointer-events:none}.form-range:disabled::-webkit-slider-thumb{background-color:var(--bs-secondary-color)}.form-range:disabled::-moz-range-thumb{background-color:var(--bs-secondary-color)}.form-floating{position:relative}.form-floating>.form-control,.form-floating>.form-control-plaintext,.form-floating>.form-select{height:calc(3.5rem + calc(var(--bs-border-width) * 2));min-height:calc(3.5rem + calc(var(--bs-border-width) * 2));line-height:1.25}.form-floating>label{position:absolute;top:0;left:0;z-index:2;height:100%;padding:1rem .75rem;overflow:hidden;text-align:start;text-overflow:ellipsis;white-space:nowrap;pointer-events:none;border:var(--bs-border-width) solid transparent;transform-origin:0 0;transition:opacity 0.1s ease-in-out,transform 0.1s ease-in-out}@media (prefers-reduced-motion: reduce){.form-floating>label{transition:none}}.form-floating>.form-control,.form-floating>.form-control-plaintext{padding:1rem .75rem}.form-floating>.form-control::placeholder,.form-floating>.form-control-plaintext::placeholder{color:transparent}.form-floating>.form-control:focus,.form-floating>.form-control:not(:placeholder-shown),.form-floating>.form-control-plaintext:focus,.form-floating>.form-control-plaintext:not(:placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:-webkit-autofill,.form-floating>.form-control-plaintext:-webkit-autofill{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-select{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:focus~label,.form-floating>.form-control:not(:placeholder-shown)~label,.form-floating>.form-control-plaintext~label,.form-floating>.form-select~label{color:rgba(var(--bs-body-color-rgb), .65);transform:scale(0.85) translateY(-0.5rem) translateX(0.15rem)}.form-floating>.form-control:focus~label::after,.form-floating>.form-control:not(:placeholder-shown)~label::after,.form-floating>.form-control-plaintext~label::after,.form-floating>.form-select~label::after{position:absolute;inset:1rem .375rem;z-index:-1;height:1.5em;content:"";background-color:var(--bs-body-bg);border-radius:var(--bs-border-radius)}.form-floating>.form-control:-webkit-autofill~label{color:rgba(var(--bs-body-color-rgb), .65);transform:scale(0.85) translateY(-0.5rem) translateX(0.15rem)}.form-floating>.form-control-plaintext~label{border-width:var(--bs-border-width) 0}.form-floating>:disabled~label,.form-floating>.form-control:disabled~label{color:#95a5a6}.form-floating>:disabled~label::after,.form-floating>.form-control:disabled~label::after{background-color:var(--bs-secondary-bg)}.input-group{position:relative;display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;align-items:stretch;-webkit-align-items:stretch;width:100%}.input-group>.form-control,.input-group>.form-select,.input-group>.form-floating{position:relative;flex:1 1 auto;-webkit-flex:1 1 auto;width:1%;min-width:0}.input-group>.form-control:focus,.input-group>.form-select:focus,.input-group>.form-floating:focus-within{z-index:5}.input-group .btn{position:relative;z-index:2}.input-group .btn:focus{z-index:5}.input-group-text{display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:var(--bs-body-color);text-align:center;white-space:nowrap;background-color:var(--bs-tertiary-bg);border:var(--bs-border-width) solid var(--bs-border-color);border-radius:var(--bs-border-radius)}.input-group-lg>.form-control,.input-group-lg>.form-select,.input-group-lg>.input-group-text,.input-group-lg>.btn{padding:.5rem 1rem;font-size:1.25rem;border-radius:var(--bs-border-radius-lg)}.input-group-sm>.form-control,.input-group-sm>.form-select,.input-group-sm>.input-group-text,.input-group-sm>.btn{padding:.25rem .5rem;font-size:.875rem;border-radius:var(--bs-border-radius-sm)}.input-group-lg>.form-select,.input-group-sm>.form-select{padding-right:3rem}.input-group:not(.has-validation)>:not(:last-child):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating),.input-group:not(.has-validation)>.dropdown-toggle:nth-last-child(n + 3),.input-group:not(.has-validation)>.form-floating:not(:last-child)>.form-control,.input-group:not(.has-validation)>.form-floating:not(:last-child)>.form-select{border-top-right-radius:0;border-bottom-right-radius:0}.input-group.has-validation>:nth-last-child(n + 3):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating),.input-group.has-validation>.dropdown-toggle:nth-last-child(n + 4),.input-group.has-validation>.form-floating:nth-last-child(n + 3)>.form-control,.input-group.has-validation>.form-floating:nth-last-child(n + 3)>.form-select{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>:not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback){margin-left:calc(var(--bs-border-width) * -1);border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.form-floating:not(:first-child)>.form-control,.input-group>.form-floating:not(:first-child)>.form-select{border-top-left-radius:0;border-bottom-left-radius:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:var(--bs-form-valid-color)}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:var(--bs-success);border-radius:var(--bs-border-radius)}.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip,.is-valid~.valid-feedback,.is-valid~.valid-tooltip{display:block}.was-validated .form-control:valid,.form-control.is-valid{border-color:var(--bs-form-valid-border-color);padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2318bc9c' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.was-validated .form-control:valid:focus,.form-control.is-valid:focus{border-color:var(--bs-form-valid-border-color);box-shadow:0 0 0 .25rem rgba(var(--bs-success-rgb), 0.25)}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.was-validated .form-select:valid,.form-select.is-valid{border-color:var(--bs-form-valid-border-color)}.was-validated .form-select:valid:not([multiple]):not([size]),.was-validated .form-select:valid:not([multiple])[size="1"],.form-select.is-valid:not([multiple]):not([size]),.form-select.is-valid:not([multiple])[size="1"]{--bs-form-select-bg-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2318bc9c' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");padding-right:4.125rem;background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem)}.was-validated .form-select:valid:focus,.form-select.is-valid:focus{border-color:var(--bs-form-valid-border-color);box-shadow:0 0 0 .25rem rgba(var(--bs-success-rgb), 0.25)}.was-validated .form-control-color:valid,.form-control-color.is-valid{width:calc(3rem + calc(1.5em + .75rem))}.was-validated .form-check-input:valid,.form-check-input.is-valid{border-color:var(--bs-form-valid-border-color)}.was-validated .form-check-input:valid:checked,.form-check-input.is-valid:checked{background-color:var(--bs-form-valid-color)}.was-validated .form-check-input:valid:focus,.form-check-input.is-valid:focus{box-shadow:0 0 0 .25rem rgba(var(--bs-success-rgb), 0.25)}.was-validated .form-check-input:valid~.form-check-label,.form-check-input.is-valid~.form-check-label{color:var(--bs-form-valid-color)}.form-check-inline .form-check-input~.valid-feedback{margin-left:.5em}.was-validated .input-group>.form-control:not(:focus):valid,.input-group>.form-control:not(:focus).is-valid,.was-validated .input-group>.form-select:not(:focus):valid,.input-group>.form-select:not(:focus).is-valid,.was-validated .input-group>.form-floating:not(:focus-within):valid,.input-group>.form-floating:not(:focus-within).is-valid{z-index:3}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:var(--bs-form-invalid-color)}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:var(--bs-danger);border-radius:var(--bs-border-radius)}.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip,.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip{display:block}.was-validated .form-control:invalid,.form-control.is-invalid{border-color:var(--bs-form-invalid-border-color);padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23e74c3c'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23e74c3c' stroke='none'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.was-validated .form-control:invalid:focus,.form-control.is-invalid:focus{border-color:var(--bs-form-invalid-border-color);box-shadow:0 0 0 .25rem rgba(var(--bs-danger-rgb), 0.25)}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.was-validated .form-select:invalid,.form-select.is-invalid{border-color:var(--bs-form-invalid-border-color)}.was-validated .form-select:invalid:not([multiple]):not([size]),.was-validated .form-select:invalid:not([multiple])[size="1"],.form-select.is-invalid:not([multiple]):not([size]),.form-select.is-invalid:not([multiple])[size="1"]{--bs-form-select-bg-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23e74c3c'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23e74c3c' stroke='none'/%3e%3c/svg%3e");padding-right:4.125rem;background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem)}.was-validated .form-select:invalid:focus,.form-select.is-invalid:focus{border-color:var(--bs-form-invalid-border-color);box-shadow:0 0 0 .25rem rgba(var(--bs-danger-rgb), 0.25)}.was-validated .form-control-color:invalid,.form-control-color.is-invalid{width:calc(3rem + calc(1.5em + .75rem))}.was-validated .form-check-input:invalid,.form-check-input.is-invalid{border-color:var(--bs-form-invalid-border-color)}.was-validated .form-check-input:invalid:checked,.form-check-input.is-invalid:checked{background-color:var(--bs-form-invalid-color)}.was-validated .form-check-input:invalid:focus,.form-check-input.is-invalid:focus{box-shadow:0 0 0 .25rem rgba(var(--bs-danger-rgb), 0.25)}.was-validated .form-check-input:invalid~.form-check-label,.form-check-input.is-invalid~.form-check-label{color:var(--bs-form-invalid-color)}.form-check-inline .form-check-input~.invalid-feedback{margin-left:.5em}.was-validated .input-group>.form-control:not(:focus):invalid,.input-group>.form-control:not(:focus).is-invalid,.was-validated .input-group>.form-select:not(:focus):invalid,.input-group>.form-select:not(:focus).is-invalid,.was-validated .input-group>.form-floating:not(:focus-within):invalid,.input-group>.form-floating:not(:focus-within).is-invalid{z-index:4}.btn{--bs-btn-padding-x: .75rem;--bs-btn-padding-y: .375rem;--bs-btn-font-family: ;--bs-btn-font-size:1rem;--bs-btn-font-weight: 400;--bs-btn-line-height: 1.5;--bs-btn-color: var(--bs-body-color);--bs-btn-bg: transparent;--bs-btn-border-width: var(--bs-border-width);--bs-btn-border-color: transparent;--bs-btn-border-radius: var(--bs-border-radius);--bs-btn-hover-border-color: transparent;--bs-btn-box-shadow: inset 0 1px 0 rgba(255,255,255,0.15),0 1px 1px rgba(0,0,0,0.075);--bs-btn-disabled-opacity: .65;--bs-btn-focus-box-shadow: 0 0 0 .25rem rgba(var(--bs-btn-focus-shadow-rgb), .5);display:inline-block;padding:var(--bs-btn-padding-y) var(--bs-btn-padding-x);font-family:var(--bs-btn-font-family);font-size:var(--bs-btn-font-size);font-weight:var(--bs-btn-font-weight);line-height:var(--bs-btn-line-height);color:var(--bs-btn-color);text-align:center;text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;vertical-align:middle;cursor:pointer;user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;border:var(--bs-btn-border-width) solid var(--bs-btn-border-color);border-radius:var(--bs-btn-border-radius);background-color:var(--bs-btn-bg);transition:color 0.15s ease-in-out,background-color 0.15s ease-in-out,border-color 0.15s ease-in-out,box-shadow 0.15s ease-in-out}@media (prefers-reduced-motion: reduce){.btn{transition:none}}.btn:hover{color:var(--bs-btn-hover-color);background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color)}.btn-check+.btn:hover{color:var(--bs-btn-color);background-color:var(--bs-btn-bg);border-color:var(--bs-btn-border-color)}.btn:focus-visible{color:var(--bs-btn-hover-color);background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color);outline:0;box-shadow:var(--bs-btn-focus-box-shadow)}.btn-check:focus-visible+.btn{border-color:var(--bs-btn-hover-border-color);outline:0;box-shadow:var(--bs-btn-focus-box-shadow)}.btn-check:checked+.btn,:not(.btn-check)+.btn:active,.btn:first-child:active,.btn.active,.btn.show{color:var(--bs-btn-active-color);background-color:var(--bs-btn-active-bg);border-color:var(--bs-btn-active-border-color)}.btn-check:checked+.btn:focus-visible,:not(.btn-check)+.btn:active:focus-visible,.btn:first-child:active:focus-visible,.btn.active:focus-visible,.btn.show:focus-visible{box-shadow:var(--bs-btn-focus-box-shadow)}.btn:disabled,.btn.disabled,fieldset:disabled .btn{color:var(--bs-btn-disabled-color);pointer-events:none;background-color:var(--bs-btn-disabled-bg);border-color:var(--bs-btn-disabled-border-color);opacity:var(--bs-btn-disabled-opacity)}.btn-default{--bs-btn-color: #fff;--bs-btn-bg: #95a5a6;--bs-btn-border-color: #95a5a6;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #7f8c8d;--bs-btn-hover-border-color: #778485;--bs-btn-focus-shadow-rgb: 165,179,179;--bs-btn-active-color: #fff;--bs-btn-active-bg: #778485;--bs-btn-active-border-color: #707c7d;--bs-btn-active-shadow: inset 0 3px 5px rgba(0,0,0,0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #95a5a6;--bs-btn-disabled-border-color: #95a5a6}.btn-primary{--bs-btn-color: #fff;--bs-btn-bg: #2c3e50;--bs-btn-border-color: #2c3e50;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #253544;--bs-btn-hover-border-color: #233240;--bs-btn-focus-shadow-rgb: 76,91,106;--bs-btn-active-color: #fff;--bs-btn-active-bg: #233240;--bs-btn-active-border-color: #212f3c;--bs-btn-active-shadow: inset 0 3px 5px rgba(0,0,0,0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #2c3e50;--bs-btn-disabled-border-color: #2c3e50}.btn-secondary,.btn-default:not(.btn-primary):not(.btn-info):not(.btn-success):not(.btn-warning):not(.btn-danger):not(.btn-dark):not(.btn-light):not([class*='btn-outline-']){--bs-btn-color: #fff;--bs-btn-bg: #95a5a6;--bs-btn-border-color: #95a5a6;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #7f8c8d;--bs-btn-hover-border-color: #778485;--bs-btn-focus-shadow-rgb: 165,179,179;--bs-btn-active-color: #fff;--bs-btn-active-bg: #778485;--bs-btn-active-border-color: #707c7d;--bs-btn-active-shadow: inset 0 3px 5px rgba(0,0,0,0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #95a5a6;--bs-btn-disabled-border-color: #95a5a6}.btn-success{--bs-btn-color: #fff;--bs-btn-bg: #18bc9c;--bs-btn-border-color: #18bc9c;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #14a085;--bs-btn-hover-border-color: #13967d;--bs-btn-focus-shadow-rgb: 59,198,171;--bs-btn-active-color: #fff;--bs-btn-active-bg: #13967d;--bs-btn-active-border-color: #128d75;--bs-btn-active-shadow: inset 0 3px 5px rgba(0,0,0,0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #18bc9c;--bs-btn-disabled-border-color: #18bc9c}.btn-info{--bs-btn-color: #fff;--bs-btn-bg: #3498db;--bs-btn-border-color: #3498db;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #2c81ba;--bs-btn-hover-border-color: #2a7aaf;--bs-btn-focus-shadow-rgb: 82,167,224;--bs-btn-active-color: #fff;--bs-btn-active-bg: #2a7aaf;--bs-btn-active-border-color: #2772a4;--bs-btn-active-shadow: inset 0 3px 5px rgba(0,0,0,0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #3498db;--bs-btn-disabled-border-color: #3498db}.btn-warning{--bs-btn-color: #fff;--bs-btn-bg: #f39c12;--bs-btn-border-color: #f39c12;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #cf850f;--bs-btn-hover-border-color: #c27d0e;--bs-btn-focus-shadow-rgb: 245,171,54;--bs-btn-active-color: #fff;--bs-btn-active-bg: #c27d0e;--bs-btn-active-border-color: #b6750e;--bs-btn-active-shadow: inset 0 3px 5px rgba(0,0,0,0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #f39c12;--bs-btn-disabled-border-color: #f39c12}.btn-danger{--bs-btn-color: #fff;--bs-btn-bg: #e74c3c;--bs-btn-border-color: #e74c3c;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #c44133;--bs-btn-hover-border-color: #b93d30;--bs-btn-focus-shadow-rgb: 235,103,89;--bs-btn-active-color: #fff;--bs-btn-active-bg: #b93d30;--bs-btn-active-border-color: #ad392d;--bs-btn-active-shadow: inset 0 3px 5px rgba(0,0,0,0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #e74c3c;--bs-btn-disabled-border-color: #e74c3c}.btn-light{--bs-btn-color: #000;--bs-btn-bg: #ecf0f1;--bs-btn-border-color: #ecf0f1;--bs-btn-hover-color: #000;--bs-btn-hover-bg: #c9cccd;--bs-btn-hover-border-color: #bdc0c1;--bs-btn-focus-shadow-rgb: 201,204,205;--bs-btn-active-color: #000;--bs-btn-active-bg: #bdc0c1;--bs-btn-active-border-color: #b1b4b5;--bs-btn-active-shadow: inset 0 3px 5px rgba(0,0,0,0.125);--bs-btn-disabled-color: #000;--bs-btn-disabled-bg: #ecf0f1;--bs-btn-disabled-border-color: #ecf0f1}.btn-dark{--bs-btn-color: #fff;--bs-btn-bg: #7b8a8b;--bs-btn-border-color: #7b8a8b;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #8f9c9c;--bs-btn-hover-border-color: #889697;--bs-btn-focus-shadow-rgb: 143,156,156;--bs-btn-active-color: #fff;--bs-btn-active-bg: #95a1a2;--bs-btn-active-border-color: #889697;--bs-btn-active-shadow: inset 0 3px 5px rgba(0,0,0,0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #7b8a8b;--bs-btn-disabled-border-color: #7b8a8b}.btn-outline-default{--bs-btn-color: #95a5a6;--bs-btn-border-color: #95a5a6;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #95a5a6;--bs-btn-hover-border-color: #95a5a6;--bs-btn-focus-shadow-rgb: 149,165,166;--bs-btn-active-color: #fff;--bs-btn-active-bg: #95a5a6;--bs-btn-active-border-color: #95a5a6;--bs-btn-active-shadow: inset 0 3px 5px rgba(0,0,0,0.125);--bs-btn-disabled-color: #95a5a6;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #95a5a6;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-primary{--bs-btn-color: #2c3e50;--bs-btn-border-color: #2c3e50;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #2c3e50;--bs-btn-hover-border-color: #2c3e50;--bs-btn-focus-shadow-rgb: 44,62,80;--bs-btn-active-color: #fff;--bs-btn-active-bg: #2c3e50;--bs-btn-active-border-color: #2c3e50;--bs-btn-active-shadow: inset 0 3px 5px rgba(0,0,0,0.125);--bs-btn-disabled-color: #2c3e50;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #2c3e50;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-secondary{--bs-btn-color: #95a5a6;--bs-btn-border-color: #95a5a6;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #95a5a6;--bs-btn-hover-border-color: #95a5a6;--bs-btn-focus-shadow-rgb: 149,165,166;--bs-btn-active-color: #fff;--bs-btn-active-bg: #95a5a6;--bs-btn-active-border-color: #95a5a6;--bs-btn-active-shadow: inset 0 3px 5px rgba(0,0,0,0.125);--bs-btn-disabled-color: #95a5a6;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #95a5a6;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-success{--bs-btn-color: #18bc9c;--bs-btn-border-color: #18bc9c;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #18bc9c;--bs-btn-hover-border-color: #18bc9c;--bs-btn-focus-shadow-rgb: 24,188,156;--bs-btn-active-color: #fff;--bs-btn-active-bg: #18bc9c;--bs-btn-active-border-color: #18bc9c;--bs-btn-active-shadow: inset 0 3px 5px rgba(0,0,0,0.125);--bs-btn-disabled-color: #18bc9c;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #18bc9c;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-info{--bs-btn-color: #3498db;--bs-btn-border-color: #3498db;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #3498db;--bs-btn-hover-border-color: #3498db;--bs-btn-focus-shadow-rgb: 52,152,219;--bs-btn-active-color: #fff;--bs-btn-active-bg: #3498db;--bs-btn-active-border-color: #3498db;--bs-btn-active-shadow: inset 0 3px 5px rgba(0,0,0,0.125);--bs-btn-disabled-color: #3498db;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #3498db;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-warning{--bs-btn-color: #f39c12;--bs-btn-border-color: #f39c12;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #f39c12;--bs-btn-hover-border-color: #f39c12;--bs-btn-focus-shadow-rgb: 243,156,18;--bs-btn-active-color: #fff;--bs-btn-active-bg: #f39c12;--bs-btn-active-border-color: #f39c12;--bs-btn-active-shadow: inset 0 3px 5px rgba(0,0,0,0.125);--bs-btn-disabled-color: #f39c12;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #f39c12;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-danger{--bs-btn-color: #e74c3c;--bs-btn-border-color: #e74c3c;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #e74c3c;--bs-btn-hover-border-color: #e74c3c;--bs-btn-focus-shadow-rgb: 231,76,60;--bs-btn-active-color: #fff;--bs-btn-active-bg: #e74c3c;--bs-btn-active-border-color: #e74c3c;--bs-btn-active-shadow: inset 0 3px 5px rgba(0,0,0,0.125);--bs-btn-disabled-color: #e74c3c;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #e74c3c;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-light{--bs-btn-color: #ecf0f1;--bs-btn-border-color: #ecf0f1;--bs-btn-hover-color: #000;--bs-btn-hover-bg: #ecf0f1;--bs-btn-hover-border-color: #ecf0f1;--bs-btn-focus-shadow-rgb: 236,240,241;--bs-btn-active-color: #000;--bs-btn-active-bg: #ecf0f1;--bs-btn-active-border-color: #ecf0f1;--bs-btn-active-shadow: inset 0 3px 5px rgba(0,0,0,0.125);--bs-btn-disabled-color: #ecf0f1;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #ecf0f1;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-dark{--bs-btn-color: #7b8a8b;--bs-btn-border-color: #7b8a8b;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #7b8a8b;--bs-btn-hover-border-color: #7b8a8b;--bs-btn-focus-shadow-rgb: 123,138,139;--bs-btn-active-color: #fff;--bs-btn-active-bg: #7b8a8b;--bs-btn-active-border-color: #7b8a8b;--bs-btn-active-shadow: inset 0 3px 5px rgba(0,0,0,0.125);--bs-btn-disabled-color: #7b8a8b;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #7b8a8b;--bs-btn-bg: transparent;--bs-gradient: none}.btn-link{--bs-btn-font-weight: 400;--bs-btn-color: var(--bs-link-color);--bs-btn-bg: transparent;--bs-btn-border-color: transparent;--bs-btn-hover-color: var(--bs-link-hover-color);--bs-btn-hover-border-color: transparent;--bs-btn-active-color: var(--bs-link-hover-color);--bs-btn-active-border-color: transparent;--bs-btn-disabled-color: #95a5a6;--bs-btn-disabled-border-color: transparent;--bs-btn-box-shadow: 0 0 0 #000;--bs-btn-focus-shadow-rgb: 59,198,171;text-decoration:underline;-webkit-text-decoration:underline;-moz-text-decoration:underline;-ms-text-decoration:underline;-o-text-decoration:underline}.btn-link:focus-visible{color:var(--bs-btn-color)}.btn-link:hover{color:var(--bs-btn-hover-color)}.btn-lg,.btn-group-lg>.btn{--bs-btn-padding-y: .5rem;--bs-btn-padding-x: 1rem;--bs-btn-font-size:1.25rem;--bs-btn-border-radius: var(--bs-border-radius-lg)}.btn-sm,.btn-group-sm>.btn{--bs-btn-padding-y: .25rem;--bs-btn-padding-x: .5rem;--bs-btn-font-size:.875rem;--bs-btn-border-radius: var(--bs-border-radius-sm)}.fade{transition:opacity 0.15s linear}@media (prefers-reduced-motion: reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{height:0;overflow:hidden;transition:height 0.35s ease}@media (prefers-reduced-motion: reduce){.collapsing{transition:none}}.collapsing.collapse-horizontal{width:0;height:auto;transition:width 0.35s ease}@media (prefers-reduced-motion: reduce){.collapsing.collapse-horizontal{transition:none}}.dropup,.dropend,.dropdown,.dropstart,.dropup-center,.dropdown-center{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{--bs-dropdown-zindex: 1000;--bs-dropdown-min-width: 10rem;--bs-dropdown-padding-x: 0;--bs-dropdown-padding-y: .5rem;--bs-dropdown-spacer: .125rem;--bs-dropdown-font-size:1rem;--bs-dropdown-color: var(--bs-body-color);--bs-dropdown-bg: var(--bs-body-bg);--bs-dropdown-border-color: var(--bs-border-color-translucent);--bs-dropdown-border-radius: var(--bs-border-radius);--bs-dropdown-border-width: var(--bs-border-width);--bs-dropdown-inner-border-radius: calc(var(--bs-border-radius) - var(--bs-border-width));--bs-dropdown-divider-bg: var(--bs-border-color-translucent);--bs-dropdown-divider-margin-y: .5rem;--bs-dropdown-box-shadow: 0 0.5rem 1rem rgba(0,0,0,0.15);--bs-dropdown-link-color: #7b8a8b;--bs-dropdown-link-hover-color: #fff;--bs-dropdown-link-hover-bg: #2c3e50;--bs-dropdown-link-active-color: #fff;--bs-dropdown-link-active-bg: #2c3e50;--bs-dropdown-link-disabled-color: var(--bs-tertiary-color);--bs-dropdown-item-padding-x: 1rem;--bs-dropdown-item-padding-y: .25rem;--bs-dropdown-header-color: #95a5a6;--bs-dropdown-header-padding-x: 1rem;--bs-dropdown-header-padding-y: .5rem;position:absolute;z-index:var(--bs-dropdown-zindex);display:none;min-width:var(--bs-dropdown-min-width);padding:var(--bs-dropdown-padding-y) var(--bs-dropdown-padding-x);margin:0;font-size:var(--bs-dropdown-font-size);color:var(--bs-dropdown-color);text-align:left;list-style:none;background-color:var(--bs-dropdown-bg);background-clip:padding-box;border:var(--bs-dropdown-border-width) solid var(--bs-dropdown-border-color);border-radius:var(--bs-dropdown-border-radius)}.dropdown-menu[data-bs-popper]{top:100%;left:0;margin-top:var(--bs-dropdown-spacer)}.dropdown-menu-start{--bs-position: start}.dropdown-menu-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-end{--bs-position: end}.dropdown-menu-end[data-bs-popper]{right:0;left:auto}@media (min-width: 576px){.dropdown-menu-sm-start{--bs-position: start}.dropdown-menu-sm-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-sm-end{--bs-position: end}.dropdown-menu-sm-end[data-bs-popper]{right:0;left:auto}}@media (min-width: 768px){.dropdown-menu-md-start{--bs-position: start}.dropdown-menu-md-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-md-end{--bs-position: end}.dropdown-menu-md-end[data-bs-popper]{right:0;left:auto}}@media (min-width: 992px){.dropdown-menu-lg-start{--bs-position: start}.dropdown-menu-lg-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-lg-end{--bs-position: end}.dropdown-menu-lg-end[data-bs-popper]{right:0;left:auto}}@media (min-width: 1200px){.dropdown-menu-xl-start{--bs-position: start}.dropdown-menu-xl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xl-end{--bs-position: end}.dropdown-menu-xl-end[data-bs-popper]{right:0;left:auto}}@media (min-width: 1400px){.dropdown-menu-xxl-start{--bs-position: start}.dropdown-menu-xxl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xxl-end{--bs-position: end}.dropdown-menu-xxl-end[data-bs-popper]{right:0;left:auto}}.dropup .dropdown-menu[data-bs-popper]{top:auto;bottom:100%;margin-top:0;margin-bottom:var(--bs-dropdown-spacer)}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-menu[data-bs-popper]{top:0;right:auto;left:100%;margin-top:0;margin-left:var(--bs-dropdown-spacer)}.dropend .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropend .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-toggle::after{vertical-align:0}.dropstart .dropdown-menu[data-bs-popper]{top:0;right:100%;left:auto;margin-top:0;margin-right:var(--bs-dropdown-spacer)}.dropstart .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropstart .dropdown-toggle::after{display:none}.dropstart .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropstart .dropdown-toggle:empty::after{margin-left:0}.dropstart .dropdown-toggle::before{vertical-align:0}.dropdown-divider{height:0;margin:var(--bs-dropdown-divider-margin-y) 0;overflow:hidden;border-top:1px solid var(--bs-dropdown-divider-bg);opacity:1}.dropdown-item{display:block;width:100%;padding:var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);clear:both;font-weight:400;color:var(--bs-dropdown-link-color);text-align:inherit;text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;white-space:nowrap;background-color:transparent;border:0;border-radius:var(--bs-dropdown-item-border-radius, 0)}.dropdown-item:hover,.dropdown-item:focus{color:var(--bs-dropdown-link-hover-color);background-color:var(--bs-dropdown-link-hover-bg)}.dropdown-item.active,.dropdown-item:active{color:var(--bs-dropdown-link-active-color);text-decoration:none;background-color:var(--bs-dropdown-link-active-bg)}.dropdown-item.disabled,.dropdown-item:disabled{color:var(--bs-dropdown-link-disabled-color);pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:var(--bs-dropdown-header-padding-y) var(--bs-dropdown-header-padding-x);margin-bottom:0;font-size:.875rem;color:var(--bs-dropdown-header-color);white-space:nowrap}.dropdown-item-text{display:block;padding:var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);color:var(--bs-dropdown-link-color)}.dropdown-menu-dark{--bs-dropdown-color: #dee2e6;--bs-dropdown-bg: #343a40;--bs-dropdown-border-color: var(--bs-border-color-translucent);--bs-dropdown-box-shadow: ;--bs-dropdown-link-color: #dee2e6;--bs-dropdown-link-hover-color: #fff;--bs-dropdown-divider-bg: var(--bs-border-color-translucent);--bs-dropdown-link-hover-bg: rgba(255,255,255,0.15);--bs-dropdown-link-active-color: #fff;--bs-dropdown-link-active-bg: #2c3e50;--bs-dropdown-link-disabled-color: #b4bcc2;--bs-dropdown-header-color: #b4bcc2}.btn-group,.btn-group-vertical{position:relative;display:inline-flex;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;flex:1 1 auto;-webkit-flex:1 1 auto}.btn-group>.btn-check:checked+.btn,.btn-group>.btn-check:focus+.btn,.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn-check:checked+.btn,.btn-group-vertical>.btn-check:focus+.btn,.btn-group-vertical>.btn:hover,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn.active{z-index:1}.btn-toolbar{display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;justify-content:flex-start;-webkit-justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group{border-radius:var(--bs-border-radius)}.btn-group>:not(.btn-check:first-child)+.btn,.btn-group>.btn-group:not(:first-child){margin-left:calc(var(--bs-border-width) * -1)}.btn-group>.btn:not(:last-child):not(.dropdown-toggle),.btn-group>.btn.dropdown-toggle-split:first-child,.btn-group>.btn-group:not(:last-child)>.btn{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:nth-child(n + 3),.btn-group>:not(.btn-check)+.btn,.btn-group>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after,.dropend .dropdown-toggle-split::after{margin-left:0}.dropstart .dropdown-toggle-split::before{margin-right:0}.btn-sm+.dropdown-toggle-split,.btn-group-sm>.btn+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-lg+.dropdown-toggle-split,.btn-group-lg>.btn+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{flex-direction:column;-webkit-flex-direction:column;align-items:flex-start;-webkit-align-items:flex-start;justify-content:center;-webkit-justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn:not(:first-child),.btn-group-vertical>.btn-group:not(:first-child){margin-top:calc(var(--bs-border-width) * -1)}.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle),.btn-group-vertical>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn~.btn,.btn-group-vertical>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-top-right-radius:0}.nav{--bs-nav-link-padding-x: 2rem;--bs-nav-link-padding-y: .5rem;--bs-nav-link-font-weight: ;--bs-nav-link-color: var(--bs-link-color);--bs-nav-link-hover-color: var(--bs-link-hover-color);--bs-nav-link-disabled-color: #95a5a6;display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:var(--bs-nav-link-padding-y) var(--bs-nav-link-padding-x);font-size:var(--bs-nav-link-font-size);font-weight:var(--bs-nav-link-font-weight);color:var(--bs-nav-link-color);text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;background:none;border:0;transition:color 0.15s ease-in-out,background-color 0.15s ease-in-out,border-color 0.15s ease-in-out}@media (prefers-reduced-motion: reduce){.nav-link{transition:none}}.nav-link:hover,.nav-link:focus{color:var(--bs-nav-link-hover-color)}.nav-link:focus-visible{outline:0;box-shadow:0 0 0 .25rem rgba(44,62,80,0.25)}.nav-link.disabled,.nav-link:disabled{color:var(--bs-nav-link-disabled-color);pointer-events:none;cursor:default}.nav-tabs{--bs-nav-tabs-border-width: var(--bs-border-width);--bs-nav-tabs-border-color: #ecf0f1;--bs-nav-tabs-border-radius: var(--bs-border-radius);--bs-nav-tabs-link-hover-border-color: var(--bs-secondary-bg) var(--bs-secondary-bg) #ecf0f1;--bs-nav-tabs-link-active-color: var(--bs-emphasis-color);--bs-nav-tabs-link-active-bg: var(--bs-body-bg);--bs-nav-tabs-link-active-border-color: var(--bs-border-color) var(--bs-border-color) var(--bs-body-bg);border-bottom:var(--bs-nav-tabs-border-width) solid var(--bs-nav-tabs-border-color)}.nav-tabs .nav-link{margin-bottom:calc(-1 * var(--bs-nav-tabs-border-width));border:var(--bs-nav-tabs-border-width) solid transparent;border-top-left-radius:var(--bs-nav-tabs-border-radius);border-top-right-radius:var(--bs-nav-tabs-border-radius)}.nav-tabs .nav-link:hover,.nav-tabs .nav-link:focus{isolation:isolate;border-color:var(--bs-nav-tabs-link-hover-border-color)}.nav-tabs .nav-link.active,.nav-tabs .nav-item.show .nav-link{color:var(--bs-nav-tabs-link-active-color);background-color:var(--bs-nav-tabs-link-active-bg);border-color:var(--bs-nav-tabs-link-active-border-color)}.nav-tabs .dropdown-menu{margin-top:calc(-1 * var(--bs-nav-tabs-border-width));border-top-left-radius:0;border-top-right-radius:0}.nav-pills{--bs-nav-pills-border-radius: var(--bs-border-radius);--bs-nav-pills-link-active-color: #fff;--bs-nav-pills-link-active-bg: #2c3e50}.nav-pills .nav-link{border-radius:var(--bs-nav-pills-border-radius)}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:var(--bs-nav-pills-link-active-color);background-color:var(--bs-nav-pills-link-active-bg)}.nav-underline{--bs-nav-underline-gap: 1rem;--bs-nav-underline-border-width: .125rem;--bs-nav-underline-link-active-color: var(--bs-emphasis-color);gap:var(--bs-nav-underline-gap)}.nav-underline .nav-link{padding-right:0;padding-left:0;border-bottom:var(--bs-nav-underline-border-width) solid transparent}.nav-underline .nav-link:hover,.nav-underline .nav-link:focus{border-bottom-color:currentcolor}.nav-underline .nav-link.active,.nav-underline .show>.nav-link{font-weight:700;color:var(--bs-nav-underline-link-active-color);border-bottom-color:currentcolor}.nav-fill>.nav-link,.nav-fill .nav-item{flex:1 1 auto;-webkit-flex:1 1 auto;text-align:center}.nav-justified>.nav-link,.nav-justified .nav-item{flex-basis:0;-webkit-flex-basis:0;flex-grow:1;-webkit-flex-grow:1;text-align:center}.nav-fill .nav-item .nav-link,.nav-justified .nav-item .nav-link{width:100%}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{--bs-navbar-padding-x: 0;--bs-navbar-padding-y: 1rem;--bs-navbar-color: #fff;--bs-navbar-hover-color: #18bc9c;--bs-navbar-disabled-color: rgba(255,255,255,0.3);--bs-navbar-active-color: #18bc9c;--bs-navbar-brand-padding-y: .3125rem;--bs-navbar-brand-margin-end: 1rem;--bs-navbar-brand-font-size: 1.25rem;--bs-navbar-brand-color: #fff;--bs-navbar-brand-hover-color: #fff;--bs-navbar-nav-link-padding-x: .5rem;--bs-navbar-toggler-padding-y: .25rem;--bs-navbar-toggler-padding-x: .75rem;--bs-navbar-toggler-font-size: 1.25rem;--bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255,255,255,0.75%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");--bs-navbar-toggler-border-color: rgba(255,255,255,0.15);--bs-navbar-toggler-border-radius: var(--bs-border-radius);--bs-navbar-toggler-focus-width: .25rem;--bs-navbar-toggler-transition: box-shadow 0.15s ease-in-out;position:relative;display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;align-items:center;-webkit-align-items:center;justify-content:space-between;-webkit-justify-content:space-between;padding:var(--bs-navbar-padding-y) var(--bs-navbar-padding-x)}.navbar>.container,.navbar>.container-fluid,.navbar>.container-sm,.navbar>.container-md,.navbar>.container-lg,.navbar>.container-xl,.navbar>.container-xxl{display:flex;display:-webkit-flex;flex-wrap:inherit;-webkit-flex-wrap:inherit;align-items:center;-webkit-align-items:center;justify-content:space-between;-webkit-justify-content:space-between}.navbar-brand{padding-top:var(--bs-navbar-brand-padding-y);padding-bottom:var(--bs-navbar-brand-padding-y);margin-right:var(--bs-navbar-brand-margin-end);font-size:var(--bs-navbar-brand-font-size);color:var(--bs-navbar-brand-color);text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;white-space:nowrap}.navbar-brand:hover,.navbar-brand:focus{color:var(--bs-navbar-brand-hover-color)}.navbar-nav{--bs-nav-link-padding-x: 0;--bs-nav-link-padding-y: .5rem;--bs-nav-link-font-weight: ;--bs-nav-link-color: var(--bs-navbar-color);--bs-nav-link-hover-color: var(--bs-navbar-hover-color);--bs-nav-link-disabled-color: var(--bs-navbar-disabled-color);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link.active,.navbar-nav .nav-link.show{color:var(--bs-navbar-active-color)}.navbar-nav .dropdown-menu{position:static}.navbar-text{padding-top:.5rem;padding-bottom:.5rem;color:var(--bs-navbar-color)}.navbar-text a,.navbar-text a:hover,.navbar-text a:focus{color:var(--bs-navbar-active-color)}.navbar-collapse{flex-basis:100%;-webkit-flex-basis:100%;flex-grow:1;-webkit-flex-grow:1;align-items:center;-webkit-align-items:center}.navbar-toggler{padding:var(--bs-navbar-toggler-padding-y) var(--bs-navbar-toggler-padding-x);font-size:var(--bs-navbar-toggler-font-size);line-height:1;color:var(--bs-navbar-color);background-color:transparent;border:var(--bs-border-width) solid var(--bs-navbar-toggler-border-color);border-radius:var(--bs-navbar-toggler-border-radius);transition:var(--bs-navbar-toggler-transition)}@media (prefers-reduced-motion: reduce){.navbar-toggler{transition:none}}.navbar-toggler:hover{text-decoration:none}.navbar-toggler:focus{text-decoration:none;outline:0;box-shadow:0 0 0 var(--bs-navbar-toggler-focus-width)}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;background-image:var(--bs-navbar-toggler-icon-bg);background-repeat:no-repeat;background-position:center;background-size:100%}.navbar-nav-scroll{max-height:var(--bs-scroll-height, 75vh);overflow-y:auto}@media (min-width: 576px){.navbar-expand-sm{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}.navbar-expand-sm .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:transparent !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-sm .offcanvas .offcanvas-header{display:none}.navbar-expand-sm .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}@media (min-width: 768px){.navbar-expand-md{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}.navbar-expand-md .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:transparent !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-md .offcanvas .offcanvas-header{display:none}.navbar-expand-md .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}@media (min-width: 992px){.navbar-expand-lg{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}.navbar-expand-lg .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:transparent !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-lg .offcanvas .offcanvas-header{display:none}.navbar-expand-lg .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}@media (min-width: 1200px){.navbar-expand-xl{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}.navbar-expand-xl .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:transparent !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-xl .offcanvas .offcanvas-header{display:none}.navbar-expand-xl .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}@media (min-width: 1400px){.navbar-expand-xxl{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-xxl .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-xxl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xxl .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-xxl .navbar-nav-scroll{overflow:visible}.navbar-expand-xxl .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-xxl .navbar-toggler{display:none}.navbar-expand-xxl .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:transparent !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-xxl .offcanvas .offcanvas-header{display:none}.navbar-expand-xxl .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}.navbar-expand{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-expand .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:transparent !important;border:0 !important;transform:none !important;transition:none}.navbar-expand .offcanvas .offcanvas-header{display:none}.navbar-expand .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}.navbar-dark,.navbar[data-bs-theme="dark"]{--bs-navbar-color: #fff;--bs-navbar-hover-color: #2c3e50;--bs-navbar-disabled-color: rgba(255,255,255,0.25);--bs-navbar-active-color: #2c3e50;--bs-navbar-brand-color: #fff;--bs-navbar-brand-hover-color: #fff;--bs-navbar-toggler-border-color: rgba(255,255,255,0.1);--bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255,255,255,0.75%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}[data-bs-theme="dark"] .navbar-toggler-icon{--bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255,255,255,0.75%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.card{--bs-card-spacer-y: 1rem;--bs-card-spacer-x: 1rem;--bs-card-title-spacer-y: .5rem;--bs-card-title-color: ;--bs-card-subtitle-color: ;--bs-card-border-width: var(--bs-border-width);--bs-card-border-color: var(--bs-border-color-translucent);--bs-card-border-radius: var(--bs-border-radius);--bs-card-box-shadow: ;--bs-card-inner-border-radius: calc(var(--bs-border-radius) - (var(--bs-border-width)));--bs-card-cap-padding-y: .5rem;--bs-card-cap-padding-x: 1rem;--bs-card-cap-bg: rgba(var(--bs-body-color-rgb), 0.03);--bs-card-cap-color: ;--bs-card-height: ;--bs-card-color: ;--bs-card-bg: var(--bs-body-bg);--bs-card-img-overlay-padding: 1rem;--bs-card-group-margin: .75rem;position:relative;display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;min-width:0;height:var(--bs-card-height);color:var(--bs-body-color);word-wrap:break-word;background-color:var(--bs-card-bg);background-clip:border-box;border:var(--bs-card-border-width) solid var(--bs-card-border-color);border-radius:var(--bs-card-border-radius)}.card>hr{margin-right:0;margin-left:0}.card>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child{border-top-width:0;border-top-left-radius:var(--bs-card-inner-border-radius);border-top-right-radius:var(--bs-card-inner-border-radius)}.card>.list-group:last-child{border-bottom-width:0;border-bottom-right-radius:var(--bs-card-inner-border-radius);border-bottom-left-radius:var(--bs-card-inner-border-radius)}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{flex:1 1 auto;-webkit-flex:1 1 auto;padding:var(--bs-card-spacer-y) var(--bs-card-spacer-x);color:var(--bs-card-color)}.card-title{margin-bottom:var(--bs-card-title-spacer-y);color:var(--bs-card-title-color)}.card-subtitle{margin-top:calc(-.5 * var(--bs-card-title-spacer-y));margin-bottom:0;color:var(--bs-card-subtitle-color)}.card-text:last-child{margin-bottom:0}.card-link+.card-link{margin-left:var(--bs-card-spacer-x)}.card-header{padding:var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);margin-bottom:0;color:var(--bs-card-cap-color);background-color:var(--bs-card-cap-bg);border-bottom:var(--bs-card-border-width) solid var(--bs-card-border-color)}.card-header:first-child{border-radius:var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius) 0 0}.card-footer{padding:var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);color:var(--bs-card-cap-color);background-color:var(--bs-card-cap-bg);border-top:var(--bs-card-border-width) solid var(--bs-card-border-color)}.card-footer:last-child{border-radius:0 0 var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius)}.card-header-tabs{margin-right:calc(-.5 * var(--bs-card-cap-padding-x));margin-bottom:calc(-1 * var(--bs-card-cap-padding-y));margin-left:calc(-.5 * var(--bs-card-cap-padding-x));border-bottom:0}.card-header-tabs .nav-link.active{background-color:var(--bs-card-bg);border-bottom-color:var(--bs-card-bg)}.card-header-pills{margin-right:calc(-.5 * var(--bs-card-cap-padding-x));margin-left:calc(-.5 * var(--bs-card-cap-padding-x))}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:var(--bs-card-img-overlay-padding);border-radius:var(--bs-card-inner-border-radius)}.card-img,.card-img-top,.card-img-bottom{width:100%}.card-img,.card-img-top{border-top-left-radius:var(--bs-card-inner-border-radius);border-top-right-radius:var(--bs-card-inner-border-radius)}.card-img,.card-img-bottom{border-bottom-right-radius:var(--bs-card-inner-border-radius);border-bottom-left-radius:var(--bs-card-inner-border-radius)}.card-group>.card{margin-bottom:var(--bs-card-group-margin)}@media (min-width: 576px){.card-group{display:flex;display:-webkit-flex;flex-flow:row wrap;-webkit-flex-flow:row wrap}.card-group>.card{flex:1 0 0%;-webkit-flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child) .card-img-top,.card-group>.card:not(:last-child) .card-header{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-img-bottom,.card-group>.card:not(:last-child) .card-footer{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child) .card-img-top,.card-group>.card:not(:first-child) .card-header{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-img-bottom,.card-group>.card:not(:first-child) .card-footer{border-bottom-left-radius:0}}.accordion{--bs-accordion-color: var(--bs-body-color);--bs-accordion-bg: var(--bs-body-bg);--bs-accordion-transition: color 0.15s ease-in-out,background-color 0.15s ease-in-out,border-color 0.15s ease-in-out,box-shadow 0.15s ease-in-out,border-radius 0.15s ease;--bs-accordion-border-color: var(--bs-border-color);--bs-accordion-border-width: var(--bs-border-width);--bs-accordion-border-radius: var(--bs-border-radius);--bs-accordion-inner-border-radius: calc(var(--bs-border-radius) - (var(--bs-border-width)));--bs-accordion-btn-padding-x: 1.25rem;--bs-accordion-btn-padding-y: 1rem;--bs-accordion-btn-color: var(--bs-body-color);--bs-accordion-btn-bg: var(--bs-accordion-bg);--bs-accordion-btn-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23212529'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");--bs-accordion-btn-icon-width: 1.25rem;--bs-accordion-btn-icon-transform: rotate(-180deg);--bs-accordion-btn-icon-transition: transform 0.2s ease-in-out;--bs-accordion-btn-active-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23121920'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");--bs-accordion-btn-focus-border-color: #969fa8;--bs-accordion-btn-focus-box-shadow: 0 0 0 .25rem rgba(44,62,80,0.25);--bs-accordion-body-padding-x: 1.25rem;--bs-accordion-body-padding-y: 1rem;--bs-accordion-active-color: var(--bs-primary-text-emphasis);--bs-accordion-active-bg: var(--bs-primary-bg-subtle)}.accordion-button{position:relative;display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;width:100%;padding:var(--bs-accordion-btn-padding-y) var(--bs-accordion-btn-padding-x);font-size:1rem;color:var(--bs-accordion-btn-color);text-align:left;background-color:var(--bs-accordion-btn-bg);border:0;border-radius:0;overflow-anchor:none;transition:var(--bs-accordion-transition)}@media (prefers-reduced-motion: reduce){.accordion-button{transition:none}}.accordion-button:not(.collapsed){color:var(--bs-accordion-active-color);background-color:var(--bs-accordion-active-bg);box-shadow:inset 0 calc(-1 * var(--bs-accordion-border-width)) 0 var(--bs-accordion-border-color)}.accordion-button:not(.collapsed)::after{background-image:var(--bs-accordion-btn-active-icon);transform:var(--bs-accordion-btn-icon-transform)}.accordion-button::after{flex-shrink:0;-webkit-flex-shrink:0;width:var(--bs-accordion-btn-icon-width);height:var(--bs-accordion-btn-icon-width);margin-left:auto;content:"";background-image:var(--bs-accordion-btn-icon);background-repeat:no-repeat;background-size:var(--bs-accordion-btn-icon-width);transition:var(--bs-accordion-btn-icon-transition)}@media (prefers-reduced-motion: reduce){.accordion-button::after{transition:none}}.accordion-button:hover{z-index:2}.accordion-button:focus{z-index:3;border-color:var(--bs-accordion-btn-focus-border-color);outline:0;box-shadow:var(--bs-accordion-btn-focus-box-shadow)}.accordion-header{margin-bottom:0}.accordion-item{color:var(--bs-accordion-color);background-color:var(--bs-accordion-bg);border:var(--bs-accordion-border-width) solid var(--bs-accordion-border-color)}.accordion-item:first-of-type{border-top-left-radius:var(--bs-accordion-border-radius);border-top-right-radius:var(--bs-accordion-border-radius)}.accordion-item:first-of-type .accordion-button{border-top-left-radius:var(--bs-accordion-inner-border-radius);border-top-right-radius:var(--bs-accordion-inner-border-radius)}.accordion-item:not(:first-of-type){border-top:0}.accordion-item:last-of-type{border-bottom-right-radius:var(--bs-accordion-border-radius);border-bottom-left-radius:var(--bs-accordion-border-radius)}.accordion-item:last-of-type .accordion-button.collapsed{border-bottom-right-radius:var(--bs-accordion-inner-border-radius);border-bottom-left-radius:var(--bs-accordion-inner-border-radius)}.accordion-item:last-of-type .accordion-collapse{border-bottom-right-radius:var(--bs-accordion-border-radius);border-bottom-left-radius:var(--bs-accordion-border-radius)}.accordion-body{padding:var(--bs-accordion-body-padding-y) var(--bs-accordion-body-padding-x)}.accordion-flush .accordion-collapse{border-width:0}.accordion-flush .accordion-item{border-right:0;border-left:0;border-radius:0}.accordion-flush .accordion-item:first-child{border-top:0}.accordion-flush .accordion-item:last-child{border-bottom:0}.accordion-flush .accordion-item .accordion-button,.accordion-flush .accordion-item .accordion-button.collapsed{border-radius:0}[data-bs-theme="dark"] .accordion-button::after{--bs-accordion-btn-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23808b96'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");--bs-accordion-btn-active-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23808b96'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}.breadcrumb{--bs-breadcrumb-padding-x: .75rem;--bs-breadcrumb-padding-y: .375rem;--bs-breadcrumb-margin-bottom: 1rem;--bs-breadcrumb-bg: ;--bs-breadcrumb-border-radius: .25rem;--bs-breadcrumb-divider-color: var(--bs-secondary-color);--bs-breadcrumb-item-padding-x: .5rem;--bs-breadcrumb-item-active-color: var(--bs-secondary-color);display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;padding:var(--bs-breadcrumb-padding-y) var(--bs-breadcrumb-padding-x);margin-bottom:var(--bs-breadcrumb-margin-bottom);font-size:var(--bs-breadcrumb-font-size);list-style:none;background-color:var(--bs-breadcrumb-bg);border-radius:var(--bs-breadcrumb-border-radius)}.breadcrumb-item+.breadcrumb-item{padding-left:var(--bs-breadcrumb-item-padding-x)}.breadcrumb-item+.breadcrumb-item::before{float:left;padding-right:var(--bs-breadcrumb-item-padding-x);color:var(--bs-breadcrumb-divider-color);content:var(--bs-breadcrumb-divider, "/") /* rtl: var(--bs-breadcrumb-divider, "/") */}.breadcrumb-item.active{color:var(--bs-breadcrumb-item-active-color)}.pagination{--bs-pagination-padding-x: .75rem;--bs-pagination-padding-y: .375rem;--bs-pagination-font-size:1rem;--bs-pagination-color: #fff;--bs-pagination-bg: #18bc9c;--bs-pagination-border-width: 0;--bs-pagination-border-color: rgba(0,0,0,0);--bs-pagination-border-radius: var(--bs-border-radius);--bs-pagination-hover-color: #fff;--bs-pagination-hover-bg: #0f7864;--bs-pagination-hover-border-color: rgba(0,0,0,0);--bs-pagination-focus-color: var(--bs-link-hover-color);--bs-pagination-focus-bg: var(--bs-secondary-bg);--bs-pagination-focus-box-shadow: 0 0 0 .25rem rgba(44,62,80,0.25);--bs-pagination-active-color: #fff;--bs-pagination-active-bg: #0f7864;--bs-pagination-active-border-color: rgba(0,0,0,0);--bs-pagination-disabled-color: #ecf0f1;--bs-pagination-disabled-bg: #3be6c4;--bs-pagination-disabled-border-color: rgba(0,0,0,0);display:flex;display:-webkit-flex;padding-left:0;list-style:none}.page-link{position:relative;display:block;padding:var(--bs-pagination-padding-y) var(--bs-pagination-padding-x);font-size:var(--bs-pagination-font-size);color:var(--bs-pagination-color);text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;background-color:var(--bs-pagination-bg);border:var(--bs-pagination-border-width) solid var(--bs-pagination-border-color);transition:color 0.15s ease-in-out,background-color 0.15s ease-in-out,border-color 0.15s ease-in-out,box-shadow 0.15s ease-in-out}@media (prefers-reduced-motion: reduce){.page-link{transition:none}}.page-link:hover{z-index:2;color:var(--bs-pagination-hover-color);background-color:var(--bs-pagination-hover-bg);border-color:var(--bs-pagination-hover-border-color)}.page-link:focus{z-index:3;color:var(--bs-pagination-focus-color);background-color:var(--bs-pagination-focus-bg);outline:0;box-shadow:var(--bs-pagination-focus-box-shadow)}.page-link.active,.active>.page-link{z-index:3;color:var(--bs-pagination-active-color);background-color:var(--bs-pagination-active-bg);border-color:var(--bs-pagination-active-border-color)}.page-link.disabled,.disabled>.page-link{color:var(--bs-pagination-disabled-color);pointer-events:none;background-color:var(--bs-pagination-disabled-bg);border-color:var(--bs-pagination-disabled-border-color)}.page-item:not(:first-child) .page-link{margin-left:calc(0 * -1)}.page-item:first-child .page-link{border-top-left-radius:var(--bs-pagination-border-radius);border-bottom-left-radius:var(--bs-pagination-border-radius)}.page-item:last-child .page-link{border-top-right-radius:var(--bs-pagination-border-radius);border-bottom-right-radius:var(--bs-pagination-border-radius)}.pagination-lg{--bs-pagination-padding-x: 1.5rem;--bs-pagination-padding-y: .75rem;--bs-pagination-font-size:1.25rem;--bs-pagination-border-radius: var(--bs-border-radius-lg)}.pagination-sm{--bs-pagination-padding-x: .5rem;--bs-pagination-padding-y: .25rem;--bs-pagination-font-size:.875rem;--bs-pagination-border-radius: var(--bs-border-radius-sm)}.badge{--bs-badge-padding-x: .65em;--bs-badge-padding-y: .35em;--bs-badge-font-size:.75em;--bs-badge-font-weight: 700;--bs-badge-color: #fff;--bs-badge-border-radius: var(--bs-border-radius);display:inline-block;padding:var(--bs-badge-padding-y) var(--bs-badge-padding-x);font-size:var(--bs-badge-font-size);font-weight:var(--bs-badge-font-weight);line-height:1;color:var(--bs-badge-color);text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:var(--bs-badge-border-radius)}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.alert{--bs-alert-bg: transparent;--bs-alert-padding-x: 1rem;--bs-alert-padding-y: 1rem;--bs-alert-margin-bottom: 1rem;--bs-alert-color: inherit;--bs-alert-border-color: transparent;--bs-alert-border: var(--bs-border-width) solid var(--bs-alert-border-color);--bs-alert-border-radius: var(--bs-border-radius);--bs-alert-link-color: inherit;position:relative;padding:var(--bs-alert-padding-y) var(--bs-alert-padding-x);margin-bottom:var(--bs-alert-margin-bottom);color:var(--bs-alert-color);background-color:var(--bs-alert-bg);border:var(--bs-alert-border);border-radius:var(--bs-alert-border-radius)}.alert-heading{color:inherit}.alert-link{font-weight:700;color:var(--bs-alert-link-color)}.alert-dismissible{padding-right:3rem}.alert-dismissible .btn-close{position:absolute;top:0;right:0;z-index:2;padding:1.25rem 1rem}.alert-default{--bs-alert-color: var(--bs-default-text-emphasis);--bs-alert-bg: var(--bs-default-bg-subtle);--bs-alert-border-color: var(--bs-default-border-subtle);--bs-alert-link-color: var(--bs-default-text-emphasis)}.alert-primary{--bs-alert-color: var(--bs-primary-text-emphasis);--bs-alert-bg: var(--bs-primary-bg-subtle);--bs-alert-border-color: var(--bs-primary-border-subtle);--bs-alert-link-color: var(--bs-primary-text-emphasis)}.alert-secondary{--bs-alert-color: var(--bs-secondary-text-emphasis);--bs-alert-bg: var(--bs-secondary-bg-subtle);--bs-alert-border-color: var(--bs-secondary-border-subtle);--bs-alert-link-color: var(--bs-secondary-text-emphasis)}.alert-success{--bs-alert-color: var(--bs-success-text-emphasis);--bs-alert-bg: var(--bs-success-bg-subtle);--bs-alert-border-color: var(--bs-success-border-subtle);--bs-alert-link-color: var(--bs-success-text-emphasis)}.alert-info{--bs-alert-color: var(--bs-info-text-emphasis);--bs-alert-bg: var(--bs-info-bg-subtle);--bs-alert-border-color: var(--bs-info-border-subtle);--bs-alert-link-color: var(--bs-info-text-emphasis)}.alert-warning{--bs-alert-color: var(--bs-warning-text-emphasis);--bs-alert-bg: var(--bs-warning-bg-subtle);--bs-alert-border-color: var(--bs-warning-border-subtle);--bs-alert-link-color: var(--bs-warning-text-emphasis)}.alert-danger{--bs-alert-color: var(--bs-danger-text-emphasis);--bs-alert-bg: var(--bs-danger-bg-subtle);--bs-alert-border-color: var(--bs-danger-border-subtle);--bs-alert-link-color: var(--bs-danger-text-emphasis)}.alert-light{--bs-alert-color: var(--bs-light-text-emphasis);--bs-alert-bg: var(--bs-light-bg-subtle);--bs-alert-border-color: var(--bs-light-border-subtle);--bs-alert-link-color: var(--bs-light-text-emphasis)}.alert-dark{--bs-alert-color: var(--bs-dark-text-emphasis);--bs-alert-bg: var(--bs-dark-bg-subtle);--bs-alert-border-color: var(--bs-dark-border-subtle);--bs-alert-link-color: var(--bs-dark-text-emphasis)}@keyframes progress-bar-stripes{0%{background-position-x:1rem}}.progress,.progress-stacked{--bs-progress-height: 1rem;--bs-progress-font-size:.75rem;--bs-progress-bg: var(--bs-secondary-bg);--bs-progress-border-radius: var(--bs-border-radius);--bs-progress-box-shadow: var(--bs-box-shadow-inset);--bs-progress-bar-color: #fff;--bs-progress-bar-bg: #2c3e50;--bs-progress-bar-transition: width 0.6s ease;display:flex;display:-webkit-flex;height:var(--bs-progress-height);overflow:hidden;font-size:var(--bs-progress-font-size);background-color:var(--bs-progress-bg);border-radius:var(--bs-progress-border-radius)}.progress-bar{display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;justify-content:center;-webkit-justify-content:center;overflow:hidden;color:var(--bs-progress-bar-color);text-align:center;white-space:nowrap;background-color:var(--bs-progress-bar-bg);transition:var(--bs-progress-bar-transition)}@media (prefers-reduced-motion: reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-size:var(--bs-progress-height) var(--bs-progress-height)}.progress-stacked>.progress{overflow:visible}.progress-stacked>.progress>.progress-bar{width:100%}.progress-bar-animated{animation:1s linear infinite progress-bar-stripes}@media (prefers-reduced-motion: reduce){.progress-bar-animated{animation:none}}.list-group{--bs-list-group-color: var(--bs-body-color);--bs-list-group-bg: var(--bs-body-bg);--bs-list-group-border-color: var(--bs-border-color);--bs-list-group-border-width: var(--bs-border-width);--bs-list-group-border-radius: var(--bs-border-radius);--bs-list-group-item-padding-x: 1rem;--bs-list-group-item-padding-y: .5rem;--bs-list-group-action-color: var(--bs-secondary-color);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: #ecf0f1;--bs-list-group-action-active-color: var(--bs-body-color);--bs-list-group-action-active-bg: var(--bs-secondary-bg);--bs-list-group-disabled-color: var(--bs-secondary-color);--bs-list-group-disabled-bg: #ecf0f1;--bs-list-group-active-color: #fff;--bs-list-group-active-bg: #2c3e50;--bs-list-group-active-border-color: #2c3e50;display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;padding-left:0;margin-bottom:0;border-radius:var(--bs-list-group-border-radius)}.list-group-numbered{list-style-type:none;counter-reset:section}.list-group-numbered>.list-group-item::before{content:counters(section, ".") ". ";counter-increment:section}.list-group-item-action{width:100%;color:var(--bs-list-group-action-color);text-align:inherit}.list-group-item-action:hover,.list-group-item-action:focus{z-index:1;color:var(--bs-list-group-action-hover-color);text-decoration:none;background-color:var(--bs-list-group-action-hover-bg)}.list-group-item-action:active{color:var(--bs-list-group-action-active-color);background-color:var(--bs-list-group-action-active-bg)}.list-group-item{position:relative;display:block;padding:var(--bs-list-group-item-padding-y) var(--bs-list-group-item-padding-x);color:var(--bs-list-group-color);text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;background-color:var(--bs-list-group-bg);border:var(--bs-list-group-border-width) solid var(--bs-list-group-border-color)}.list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.list-group-item:last-child{border-bottom-right-radius:inherit;border-bottom-left-radius:inherit}.list-group-item.disabled,.list-group-item:disabled{color:var(--bs-list-group-disabled-color);pointer-events:none;background-color:var(--bs-list-group-disabled-bg)}.list-group-item.active{z-index:2;color:var(--bs-list-group-active-color);background-color:var(--bs-list-group-active-bg);border-color:var(--bs-list-group-active-border-color)}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:calc(-1 * var(--bs-list-group-border-width));border-top-width:var(--bs-list-group-border-width)}.list-group-horizontal{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}@media (min-width: 576px){.list-group-horizontal-sm{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-sm>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media (min-width: 768px){.list-group-horizontal-md{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-md>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media (min-width: 992px){.list-group-horizontal-lg{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-lg>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media (min-width: 1200px){.list-group-horizontal-xl{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-xl>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media (min-width: 1400px){.list-group-horizontal-xxl{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-xxl>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-xxl>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-xxl>.list-group-item.active{margin-top:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 var(--bs-list-group-border-width)}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-default{--bs-list-group-color: var(--bs-default-text-emphasis);--bs-list-group-bg: var(--bs-default-bg-subtle);--bs-list-group-border-color: var(--bs-default-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-default-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-default-border-subtle);--bs-list-group-active-color: var(--bs-default-bg-subtle);--bs-list-group-active-bg: var(--bs-default-text-emphasis);--bs-list-group-active-border-color: var(--bs-default-text-emphasis)}.list-group-item-primary{--bs-list-group-color: var(--bs-primary-text-emphasis);--bs-list-group-bg: var(--bs-primary-bg-subtle);--bs-list-group-border-color: var(--bs-primary-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-primary-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-primary-border-subtle);--bs-list-group-active-color: var(--bs-primary-bg-subtle);--bs-list-group-active-bg: var(--bs-primary-text-emphasis);--bs-list-group-active-border-color: var(--bs-primary-text-emphasis)}.list-group-item-secondary{--bs-list-group-color: var(--bs-secondary-text-emphasis);--bs-list-group-bg: var(--bs-secondary-bg-subtle);--bs-list-group-border-color: var(--bs-secondary-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-secondary-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-secondary-border-subtle);--bs-list-group-active-color: var(--bs-secondary-bg-subtle);--bs-list-group-active-bg: var(--bs-secondary-text-emphasis);--bs-list-group-active-border-color: var(--bs-secondary-text-emphasis)}.list-group-item-success{--bs-list-group-color: var(--bs-success-text-emphasis);--bs-list-group-bg: var(--bs-success-bg-subtle);--bs-list-group-border-color: var(--bs-success-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-success-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-success-border-subtle);--bs-list-group-active-color: var(--bs-success-bg-subtle);--bs-list-group-active-bg: var(--bs-success-text-emphasis);--bs-list-group-active-border-color: var(--bs-success-text-emphasis)}.list-group-item-info{--bs-list-group-color: var(--bs-info-text-emphasis);--bs-list-group-bg: var(--bs-info-bg-subtle);--bs-list-group-border-color: var(--bs-info-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-info-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-info-border-subtle);--bs-list-group-active-color: var(--bs-info-bg-subtle);--bs-list-group-active-bg: var(--bs-info-text-emphasis);--bs-list-group-active-border-color: var(--bs-info-text-emphasis)}.list-group-item-warning{--bs-list-group-color: var(--bs-warning-text-emphasis);--bs-list-group-bg: var(--bs-warning-bg-subtle);--bs-list-group-border-color: var(--bs-warning-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-warning-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-warning-border-subtle);--bs-list-group-active-color: var(--bs-warning-bg-subtle);--bs-list-group-active-bg: var(--bs-warning-text-emphasis);--bs-list-group-active-border-color: var(--bs-warning-text-emphasis)}.list-group-item-danger{--bs-list-group-color: var(--bs-danger-text-emphasis);--bs-list-group-bg: var(--bs-danger-bg-subtle);--bs-list-group-border-color: var(--bs-danger-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-danger-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-danger-border-subtle);--bs-list-group-active-color: var(--bs-danger-bg-subtle);--bs-list-group-active-bg: var(--bs-danger-text-emphasis);--bs-list-group-active-border-color: var(--bs-danger-text-emphasis)}.list-group-item-light{--bs-list-group-color: var(--bs-light-text-emphasis);--bs-list-group-bg: var(--bs-light-bg-subtle);--bs-list-group-border-color: var(--bs-light-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-light-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-light-border-subtle);--bs-list-group-active-color: var(--bs-light-bg-subtle);--bs-list-group-active-bg: var(--bs-light-text-emphasis);--bs-list-group-active-border-color: var(--bs-light-text-emphasis)}.list-group-item-dark{--bs-list-group-color: var(--bs-dark-text-emphasis);--bs-list-group-bg: var(--bs-dark-bg-subtle);--bs-list-group-border-color: var(--bs-dark-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-dark-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-dark-border-subtle);--bs-list-group-active-color: var(--bs-dark-bg-subtle);--bs-list-group-active-bg: var(--bs-dark-text-emphasis);--bs-list-group-active-border-color: var(--bs-dark-text-emphasis)}.btn-close{--bs-btn-close-color: #fff;--bs-btn-close-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M.293.293a1 1 0 0 1 1.414 0L8 6.586 14.293.293a1 1 0 1 1 1.414 1.414L9.414 8l6.293 6.293a1 1 0 0 1-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 0 1-1.414-1.414L6.586 8 .293 1.707a1 1 0 0 1 0-1.414z'/%3e%3c/svg%3e");--bs-btn-close-opacity: .4;--bs-btn-close-hover-opacity: 1;--bs-btn-close-focus-shadow: 0 0 0 .25rem rgba(44,62,80,0.25);--bs-btn-close-focus-opacity: 1;--bs-btn-close-disabled-opacity: .25;--bs-btn-close-white-filter: invert(1) grayscale(100%) brightness(200%);box-sizing:content-box;width:1em;height:1em;padding:.25em .25em;color:var(--bs-btn-close-color);background:transparent var(--bs-btn-close-bg) center/1em auto no-repeat;border:0;border-radius:.375rem;opacity:var(--bs-btn-close-opacity)}.btn-close:hover{color:var(--bs-btn-close-color);text-decoration:none;opacity:var(--bs-btn-close-hover-opacity)}.btn-close:focus{outline:0;box-shadow:var(--bs-btn-close-focus-shadow);opacity:var(--bs-btn-close-focus-opacity)}.btn-close:disabled,.btn-close.disabled{pointer-events:none;user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;opacity:var(--bs-btn-close-disabled-opacity)}.btn-close-white{filter:var(--bs-btn-close-white-filter)}[data-bs-theme="dark"] .btn-close{filter:var(--bs-btn-close-white-filter)}.toast{--bs-toast-zindex: 1090;--bs-toast-padding-x: .75rem;--bs-toast-padding-y: .5rem;--bs-toast-spacing: 1.5rem;--bs-toast-max-width: 350px;--bs-toast-font-size:.875rem;--bs-toast-color: ;--bs-toast-bg: rgba(var(--bs-body-bg-rgb), 0.85);--bs-toast-border-width: var(--bs-border-width);--bs-toast-border-color: var(--bs-border-color-translucent);--bs-toast-border-radius: var(--bs-border-radius);--bs-toast-box-shadow: var(--bs-box-shadow);--bs-toast-header-color: var(--bs-secondary-color);--bs-toast-header-bg: rgba(var(--bs-body-bg-rgb), 0.85);--bs-toast-header-border-color: var(--bs-border-color-translucent);width:var(--bs-toast-max-width);max-width:100%;font-size:var(--bs-toast-font-size);color:var(--bs-toast-color);pointer-events:auto;background-color:var(--bs-toast-bg);background-clip:padding-box;border:var(--bs-toast-border-width) solid var(--bs-toast-border-color);box-shadow:var(--bs-toast-box-shadow);border-radius:var(--bs-toast-border-radius)}.toast.showing{opacity:0}.toast:not(.show){display:none}.toast-container{--bs-toast-zindex: 1090;position:absolute;z-index:var(--bs-toast-zindex);width:max-content;width:-webkit-max-content;width:-moz-max-content;width:-ms-max-content;width:-o-max-content;max-width:100%;pointer-events:none}.toast-container>:not(:last-child){margin-bottom:var(--bs-toast-spacing)}.toast-header{display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;padding:var(--bs-toast-padding-y) var(--bs-toast-padding-x);color:var(--bs-toast-header-color);background-color:var(--bs-toast-header-bg);background-clip:padding-box;border-bottom:var(--bs-toast-border-width) solid var(--bs-toast-header-border-color);border-top-left-radius:calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width));border-top-right-radius:calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width))}.toast-header .btn-close{margin-right:calc(-.5 * var(--bs-toast-padding-x));margin-left:var(--bs-toast-padding-x)}.toast-body{padding:var(--bs-toast-padding-x);word-wrap:break-word}.modal{--bs-modal-zindex: 1055;--bs-modal-width: 500px;--bs-modal-padding: 1rem;--bs-modal-margin: .5rem;--bs-modal-color: ;--bs-modal-bg: var(--bs-body-bg);--bs-modal-border-color: var(--bs-border-color-translucent);--bs-modal-border-width: var(--bs-border-width);--bs-modal-border-radius: var(--bs-border-radius-lg);--bs-modal-box-shadow: 0 0.125rem 0.25rem rgba(0,0,0,0.075);--bs-modal-inner-border-radius: calc(var(--bs-border-radius-lg) - (var(--bs-border-width)));--bs-modal-header-padding-x: 1rem;--bs-modal-header-padding-y: 1rem;--bs-modal-header-padding: 1rem 1rem;--bs-modal-header-border-color: var(--bs-border-color);--bs-modal-header-border-width: var(--bs-border-width);--bs-modal-title-line-height: 1.5;--bs-modal-footer-gap: .5rem;--bs-modal-footer-bg: ;--bs-modal-footer-border-color: var(--bs-border-color);--bs-modal-footer-border-width: var(--bs-border-width);position:fixed;top:0;left:0;z-index:var(--bs-modal-zindex);display:none;width:100%;height:100%;overflow-x:hidden;overflow-y:auto;outline:0}.modal-dialog{position:relative;width:auto;margin:var(--bs-modal-margin);pointer-events:none}.modal.fade .modal-dialog{transition:transform 0.3s ease-out;transform:translate(0, -50px)}@media (prefers-reduced-motion: reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{transform:none}.modal.modal-static .modal-dialog{transform:scale(1.02)}.modal-dialog-scrollable{height:calc(100% - var(--bs-modal-margin) * 2)}.modal-dialog-scrollable .modal-content{max-height:100%;overflow:hidden}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;min-height:calc(100% - var(--bs-modal-margin) * 2)}.modal-content{position:relative;display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;width:100%;color:var(--bs-modal-color);pointer-events:auto;background-color:var(--bs-modal-bg);background-clip:padding-box;border:var(--bs-modal-border-width) solid var(--bs-modal-border-color);border-radius:var(--bs-modal-border-radius);outline:0}.modal-backdrop{--bs-backdrop-zindex: 1050;--bs-backdrop-bg: #000;--bs-backdrop-opacity: .5;position:fixed;top:0;left:0;z-index:var(--bs-backdrop-zindex);width:100vw;height:100vh;background-color:var(--bs-backdrop-bg)}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:var(--bs-backdrop-opacity)}.modal-header{display:flex;display:-webkit-flex;flex-shrink:0;-webkit-flex-shrink:0;align-items:center;-webkit-align-items:center;justify-content:space-between;-webkit-justify-content:space-between;padding:var(--bs-modal-header-padding);border-bottom:var(--bs-modal-header-border-width) solid var(--bs-modal-header-border-color);border-top-left-radius:var(--bs-modal-inner-border-radius);border-top-right-radius:var(--bs-modal-inner-border-radius)}.modal-header .btn-close{padding:calc(var(--bs-modal-header-padding-y) * .5) calc(var(--bs-modal-header-padding-x) * .5);margin:calc(-.5 * var(--bs-modal-header-padding-y)) calc(-.5 * var(--bs-modal-header-padding-x)) calc(-.5 * var(--bs-modal-header-padding-y)) auto}.modal-title{margin-bottom:0;line-height:var(--bs-modal-title-line-height)}.modal-body{position:relative;flex:1 1 auto;-webkit-flex:1 1 auto;padding:var(--bs-modal-padding)}.modal-footer{display:flex;display:-webkit-flex;flex-shrink:0;-webkit-flex-shrink:0;flex-wrap:wrap;-webkit-flex-wrap:wrap;align-items:center;-webkit-align-items:center;justify-content:flex-end;-webkit-justify-content:flex-end;padding:calc(var(--bs-modal-padding) - var(--bs-modal-footer-gap) * .5);background-color:var(--bs-modal-footer-bg);border-top:var(--bs-modal-footer-border-width) solid var(--bs-modal-footer-border-color);border-bottom-right-radius:var(--bs-modal-inner-border-radius);border-bottom-left-radius:var(--bs-modal-inner-border-radius)}.modal-footer>*{margin:calc(var(--bs-modal-footer-gap) * .5)}@media (min-width: 576px){.modal{--bs-modal-margin: 1.75rem;--bs-modal-box-shadow: 0 0.5rem 1rem rgba(0,0,0,0.15)}.modal-dialog{max-width:var(--bs-modal-width);margin-right:auto;margin-left:auto}.modal-sm{--bs-modal-width: 300px}}@media (min-width: 992px){.modal-lg,.modal-xl{--bs-modal-width: 800px}}@media (min-width: 1200px){.modal-xl{--bs-modal-width: 1140px}}.modal-fullscreen{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen .modal-header,.modal-fullscreen .modal-footer{border-radius:0}.modal-fullscreen .modal-body{overflow-y:auto}@media (max-width: 575.98px){.modal-fullscreen-sm-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-sm-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-sm-down .modal-header,.modal-fullscreen-sm-down .modal-footer{border-radius:0}.modal-fullscreen-sm-down .modal-body{overflow-y:auto}}@media (max-width: 767.98px){.modal-fullscreen-md-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-md-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-md-down .modal-header,.modal-fullscreen-md-down .modal-footer{border-radius:0}.modal-fullscreen-md-down .modal-body{overflow-y:auto}}@media (max-width: 991.98px){.modal-fullscreen-lg-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-lg-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-lg-down .modal-header,.modal-fullscreen-lg-down .modal-footer{border-radius:0}.modal-fullscreen-lg-down .modal-body{overflow-y:auto}}@media (max-width: 1199.98px){.modal-fullscreen-xl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xl-down .modal-header,.modal-fullscreen-xl-down .modal-footer{border-radius:0}.modal-fullscreen-xl-down .modal-body{overflow-y:auto}}@media (max-width: 1399.98px){.modal-fullscreen-xxl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xxl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xxl-down .modal-header,.modal-fullscreen-xxl-down .modal-footer{border-radius:0}.modal-fullscreen-xxl-down .modal-body{overflow-y:auto}}.tooltip{--bs-tooltip-zindex: 1080;--bs-tooltip-max-width: 200px;--bs-tooltip-padding-x: .5rem;--bs-tooltip-padding-y: .25rem;--bs-tooltip-margin: ;--bs-tooltip-font-size:.875rem;--bs-tooltip-color: var(--bs-body-bg);--bs-tooltip-bg: var(--bs-emphasis-color);--bs-tooltip-border-radius: var(--bs-border-radius);--bs-tooltip-opacity: .9;--bs-tooltip-arrow-width: .8rem;--bs-tooltip-arrow-height: .4rem;z-index:var(--bs-tooltip-zindex);display:block;margin:var(--bs-tooltip-margin);font-family:var(--bs-font-sans-serif);font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:var(--bs-tooltip-font-size);word-wrap:break-word;opacity:0}.tooltip.show{opacity:var(--bs-tooltip-opacity)}.tooltip .tooltip-arrow{display:block;width:var(--bs-tooltip-arrow-width);height:var(--bs-tooltip-arrow-height)}.tooltip .tooltip-arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-top .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^="top"] .tooltip-arrow{bottom:calc(-1 * var(--bs-tooltip-arrow-height))}.bs-tooltip-top .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^="top"] .tooltip-arrow::before{top:-1px;border-width:var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width) * .5) 0;border-top-color:var(--bs-tooltip-bg)}.bs-tooltip-end .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^="right"] .tooltip-arrow{left:calc(-1 * var(--bs-tooltip-arrow-height));width:var(--bs-tooltip-arrow-height);height:var(--bs-tooltip-arrow-width)}.bs-tooltip-end .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^="right"] .tooltip-arrow::before{right:-1px;border-width:calc(var(--bs-tooltip-arrow-width) * .5) var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width) * .5) 0;border-right-color:var(--bs-tooltip-bg)}.bs-tooltip-bottom .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^="bottom"] .tooltip-arrow{top:calc(-1 * var(--bs-tooltip-arrow-height))}.bs-tooltip-bottom .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^="bottom"] .tooltip-arrow::before{bottom:-1px;border-width:0 calc(var(--bs-tooltip-arrow-width) * .5) var(--bs-tooltip-arrow-height);border-bottom-color:var(--bs-tooltip-bg)}.bs-tooltip-start .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^="left"] .tooltip-arrow{right:calc(-1 * var(--bs-tooltip-arrow-height));width:var(--bs-tooltip-arrow-height);height:var(--bs-tooltip-arrow-width)}.bs-tooltip-start .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^="left"] .tooltip-arrow::before{left:-1px;border-width:calc(var(--bs-tooltip-arrow-width) * .5) 0 calc(var(--bs-tooltip-arrow-width) * .5) var(--bs-tooltip-arrow-height);border-left-color:var(--bs-tooltip-bg)}.tooltip-inner{max-width:var(--bs-tooltip-max-width);padding:var(--bs-tooltip-padding-y) var(--bs-tooltip-padding-x);color:var(--bs-tooltip-color);text-align:center;background-color:var(--bs-tooltip-bg);border-radius:var(--bs-tooltip-border-radius)}.popover{--bs-popover-zindex: 1070;--bs-popover-max-width: 276px;--bs-popover-font-size:.875rem;--bs-popover-bg: var(--bs-body-bg);--bs-popover-border-width: var(--bs-border-width);--bs-popover-border-color: var(--bs-border-color-translucent);--bs-popover-border-radius: var(--bs-border-radius-lg);--bs-popover-inner-border-radius: calc(var(--bs-border-radius-lg) - var(--bs-border-width));--bs-popover-box-shadow: 0 0.5rem 1rem rgba(0,0,0,0.15);--bs-popover-header-padding-x: 1rem;--bs-popover-header-padding-y: .5rem;--bs-popover-header-font-size:1rem;--bs-popover-header-color: inherit;--bs-popover-header-bg: var(--bs-secondary-bg);--bs-popover-body-padding-x: 1rem;--bs-popover-body-padding-y: 1rem;--bs-popover-body-color: var(--bs-body-color);--bs-popover-arrow-width: 1rem;--bs-popover-arrow-height: .5rem;--bs-popover-arrow-border: var(--bs-popover-border-color);z-index:var(--bs-popover-zindex);display:block;max-width:var(--bs-popover-max-width);font-family:var(--bs-font-sans-serif);font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:var(--bs-popover-font-size);word-wrap:break-word;background-color:var(--bs-popover-bg);background-clip:padding-box;border:var(--bs-popover-border-width) solid var(--bs-popover-border-color);border-radius:var(--bs-popover-border-radius)}.popover .popover-arrow{display:block;width:var(--bs-popover-arrow-width);height:var(--bs-popover-arrow-height)}.popover .popover-arrow::before,.popover .popover-arrow::after{position:absolute;display:block;content:"";border-color:transparent;border-style:solid;border-width:0}.bs-popover-top>.popover-arrow,.bs-popover-auto[data-popper-placement^="top"]>.popover-arrow{bottom:calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width))}.bs-popover-top>.popover-arrow::before,.bs-popover-auto[data-popper-placement^="top"]>.popover-arrow::before,.bs-popover-top>.popover-arrow::after,.bs-popover-auto[data-popper-placement^="top"]>.popover-arrow::after{border-width:var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width) * .5) 0}.bs-popover-top>.popover-arrow::before,.bs-popover-auto[data-popper-placement^="top"]>.popover-arrow::before{bottom:0;border-top-color:var(--bs-popover-arrow-border)}.bs-popover-top>.popover-arrow::after,.bs-popover-auto[data-popper-placement^="top"]>.popover-arrow::after{bottom:var(--bs-popover-border-width);border-top-color:var(--bs-popover-bg)}.bs-popover-end>.popover-arrow,.bs-popover-auto[data-popper-placement^="right"]>.popover-arrow{left:calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));width:var(--bs-popover-arrow-height);height:var(--bs-popover-arrow-width)}.bs-popover-end>.popover-arrow::before,.bs-popover-auto[data-popper-placement^="right"]>.popover-arrow::before,.bs-popover-end>.popover-arrow::after,.bs-popover-auto[data-popper-placement^="right"]>.popover-arrow::after{border-width:calc(var(--bs-popover-arrow-width) * .5) var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width) * .5) 0}.bs-popover-end>.popover-arrow::before,.bs-popover-auto[data-popper-placement^="right"]>.popover-arrow::before{left:0;border-right-color:var(--bs-popover-arrow-border)}.bs-popover-end>.popover-arrow::after,.bs-popover-auto[data-popper-placement^="right"]>.popover-arrow::after{left:var(--bs-popover-border-width);border-right-color:var(--bs-popover-bg)}.bs-popover-bottom>.popover-arrow,.bs-popover-auto[data-popper-placement^="bottom"]>.popover-arrow{top:calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width))}.bs-popover-bottom>.popover-arrow::before,.bs-popover-auto[data-popper-placement^="bottom"]>.popover-arrow::before,.bs-popover-bottom>.popover-arrow::after,.bs-popover-auto[data-popper-placement^="bottom"]>.popover-arrow::after{border-width:0 calc(var(--bs-popover-arrow-width) * .5) var(--bs-popover-arrow-height)}.bs-popover-bottom>.popover-arrow::before,.bs-popover-auto[data-popper-placement^="bottom"]>.popover-arrow::before{top:0;border-bottom-color:var(--bs-popover-arrow-border)}.bs-popover-bottom>.popover-arrow::after,.bs-popover-auto[data-popper-placement^="bottom"]>.popover-arrow::after{top:var(--bs-popover-border-width);border-bottom-color:var(--bs-popover-bg)}.bs-popover-bottom .popover-header::before,.bs-popover-auto[data-popper-placement^="bottom"] .popover-header::before{position:absolute;top:0;left:50%;display:block;width:var(--bs-popover-arrow-width);margin-left:calc(-.5 * var(--bs-popover-arrow-width));content:"";border-bottom:var(--bs-popover-border-width) solid var(--bs-popover-header-bg)}.bs-popover-start>.popover-arrow,.bs-popover-auto[data-popper-placement^="left"]>.popover-arrow{right:calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));width:var(--bs-popover-arrow-height);height:var(--bs-popover-arrow-width)}.bs-popover-start>.popover-arrow::before,.bs-popover-auto[data-popper-placement^="left"]>.popover-arrow::before,.bs-popover-start>.popover-arrow::after,.bs-popover-auto[data-popper-placement^="left"]>.popover-arrow::after{border-width:calc(var(--bs-popover-arrow-width) * .5) 0 calc(var(--bs-popover-arrow-width) * .5) var(--bs-popover-arrow-height)}.bs-popover-start>.popover-arrow::before,.bs-popover-auto[data-popper-placement^="left"]>.popover-arrow::before{right:0;border-left-color:var(--bs-popover-arrow-border)}.bs-popover-start>.popover-arrow::after,.bs-popover-auto[data-popper-placement^="left"]>.popover-arrow::after{right:var(--bs-popover-border-width);border-left-color:var(--bs-popover-bg)}.popover-header{padding:var(--bs-popover-header-padding-y) var(--bs-popover-header-padding-x);margin-bottom:0;font-size:var(--bs-popover-header-font-size);color:var(--bs-popover-header-color);background-color:var(--bs-popover-header-bg);border-bottom:var(--bs-popover-border-width) solid var(--bs-popover-border-color);border-top-left-radius:var(--bs-popover-inner-border-radius);border-top-right-radius:var(--bs-popover-inner-border-radius)}.popover-header:empty{display:none}.popover-body{padding:var(--bs-popover-body-padding-y) var(--bs-popover-body-padding-x);color:var(--bs-popover-body-color)}.carousel{position:relative}.carousel.pointer-event{touch-action:pan-y;-webkit-touch-action:pan-y;-moz-touch-action:pan-y;-ms-touch-action:pan-y;-o-touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;backface-visibility:hidden;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden;transition:transform .6s ease-in-out}@media (prefers-reduced-motion: reduce){.carousel-item{transition:none}}.carousel-item.active,.carousel-item-next,.carousel-item-prev{display:block}.carousel-item-next:not(.carousel-item-start),.active.carousel-item-end{transform:translateX(100%)}.carousel-item-prev:not(.carousel-item-end),.active.carousel-item-start{transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;transform:none}.carousel-fade .carousel-item.active,.carousel-fade .carousel-item-next.carousel-item-start,.carousel-fade .carousel-item-prev.carousel-item-end{z-index:1;opacity:1}.carousel-fade .active.carousel-item-start,.carousel-fade .active.carousel-item-end{z-index:0;opacity:0;transition:opacity 0s .6s}@media (prefers-reduced-motion: reduce){.carousel-fade .active.carousel-item-start,.carousel-fade .active.carousel-item-end{transition:none}}.carousel-control-prev,.carousel-control-next{position:absolute;top:0;bottom:0;z-index:1;display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;justify-content:center;-webkit-justify-content:center;width:15%;padding:0;color:#fff;text-align:center;background:none;border:0;opacity:.5;transition:opacity 0.15s ease}@media (prefers-reduced-motion: reduce){.carousel-control-prev,.carousel-control-next{transition:none}}.carousel-control-prev:hover,.carousel-control-prev:focus,.carousel-control-next:hover,.carousel-control-next:focus{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-prev-icon,.carousel-control-next-icon{display:inline-block;width:2rem;height:2rem;background-repeat:no-repeat;background-position:50%;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:2;display:flex;display:-webkit-flex;justify-content:center;-webkit-justify-content:center;padding:0;margin-right:15%;margin-bottom:1rem;margin-left:15%}.carousel-indicators [data-bs-target]{box-sizing:content-box;flex:0 1 auto;-webkit-flex:0 1 auto;width:30px;height:3px;padding:0;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border:0;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity 0.6s ease}@media (prefers-reduced-motion: reduce){.carousel-indicators [data-bs-target]{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:1.25rem;left:15%;padding-top:1.25rem;padding-bottom:1.25rem;color:#fff;text-align:center}.carousel-dark .carousel-control-prev-icon,.carousel-dark .carousel-control-next-icon{filter:invert(1) grayscale(100)}.carousel-dark .carousel-indicators [data-bs-target]{background-color:#000}.carousel-dark .carousel-caption{color:#000}[data-bs-theme="dark"] .carousel .carousel-control-prev-icon,[data-bs-theme="dark"] .carousel .carousel-control-next-icon,[data-bs-theme="dark"].carousel .carousel-control-prev-icon,[data-bs-theme="dark"].carousel .carousel-control-next-icon{filter:invert(1) grayscale(100)}[data-bs-theme="dark"] .carousel .carousel-indicators [data-bs-target],[data-bs-theme="dark"].carousel .carousel-indicators [data-bs-target]{background-color:#000}[data-bs-theme="dark"] .carousel .carousel-caption,[data-bs-theme="dark"].carousel .carousel-caption{color:#000}.spinner-grow,.spinner-border{display:inline-block;width:var(--bs-spinner-width);height:var(--bs-spinner-height);vertical-align:var(--bs-spinner-vertical-align);border-radius:50%;animation:var(--bs-spinner-animation-speed) linear infinite var(--bs-spinner-animation-name)}@keyframes spinner-border{to{transform:rotate(360deg) /* rtl:ignore */}}.spinner-border{--bs-spinner-width: 2rem;--bs-spinner-height: 2rem;--bs-spinner-vertical-align: -.125em;--bs-spinner-border-width: .25em;--bs-spinner-animation-speed: .75s;--bs-spinner-animation-name: spinner-border;border:var(--bs-spinner-border-width) solid currentcolor;border-right-color:transparent}.spinner-border-sm{--bs-spinner-width: 1rem;--bs-spinner-height: 1rem;--bs-spinner-border-width: .2em}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{--bs-spinner-width: 2rem;--bs-spinner-height: 2rem;--bs-spinner-vertical-align: -.125em;--bs-spinner-animation-speed: .75s;--bs-spinner-animation-name: spinner-grow;background-color:currentcolor;opacity:0}.spinner-grow-sm{--bs-spinner-width: 1rem;--bs-spinner-height: 1rem}@media (prefers-reduced-motion: reduce){.spinner-border,.spinner-grow{--bs-spinner-animation-speed: 1.5s}}.offcanvas,.offcanvas-xxl,.offcanvas-xl,.offcanvas-lg,.offcanvas-md,.offcanvas-sm{--bs-offcanvas-zindex: 1045;--bs-offcanvas-width: 400px;--bs-offcanvas-height: 30vh;--bs-offcanvas-padding-x: 1rem;--bs-offcanvas-padding-y: 1rem;--bs-offcanvas-color: var(--bs-body-color);--bs-offcanvas-bg: var(--bs-body-bg);--bs-offcanvas-border-width: var(--bs-border-width);--bs-offcanvas-border-color: var(--bs-border-color-translucent);--bs-offcanvas-box-shadow: 0 0.125rem 0.25rem rgba(0,0,0,0.075);--bs-offcanvas-transition: transform .3s ease-in-out;--bs-offcanvas-title-line-height: 1.5}@media (max-width: 575.98px){.offcanvas-sm{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media (max-width: 575.98px) and (prefers-reduced-motion: reduce){.offcanvas-sm{transition:none}}@media (max-width: 575.98px){.offcanvas-sm.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-sm.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-sm.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-sm.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-sm.showing,.offcanvas-sm.show:not(.hiding){transform:none}.offcanvas-sm.showing,.offcanvas-sm.hiding,.offcanvas-sm.show{visibility:visible}}@media (min-width: 576px){.offcanvas-sm{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:transparent !important}.offcanvas-sm .offcanvas-header{display:none}.offcanvas-sm .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible;background-color:transparent !important}}@media (max-width: 767.98px){.offcanvas-md{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media (max-width: 767.98px) and (prefers-reduced-motion: reduce){.offcanvas-md{transition:none}}@media (max-width: 767.98px){.offcanvas-md.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-md.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-md.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-md.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-md.showing,.offcanvas-md.show:not(.hiding){transform:none}.offcanvas-md.showing,.offcanvas-md.hiding,.offcanvas-md.show{visibility:visible}}@media (min-width: 768px){.offcanvas-md{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:transparent !important}.offcanvas-md .offcanvas-header{display:none}.offcanvas-md .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible;background-color:transparent !important}}@media (max-width: 991.98px){.offcanvas-lg{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media (max-width: 991.98px) and (prefers-reduced-motion: reduce){.offcanvas-lg{transition:none}}@media (max-width: 991.98px){.offcanvas-lg.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-lg.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-lg.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-lg.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-lg.showing,.offcanvas-lg.show:not(.hiding){transform:none}.offcanvas-lg.showing,.offcanvas-lg.hiding,.offcanvas-lg.show{visibility:visible}}@media (min-width: 992px){.offcanvas-lg{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:transparent !important}.offcanvas-lg .offcanvas-header{display:none}.offcanvas-lg .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible;background-color:transparent !important}}@media (max-width: 1199.98px){.offcanvas-xl{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media (max-width: 1199.98px) and (prefers-reduced-motion: reduce){.offcanvas-xl{transition:none}}@media (max-width: 1199.98px){.offcanvas-xl.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-xl.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-xl.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-xl.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-xl.showing,.offcanvas-xl.show:not(.hiding){transform:none}.offcanvas-xl.showing,.offcanvas-xl.hiding,.offcanvas-xl.show{visibility:visible}}@media (min-width: 1200px){.offcanvas-xl{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:transparent !important}.offcanvas-xl .offcanvas-header{display:none}.offcanvas-xl .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible;background-color:transparent !important}}@media (max-width: 1399.98px){.offcanvas-xxl{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media (max-width: 1399.98px) and (prefers-reduced-motion: reduce){.offcanvas-xxl{transition:none}}@media (max-width: 1399.98px){.offcanvas-xxl.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-xxl.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-xxl.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-xxl.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-xxl.showing,.offcanvas-xxl.show:not(.hiding){transform:none}.offcanvas-xxl.showing,.offcanvas-xxl.hiding,.offcanvas-xxl.show{visibility:visible}}@media (min-width: 1400px){.offcanvas-xxl{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:transparent !important}.offcanvas-xxl .offcanvas-header{display:none}.offcanvas-xxl .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible;background-color:transparent !important}}.offcanvas{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}@media (prefers-reduced-motion: reduce){.offcanvas{transition:none}}.offcanvas.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas.showing,.offcanvas.show:not(.hiding){transform:none}.offcanvas.showing,.offcanvas.hiding,.offcanvas.show{visibility:visible}.offcanvas-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.offcanvas-backdrop.fade{opacity:0}.offcanvas-backdrop.show{opacity:.5}.offcanvas-header{display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;justify-content:space-between;-webkit-justify-content:space-between;padding:var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x)}.offcanvas-header .btn-close{padding:calc(var(--bs-offcanvas-padding-y) * .5) calc(var(--bs-offcanvas-padding-x) * .5);margin-top:calc(-.5 * var(--bs-offcanvas-padding-y));margin-right:calc(-.5 * var(--bs-offcanvas-padding-x));margin-bottom:calc(-.5 * var(--bs-offcanvas-padding-y))}.offcanvas-title{margin-bottom:0;line-height:var(--bs-offcanvas-title-line-height)}.offcanvas-body{flex-grow:1;-webkit-flex-grow:1;padding:var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x);overflow-y:auto}.placeholder{display:inline-block;min-height:1em;vertical-align:middle;cursor:wait;background-color:currentcolor;opacity:.5}.placeholder.btn::before{display:inline-block;content:""}.placeholder-xs{min-height:.6em}.placeholder-sm{min-height:.8em}.placeholder-lg{min-height:1.2em}.placeholder-glow .placeholder{animation:placeholder-glow 2s ease-in-out infinite}@keyframes placeholder-glow{50%{opacity:.2}}.placeholder-wave{mask-image:linear-gradient(130deg, #000 55%, rgba(0,0,0,0.8) 75%, #000 95%);-webkit-mask-image:linear-gradient(130deg, #000 55%, rgba(0,0,0,0.8) 75%, #000 95%);mask-size:200% 100%;-webkit-mask-size:200% 100%;animation:placeholder-wave 2s linear infinite}@keyframes placeholder-wave{100%{mask-position:-200% 0%;-webkit-mask-position:-200% 0%}}.clearfix::after{display:block;clear:both;content:""}.text-bg-default{color:#fff !important;background-color:RGBA(var(--bs-default-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-primary{color:#fff !important;background-color:RGBA(var(--bs-primary-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-secondary{color:#fff !important;background-color:RGBA(var(--bs-secondary-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-success{color:#fff !important;background-color:RGBA(var(--bs-success-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-info{color:#fff !important;background-color:RGBA(var(--bs-info-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-warning{color:#fff !important;background-color:RGBA(var(--bs-warning-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-danger{color:#fff !important;background-color:RGBA(var(--bs-danger-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-light{color:#000 !important;background-color:RGBA(var(--bs-light-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-dark{color:#fff !important;background-color:RGBA(var(--bs-dark-rgb), var(--bs-bg-opacity, 1)) !important}.link-default{color:RGBA(var(--bs-default-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-default-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-default:hover,.link-default:focus{color:RGBA(119,132,133, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(119,132,133, var(--bs-link-underline-opacity, 1)) !important}.link-primary{color:RGBA(var(--bs-primary-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-primary-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-primary:hover,.link-primary:focus{color:RGBA(35,50,64, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(35,50,64, var(--bs-link-underline-opacity, 1)) !important}.link-secondary{color:RGBA(var(--bs-secondary-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-secondary-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-secondary:hover,.link-secondary:focus{color:RGBA(119,132,133, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(119,132,133, var(--bs-link-underline-opacity, 1)) !important}.link-success{color:RGBA(var(--bs-success-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-success-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-success:hover,.link-success:focus{color:RGBA(19,150,125, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(19,150,125, var(--bs-link-underline-opacity, 1)) !important}.link-info{color:RGBA(var(--bs-info-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-info-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-info:hover,.link-info:focus{color:RGBA(42,122,175, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(42,122,175, var(--bs-link-underline-opacity, 1)) !important}.link-warning{color:RGBA(var(--bs-warning-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-warning-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-warning:hover,.link-warning:focus{color:RGBA(194,125,14, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(194,125,14, var(--bs-link-underline-opacity, 1)) !important}.link-danger{color:RGBA(var(--bs-danger-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-danger-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-danger:hover,.link-danger:focus{color:RGBA(185,61,48, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(185,61,48, var(--bs-link-underline-opacity, 1)) !important}.link-light{color:RGBA(var(--bs-light-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-light-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-light:hover,.link-light:focus{color:RGBA(240,243,244, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(240,243,244, var(--bs-link-underline-opacity, 1)) !important}.link-dark{color:RGBA(var(--bs-dark-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-dark-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-dark:hover,.link-dark:focus{color:RGBA(98,110,111, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(98,110,111, var(--bs-link-underline-opacity, 1)) !important}.link-body-emphasis{color:RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-body-emphasis:hover,.link-body-emphasis:focus{color:RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-opacity, 0.75)) !important;text-decoration-color:RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-underline-opacity, 0.75)) !important}.focus-ring:focus{outline:0;box-shadow:var(--bs-focus-ring-x, 0) var(--bs-focus-ring-y, 0) var(--bs-focus-ring-blur, 0) var(--bs-focus-ring-width) var(--bs-focus-ring-color)}.icon-link{display:inline-flex;gap:.375rem;align-items:center;-webkit-align-items:center;text-decoration-color:rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 0.5));text-underline-offset:.25em;backface-visibility:hidden;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden}.icon-link>.bi{flex-shrink:0;-webkit-flex-shrink:0;width:1em;height:1em;fill:currentcolor;transition:0.2s ease-in-out transform}@media (prefers-reduced-motion: reduce){.icon-link>.bi{transition:none}}.icon-link-hover:hover>.bi,.icon-link-hover:focus-visible>.bi{transform:var(--bs-icon-link-transform, translate3d(0.25em, 0, 0))}.ratio{position:relative;width:100%}.ratio::before{display:block;padding-top:var(--bs-aspect-ratio);content:""}.ratio>*{position:absolute;top:0;left:0;width:100%;height:100%}.ratio-1x1{--bs-aspect-ratio: 100%}.ratio-4x3{--bs-aspect-ratio: calc(3 / 4 * 100%)}.ratio-16x9{--bs-aspect-ratio: calc(9 / 16 * 100%)}.ratio-21x9{--bs-aspect-ratio: calc(9 / 21 * 100%)}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}.sticky-top{position:sticky;top:0;z-index:1020}.sticky-bottom{position:sticky;bottom:0;z-index:1020}@media (min-width: 576px){.sticky-sm-top{position:sticky;top:0;z-index:1020}.sticky-sm-bottom{position:sticky;bottom:0;z-index:1020}}@media (min-width: 768px){.sticky-md-top{position:sticky;top:0;z-index:1020}.sticky-md-bottom{position:sticky;bottom:0;z-index:1020}}@media (min-width: 992px){.sticky-lg-top{position:sticky;top:0;z-index:1020}.sticky-lg-bottom{position:sticky;bottom:0;z-index:1020}}@media (min-width: 1200px){.sticky-xl-top{position:sticky;top:0;z-index:1020}.sticky-xl-bottom{position:sticky;bottom:0;z-index:1020}}@media (min-width: 1400px){.sticky-xxl-top{position:sticky;top:0;z-index:1020}.sticky-xxl-bottom{position:sticky;bottom:0;z-index:1020}}.hstack{display:flex;display:-webkit-flex;flex-direction:row;-webkit-flex-direction:row;align-items:center;-webkit-align-items:center;align-self:stretch;-webkit-align-self:stretch}.vstack{display:flex;display:-webkit-flex;flex:1 1 auto;-webkit-flex:1 1 auto;flex-direction:column;-webkit-flex-direction:column;align-self:stretch;-webkit-align-self:stretch}.visually-hidden,.visually-hidden-focusable:not(:focus):not(:focus-within){width:1px !important;height:1px !important;padding:0 !important;margin:-1px !important;overflow:hidden !important;clip:rect(0, 0, 0, 0) !important;white-space:nowrap !important;border:0 !important}.visually-hidden:not(caption),.visually-hidden-focusable:not(:focus):not(:focus-within):not(caption){position:absolute !important}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;content:""}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vr{display:inline-block;align-self:stretch;-webkit-align-self:stretch;width:var(--bs-border-width);min-height:1em;background-color:currentcolor;opacity:.25}.align-baseline{vertical-align:baseline !important}.align-top{vertical-align:top !important}.align-middle{vertical-align:middle !important}.align-bottom{vertical-align:bottom !important}.align-text-bottom{vertical-align:text-bottom !important}.align-text-top{vertical-align:text-top !important}.float-start{float:left !important}.float-end{float:right !important}.float-none{float:none !important}.object-fit-contain{object-fit:contain !important}.object-fit-cover{object-fit:cover !important}.object-fit-fill{object-fit:fill !important}.object-fit-scale{object-fit:scale-down !important}.object-fit-none{object-fit:none !important}.opacity-0{opacity:0 !important}.opacity-25{opacity:.25 !important}.opacity-50{opacity:.5 !important}.opacity-75{opacity:.75 !important}.opacity-100{opacity:1 !important}.overflow-auto{overflow:auto !important}.overflow-hidden{overflow:hidden !important}.overflow-visible{overflow:visible !important}.overflow-scroll{overflow:scroll !important}.overflow-x-auto{overflow-x:auto !important}.overflow-x-hidden{overflow-x:hidden !important}.overflow-x-visible{overflow-x:visible !important}.overflow-x-scroll{overflow-x:scroll !important}.overflow-y-auto{overflow-y:auto !important}.overflow-y-hidden{overflow-y:hidden !important}.overflow-y-visible{overflow-y:visible !important}.overflow-y-scroll{overflow-y:scroll !important}.d-inline{display:inline !important}.d-inline-block{display:inline-block !important}.d-block{display:block !important}.d-grid{display:grid !important}.d-inline-grid{display:inline-grid !important}.d-table{display:table !important}.d-table-row{display:table-row !important}.d-table-cell{display:table-cell !important}.d-flex{display:flex !important}.d-inline-flex{display:inline-flex !important}.d-none{display:none !important}.shadow{box-shadow:0 0.5rem 1rem rgba(0,0,0,0.15) !important}.shadow-sm{box-shadow:0 0.125rem 0.25rem rgba(0,0,0,0.075) !important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,0.175) !important}.shadow-none{box-shadow:none !important}.focus-ring-default{--bs-focus-ring-color: rgba(var(--bs-default-rgb), var(--bs-focus-ring-opacity))}.focus-ring-primary{--bs-focus-ring-color: rgba(var(--bs-primary-rgb), var(--bs-focus-ring-opacity))}.focus-ring-secondary{--bs-focus-ring-color: rgba(var(--bs-secondary-rgb), var(--bs-focus-ring-opacity))}.focus-ring-success{--bs-focus-ring-color: rgba(var(--bs-success-rgb), var(--bs-focus-ring-opacity))}.focus-ring-info{--bs-focus-ring-color: rgba(var(--bs-info-rgb), var(--bs-focus-ring-opacity))}.focus-ring-warning{--bs-focus-ring-color: rgba(var(--bs-warning-rgb), var(--bs-focus-ring-opacity))}.focus-ring-danger{--bs-focus-ring-color: rgba(var(--bs-danger-rgb), var(--bs-focus-ring-opacity))}.focus-ring-light{--bs-focus-ring-color: rgba(var(--bs-light-rgb), var(--bs-focus-ring-opacity))}.focus-ring-dark{--bs-focus-ring-color: rgba(var(--bs-dark-rgb), var(--bs-focus-ring-opacity))}.position-static{position:static !important}.position-relative{position:relative !important}.position-absolute{position:absolute !important}.position-fixed{position:fixed !important}.position-sticky{position:sticky !important}.top-0{top:0 !important}.top-50{top:50% !important}.top-100{top:100% !important}.bottom-0{bottom:0 !important}.bottom-50{bottom:50% !important}.bottom-100{bottom:100% !important}.start-0{left:0 !important}.start-50{left:50% !important}.start-100{left:100% !important}.end-0{right:0 !important}.end-50{right:50% !important}.end-100{right:100% !important}.translate-middle{transform:translate(-50%, -50%) !important}.translate-middle-x{transform:translateX(-50%) !important}.translate-middle-y{transform:translateY(-50%) !important}.border{border:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-0{border:0 !important}.border-top{border-top:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-top-0{border-top:0 !important}.border-end{border-right:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-end-0{border-right:0 !important}.border-bottom{border-bottom:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-bottom-0{border-bottom:0 !important}.border-start{border-left:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-start-0{border-left:0 !important}.border-default{--bs-border-opacity: 1;border-color:rgba(var(--bs-default-rgb), var(--bs-border-opacity)) !important}.border-primary{--bs-border-opacity: 1;border-color:rgba(var(--bs-primary-rgb), var(--bs-border-opacity)) !important}.border-secondary{--bs-border-opacity: 1;border-color:rgba(var(--bs-secondary-rgb), var(--bs-border-opacity)) !important}.border-success{--bs-border-opacity: 1;border-color:rgba(var(--bs-success-rgb), var(--bs-border-opacity)) !important}.border-info{--bs-border-opacity: 1;border-color:rgba(var(--bs-info-rgb), var(--bs-border-opacity)) !important}.border-warning{--bs-border-opacity: 1;border-color:rgba(var(--bs-warning-rgb), var(--bs-border-opacity)) !important}.border-danger{--bs-border-opacity: 1;border-color:rgba(var(--bs-danger-rgb), var(--bs-border-opacity)) !important}.border-light{--bs-border-opacity: 1;border-color:rgba(var(--bs-light-rgb), var(--bs-border-opacity)) !important}.border-dark{--bs-border-opacity: 1;border-color:rgba(var(--bs-dark-rgb), var(--bs-border-opacity)) !important}.border-black{--bs-border-opacity: 1;border-color:rgba(var(--bs-black-rgb), var(--bs-border-opacity)) !important}.border-white{--bs-border-opacity: 1;border-color:rgba(var(--bs-white-rgb), var(--bs-border-opacity)) !important}.border-primary-subtle{border-color:var(--bs-primary-border-subtle) !important}.border-secondary-subtle{border-color:var(--bs-secondary-border-subtle) !important}.border-success-subtle{border-color:var(--bs-success-border-subtle) !important}.border-info-subtle{border-color:var(--bs-info-border-subtle) !important}.border-warning-subtle{border-color:var(--bs-warning-border-subtle) !important}.border-danger-subtle{border-color:var(--bs-danger-border-subtle) !important}.border-light-subtle{border-color:var(--bs-light-border-subtle) !important}.border-dark-subtle{border-color:var(--bs-dark-border-subtle) !important}.border-1{border-width:1px !important}.border-2{border-width:2px !important}.border-3{border-width:3px !important}.border-4{border-width:4px !important}.border-5{border-width:5px !important}.border-opacity-10{--bs-border-opacity: .1}.border-opacity-25{--bs-border-opacity: .25}.border-opacity-50{--bs-border-opacity: .5}.border-opacity-75{--bs-border-opacity: .75}.border-opacity-100{--bs-border-opacity: 1}.w-25{width:25% !important}.w-50{width:50% !important}.w-75{width:75% !important}.w-100{width:100% !important}.w-auto{width:auto !important}.mw-100{max-width:100% !important}.vw-100{width:100vw !important}.min-vw-100{min-width:100vw !important}.h-25{height:25% !important}.h-50{height:50% !important}.h-75{height:75% !important}.h-100{height:100% !important}.h-auto{height:auto !important}.mh-100{max-height:100% !important}.vh-100{height:100vh !important}.min-vh-100{min-height:100vh !important}.flex-fill{flex:1 1 auto !important}.flex-row{flex-direction:row !important}.flex-column{flex-direction:column !important}.flex-row-reverse{flex-direction:row-reverse !important}.flex-column-reverse{flex-direction:column-reverse !important}.flex-grow-0{flex-grow:0 !important}.flex-grow-1{flex-grow:1 !important}.flex-shrink-0{flex-shrink:0 !important}.flex-shrink-1{flex-shrink:1 !important}.flex-wrap{flex-wrap:wrap !important}.flex-nowrap{flex-wrap:nowrap !important}.flex-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-start{justify-content:flex-start !important}.justify-content-end{justify-content:flex-end !important}.justify-content-center{justify-content:center !important}.justify-content-between{justify-content:space-between !important}.justify-content-around{justify-content:space-around !important}.justify-content-evenly{justify-content:space-evenly !important}.align-items-start{align-items:flex-start !important}.align-items-end{align-items:flex-end !important}.align-items-center{align-items:center !important}.align-items-baseline{align-items:baseline !important}.align-items-stretch{align-items:stretch !important}.align-content-start{align-content:flex-start !important}.align-content-end{align-content:flex-end !important}.align-content-center{align-content:center !important}.align-content-between{align-content:space-between !important}.align-content-around{align-content:space-around !important}.align-content-stretch{align-content:stretch !important}.align-self-auto{align-self:auto !important}.align-self-start{align-self:flex-start !important}.align-self-end{align-self:flex-end !important}.align-self-center{align-self:center !important}.align-self-baseline{align-self:baseline !important}.align-self-stretch{align-self:stretch !important}.order-first{order:-1 !important}.order-0{order:0 !important}.order-1{order:1 !important}.order-2{order:2 !important}.order-3{order:3 !important}.order-4{order:4 !important}.order-5{order:5 !important}.order-last{order:6 !important}.m-0{margin:0 !important}.m-1{margin:.25rem !important}.m-2{margin:.5rem !important}.m-3{margin:1rem !important}.m-4{margin:1.5rem !important}.m-5{margin:3rem !important}.m-auto{margin:auto !important}.mx-0{margin-right:0 !important;margin-left:0 !important}.mx-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-3{margin-right:1rem !important;margin-left:1rem !important}.mx-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-5{margin-right:3rem !important;margin-left:3rem !important}.mx-auto{margin-right:auto !important;margin-left:auto !important}.my-0{margin-top:0 !important;margin-bottom:0 !important}.my-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-0{margin-top:0 !important}.mt-1{margin-top:.25rem !important}.mt-2{margin-top:.5rem !important}.mt-3{margin-top:1rem !important}.mt-4{margin-top:1.5rem !important}.mt-5{margin-top:3rem !important}.mt-auto{margin-top:auto !important}.me-0{margin-right:0 !important}.me-1{margin-right:.25rem !important}.me-2{margin-right:.5rem !important}.me-3{margin-right:1rem !important}.me-4{margin-right:1.5rem !important}.me-5{margin-right:3rem !important}.me-auto{margin-right:auto !important}.mb-0{margin-bottom:0 !important}.mb-1{margin-bottom:.25rem !important}.mb-2{margin-bottom:.5rem !important}.mb-3{margin-bottom:1rem !important}.mb-4{margin-bottom:1.5rem !important}.mb-5{margin-bottom:3rem !important}.mb-auto{margin-bottom:auto !important}.ms-0{margin-left:0 !important}.ms-1{margin-left:.25rem !important}.ms-2{margin-left:.5rem !important}.ms-3{margin-left:1rem !important}.ms-4{margin-left:1.5rem !important}.ms-5{margin-left:3rem !important}.ms-auto{margin-left:auto !important}.p-0{padding:0 !important}.p-1{padding:.25rem !important}.p-2{padding:.5rem !important}.p-3{padding:1rem !important}.p-4{padding:1.5rem !important}.p-5{padding:3rem !important}.px-0{padding-right:0 !important;padding-left:0 !important}.px-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-3{padding-right:1rem !important;padding-left:1rem !important}.px-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-5{padding-right:3rem !important;padding-left:3rem !important}.py-0{padding-top:0 !important;padding-bottom:0 !important}.py-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-0{padding-top:0 !important}.pt-1{padding-top:.25rem !important}.pt-2{padding-top:.5rem !important}.pt-3{padding-top:1rem !important}.pt-4{padding-top:1.5rem !important}.pt-5{padding-top:3rem !important}.pe-0{padding-right:0 !important}.pe-1{padding-right:.25rem !important}.pe-2{padding-right:.5rem !important}.pe-3{padding-right:1rem !important}.pe-4{padding-right:1.5rem !important}.pe-5{padding-right:3rem !important}.pb-0{padding-bottom:0 !important}.pb-1{padding-bottom:.25rem !important}.pb-2{padding-bottom:.5rem !important}.pb-3{padding-bottom:1rem !important}.pb-4{padding-bottom:1.5rem !important}.pb-5{padding-bottom:3rem !important}.ps-0{padding-left:0 !important}.ps-1{padding-left:.25rem !important}.ps-2{padding-left:.5rem !important}.ps-3{padding-left:1rem !important}.ps-4{padding-left:1.5rem !important}.ps-5{padding-left:3rem !important}.gap-0{gap:0 !important}.gap-1{gap:.25rem !important}.gap-2{gap:.5rem !important}.gap-3{gap:1rem !important}.gap-4{gap:1.5rem !important}.gap-5{gap:3rem !important}.row-gap-0{row-gap:0 !important}.row-gap-1{row-gap:.25rem !important}.row-gap-2{row-gap:.5rem !important}.row-gap-3{row-gap:1rem !important}.row-gap-4{row-gap:1.5rem !important}.row-gap-5{row-gap:3rem !important}.column-gap-0{column-gap:0 !important}.column-gap-1{column-gap:.25rem !important}.column-gap-2{column-gap:.5rem !important}.column-gap-3{column-gap:1rem !important}.column-gap-4{column-gap:1.5rem !important}.column-gap-5{column-gap:3rem !important}.font-monospace{font-family:var(--bs-font-monospace) !important}.fs-1{font-size:calc(1.425rem + 2.1vw) !important}.fs-2{font-size:calc(1.375rem + 1.5vw) !important}.fs-3{font-size:calc(1.325rem + .9vw) !important}.fs-4{font-size:calc(1.275rem + .3vw) !important}.fs-5{font-size:1.25rem !important}.fs-6{font-size:1rem !important}.fst-italic{font-style:italic !important}.fst-normal{font-style:normal !important}.fw-lighter{font-weight:lighter !important}.fw-light{font-weight:300 !important}.fw-normal{font-weight:400 !important}.fw-medium{font-weight:500 !important}.fw-semibold{font-weight:600 !important}.fw-bold{font-weight:700 !important}.fw-bolder{font-weight:bolder !important}.lh-1{line-height:1 !important}.lh-sm{line-height:1.25 !important}.lh-base{line-height:1.5 !important}.lh-lg{line-height:2 !important}.text-start{text-align:left !important}.text-end{text-align:right !important}.text-center{text-align:center !important}.text-decoration-none{text-decoration:none !important}.text-decoration-underline{text-decoration:underline !important}.text-decoration-line-through{text-decoration:line-through !important}.text-lowercase{text-transform:lowercase !important}.text-uppercase{text-transform:uppercase !important}.text-capitalize{text-transform:capitalize !important}.text-wrap{white-space:normal !important}.text-nowrap{white-space:nowrap !important}.text-break{word-wrap:break-word !important;word-break:break-word !important}.text-default{--bs-text-opacity: 1;color:rgba(var(--bs-default-rgb), var(--bs-text-opacity)) !important}.text-primary{--bs-text-opacity: 1;color:rgba(var(--bs-primary-rgb), var(--bs-text-opacity)) !important}.text-secondary{--bs-text-opacity: 1;color:rgba(var(--bs-secondary-rgb), var(--bs-text-opacity)) !important}.text-success{--bs-text-opacity: 1;color:rgba(var(--bs-success-rgb), var(--bs-text-opacity)) !important}.text-info{--bs-text-opacity: 1;color:rgba(var(--bs-info-rgb), var(--bs-text-opacity)) !important}.text-warning{--bs-text-opacity: 1;color:rgba(var(--bs-warning-rgb), var(--bs-text-opacity)) !important}.text-danger{--bs-text-opacity: 1;color:rgba(var(--bs-danger-rgb), var(--bs-text-opacity)) !important}.text-light{--bs-text-opacity: 1;color:rgba(var(--bs-light-rgb), var(--bs-text-opacity)) !important}.text-dark{--bs-text-opacity: 1;color:rgba(var(--bs-dark-rgb), var(--bs-text-opacity)) !important}.text-black{--bs-text-opacity: 1;color:rgba(var(--bs-black-rgb), var(--bs-text-opacity)) !important}.text-white{--bs-text-opacity: 1;color:rgba(var(--bs-white-rgb), var(--bs-text-opacity)) !important}.text-body{--bs-text-opacity: 1;color:rgba(var(--bs-body-color-rgb), var(--bs-text-opacity)) !important}.text-muted{--bs-text-opacity: 1;color:var(--bs-secondary-color) !important}.text-black-50{--bs-text-opacity: 1;color:rgba(0,0,0,0.5) !important}.text-white-50{--bs-text-opacity: 1;color:rgba(255,255,255,0.5) !important}.text-body-secondary{--bs-text-opacity: 1;color:var(--bs-secondary-color) !important}.text-body-tertiary{--bs-text-opacity: 1;color:var(--bs-tertiary-color) !important}.text-body-emphasis{--bs-text-opacity: 1;color:var(--bs-emphasis-color) !important}.text-reset{--bs-text-opacity: 1;color:inherit !important}.text-opacity-25{--bs-text-opacity: .25}.text-opacity-50{--bs-text-opacity: .5}.text-opacity-75{--bs-text-opacity: .75}.text-opacity-100{--bs-text-opacity: 1}.text-primary-emphasis{color:var(--bs-primary-text-emphasis) !important}.text-secondary-emphasis{color:var(--bs-secondary-text-emphasis) !important}.text-success-emphasis{color:var(--bs-success-text-emphasis) !important}.text-info-emphasis{color:var(--bs-info-text-emphasis) !important}.text-warning-emphasis{color:var(--bs-warning-text-emphasis) !important}.text-danger-emphasis{color:var(--bs-danger-text-emphasis) !important}.text-light-emphasis{color:var(--bs-light-text-emphasis) !important}.text-dark-emphasis{color:var(--bs-dark-text-emphasis) !important}.link-opacity-10{--bs-link-opacity: .1}.link-opacity-10-hover:hover{--bs-link-opacity: .1}.link-opacity-25{--bs-link-opacity: .25}.link-opacity-25-hover:hover{--bs-link-opacity: .25}.link-opacity-50{--bs-link-opacity: .5}.link-opacity-50-hover:hover{--bs-link-opacity: .5}.link-opacity-75{--bs-link-opacity: .75}.link-opacity-75-hover:hover{--bs-link-opacity: .75}.link-opacity-100{--bs-link-opacity: 1}.link-opacity-100-hover:hover{--bs-link-opacity: 1}.link-offset-1{text-underline-offset:.125em !important}.link-offset-1-hover:hover{text-underline-offset:.125em !important}.link-offset-2{text-underline-offset:.25em !important}.link-offset-2-hover:hover{text-underline-offset:.25em !important}.link-offset-3{text-underline-offset:.375em !important}.link-offset-3-hover:hover{text-underline-offset:.375em !important}.link-underline-default{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-default-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-primary{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-primary-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-secondary{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-secondary-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-success{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-success-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-info{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-info-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-warning{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-warning-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-danger{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-danger-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-light{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-light-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-dark{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-dark-rgb), var(--bs-link-underline-opacity)) !important}.link-underline{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-link-color-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-underline-opacity-0{--bs-link-underline-opacity: 0}.link-underline-opacity-0-hover:hover{--bs-link-underline-opacity: 0}.link-underline-opacity-10{--bs-link-underline-opacity: .1}.link-underline-opacity-10-hover:hover{--bs-link-underline-opacity: .1}.link-underline-opacity-25{--bs-link-underline-opacity: .25}.link-underline-opacity-25-hover:hover{--bs-link-underline-opacity: .25}.link-underline-opacity-50{--bs-link-underline-opacity: .5}.link-underline-opacity-50-hover:hover{--bs-link-underline-opacity: .5}.link-underline-opacity-75{--bs-link-underline-opacity: .75}.link-underline-opacity-75-hover:hover{--bs-link-underline-opacity: .75}.link-underline-opacity-100{--bs-link-underline-opacity: 1}.link-underline-opacity-100-hover:hover{--bs-link-underline-opacity: 1}.bg-default{--bs-bg-opacity: 1;background-color:rgba(var(--bs-default-rgb), var(--bs-bg-opacity)) !important}.bg-primary{--bs-bg-opacity: 1;background-color:rgba(var(--bs-primary-rgb), var(--bs-bg-opacity)) !important}.bg-secondary{--bs-bg-opacity: 1;background-color:rgba(var(--bs-secondary-rgb), var(--bs-bg-opacity)) !important}.bg-success{--bs-bg-opacity: 1;background-color:rgba(var(--bs-success-rgb), var(--bs-bg-opacity)) !important}.bg-info{--bs-bg-opacity: 1;background-color:rgba(var(--bs-info-rgb), var(--bs-bg-opacity)) !important}.bg-warning{--bs-bg-opacity: 1;background-color:rgba(var(--bs-warning-rgb), var(--bs-bg-opacity)) !important}.bg-danger{--bs-bg-opacity: 1;background-color:rgba(var(--bs-danger-rgb), var(--bs-bg-opacity)) !important}.bg-light{--bs-bg-opacity: 1;background-color:rgba(var(--bs-light-rgb), var(--bs-bg-opacity)) !important}.bg-dark{--bs-bg-opacity: 1;background-color:rgba(var(--bs-dark-rgb), var(--bs-bg-opacity)) !important}.bg-black{--bs-bg-opacity: 1;background-color:rgba(var(--bs-black-rgb), var(--bs-bg-opacity)) !important}.bg-white{--bs-bg-opacity: 1;background-color:rgba(var(--bs-white-rgb), var(--bs-bg-opacity)) !important}.bg-body{--bs-bg-opacity: 1;background-color:rgba(var(--bs-body-bg-rgb), var(--bs-bg-opacity)) !important}.bg-transparent{--bs-bg-opacity: 1;background-color:rgba(0,0,0,0) !important}.bg-body-secondary{--bs-bg-opacity: 1;background-color:rgba(var(--bs-secondary-bg-rgb), var(--bs-bg-opacity)) !important}.bg-body-tertiary{--bs-bg-opacity: 1;background-color:rgba(var(--bs-tertiary-bg-rgb), var(--bs-bg-opacity)) !important}.bg-opacity-10{--bs-bg-opacity: .1}.bg-opacity-25{--bs-bg-opacity: .25}.bg-opacity-50{--bs-bg-opacity: .5}.bg-opacity-75{--bs-bg-opacity: .75}.bg-opacity-100{--bs-bg-opacity: 1}.bg-primary-subtle{background-color:var(--bs-primary-bg-subtle) !important}.bg-secondary-subtle{background-color:var(--bs-secondary-bg-subtle) !important}.bg-success-subtle{background-color:var(--bs-success-bg-subtle) !important}.bg-info-subtle{background-color:var(--bs-info-bg-subtle) !important}.bg-warning-subtle{background-color:var(--bs-warning-bg-subtle) !important}.bg-danger-subtle{background-color:var(--bs-danger-bg-subtle) !important}.bg-light-subtle{background-color:var(--bs-light-bg-subtle) !important}.bg-dark-subtle{background-color:var(--bs-dark-bg-subtle) !important}.bg-gradient{background-image:var(--bs-gradient) !important}.user-select-all{user-select:all !important}.user-select-auto{user-select:auto !important}.user-select-none{user-select:none !important}.pe-none{pointer-events:none !important}.pe-auto{pointer-events:auto !important}.rounded{border-radius:var(--bs-border-radius) !important}.rounded-0{border-radius:0 !important}.rounded-1{border-radius:var(--bs-border-radius-sm) !important}.rounded-2{border-radius:var(--bs-border-radius) !important}.rounded-3{border-radius:var(--bs-border-radius-lg) !important}.rounded-4{border-radius:var(--bs-border-radius-xl) !important}.rounded-5{border-radius:var(--bs-border-radius-xxl) !important}.rounded-circle{border-radius:50% !important}.rounded-pill{border-radius:var(--bs-border-radius-pill) !important}.rounded-top{border-top-left-radius:var(--bs-border-radius) !important;border-top-right-radius:var(--bs-border-radius) !important}.rounded-top-0{border-top-left-radius:0 !important;border-top-right-radius:0 !important}.rounded-top-1{border-top-left-radius:var(--bs-border-radius-sm) !important;border-top-right-radius:var(--bs-border-radius-sm) !important}.rounded-top-2{border-top-left-radius:var(--bs-border-radius) !important;border-top-right-radius:var(--bs-border-radius) !important}.rounded-top-3{border-top-left-radius:var(--bs-border-radius-lg) !important;border-top-right-radius:var(--bs-border-radius-lg) !important}.rounded-top-4{border-top-left-radius:var(--bs-border-radius-xl) !important;border-top-right-radius:var(--bs-border-radius-xl) !important}.rounded-top-5{border-top-left-radius:var(--bs-border-radius-xxl) !important;border-top-right-radius:var(--bs-border-radius-xxl) !important}.rounded-top-circle{border-top-left-radius:50% !important;border-top-right-radius:50% !important}.rounded-top-pill{border-top-left-radius:var(--bs-border-radius-pill) !important;border-top-right-radius:var(--bs-border-radius-pill) !important}.rounded-end{border-top-right-radius:var(--bs-border-radius) !important;border-bottom-right-radius:var(--bs-border-radius) !important}.rounded-end-0{border-top-right-radius:0 !important;border-bottom-right-radius:0 !important}.rounded-end-1{border-top-right-radius:var(--bs-border-radius-sm) !important;border-bottom-right-radius:var(--bs-border-radius-sm) !important}.rounded-end-2{border-top-right-radius:var(--bs-border-radius) !important;border-bottom-right-radius:var(--bs-border-radius) !important}.rounded-end-3{border-top-right-radius:var(--bs-border-radius-lg) !important;border-bottom-right-radius:var(--bs-border-radius-lg) !important}.rounded-end-4{border-top-right-radius:var(--bs-border-radius-xl) !important;border-bottom-right-radius:var(--bs-border-radius-xl) !important}.rounded-end-5{border-top-right-radius:var(--bs-border-radius-xxl) !important;border-bottom-right-radius:var(--bs-border-radius-xxl) !important}.rounded-end-circle{border-top-right-radius:50% !important;border-bottom-right-radius:50% !important}.rounded-end-pill{border-top-right-radius:var(--bs-border-radius-pill) !important;border-bottom-right-radius:var(--bs-border-radius-pill) !important}.rounded-bottom{border-bottom-right-radius:var(--bs-border-radius) !important;border-bottom-left-radius:var(--bs-border-radius) !important}.rounded-bottom-0{border-bottom-right-radius:0 !important;border-bottom-left-radius:0 !important}.rounded-bottom-1{border-bottom-right-radius:var(--bs-border-radius-sm) !important;border-bottom-left-radius:var(--bs-border-radius-sm) !important}.rounded-bottom-2{border-bottom-right-radius:var(--bs-border-radius) !important;border-bottom-left-radius:var(--bs-border-radius) !important}.rounded-bottom-3{border-bottom-right-radius:var(--bs-border-radius-lg) !important;border-bottom-left-radius:var(--bs-border-radius-lg) !important}.rounded-bottom-4{border-bottom-right-radius:var(--bs-border-radius-xl) !important;border-bottom-left-radius:var(--bs-border-radius-xl) !important}.rounded-bottom-5{border-bottom-right-radius:var(--bs-border-radius-xxl) !important;border-bottom-left-radius:var(--bs-border-radius-xxl) !important}.rounded-bottom-circle{border-bottom-right-radius:50% !important;border-bottom-left-radius:50% !important}.rounded-bottom-pill{border-bottom-right-radius:var(--bs-border-radius-pill) !important;border-bottom-left-radius:var(--bs-border-radius-pill) !important}.rounded-start{border-bottom-left-radius:var(--bs-border-radius) !important;border-top-left-radius:var(--bs-border-radius) !important}.rounded-start-0{border-bottom-left-radius:0 !important;border-top-left-radius:0 !important}.rounded-start-1{border-bottom-left-radius:var(--bs-border-radius-sm) !important;border-top-left-radius:var(--bs-border-radius-sm) !important}.rounded-start-2{border-bottom-left-radius:var(--bs-border-radius) !important;border-top-left-radius:var(--bs-border-radius) !important}.rounded-start-3{border-bottom-left-radius:var(--bs-border-radius-lg) !important;border-top-left-radius:var(--bs-border-radius-lg) !important}.rounded-start-4{border-bottom-left-radius:var(--bs-border-radius-xl) !important;border-top-left-radius:var(--bs-border-radius-xl) !important}.rounded-start-5{border-bottom-left-radius:var(--bs-border-radius-xxl) !important;border-top-left-radius:var(--bs-border-radius-xxl) !important}.rounded-start-circle{border-bottom-left-radius:50% !important;border-top-left-radius:50% !important}.rounded-start-pill{border-bottom-left-radius:var(--bs-border-radius-pill) !important;border-top-left-radius:var(--bs-border-radius-pill) !important}.visible{visibility:visible !important}.invisible{visibility:hidden !important}.z-n1{z-index:-1 !important}.z-0{z-index:0 !important}.z-1{z-index:1 !important}.z-2{z-index:2 !important}.z-3{z-index:3 !important}@media (min-width: 576px){.float-sm-start{float:left !important}.float-sm-end{float:right !important}.float-sm-none{float:none !important}.object-fit-sm-contain{object-fit:contain !important}.object-fit-sm-cover{object-fit:cover !important}.object-fit-sm-fill{object-fit:fill !important}.object-fit-sm-scale{object-fit:scale-down !important}.object-fit-sm-none{object-fit:none !important}.d-sm-inline{display:inline !important}.d-sm-inline-block{display:inline-block !important}.d-sm-block{display:block !important}.d-sm-grid{display:grid !important}.d-sm-inline-grid{display:inline-grid !important}.d-sm-table{display:table !important}.d-sm-table-row{display:table-row !important}.d-sm-table-cell{display:table-cell !important}.d-sm-flex{display:flex !important}.d-sm-inline-flex{display:inline-flex !important}.d-sm-none{display:none !important}.flex-sm-fill{flex:1 1 auto !important}.flex-sm-row{flex-direction:row !important}.flex-sm-column{flex-direction:column !important}.flex-sm-row-reverse{flex-direction:row-reverse !important}.flex-sm-column-reverse{flex-direction:column-reverse !important}.flex-sm-grow-0{flex-grow:0 !important}.flex-sm-grow-1{flex-grow:1 !important}.flex-sm-shrink-0{flex-shrink:0 !important}.flex-sm-shrink-1{flex-shrink:1 !important}.flex-sm-wrap{flex-wrap:wrap !important}.flex-sm-nowrap{flex-wrap:nowrap !important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-sm-start{justify-content:flex-start !important}.justify-content-sm-end{justify-content:flex-end !important}.justify-content-sm-center{justify-content:center !important}.justify-content-sm-between{justify-content:space-between !important}.justify-content-sm-around{justify-content:space-around !important}.justify-content-sm-evenly{justify-content:space-evenly !important}.align-items-sm-start{align-items:flex-start !important}.align-items-sm-end{align-items:flex-end !important}.align-items-sm-center{align-items:center !important}.align-items-sm-baseline{align-items:baseline !important}.align-items-sm-stretch{align-items:stretch !important}.align-content-sm-start{align-content:flex-start !important}.align-content-sm-end{align-content:flex-end !important}.align-content-sm-center{align-content:center !important}.align-content-sm-between{align-content:space-between !important}.align-content-sm-around{align-content:space-around !important}.align-content-sm-stretch{align-content:stretch !important}.align-self-sm-auto{align-self:auto !important}.align-self-sm-start{align-self:flex-start !important}.align-self-sm-end{align-self:flex-end !important}.align-self-sm-center{align-self:center !important}.align-self-sm-baseline{align-self:baseline !important}.align-self-sm-stretch{align-self:stretch !important}.order-sm-first{order:-1 !important}.order-sm-0{order:0 !important}.order-sm-1{order:1 !important}.order-sm-2{order:2 !important}.order-sm-3{order:3 !important}.order-sm-4{order:4 !important}.order-sm-5{order:5 !important}.order-sm-last{order:6 !important}.m-sm-0{margin:0 !important}.m-sm-1{margin:.25rem !important}.m-sm-2{margin:.5rem !important}.m-sm-3{margin:1rem !important}.m-sm-4{margin:1.5rem !important}.m-sm-5{margin:3rem !important}.m-sm-auto{margin:auto !important}.mx-sm-0{margin-right:0 !important;margin-left:0 !important}.mx-sm-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-sm-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-sm-3{margin-right:1rem !important;margin-left:1rem !important}.mx-sm-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-sm-5{margin-right:3rem !important;margin-left:3rem !important}.mx-sm-auto{margin-right:auto !important;margin-left:auto !important}.my-sm-0{margin-top:0 !important;margin-bottom:0 !important}.my-sm-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-sm-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-sm-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-sm-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-sm-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-sm-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-sm-0{margin-top:0 !important}.mt-sm-1{margin-top:.25rem !important}.mt-sm-2{margin-top:.5rem !important}.mt-sm-3{margin-top:1rem !important}.mt-sm-4{margin-top:1.5rem !important}.mt-sm-5{margin-top:3rem !important}.mt-sm-auto{margin-top:auto !important}.me-sm-0{margin-right:0 !important}.me-sm-1{margin-right:.25rem !important}.me-sm-2{margin-right:.5rem !important}.me-sm-3{margin-right:1rem !important}.me-sm-4{margin-right:1.5rem !important}.me-sm-5{margin-right:3rem !important}.me-sm-auto{margin-right:auto !important}.mb-sm-0{margin-bottom:0 !important}.mb-sm-1{margin-bottom:.25rem !important}.mb-sm-2{margin-bottom:.5rem !important}.mb-sm-3{margin-bottom:1rem !important}.mb-sm-4{margin-bottom:1.5rem !important}.mb-sm-5{margin-bottom:3rem !important}.mb-sm-auto{margin-bottom:auto !important}.ms-sm-0{margin-left:0 !important}.ms-sm-1{margin-left:.25rem !important}.ms-sm-2{margin-left:.5rem !important}.ms-sm-3{margin-left:1rem !important}.ms-sm-4{margin-left:1.5rem !important}.ms-sm-5{margin-left:3rem !important}.ms-sm-auto{margin-left:auto !important}.p-sm-0{padding:0 !important}.p-sm-1{padding:.25rem !important}.p-sm-2{padding:.5rem !important}.p-sm-3{padding:1rem !important}.p-sm-4{padding:1.5rem !important}.p-sm-5{padding:3rem !important}.px-sm-0{padding-right:0 !important;padding-left:0 !important}.px-sm-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-sm-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-sm-3{padding-right:1rem !important;padding-left:1rem !important}.px-sm-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-sm-5{padding-right:3rem !important;padding-left:3rem !important}.py-sm-0{padding-top:0 !important;padding-bottom:0 !important}.py-sm-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-sm-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-sm-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-sm-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-sm-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-sm-0{padding-top:0 !important}.pt-sm-1{padding-top:.25rem !important}.pt-sm-2{padding-top:.5rem !important}.pt-sm-3{padding-top:1rem !important}.pt-sm-4{padding-top:1.5rem !important}.pt-sm-5{padding-top:3rem !important}.pe-sm-0{padding-right:0 !important}.pe-sm-1{padding-right:.25rem !important}.pe-sm-2{padding-right:.5rem !important}.pe-sm-3{padding-right:1rem !important}.pe-sm-4{padding-right:1.5rem !important}.pe-sm-5{padding-right:3rem !important}.pb-sm-0{padding-bottom:0 !important}.pb-sm-1{padding-bottom:.25rem !important}.pb-sm-2{padding-bottom:.5rem !important}.pb-sm-3{padding-bottom:1rem !important}.pb-sm-4{padding-bottom:1.5rem !important}.pb-sm-5{padding-bottom:3rem !important}.ps-sm-0{padding-left:0 !important}.ps-sm-1{padding-left:.25rem !important}.ps-sm-2{padding-left:.5rem !important}.ps-sm-3{padding-left:1rem !important}.ps-sm-4{padding-left:1.5rem !important}.ps-sm-5{padding-left:3rem !important}.gap-sm-0{gap:0 !important}.gap-sm-1{gap:.25rem !important}.gap-sm-2{gap:.5rem !important}.gap-sm-3{gap:1rem !important}.gap-sm-4{gap:1.5rem !important}.gap-sm-5{gap:3rem !important}.row-gap-sm-0{row-gap:0 !important}.row-gap-sm-1{row-gap:.25rem !important}.row-gap-sm-2{row-gap:.5rem !important}.row-gap-sm-3{row-gap:1rem !important}.row-gap-sm-4{row-gap:1.5rem !important}.row-gap-sm-5{row-gap:3rem !important}.column-gap-sm-0{column-gap:0 !important}.column-gap-sm-1{column-gap:.25rem !important}.column-gap-sm-2{column-gap:.5rem !important}.column-gap-sm-3{column-gap:1rem !important}.column-gap-sm-4{column-gap:1.5rem !important}.column-gap-sm-5{column-gap:3rem !important}.text-sm-start{text-align:left !important}.text-sm-end{text-align:right !important}.text-sm-center{text-align:center !important}}@media (min-width: 768px){.float-md-start{float:left !important}.float-md-end{float:right !important}.float-md-none{float:none !important}.object-fit-md-contain{object-fit:contain !important}.object-fit-md-cover{object-fit:cover !important}.object-fit-md-fill{object-fit:fill !important}.object-fit-md-scale{object-fit:scale-down !important}.object-fit-md-none{object-fit:none !important}.d-md-inline{display:inline !important}.d-md-inline-block{display:inline-block !important}.d-md-block{display:block !important}.d-md-grid{display:grid !important}.d-md-inline-grid{display:inline-grid !important}.d-md-table{display:table !important}.d-md-table-row{display:table-row !important}.d-md-table-cell{display:table-cell !important}.d-md-flex{display:flex !important}.d-md-inline-flex{display:inline-flex !important}.d-md-none{display:none !important}.flex-md-fill{flex:1 1 auto !important}.flex-md-row{flex-direction:row !important}.flex-md-column{flex-direction:column !important}.flex-md-row-reverse{flex-direction:row-reverse !important}.flex-md-column-reverse{flex-direction:column-reverse !important}.flex-md-grow-0{flex-grow:0 !important}.flex-md-grow-1{flex-grow:1 !important}.flex-md-shrink-0{flex-shrink:0 !important}.flex-md-shrink-1{flex-shrink:1 !important}.flex-md-wrap{flex-wrap:wrap !important}.flex-md-nowrap{flex-wrap:nowrap !important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-md-start{justify-content:flex-start !important}.justify-content-md-end{justify-content:flex-end !important}.justify-content-md-center{justify-content:center !important}.justify-content-md-between{justify-content:space-between !important}.justify-content-md-around{justify-content:space-around !important}.justify-content-md-evenly{justify-content:space-evenly !important}.align-items-md-start{align-items:flex-start !important}.align-items-md-end{align-items:flex-end !important}.align-items-md-center{align-items:center !important}.align-items-md-baseline{align-items:baseline !important}.align-items-md-stretch{align-items:stretch !important}.align-content-md-start{align-content:flex-start !important}.align-content-md-end{align-content:flex-end !important}.align-content-md-center{align-content:center !important}.align-content-md-between{align-content:space-between !important}.align-content-md-around{align-content:space-around !important}.align-content-md-stretch{align-content:stretch !important}.align-self-md-auto{align-self:auto !important}.align-self-md-start{align-self:flex-start !important}.align-self-md-end{align-self:flex-end !important}.align-self-md-center{align-self:center !important}.align-self-md-baseline{align-self:baseline !important}.align-self-md-stretch{align-self:stretch !important}.order-md-first{order:-1 !important}.order-md-0{order:0 !important}.order-md-1{order:1 !important}.order-md-2{order:2 !important}.order-md-3{order:3 !important}.order-md-4{order:4 !important}.order-md-5{order:5 !important}.order-md-last{order:6 !important}.m-md-0{margin:0 !important}.m-md-1{margin:.25rem !important}.m-md-2{margin:.5rem !important}.m-md-3{margin:1rem !important}.m-md-4{margin:1.5rem !important}.m-md-5{margin:3rem !important}.m-md-auto{margin:auto !important}.mx-md-0{margin-right:0 !important;margin-left:0 !important}.mx-md-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-md-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-md-3{margin-right:1rem !important;margin-left:1rem !important}.mx-md-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-md-5{margin-right:3rem !important;margin-left:3rem !important}.mx-md-auto{margin-right:auto !important;margin-left:auto !important}.my-md-0{margin-top:0 !important;margin-bottom:0 !important}.my-md-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-md-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-md-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-md-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-md-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-md-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-md-0{margin-top:0 !important}.mt-md-1{margin-top:.25rem !important}.mt-md-2{margin-top:.5rem !important}.mt-md-3{margin-top:1rem !important}.mt-md-4{margin-top:1.5rem !important}.mt-md-5{margin-top:3rem !important}.mt-md-auto{margin-top:auto !important}.me-md-0{margin-right:0 !important}.me-md-1{margin-right:.25rem !important}.me-md-2{margin-right:.5rem !important}.me-md-3{margin-right:1rem !important}.me-md-4{margin-right:1.5rem !important}.me-md-5{margin-right:3rem !important}.me-md-auto{margin-right:auto !important}.mb-md-0{margin-bottom:0 !important}.mb-md-1{margin-bottom:.25rem !important}.mb-md-2{margin-bottom:.5rem !important}.mb-md-3{margin-bottom:1rem !important}.mb-md-4{margin-bottom:1.5rem !important}.mb-md-5{margin-bottom:3rem !important}.mb-md-auto{margin-bottom:auto !important}.ms-md-0{margin-left:0 !important}.ms-md-1{margin-left:.25rem !important}.ms-md-2{margin-left:.5rem !important}.ms-md-3{margin-left:1rem !important}.ms-md-4{margin-left:1.5rem !important}.ms-md-5{margin-left:3rem !important}.ms-md-auto{margin-left:auto !important}.p-md-0{padding:0 !important}.p-md-1{padding:.25rem !important}.p-md-2{padding:.5rem !important}.p-md-3{padding:1rem !important}.p-md-4{padding:1.5rem !important}.p-md-5{padding:3rem !important}.px-md-0{padding-right:0 !important;padding-left:0 !important}.px-md-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-md-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-md-3{padding-right:1rem !important;padding-left:1rem !important}.px-md-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-md-5{padding-right:3rem !important;padding-left:3rem !important}.py-md-0{padding-top:0 !important;padding-bottom:0 !important}.py-md-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-md-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-md-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-md-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-md-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-md-0{padding-top:0 !important}.pt-md-1{padding-top:.25rem !important}.pt-md-2{padding-top:.5rem !important}.pt-md-3{padding-top:1rem !important}.pt-md-4{padding-top:1.5rem !important}.pt-md-5{padding-top:3rem !important}.pe-md-0{padding-right:0 !important}.pe-md-1{padding-right:.25rem !important}.pe-md-2{padding-right:.5rem !important}.pe-md-3{padding-right:1rem !important}.pe-md-4{padding-right:1.5rem !important}.pe-md-5{padding-right:3rem !important}.pb-md-0{padding-bottom:0 !important}.pb-md-1{padding-bottom:.25rem !important}.pb-md-2{padding-bottom:.5rem !important}.pb-md-3{padding-bottom:1rem !important}.pb-md-4{padding-bottom:1.5rem !important}.pb-md-5{padding-bottom:3rem !important}.ps-md-0{padding-left:0 !important}.ps-md-1{padding-left:.25rem !important}.ps-md-2{padding-left:.5rem !important}.ps-md-3{padding-left:1rem !important}.ps-md-4{padding-left:1.5rem !important}.ps-md-5{padding-left:3rem !important}.gap-md-0{gap:0 !important}.gap-md-1{gap:.25rem !important}.gap-md-2{gap:.5rem !important}.gap-md-3{gap:1rem !important}.gap-md-4{gap:1.5rem !important}.gap-md-5{gap:3rem !important}.row-gap-md-0{row-gap:0 !important}.row-gap-md-1{row-gap:.25rem !important}.row-gap-md-2{row-gap:.5rem !important}.row-gap-md-3{row-gap:1rem !important}.row-gap-md-4{row-gap:1.5rem !important}.row-gap-md-5{row-gap:3rem !important}.column-gap-md-0{column-gap:0 !important}.column-gap-md-1{column-gap:.25rem !important}.column-gap-md-2{column-gap:.5rem !important}.column-gap-md-3{column-gap:1rem !important}.column-gap-md-4{column-gap:1.5rem !important}.column-gap-md-5{column-gap:3rem !important}.text-md-start{text-align:left !important}.text-md-end{text-align:right !important}.text-md-center{text-align:center !important}}@media (min-width: 992px){.float-lg-start{float:left !important}.float-lg-end{float:right !important}.float-lg-none{float:none !important}.object-fit-lg-contain{object-fit:contain !important}.object-fit-lg-cover{object-fit:cover !important}.object-fit-lg-fill{object-fit:fill !important}.object-fit-lg-scale{object-fit:scale-down !important}.object-fit-lg-none{object-fit:none !important}.d-lg-inline{display:inline !important}.d-lg-inline-block{display:inline-block !important}.d-lg-block{display:block !important}.d-lg-grid{display:grid !important}.d-lg-inline-grid{display:inline-grid !important}.d-lg-table{display:table !important}.d-lg-table-row{display:table-row !important}.d-lg-table-cell{display:table-cell !important}.d-lg-flex{display:flex !important}.d-lg-inline-flex{display:inline-flex !important}.d-lg-none{display:none !important}.flex-lg-fill{flex:1 1 auto !important}.flex-lg-row{flex-direction:row !important}.flex-lg-column{flex-direction:column !important}.flex-lg-row-reverse{flex-direction:row-reverse !important}.flex-lg-column-reverse{flex-direction:column-reverse !important}.flex-lg-grow-0{flex-grow:0 !important}.flex-lg-grow-1{flex-grow:1 !important}.flex-lg-shrink-0{flex-shrink:0 !important}.flex-lg-shrink-1{flex-shrink:1 !important}.flex-lg-wrap{flex-wrap:wrap !important}.flex-lg-nowrap{flex-wrap:nowrap !important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-lg-start{justify-content:flex-start !important}.justify-content-lg-end{justify-content:flex-end !important}.justify-content-lg-center{justify-content:center !important}.justify-content-lg-between{justify-content:space-between !important}.justify-content-lg-around{justify-content:space-around !important}.justify-content-lg-evenly{justify-content:space-evenly !important}.align-items-lg-start{align-items:flex-start !important}.align-items-lg-end{align-items:flex-end !important}.align-items-lg-center{align-items:center !important}.align-items-lg-baseline{align-items:baseline !important}.align-items-lg-stretch{align-items:stretch !important}.align-content-lg-start{align-content:flex-start !important}.align-content-lg-end{align-content:flex-end !important}.align-content-lg-center{align-content:center !important}.align-content-lg-between{align-content:space-between !important}.align-content-lg-around{align-content:space-around !important}.align-content-lg-stretch{align-content:stretch !important}.align-self-lg-auto{align-self:auto !important}.align-self-lg-start{align-self:flex-start !important}.align-self-lg-end{align-self:flex-end !important}.align-self-lg-center{align-self:center !important}.align-self-lg-baseline{align-self:baseline !important}.align-self-lg-stretch{align-self:stretch !important}.order-lg-first{order:-1 !important}.order-lg-0{order:0 !important}.order-lg-1{order:1 !important}.order-lg-2{order:2 !important}.order-lg-3{order:3 !important}.order-lg-4{order:4 !important}.order-lg-5{order:5 !important}.order-lg-last{order:6 !important}.m-lg-0{margin:0 !important}.m-lg-1{margin:.25rem !important}.m-lg-2{margin:.5rem !important}.m-lg-3{margin:1rem !important}.m-lg-4{margin:1.5rem !important}.m-lg-5{margin:3rem !important}.m-lg-auto{margin:auto !important}.mx-lg-0{margin-right:0 !important;margin-left:0 !important}.mx-lg-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-lg-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-lg-3{margin-right:1rem !important;margin-left:1rem !important}.mx-lg-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-lg-5{margin-right:3rem !important;margin-left:3rem !important}.mx-lg-auto{margin-right:auto !important;margin-left:auto !important}.my-lg-0{margin-top:0 !important;margin-bottom:0 !important}.my-lg-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-lg-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-lg-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-lg-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-lg-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-lg-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-lg-0{margin-top:0 !important}.mt-lg-1{margin-top:.25rem !important}.mt-lg-2{margin-top:.5rem !important}.mt-lg-3{margin-top:1rem !important}.mt-lg-4{margin-top:1.5rem !important}.mt-lg-5{margin-top:3rem !important}.mt-lg-auto{margin-top:auto !important}.me-lg-0{margin-right:0 !important}.me-lg-1{margin-right:.25rem !important}.me-lg-2{margin-right:.5rem !important}.me-lg-3{margin-right:1rem !important}.me-lg-4{margin-right:1.5rem !important}.me-lg-5{margin-right:3rem !important}.me-lg-auto{margin-right:auto !important}.mb-lg-0{margin-bottom:0 !important}.mb-lg-1{margin-bottom:.25rem !important}.mb-lg-2{margin-bottom:.5rem !important}.mb-lg-3{margin-bottom:1rem !important}.mb-lg-4{margin-bottom:1.5rem !important}.mb-lg-5{margin-bottom:3rem !important}.mb-lg-auto{margin-bottom:auto !important}.ms-lg-0{margin-left:0 !important}.ms-lg-1{margin-left:.25rem !important}.ms-lg-2{margin-left:.5rem !important}.ms-lg-3{margin-left:1rem !important}.ms-lg-4{margin-left:1.5rem !important}.ms-lg-5{margin-left:3rem !important}.ms-lg-auto{margin-left:auto !important}.p-lg-0{padding:0 !important}.p-lg-1{padding:.25rem !important}.p-lg-2{padding:.5rem !important}.p-lg-3{padding:1rem !important}.p-lg-4{padding:1.5rem !important}.p-lg-5{padding:3rem !important}.px-lg-0{padding-right:0 !important;padding-left:0 !important}.px-lg-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-lg-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-lg-3{padding-right:1rem !important;padding-left:1rem !important}.px-lg-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-lg-5{padding-right:3rem !important;padding-left:3rem !important}.py-lg-0{padding-top:0 !important;padding-bottom:0 !important}.py-lg-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-lg-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-lg-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-lg-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-lg-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-lg-0{padding-top:0 !important}.pt-lg-1{padding-top:.25rem !important}.pt-lg-2{padding-top:.5rem !important}.pt-lg-3{padding-top:1rem !important}.pt-lg-4{padding-top:1.5rem !important}.pt-lg-5{padding-top:3rem !important}.pe-lg-0{padding-right:0 !important}.pe-lg-1{padding-right:.25rem !important}.pe-lg-2{padding-right:.5rem !important}.pe-lg-3{padding-right:1rem !important}.pe-lg-4{padding-right:1.5rem !important}.pe-lg-5{padding-right:3rem !important}.pb-lg-0{padding-bottom:0 !important}.pb-lg-1{padding-bottom:.25rem !important}.pb-lg-2{padding-bottom:.5rem !important}.pb-lg-3{padding-bottom:1rem !important}.pb-lg-4{padding-bottom:1.5rem !important}.pb-lg-5{padding-bottom:3rem !important}.ps-lg-0{padding-left:0 !important}.ps-lg-1{padding-left:.25rem !important}.ps-lg-2{padding-left:.5rem !important}.ps-lg-3{padding-left:1rem !important}.ps-lg-4{padding-left:1.5rem !important}.ps-lg-5{padding-left:3rem !important}.gap-lg-0{gap:0 !important}.gap-lg-1{gap:.25rem !important}.gap-lg-2{gap:.5rem !important}.gap-lg-3{gap:1rem !important}.gap-lg-4{gap:1.5rem !important}.gap-lg-5{gap:3rem !important}.row-gap-lg-0{row-gap:0 !important}.row-gap-lg-1{row-gap:.25rem !important}.row-gap-lg-2{row-gap:.5rem !important}.row-gap-lg-3{row-gap:1rem !important}.row-gap-lg-4{row-gap:1.5rem !important}.row-gap-lg-5{row-gap:3rem !important}.column-gap-lg-0{column-gap:0 !important}.column-gap-lg-1{column-gap:.25rem !important}.column-gap-lg-2{column-gap:.5rem !important}.column-gap-lg-3{column-gap:1rem !important}.column-gap-lg-4{column-gap:1.5rem !important}.column-gap-lg-5{column-gap:3rem !important}.text-lg-start{text-align:left !important}.text-lg-end{text-align:right !important}.text-lg-center{text-align:center !important}}@media (min-width: 1200px){.float-xl-start{float:left !important}.float-xl-end{float:right !important}.float-xl-none{float:none !important}.object-fit-xl-contain{object-fit:contain !important}.object-fit-xl-cover{object-fit:cover !important}.object-fit-xl-fill{object-fit:fill !important}.object-fit-xl-scale{object-fit:scale-down !important}.object-fit-xl-none{object-fit:none !important}.d-xl-inline{display:inline !important}.d-xl-inline-block{display:inline-block !important}.d-xl-block{display:block !important}.d-xl-grid{display:grid !important}.d-xl-inline-grid{display:inline-grid !important}.d-xl-table{display:table !important}.d-xl-table-row{display:table-row !important}.d-xl-table-cell{display:table-cell !important}.d-xl-flex{display:flex !important}.d-xl-inline-flex{display:inline-flex !important}.d-xl-none{display:none !important}.flex-xl-fill{flex:1 1 auto !important}.flex-xl-row{flex-direction:row !important}.flex-xl-column{flex-direction:column !important}.flex-xl-row-reverse{flex-direction:row-reverse !important}.flex-xl-column-reverse{flex-direction:column-reverse !important}.flex-xl-grow-0{flex-grow:0 !important}.flex-xl-grow-1{flex-grow:1 !important}.flex-xl-shrink-0{flex-shrink:0 !important}.flex-xl-shrink-1{flex-shrink:1 !important}.flex-xl-wrap{flex-wrap:wrap !important}.flex-xl-nowrap{flex-wrap:nowrap !important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-xl-start{justify-content:flex-start !important}.justify-content-xl-end{justify-content:flex-end !important}.justify-content-xl-center{justify-content:center !important}.justify-content-xl-between{justify-content:space-between !important}.justify-content-xl-around{justify-content:space-around !important}.justify-content-xl-evenly{justify-content:space-evenly !important}.align-items-xl-start{align-items:flex-start !important}.align-items-xl-end{align-items:flex-end !important}.align-items-xl-center{align-items:center !important}.align-items-xl-baseline{align-items:baseline !important}.align-items-xl-stretch{align-items:stretch !important}.align-content-xl-start{align-content:flex-start !important}.align-content-xl-end{align-content:flex-end !important}.align-content-xl-center{align-content:center !important}.align-content-xl-between{align-content:space-between !important}.align-content-xl-around{align-content:space-around !important}.align-content-xl-stretch{align-content:stretch !important}.align-self-xl-auto{align-self:auto !important}.align-self-xl-start{align-self:flex-start !important}.align-self-xl-end{align-self:flex-end !important}.align-self-xl-center{align-self:center !important}.align-self-xl-baseline{align-self:baseline !important}.align-self-xl-stretch{align-self:stretch !important}.order-xl-first{order:-1 !important}.order-xl-0{order:0 !important}.order-xl-1{order:1 !important}.order-xl-2{order:2 !important}.order-xl-3{order:3 !important}.order-xl-4{order:4 !important}.order-xl-5{order:5 !important}.order-xl-last{order:6 !important}.m-xl-0{margin:0 !important}.m-xl-1{margin:.25rem !important}.m-xl-2{margin:.5rem !important}.m-xl-3{margin:1rem !important}.m-xl-4{margin:1.5rem !important}.m-xl-5{margin:3rem !important}.m-xl-auto{margin:auto !important}.mx-xl-0{margin-right:0 !important;margin-left:0 !important}.mx-xl-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-xl-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-xl-3{margin-right:1rem !important;margin-left:1rem !important}.mx-xl-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-xl-5{margin-right:3rem !important;margin-left:3rem !important}.mx-xl-auto{margin-right:auto !important;margin-left:auto !important}.my-xl-0{margin-top:0 !important;margin-bottom:0 !important}.my-xl-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-xl-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-xl-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-xl-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-xl-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-xl-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-xl-0{margin-top:0 !important}.mt-xl-1{margin-top:.25rem !important}.mt-xl-2{margin-top:.5rem !important}.mt-xl-3{margin-top:1rem !important}.mt-xl-4{margin-top:1.5rem !important}.mt-xl-5{margin-top:3rem !important}.mt-xl-auto{margin-top:auto !important}.me-xl-0{margin-right:0 !important}.me-xl-1{margin-right:.25rem !important}.me-xl-2{margin-right:.5rem !important}.me-xl-3{margin-right:1rem !important}.me-xl-4{margin-right:1.5rem !important}.me-xl-5{margin-right:3rem !important}.me-xl-auto{margin-right:auto !important}.mb-xl-0{margin-bottom:0 !important}.mb-xl-1{margin-bottom:.25rem !important}.mb-xl-2{margin-bottom:.5rem !important}.mb-xl-3{margin-bottom:1rem !important}.mb-xl-4{margin-bottom:1.5rem !important}.mb-xl-5{margin-bottom:3rem !important}.mb-xl-auto{margin-bottom:auto !important}.ms-xl-0{margin-left:0 !important}.ms-xl-1{margin-left:.25rem !important}.ms-xl-2{margin-left:.5rem !important}.ms-xl-3{margin-left:1rem !important}.ms-xl-4{margin-left:1.5rem !important}.ms-xl-5{margin-left:3rem !important}.ms-xl-auto{margin-left:auto !important}.p-xl-0{padding:0 !important}.p-xl-1{padding:.25rem !important}.p-xl-2{padding:.5rem !important}.p-xl-3{padding:1rem !important}.p-xl-4{padding:1.5rem !important}.p-xl-5{padding:3rem !important}.px-xl-0{padding-right:0 !important;padding-left:0 !important}.px-xl-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-xl-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-xl-3{padding-right:1rem !important;padding-left:1rem !important}.px-xl-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-xl-5{padding-right:3rem !important;padding-left:3rem !important}.py-xl-0{padding-top:0 !important;padding-bottom:0 !important}.py-xl-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-xl-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-xl-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-xl-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-xl-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-xl-0{padding-top:0 !important}.pt-xl-1{padding-top:.25rem !important}.pt-xl-2{padding-top:.5rem !important}.pt-xl-3{padding-top:1rem !important}.pt-xl-4{padding-top:1.5rem !important}.pt-xl-5{padding-top:3rem !important}.pe-xl-0{padding-right:0 !important}.pe-xl-1{padding-right:.25rem !important}.pe-xl-2{padding-right:.5rem !important}.pe-xl-3{padding-right:1rem !important}.pe-xl-4{padding-right:1.5rem !important}.pe-xl-5{padding-right:3rem !important}.pb-xl-0{padding-bottom:0 !important}.pb-xl-1{padding-bottom:.25rem !important}.pb-xl-2{padding-bottom:.5rem !important}.pb-xl-3{padding-bottom:1rem !important}.pb-xl-4{padding-bottom:1.5rem !important}.pb-xl-5{padding-bottom:3rem !important}.ps-xl-0{padding-left:0 !important}.ps-xl-1{padding-left:.25rem !important}.ps-xl-2{padding-left:.5rem !important}.ps-xl-3{padding-left:1rem !important}.ps-xl-4{padding-left:1.5rem !important}.ps-xl-5{padding-left:3rem !important}.gap-xl-0{gap:0 !important}.gap-xl-1{gap:.25rem !important}.gap-xl-2{gap:.5rem !important}.gap-xl-3{gap:1rem !important}.gap-xl-4{gap:1.5rem !important}.gap-xl-5{gap:3rem !important}.row-gap-xl-0{row-gap:0 !important}.row-gap-xl-1{row-gap:.25rem !important}.row-gap-xl-2{row-gap:.5rem !important}.row-gap-xl-3{row-gap:1rem !important}.row-gap-xl-4{row-gap:1.5rem !important}.row-gap-xl-5{row-gap:3rem !important}.column-gap-xl-0{column-gap:0 !important}.column-gap-xl-1{column-gap:.25rem !important}.column-gap-xl-2{column-gap:.5rem !important}.column-gap-xl-3{column-gap:1rem !important}.column-gap-xl-4{column-gap:1.5rem !important}.column-gap-xl-5{column-gap:3rem !important}.text-xl-start{text-align:left !important}.text-xl-end{text-align:right !important}.text-xl-center{text-align:center !important}}@media (min-width: 1400px){.float-xxl-start{float:left !important}.float-xxl-end{float:right !important}.float-xxl-none{float:none !important}.object-fit-xxl-contain{object-fit:contain !important}.object-fit-xxl-cover{object-fit:cover !important}.object-fit-xxl-fill{object-fit:fill !important}.object-fit-xxl-scale{object-fit:scale-down !important}.object-fit-xxl-none{object-fit:none !important}.d-xxl-inline{display:inline !important}.d-xxl-inline-block{display:inline-block !important}.d-xxl-block{display:block !important}.d-xxl-grid{display:grid !important}.d-xxl-inline-grid{display:inline-grid !important}.d-xxl-table{display:table !important}.d-xxl-table-row{display:table-row !important}.d-xxl-table-cell{display:table-cell !important}.d-xxl-flex{display:flex !important}.d-xxl-inline-flex{display:inline-flex !important}.d-xxl-none{display:none !important}.flex-xxl-fill{flex:1 1 auto !important}.flex-xxl-row{flex-direction:row !important}.flex-xxl-column{flex-direction:column !important}.flex-xxl-row-reverse{flex-direction:row-reverse !important}.flex-xxl-column-reverse{flex-direction:column-reverse !important}.flex-xxl-grow-0{flex-grow:0 !important}.flex-xxl-grow-1{flex-grow:1 !important}.flex-xxl-shrink-0{flex-shrink:0 !important}.flex-xxl-shrink-1{flex-shrink:1 !important}.flex-xxl-wrap{flex-wrap:wrap !important}.flex-xxl-nowrap{flex-wrap:nowrap !important}.flex-xxl-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-xxl-start{justify-content:flex-start !important}.justify-content-xxl-end{justify-content:flex-end !important}.justify-content-xxl-center{justify-content:center !important}.justify-content-xxl-between{justify-content:space-between !important}.justify-content-xxl-around{justify-content:space-around !important}.justify-content-xxl-evenly{justify-content:space-evenly !important}.align-items-xxl-start{align-items:flex-start !important}.align-items-xxl-end{align-items:flex-end !important}.align-items-xxl-center{align-items:center !important}.align-items-xxl-baseline{align-items:baseline !important}.align-items-xxl-stretch{align-items:stretch !important}.align-content-xxl-start{align-content:flex-start !important}.align-content-xxl-end{align-content:flex-end !important}.align-content-xxl-center{align-content:center !important}.align-content-xxl-between{align-content:space-between !important}.align-content-xxl-around{align-content:space-around !important}.align-content-xxl-stretch{align-content:stretch !important}.align-self-xxl-auto{align-self:auto !important}.align-self-xxl-start{align-self:flex-start !important}.align-self-xxl-end{align-self:flex-end !important}.align-self-xxl-center{align-self:center !important}.align-self-xxl-baseline{align-self:baseline !important}.align-self-xxl-stretch{align-self:stretch !important}.order-xxl-first{order:-1 !important}.order-xxl-0{order:0 !important}.order-xxl-1{order:1 !important}.order-xxl-2{order:2 !important}.order-xxl-3{order:3 !important}.order-xxl-4{order:4 !important}.order-xxl-5{order:5 !important}.order-xxl-last{order:6 !important}.m-xxl-0{margin:0 !important}.m-xxl-1{margin:.25rem !important}.m-xxl-2{margin:.5rem !important}.m-xxl-3{margin:1rem !important}.m-xxl-4{margin:1.5rem !important}.m-xxl-5{margin:3rem !important}.m-xxl-auto{margin:auto !important}.mx-xxl-0{margin-right:0 !important;margin-left:0 !important}.mx-xxl-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-xxl-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-xxl-3{margin-right:1rem !important;margin-left:1rem !important}.mx-xxl-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-xxl-5{margin-right:3rem !important;margin-left:3rem !important}.mx-xxl-auto{margin-right:auto !important;margin-left:auto !important}.my-xxl-0{margin-top:0 !important;margin-bottom:0 !important}.my-xxl-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-xxl-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-xxl-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-xxl-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-xxl-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-xxl-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-xxl-0{margin-top:0 !important}.mt-xxl-1{margin-top:.25rem !important}.mt-xxl-2{margin-top:.5rem !important}.mt-xxl-3{margin-top:1rem !important}.mt-xxl-4{margin-top:1.5rem !important}.mt-xxl-5{margin-top:3rem !important}.mt-xxl-auto{margin-top:auto !important}.me-xxl-0{margin-right:0 !important}.me-xxl-1{margin-right:.25rem !important}.me-xxl-2{margin-right:.5rem !important}.me-xxl-3{margin-right:1rem !important}.me-xxl-4{margin-right:1.5rem !important}.me-xxl-5{margin-right:3rem !important}.me-xxl-auto{margin-right:auto !important}.mb-xxl-0{margin-bottom:0 !important}.mb-xxl-1{margin-bottom:.25rem !important}.mb-xxl-2{margin-bottom:.5rem !important}.mb-xxl-3{margin-bottom:1rem !important}.mb-xxl-4{margin-bottom:1.5rem !important}.mb-xxl-5{margin-bottom:3rem !important}.mb-xxl-auto{margin-bottom:auto !important}.ms-xxl-0{margin-left:0 !important}.ms-xxl-1{margin-left:.25rem !important}.ms-xxl-2{margin-left:.5rem !important}.ms-xxl-3{margin-left:1rem !important}.ms-xxl-4{margin-left:1.5rem !important}.ms-xxl-5{margin-left:3rem !important}.ms-xxl-auto{margin-left:auto !important}.p-xxl-0{padding:0 !important}.p-xxl-1{padding:.25rem !important}.p-xxl-2{padding:.5rem !important}.p-xxl-3{padding:1rem !important}.p-xxl-4{padding:1.5rem !important}.p-xxl-5{padding:3rem !important}.px-xxl-0{padding-right:0 !important;padding-left:0 !important}.px-xxl-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-xxl-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-xxl-3{padding-right:1rem !important;padding-left:1rem !important}.px-xxl-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-xxl-5{padding-right:3rem !important;padding-left:3rem !important}.py-xxl-0{padding-top:0 !important;padding-bottom:0 !important}.py-xxl-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-xxl-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-xxl-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-xxl-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-xxl-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-xxl-0{padding-top:0 !important}.pt-xxl-1{padding-top:.25rem !important}.pt-xxl-2{padding-top:.5rem !important}.pt-xxl-3{padding-top:1rem !important}.pt-xxl-4{padding-top:1.5rem !important}.pt-xxl-5{padding-top:3rem !important}.pe-xxl-0{padding-right:0 !important}.pe-xxl-1{padding-right:.25rem !important}.pe-xxl-2{padding-right:.5rem !important}.pe-xxl-3{padding-right:1rem !important}.pe-xxl-4{padding-right:1.5rem !important}.pe-xxl-5{padding-right:3rem !important}.pb-xxl-0{padding-bottom:0 !important}.pb-xxl-1{padding-bottom:.25rem !important}.pb-xxl-2{padding-bottom:.5rem !important}.pb-xxl-3{padding-bottom:1rem !important}.pb-xxl-4{padding-bottom:1.5rem !important}.pb-xxl-5{padding-bottom:3rem !important}.ps-xxl-0{padding-left:0 !important}.ps-xxl-1{padding-left:.25rem !important}.ps-xxl-2{padding-left:.5rem !important}.ps-xxl-3{padding-left:1rem !important}.ps-xxl-4{padding-left:1.5rem !important}.ps-xxl-5{padding-left:3rem !important}.gap-xxl-0{gap:0 !important}.gap-xxl-1{gap:.25rem !important}.gap-xxl-2{gap:.5rem !important}.gap-xxl-3{gap:1rem !important}.gap-xxl-4{gap:1.5rem !important}.gap-xxl-5{gap:3rem !important}.row-gap-xxl-0{row-gap:0 !important}.row-gap-xxl-1{row-gap:.25rem !important}.row-gap-xxl-2{row-gap:.5rem !important}.row-gap-xxl-3{row-gap:1rem !important}.row-gap-xxl-4{row-gap:1.5rem !important}.row-gap-xxl-5{row-gap:3rem !important}.column-gap-xxl-0{column-gap:0 !important}.column-gap-xxl-1{column-gap:.25rem !important}.column-gap-xxl-2{column-gap:.5rem !important}.column-gap-xxl-3{column-gap:1rem !important}.column-gap-xxl-4{column-gap:1.5rem !important}.column-gap-xxl-5{column-gap:3rem !important}.text-xxl-start{text-align:left !important}.text-xxl-end{text-align:right !important}.text-xxl-center{text-align:center !important}}.bg-default{color:#fff}.bg-primary{color:#fff}.bg-secondary{color:#fff}.bg-success{color:#fff}.bg-info{color:#fff}.bg-warning{color:#fff}.bg-danger{color:#fff}.bg-light{color:#000}.bg-dark{color:#fff}@media (min-width: 1200px){.fs-1{font-size:3rem !important}.fs-2{font-size:2.5rem !important}.fs-3{font-size:2rem !important}.fs-4{font-size:1.5rem !important}}@media print{.d-print-inline{display:inline !important}.d-print-inline-block{display:inline-block !important}.d-print-block{display:block !important}.d-print-grid{display:grid !important}.d-print-inline-grid{display:inline-grid !important}.d-print-table{display:table !important}.d-print-table-row{display:table-row !important}.d-print-table-cell{display:table-cell !important}.d-print-flex{display:flex !important}.d-print-inline-flex{display:inline-flex !important}.d-print-none{display:none !important}}.table th[align=left]{text-align:left}.table th[align=right]{text-align:right}.table th[align=center]{text-align:center}:root{--bslib-spacer: 1rem;--bslib-mb-spacer: var(--bslib-spacer, 1rem)}.bslib-mb-spacing{margin-bottom:var(--bslib-mb-spacer)}.bslib-gap-spacing{gap:var(--bslib-mb-spacer)}.bslib-gap-spacing>.bslib-mb-spacing,.bslib-gap-spacing>.form-group,.bslib-gap-spacing>p,.bslib-gap-spacing>pre,.bslib-gap-spacing>.shiny-html-output>.bslib-mb-spacing,.bslib-gap-spacing>.shiny-html-output>.form-group,.bslib-gap-spacing>.shiny-html-output>p,.bslib-gap-spacing>.shiny-html-output>pre,.bslib-gap-spacing>.shiny-panel-conditional>.bslib-mb-spacing,.bslib-gap-spacing>.shiny-panel-conditional>.form-group,.bslib-gap-spacing>.shiny-panel-conditional>p,.bslib-gap-spacing>.shiny-panel-conditional>pre{margin-bottom:0}.html-fill-container>.html-fill-item.bslib-mb-spacing{margin-bottom:0}.tab-content>.tab-pane.html-fill-container{display:none}.tab-content>.active.html-fill-container{display:flex}.tab-content.html-fill-container{padding:0}.bg-blue{--bslib-color-bg: #2c3e50;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-blue{--bslib-color-fg: #2c3e50;color:var(--bslib-color-fg)}.bg-indigo{--bslib-color-bg: #6610f2;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-indigo{--bslib-color-fg: #6610f2;color:var(--bslib-color-fg)}.bg-purple{--bslib-color-bg: #6f42c1;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-purple{--bslib-color-fg: #6f42c1;color:var(--bslib-color-fg)}.bg-pink{--bslib-color-bg: #e83e8c;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-pink{--bslib-color-fg: #e83e8c;color:var(--bslib-color-fg)}.bg-red{--bslib-color-bg: #e74c3c;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-red{--bslib-color-fg: #e74c3c;color:var(--bslib-color-fg)}.bg-orange{--bslib-color-bg: #fd7e14;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-orange{--bslib-color-fg: #fd7e14;color:var(--bslib-color-fg)}.bg-yellow{--bslib-color-bg: #f39c12;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-yellow{--bslib-color-fg: #f39c12;color:var(--bslib-color-fg)}.bg-green{--bslib-color-bg: #18bc9c;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-green{--bslib-color-fg: #18bc9c;color:var(--bslib-color-fg)}.bg-teal{--bslib-color-bg: #20c997;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-teal{--bslib-color-fg: #20c997;color:var(--bslib-color-fg)}.bg-cyan{--bslib-color-bg: #3498db;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-cyan{--bslib-color-fg: #3498db;color:var(--bslib-color-fg)}.text-default{--bslib-color-fg: #95a5a6}.bg-default{--bslib-color-bg: #95a5a6;--bslib-color-fg: #fff}.text-primary{--bslib-color-fg: #2c3e50}.bg-primary{--bslib-color-bg: #2c3e50;--bslib-color-fg: #fff}.text-secondary{--bslib-color-fg: #95a5a6}.bg-secondary{--bslib-color-bg: #95a5a6;--bslib-color-fg: #fff}.text-success{--bslib-color-fg: #18bc9c}.bg-success{--bslib-color-bg: #18bc9c;--bslib-color-fg: #fff}.text-info{--bslib-color-fg: #3498db}.bg-info{--bslib-color-bg: #3498db;--bslib-color-fg: #fff}.text-warning{--bslib-color-fg: #f39c12}.bg-warning{--bslib-color-bg: #f39c12;--bslib-color-fg: #fff}.text-danger{--bslib-color-fg: #e74c3c}.bg-danger{--bslib-color-bg: #e74c3c;--bslib-color-fg: #fff}.text-light{--bslib-color-fg: #ecf0f1}.bg-light{--bslib-color-bg: #ecf0f1;--bslib-color-fg: #000}.text-dark{--bslib-color-fg: #7b8a8b}.bg-dark{--bslib-color-bg: #7b8a8b;--bslib-color-fg: #fff}.bg-gradient-blue-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #432c91;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2c3e50 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #432c91;color:#fff}.bg-gradient-blue-purple{--bslib-color-fg: #fff;--bslib-color-bg: #47407d;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2c3e50 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #47407d;color:#fff}.bg-gradient-blue-pink{--bslib-color-fg: #fff;--bslib-color-bg: #773e68;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2c3e50 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #773e68;color:#fff}.bg-gradient-blue-red{--bslib-color-fg: #fff;--bslib-color-bg: #774448;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2c3e50 var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #774448;color:#fff}.bg-gradient-blue-orange{--bslib-color-fg: #fff;--bslib-color-bg: #805838;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2c3e50 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #805838;color:#fff}.bg-gradient-blue-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #7c6437;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2c3e50 var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #7c6437;color:#fff}.bg-gradient-blue-green{--bslib-color-fg: #fff;--bslib-color-bg: #24706e;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2c3e50 var(--bg-gradient-start, 36%), #18bc9c var(--bg-gradient-end, 180%)) #24706e;color:#fff}.bg-gradient-blue-teal{--bslib-color-fg: #fff;--bslib-color-bg: #27766c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2c3e50 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #27766c;color:#fff}.bg-gradient-blue-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #2f6288;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2c3e50 var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #2f6288;color:#fff}.bg-gradient-indigo-blue{--bslib-color-fg: #fff;--bslib-color-bg: #4f22b1;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #2c3e50 var(--bg-gradient-end, 180%)) #4f22b1;color:#fff}.bg-gradient-indigo-purple{--bslib-color-fg: #fff;--bslib-color-bg: #6a24de;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #6a24de;color:#fff}.bg-gradient-indigo-pink{--bslib-color-fg: #fff;--bslib-color-bg: #9a22c9;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #9a22c9;color:#fff}.bg-gradient-indigo-red{--bslib-color-fg: #fff;--bslib-color-bg: #9a28a9;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #9a28a9;color:#fff}.bg-gradient-indigo-orange{--bslib-color-fg: #fff;--bslib-color-bg: #a23c99;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #a23c99;color:#fff}.bg-gradient-indigo-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #9e4898;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #9e4898;color:#fff}.bg-gradient-indigo-green{--bslib-color-fg: #fff;--bslib-color-bg: #4755d0;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #18bc9c var(--bg-gradient-end, 180%)) #4755d0;color:#fff}.bg-gradient-indigo-teal{--bslib-color-fg: #fff;--bslib-color-bg: #4a5ace;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #4a5ace;color:#fff}.bg-gradient-indigo-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #5246e9;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #5246e9;color:#fff}.bg-gradient-purple-blue{--bslib-color-fg: #fff;--bslib-color-bg: #544094;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #2c3e50 var(--bg-gradient-end, 180%)) #544094;color:#fff}.bg-gradient-purple-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #6b2ed5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #6b2ed5;color:#fff}.bg-gradient-purple-pink{--bslib-color-fg: #fff;--bslib-color-bg: #9f40ac;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #9f40ac;color:#fff}.bg-gradient-purple-red{--bslib-color-fg: #fff;--bslib-color-bg: #9f468c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #9f468c;color:#fff}.bg-gradient-purple-orange{--bslib-color-fg: #fff;--bslib-color-bg: #a85a7c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #a85a7c;color:#fff}.bg-gradient-purple-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #a4667b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #a4667b;color:#fff}.bg-gradient-purple-green{--bslib-color-fg: #fff;--bslib-color-bg: #4c73b2;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #18bc9c var(--bg-gradient-end, 180%)) #4c73b2;color:#fff}.bg-gradient-purple-teal{--bslib-color-fg: #fff;--bslib-color-bg: #4f78b0;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #4f78b0;color:#fff}.bg-gradient-purple-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #5764cb;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #5764cb;color:#fff}.bg-gradient-pink-blue{--bslib-color-fg: #fff;--bslib-color-bg: #9d3e74;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #2c3e50 var(--bg-gradient-end, 180%)) #9d3e74;color:#fff}.bg-gradient-pink-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #b42cb5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #b42cb5;color:#fff}.bg-gradient-pink-purple{--bslib-color-fg: #fff;--bslib-color-bg: #b840a1;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #b840a1;color:#fff}.bg-gradient-pink-red{--bslib-color-fg: #fff;--bslib-color-bg: #e8446c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #e8446c;color:#fff}.bg-gradient-pink-orange{--bslib-color-fg: #fff;--bslib-color-bg: #f0585c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #f0585c;color:#fff}.bg-gradient-pink-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #ec645b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #ec645b;color:#fff}.bg-gradient-pink-green{--bslib-color-fg: #fff;--bslib-color-bg: #957092;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #18bc9c var(--bg-gradient-end, 180%)) #957092;color:#fff}.bg-gradient-pink-teal{--bslib-color-fg: #fff;--bslib-color-bg: #987690;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #987690;color:#fff}.bg-gradient-pink-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #a062ac;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #a062ac;color:#fff}.bg-gradient-red-blue{--bslib-color-fg: #fff;--bslib-color-bg: #9c4644;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #2c3e50 var(--bg-gradient-end, 180%)) #9c4644;color:#fff}.bg-gradient-red-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #b33485;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #b33485;color:#fff}.bg-gradient-red-purple{--bslib-color-fg: #fff;--bslib-color-bg: #b74871;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #b74871;color:#fff}.bg-gradient-red-pink{--bslib-color-fg: #fff;--bslib-color-bg: #e7465c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #e7465c;color:#fff}.bg-gradient-red-orange{--bslib-color-fg: #fff;--bslib-color-bg: #f0602c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #f0602c;color:#fff}.bg-gradient-red-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #ec6c2b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #ec6c2b;color:#fff}.bg-gradient-red-green{--bslib-color-fg: #fff;--bslib-color-bg: #947962;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #18bc9c var(--bg-gradient-end, 180%)) #947962;color:#fff}.bg-gradient-red-teal{--bslib-color-fg: #fff;--bslib-color-bg: #977e60;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #977e60;color:#fff}.bg-gradient-red-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #9f6a7c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #9f6a7c;color:#fff}.bg-gradient-orange-blue{--bslib-color-fg: #fff;--bslib-color-bg: #a9642c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #2c3e50 var(--bg-gradient-end, 180%)) #a9642c;color:#fff}.bg-gradient-orange-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #c1526d;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #c1526d;color:#fff}.bg-gradient-orange-purple{--bslib-color-fg: #fff;--bslib-color-bg: #c46659;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #c46659;color:#fff}.bg-gradient-orange-pink{--bslib-color-fg: #fff;--bslib-color-bg: #f56444;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #f56444;color:#fff}.bg-gradient-orange-red{--bslib-color-fg: #fff;--bslib-color-bg: #f46a24;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #f46a24;color:#fff}.bg-gradient-orange-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #f98a13;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #f98a13;color:#fff}.bg-gradient-orange-green{--bslib-color-fg: #fff;--bslib-color-bg: #a1974a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #18bc9c var(--bg-gradient-end, 180%)) #a1974a;color:#fff}.bg-gradient-orange-teal{--bslib-color-fg: #fff;--bslib-color-bg: #a59c48;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #a59c48;color:#fff}.bg-gradient-orange-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #ad8864;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #ad8864;color:#fff}.bg-gradient-yellow-blue{--bslib-color-fg: #fff;--bslib-color-bg: #a3762b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #2c3e50 var(--bg-gradient-end, 180%)) #a3762b;color:#fff}.bg-gradient-yellow-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #bb646c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #bb646c;color:#fff}.bg-gradient-yellow-purple{--bslib-color-fg: #fff;--bslib-color-bg: #be7858;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #be7858;color:#fff}.bg-gradient-yellow-pink{--bslib-color-fg: #fff;--bslib-color-bg: #ef7643;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #ef7643;color:#fff}.bg-gradient-yellow-red{--bslib-color-fg: #fff;--bslib-color-bg: #ee7c23;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #ee7c23;color:#fff}.bg-gradient-yellow-orange{--bslib-color-fg: #fff;--bslib-color-bg: #f79013;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #f79013;color:#fff}.bg-gradient-yellow-green{--bslib-color-fg: #fff;--bslib-color-bg: #9ba949;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #18bc9c var(--bg-gradient-end, 180%)) #9ba949;color:#fff}.bg-gradient-yellow-teal{--bslib-color-fg: #fff;--bslib-color-bg: #9fae47;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #9fae47;color:#fff}.bg-gradient-yellow-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #a79a62;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #a79a62;color:#fff}.bg-gradient-green-blue{--bslib-color-fg: #fff;--bslib-color-bg: #208a7e;background:linear-gradient(var(--bg-gradient-deg, 140deg), #18bc9c var(--bg-gradient-start, 36%), #2c3e50 var(--bg-gradient-end, 180%)) #208a7e;color:#fff}.bg-gradient-green-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #3777be;background:linear-gradient(var(--bg-gradient-deg, 140deg), #18bc9c var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #3777be;color:#fff}.bg-gradient-green-purple{--bslib-color-fg: #fff;--bslib-color-bg: #3b8bab;background:linear-gradient(var(--bg-gradient-deg, 140deg), #18bc9c var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #3b8bab;color:#fff}.bg-gradient-green-pink{--bslib-color-fg: #fff;--bslib-color-bg: #6b8a96;background:linear-gradient(var(--bg-gradient-deg, 140deg), #18bc9c var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #6b8a96;color:#fff}.bg-gradient-green-red{--bslib-color-fg: #fff;--bslib-color-bg: #6b8f76;background:linear-gradient(var(--bg-gradient-deg, 140deg), #18bc9c var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #6b8f76;color:#fff}.bg-gradient-green-orange{--bslib-color-fg: #fff;--bslib-color-bg: #74a366;background:linear-gradient(var(--bg-gradient-deg, 140deg), #18bc9c var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #74a366;color:#fff}.bg-gradient-green-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #70af65;background:linear-gradient(var(--bg-gradient-deg, 140deg), #18bc9c var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #70af65;color:#fff}.bg-gradient-green-teal{--bslib-color-fg: #fff;--bslib-color-bg: #1bc19a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #18bc9c var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #1bc19a;color:#fff}.bg-gradient-green-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #23aeb5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #18bc9c var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #23aeb5;color:#fff}.bg-gradient-teal-blue{--bslib-color-fg: #fff;--bslib-color-bg: #25917b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #2c3e50 var(--bg-gradient-end, 180%)) #25917b;color:#fff}.bg-gradient-teal-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #3c7fbb;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #3c7fbb;color:#fff}.bg-gradient-teal-purple{--bslib-color-fg: #fff;--bslib-color-bg: #4093a8;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #4093a8;color:#fff}.bg-gradient-teal-pink{--bslib-color-fg: #fff;--bslib-color-bg: #709193;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #709193;color:#fff}.bg-gradient-teal-red{--bslib-color-fg: #fff;--bslib-color-bg: #709773;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #709773;color:#fff}.bg-gradient-teal-orange{--bslib-color-fg: #fff;--bslib-color-bg: #78ab63;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #78ab63;color:#fff}.bg-gradient-teal-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #74b762;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #74b762;color:#fff}.bg-gradient-teal-green{--bslib-color-fg: #fff;--bslib-color-bg: #1dc499;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #18bc9c var(--bg-gradient-end, 180%)) #1dc499;color:#fff}.bg-gradient-teal-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #28b5b2;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #28b5b2;color:#fff}.bg-gradient-cyan-blue{--bslib-color-fg: #fff;--bslib-color-bg: #3174a3;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #2c3e50 var(--bg-gradient-end, 180%)) #3174a3;color:#fff}.bg-gradient-cyan-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #4862e4;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #4862e4;color:#fff}.bg-gradient-cyan-purple{--bslib-color-fg: #fff;--bslib-color-bg: #4c76d1;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #4c76d1;color:#fff}.bg-gradient-cyan-pink{--bslib-color-fg: #fff;--bslib-color-bg: #7c74bb;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #7c74bb;color:#fff}.bg-gradient-cyan-red{--bslib-color-fg: #fff;--bslib-color-bg: #7c7a9b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #7c7a9b;color:#fff}.bg-gradient-cyan-orange{--bslib-color-fg: #fff;--bslib-color-bg: #848e8b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #848e8b;color:#fff}.bg-gradient-cyan-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #809a8b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #809a8b;color:#fff}.bg-gradient-cyan-green{--bslib-color-fg: #fff;--bslib-color-bg: #29a6c2;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #18bc9c var(--bg-gradient-end, 180%)) #29a6c2;color:#fff}.bg-gradient-cyan-teal{--bslib-color-fg: #fff;--bslib-color-bg: #2cacc0;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #2cacc0;color:#fff}.bg-primary .navbar-nav .show>.nav-link,.bg-primary .navbar-nav .nav-link.active,.bg-primary .navbar-nav .nav-link:hover,.bg-primary .navbar-nav .nav-link:focus{color:#18bc9c !important}.nav-tabs .nav-link.active,.nav-tabs .nav-link.active:focus,.nav-tabs .nav-link.active:hover,.nav-tabs .nav-item.open .nav-link,.nav-tabs .nav-item.open .nav-link:focus,.nav-tabs .nav-item.open .nav-link:hover{color:#2c3e50}.pagination a:hover{text-decoration:none}.badge.bg-light{color:#7b8a8b}.alert{color:#fff;border:none}.alert a,.alert .alert-link{color:#fff;text-decoration:underline}.alert-default{background-color:#95a5a6}.alert-primary{background-color:#2c3e50}.alert-secondary{background-color:#95a5a6}.alert-success{background-color:#18bc9c}.alert-info{background-color:#3498db}.alert-warning{background-color:#f39c12}.alert-danger{background-color:#e74c3c}.alert-light{background-color:#ecf0f1}.alert-dark{background-color:#7b8a8b}.alert-light,.alert-light a,.alert-light .alert-link{color:#212529}.modal .btn-close,.toast .btn-close,.offcanvas .btn-close{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 0 1 1.414 0L8 6.586 14.293.293a1 1 0 1 1 1.414 1.414L9.414 8l6.293 6.293a1 1 0 0 1-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 0 1-1.414-1.414L6.586 8 .293 1.707a1 1 0 0 1 0-1.414z'/%3e%3c/svg%3e")}.row>main{max-width:50rem}@media (min-width: 1200px) and (max-width: 1399.98px){.container .row{justify-content:space-evenly}}@media (min-width: 1400px){body{font-size:18px}.col-md-3{margin-left:5rem}}.navbar-nav .nav-item>.nav-link{border-radius:.375rem;padding:0.5rem}.navbar>.container{align-items:baseline;-webkit-align-items:baseline}.navbar-light .navbar-nav .active>.nav-link{background:#ecf0f1;color:#212529}.navbar-dark .navbar-nav .active>.nav-link{background:#343a40;color:#fff}.navbar-dark .navbar-nav .nav-item>.nav-link:hover,.navbar-light .navbar-nav .nav-item>.nav-link:hover{background:rgba(44,62,80,0.1)}.navbar-dark input[type="search"]{border-color:#95a5a6;background-color:#212529;color:#ecf0f1}input[type="search"]{border-color:#dee2e6;width:12rem}.headroom{will-change:transform;transition:transform 400ms ease}.headroom--pinned{transform:translateY(0%)}.headroom--unpinned{transform:translateY(-100%)}.row>main,.row>aside{margin-top:56px}html,body{scroll-padding:56px}@media (min-width: 576px){#toc{position:sticky;top:56px;max-height:calc(100vh - 56px - 1rem);overflow-y:auto}}aside h2,aside .h2{margin-top:1.5rem;font-size:1.25rem}aside .roles{color:#4d5154}aside .list-unstyled li{margin-bottom:0.5rem}aside .dev-status .list-unstyled li{margin-bottom:0.1rem}@media (max-width: 575.98px){aside{margin:0.5rem;width:calc(100vw - 1rem);background-color:#f8f9fa;border-color:#dee2e6;border-radius:.375rem}aside h2:first-child,aside .h2:first-child{margin-top:1rem}}body{position:relative}#toc>.nav{margin-bottom:1rem}#toc>.nav a.nav-link{color:inherit;padding:0.25rem 0.5rem;margin-bottom:2px;border-radius:.375rem;border:0 solid #dee2e6}#toc>.nav a.nav-link:hover,#toc>.nav a.nav-link:focus{background-color:rgba(44,62,80,0.1);color:#000}#toc>.nav a.nav-link.active{background-color:#e9e9ea;color:#000}#toc>.nav .nav a.nav-link{margin-left:0.5rem}#toc>.nav .nav{display:none !important}#toc>.nav a.active+.nav{display:flex !important}footer{margin:1rem 0 1rem 0;padding-top:1rem;font-size:.875em;border-top:1px solid #dee2e6;background:rgba(0,0,0,0);color:#4d5154;display:flex;column-gap:1rem}@media (max-width: 575.98px){footer{flex-direction:column}}@media (min-width: 576px){footer .pkgdown-footer-right{text-align:right}}footer div{flex:1 1 auto}html,body{height:100%}body>.container{min-height:100%;display:flex;flex-direction:column}body>.container .row{flex:1 0 auto}::selection{background-color:#d5d8dc}main img{max-width:100%;height:auto}main table{display:block;overflow:auto}body{font-display:fallback}.page-header{border-bottom:1px solid #dee2e6;padding-bottom:0.5rem;margin-bottom:0.5rem;margin-top:1.5rem}dd{margin-left:1.5rem}summary{margin-bottom:0.5rem}details{margin-bottom:1rem}.html-widget{margin-bottom:1rem}a.anchor{display:none;margin-left:5px;width:Min(0.9em, 20px);height:Min(0.9em, 20px);background-image:url(../../link.svg);background-repeat:no-repeat;background-size:Min(0.9em, 20px) Min(0.9em, 20px);background-position:center center}h2:hover .anchor,.h2:hover .anchor,h3:hover .anchor,.h3:hover .anchor,h4:hover .anchor,.h4:hover .anchor,h5:hover .anchor,.h5:hover .anchor,h6:hover .anchor,.h6:hover .anchor{display:inline-block}.orcid{color:#A6CE39;margin-right:4px}.fab{font-family:"Font Awesome 5 Brands" !important}img.logo{float:right;width:100px;margin-left:30px}.template-home img.logo{width:120px}@media (max-width: 575.98px){img.logo{width:80px}}@media (min-width: 576px){.page-header{min-height:88px}.template-home .page-header{min-height:104px}}.line-block{margin-bottom:1rem}.template-reference-index dt{font-weight:normal}.template-reference-index code{word-wrap:normal}.icon{float:right}.icon img{width:40px}a[href='#main']{position:absolute;margin:4px;padding:0.75rem;background-color:#fff;text-decoration:none;z-index:2000}a.footnote-ref{cursor:pointer}.popover{width:Min(100vw, 32rem);font-size:0.9rem;box-shadow:4px 4px 8px rgba(0,0,0,0.3)}.popover-body{padding:0.75rem}.popover-body p:last-child{margin-bottom:0}.tab-content{padding:1rem}.tabset-pills .tab-content{border:solid 1px #e5e5e5}.tab-content{display:flex}.tab-content>.tab-pane{display:block;visibility:hidden;margin-right:-100%;width:100%}.tab-content>.active{visibility:visible}div.csl-entry{clear:both}.hanging-indent div.csl-entry{margin-left:2em;text-indent:-2em}div.csl-left-margin{min-width:2em;float:left}div.csl-right-inline{margin-left:2em;padding-left:1em}div.csl-indent{margin-left:2em}pre,pre code{word-wrap:normal}code{overflow-wrap:break-word}.hasCopyButton{position:relative}.btn-copy-ex{position:absolute;right:5px;top:5px;visibility:hidden}.hasCopyButton:hover button.btn-copy-ex{visibility:visible}pre{padding:1rem 0.5rem}@media (max-width: 575.98px){div>div>pre{margin-left:calc(var(--bs-gutter-x) * -.5);margin-right:calc(var(--bs-gutter-x) * -.5);border-radius:0;padding-left:1rem;padding-right:1rem}.btn-copy-ex{right:calc(var(--bs-gutter-x) * -.5 + 5px)}}code a:any-link{color:inherit;text-decoration-color:#95a5a6}pre code{padding:0;background:transparent}pre code .error,pre code .warning{font-weight:bolder}pre .img img,pre .r-plt img{margin:5px 0;background-color:#fff}@media print{code a:link:after,code a:visited:after{content:""}}a.sourceLine:hover{text-decoration:none}mark,.mark{background:linear-gradient(-100deg, rgba(52,152,219,0.2), rgba(52,152,219,0.7) 95%, rgba(52,152,219,0.1))}.algolia-autocomplete .aa-hint{color:#212529}.algolia-autocomplete .aa-dropdown-menu{width:Max(100%, 20rem);background-color:#fff;border:1px solid var(--bs-border-color);margin-top:2px;max-height:50vh;overflow-y:auto}.algolia-autocomplete .aa-dropdown-menu .aa-suggestion{cursor:pointer;padding:5px 4px;border-bottom:1px #ecf0f1 solid;font-size:0.9rem;color:#212529}.search-details{font-size:0.9rem;color:#2c3e50;display:inline;font-weight:bolder}.algolia-autocomplete .aa-dropdown-menu .aa-suggestion.aa-cursor{background-color:#eaecee}pre{background-color:#f1f3f5}pre code{color:#003B4F}pre code span.al{color:#AD0000}pre code span.an{color:#5E5E5E}pre code span.at{color:#657422}pre code span.bn{color:#AD0000}pre code span.cf{color:#003B4F}pre code span.ch{color:#20794D}pre code span.cn{color:#8f5902}pre code span.co{color:#5E5E5E}pre code span.cv{color:#5E5E5E;font-style:italic}pre code span.do{color:#5E5E5E;font-style:italic}pre code span.dt{color:#AD0000}pre code span.dv{color:#AD0000}pre code span.er{color:#AD0000}pre code span.fl{color:#AD0000}pre code span.fu{color:#4758AB}pre code span.im{color:#00769E}pre code span.in{color:#5E5E5E}pre code span.kw{color:#003B4F}pre code span.op{color:#5E5E5E}pre code span.ot{color:#003B4F}pre code span.pp{color:#AD0000}pre code span.sc{color:#5E5E5E}pre code span.ss{color:#20794D}pre code span.st{color:#20794D}pre code span.va{color:#111111}pre code span.vs{color:#20794D}pre code span.wa{color:#5E5E5E;font-style:italic}
diff --git a/docs/deps/bootstrap-5.3.1/font.css b/docs/deps/bootstrap-5.3.1/font.css
new file mode 100644
index 00000000..02b33a19
--- /dev/null
+++ b/docs/deps/bootstrap-5.3.1/font.css
@@ -0,0 +1,54 @@
+/* latin-ext */
+@font-face {
+ font-family: 'Lato';
+ font-style: italic;
+ font-weight: 400;
+ font-display: swap;
+ src: url(fonts/S6u8w4BMUTPHjxsAUi-qJCY.woff2) format('woff2');
+ unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
+}
+/* latin */
+@font-face {
+ font-family: 'Lato';
+ font-style: italic;
+ font-weight: 400;
+ font-display: swap;
+ src: url(fonts/S6u8w4BMUTPHjxsAXC-q.woff2) format('woff2');
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
+}
+/* latin-ext */
+@font-face {
+ font-family: 'Lato';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(fonts/S6uyw4BMUTPHjxAwXjeu.woff2) format('woff2');
+ unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
+}
+/* latin */
+@font-face {
+ font-family: 'Lato';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(fonts/S6uyw4BMUTPHjx4wXg.woff2) format('woff2');
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
+}
+/* latin-ext */
+@font-face {
+ font-family: 'Lato';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(fonts/S6u9w4BMUTPHh6UVSwaPGR_p.woff2) format('woff2');
+ unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
+}
+/* latin */
+@font-face {
+ font-family: 'Lato';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(fonts/S6u9w4BMUTPHh6UVSwiPGQ.woff2) format('woff2');
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
+}
diff --git a/docs/deps/bootstrap-5.3.1/fonts/07d40e985ad7c747025dabb9f22142c4.woff2 b/docs/deps/bootstrap-5.3.1/fonts/07d40e985ad7c747025dabb9f22142c4.woff2
new file mode 100644
index 00000000..a45f4778
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/07d40e985ad7c747025dabb9f22142c4.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/1Ptug8zYS_SKggPNyC0ITw.woff2 b/docs/deps/bootstrap-5.3.1/fonts/1Ptug8zYS_SKggPNyC0ITw.woff2
new file mode 100644
index 00000000..f4675de1
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/1Ptug8zYS_SKggPNyC0ITw.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/1Ptug8zYS_SKggPNyCAIT5lu.woff2 b/docs/deps/bootstrap-5.3.1/fonts/1Ptug8zYS_SKggPNyCAIT5lu.woff2
new file mode 100644
index 00000000..7ac6ae08
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/1Ptug8zYS_SKggPNyCAIT5lu.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/1Ptug8zYS_SKggPNyCIIT5lu.woff2 b/docs/deps/bootstrap-5.3.1/fonts/1Ptug8zYS_SKggPNyCIIT5lu.woff2
new file mode 100644
index 00000000..3d4f643a
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/1Ptug8zYS_SKggPNyCIIT5lu.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/1Ptug8zYS_SKggPNyCMIT5lu.woff2 b/docs/deps/bootstrap-5.3.1/fonts/1Ptug8zYS_SKggPNyCMIT5lu.woff2
new file mode 100644
index 00000000..753e47ca
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/1Ptug8zYS_SKggPNyCMIT5lu.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/1Ptug8zYS_SKggPNyCkIT5lu.woff2 b/docs/deps/bootstrap-5.3.1/fonts/1Ptug8zYS_SKggPNyCkIT5lu.woff2
new file mode 100644
index 00000000..49dbbaa5
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/1Ptug8zYS_SKggPNyCkIT5lu.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/1f5e011d6aae0d98fc0518e1a303e99a.woff2 b/docs/deps/bootstrap-5.3.1/fonts/1f5e011d6aae0d98fc0518e1a303e99a.woff2
new file mode 100644
index 00000000..8f9ec7cc
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/1f5e011d6aae0d98fc0518e1a303e99a.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/4iCs6KVjbNBYlgoKcQ72j00.woff2 b/docs/deps/bootstrap-5.3.1/fonts/4iCs6KVjbNBYlgoKcQ72j00.woff2
new file mode 100644
index 00000000..e5cdc99a
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/4iCs6KVjbNBYlgoKcQ72j00.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/4iCs6KVjbNBYlgoKcg72j00.woff2 b/docs/deps/bootstrap-5.3.1/fonts/4iCs6KVjbNBYlgoKcg72j00.woff2
new file mode 100644
index 00000000..3804815a
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/4iCs6KVjbNBYlgoKcg72j00.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/4iCs6KVjbNBYlgoKcw72j00.woff2 b/docs/deps/bootstrap-5.3.1/fonts/4iCs6KVjbNBYlgoKcw72j00.woff2
new file mode 100644
index 00000000..b52cff96
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/4iCs6KVjbNBYlgoKcw72j00.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/4iCs6KVjbNBYlgoKew72j00.woff2 b/docs/deps/bootstrap-5.3.1/fonts/4iCs6KVjbNBYlgoKew72j00.woff2
new file mode 100644
index 00000000..cb672f2b
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/4iCs6KVjbNBYlgoKew72j00.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/4iCs6KVjbNBYlgoKfA72j00.woff2 b/docs/deps/bootstrap-5.3.1/fonts/4iCs6KVjbNBYlgoKfA72j00.woff2
new file mode 100644
index 00000000..dc3c2953
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/4iCs6KVjbNBYlgoKfA72j00.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/4iCs6KVjbNBYlgoKfw72.woff2 b/docs/deps/bootstrap-5.3.1/fonts/4iCs6KVjbNBYlgoKfw72.woff2
new file mode 100644
index 00000000..8070e4f7
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/4iCs6KVjbNBYlgoKfw72.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/4iCv6KVjbNBYlgoCxCvjs2yNL4U.woff2 b/docs/deps/bootstrap-5.3.1/fonts/4iCv6KVjbNBYlgoCxCvjs2yNL4U.woff2
new file mode 100644
index 00000000..926a1e6f
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/4iCv6KVjbNBYlgoCxCvjs2yNL4U.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/4iCv6KVjbNBYlgoCxCvjsGyN.woff2 b/docs/deps/bootstrap-5.3.1/fonts/4iCv6KVjbNBYlgoCxCvjsGyN.woff2
new file mode 100644
index 00000000..2c08bc62
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/4iCv6KVjbNBYlgoCxCvjsGyN.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/4iCv6KVjbNBYlgoCxCvjtGyNL4U.woff2 b/docs/deps/bootstrap-5.3.1/fonts/4iCv6KVjbNBYlgoCxCvjtGyNL4U.woff2
new file mode 100644
index 00000000..6d732de1
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/4iCv6KVjbNBYlgoCxCvjtGyNL4U.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/4iCv6KVjbNBYlgoCxCvjvGyNL4U.woff2 b/docs/deps/bootstrap-5.3.1/fonts/4iCv6KVjbNBYlgoCxCvjvGyNL4U.woff2
new file mode 100644
index 00000000..d2fb863a
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/4iCv6KVjbNBYlgoCxCvjvGyNL4U.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/4iCv6KVjbNBYlgoCxCvjvWyNL4U.woff2 b/docs/deps/bootstrap-5.3.1/fonts/4iCv6KVjbNBYlgoCxCvjvWyNL4U.woff2
new file mode 100644
index 00000000..5386e806
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/4iCv6KVjbNBYlgoCxCvjvWyNL4U.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/4iCv6KVjbNBYlgoCxCvjvmyNL4U.woff2 b/docs/deps/bootstrap-5.3.1/fonts/4iCv6KVjbNBYlgoCxCvjvmyNL4U.woff2
new file mode 100644
index 00000000..0d62144c
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/4iCv6KVjbNBYlgoCxCvjvmyNL4U.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/626330658504e338ee86aec8e957426b.woff2 b/docs/deps/bootstrap-5.3.1/fonts/626330658504e338ee86aec8e957426b.woff2
new file mode 100644
index 00000000..381d41fb
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/626330658504e338ee86aec8e957426b.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/6xK1dSBYKcSV-LCoeQqfX1RYOo3qPZ7jsDJT9g.woff2 b/docs/deps/bootstrap-5.3.1/fonts/6xK1dSBYKcSV-LCoeQqfX1RYOo3qPZ7jsDJT9g.woff2
new file mode 100644
index 00000000..2bcdb320
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/6xK1dSBYKcSV-LCoeQqfX1RYOo3qPZ7jsDJT9g.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/6xK1dSBYKcSV-LCoeQqfX1RYOo3qPZ7ksDJT9g.woff2 b/docs/deps/bootstrap-5.3.1/fonts/6xK1dSBYKcSV-LCoeQqfX1RYOo3qPZ7ksDJT9g.woff2
new file mode 100644
index 00000000..6a8b92a3
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/6xK1dSBYKcSV-LCoeQqfX1RYOo3qPZ7ksDJT9g.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/6xK1dSBYKcSV-LCoeQqfX1RYOo3qPZ7nsDI.woff2 b/docs/deps/bootstrap-5.3.1/fonts/6xK1dSBYKcSV-LCoeQqfX1RYOo3qPZ7nsDI.woff2
new file mode 100644
index 00000000..5d4d718e
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/6xK1dSBYKcSV-LCoeQqfX1RYOo3qPZ7nsDI.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/6xK1dSBYKcSV-LCoeQqfX1RYOo3qPZ7osDJT9g.woff2 b/docs/deps/bootstrap-5.3.1/fonts/6xK1dSBYKcSV-LCoeQqfX1RYOo3qPZ7osDJT9g.woff2
new file mode 100644
index 00000000..c9300352
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/6xK1dSBYKcSV-LCoeQqfX1RYOo3qPZ7osDJT9g.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/6xK1dSBYKcSV-LCoeQqfX1RYOo3qPZ7psDJT9g.woff2 b/docs/deps/bootstrap-5.3.1/fonts/6xK1dSBYKcSV-LCoeQqfX1RYOo3qPZ7psDJT9g.woff2
new file mode 100644
index 00000000..190e8ac0
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/6xK1dSBYKcSV-LCoeQqfX1RYOo3qPZ7psDJT9g.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/6xK1dSBYKcSV-LCoeQqfX1RYOo3qPZ7qsDJT9g.woff2 b/docs/deps/bootstrap-5.3.1/fonts/6xK1dSBYKcSV-LCoeQqfX1RYOo3qPZ7qsDJT9g.woff2
new file mode 100644
index 00000000..7b21aa84
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/6xK1dSBYKcSV-LCoeQqfX1RYOo3qPZ7qsDJT9g.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/6xK1dSBYKcSV-LCoeQqfX1RYOo3qPZ7rsDJT9g.woff2 b/docs/deps/bootstrap-5.3.1/fonts/6xK1dSBYKcSV-LCoeQqfX1RYOo3qPZ7rsDJT9g.woff2
new file mode 100644
index 00000000..180e76d9
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/6xK1dSBYKcSV-LCoeQqfX1RYOo3qPZ7rsDJT9g.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/6xK3dSBYKcSV-LCoeQqfX1RYOo3qN67lqDY.woff2 b/docs/deps/bootstrap-5.3.1/fonts/6xK3dSBYKcSV-LCoeQqfX1RYOo3qN67lqDY.woff2
new file mode 100644
index 00000000..f9915277
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/6xK3dSBYKcSV-LCoeQqfX1RYOo3qN67lqDY.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/6xK3dSBYKcSV-LCoeQqfX1RYOo3qNK7lqDY.woff2 b/docs/deps/bootstrap-5.3.1/fonts/6xK3dSBYKcSV-LCoeQqfX1RYOo3qNK7lqDY.woff2
new file mode 100644
index 00000000..69d26d80
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/6xK3dSBYKcSV-LCoeQqfX1RYOo3qNK7lqDY.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/6xK3dSBYKcSV-LCoeQqfX1RYOo3qNa7lqDY.woff2 b/docs/deps/bootstrap-5.3.1/fonts/6xK3dSBYKcSV-LCoeQqfX1RYOo3qNa7lqDY.woff2
new file mode 100644
index 00000000..5c9f701b
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/6xK3dSBYKcSV-LCoeQqfX1RYOo3qNa7lqDY.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/6xK3dSBYKcSV-LCoeQqfX1RYOo3qNq7lqDY.woff2 b/docs/deps/bootstrap-5.3.1/fonts/6xK3dSBYKcSV-LCoeQqfX1RYOo3qNq7lqDY.woff2
new file mode 100644
index 00000000..a61ec915
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/6xK3dSBYKcSV-LCoeQqfX1RYOo3qNq7lqDY.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/6xK3dSBYKcSV-LCoeQqfX1RYOo3qO67lqDY.woff2 b/docs/deps/bootstrap-5.3.1/fonts/6xK3dSBYKcSV-LCoeQqfX1RYOo3qO67lqDY.woff2
new file mode 100644
index 00000000..33145f94
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/6xK3dSBYKcSV-LCoeQqfX1RYOo3qO67lqDY.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/6xK3dSBYKcSV-LCoeQqfX1RYOo3qOK7l.woff2 b/docs/deps/bootstrap-5.3.1/fonts/6xK3dSBYKcSV-LCoeQqfX1RYOo3qOK7l.woff2
new file mode 100644
index 00000000..b1986c23
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/6xK3dSBYKcSV-LCoeQqfX1RYOo3qOK7l.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/6xK3dSBYKcSV-LCoeQqfX1RYOo3qPK7lqDY.woff2 b/docs/deps/bootstrap-5.3.1/fonts/6xK3dSBYKcSV-LCoeQqfX1RYOo3qPK7lqDY.woff2
new file mode 100644
index 00000000..2462c511
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/6xK3dSBYKcSV-LCoeQqfX1RYOo3qPK7lqDY.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3i54rwkxduz8A.woff2 b/docs/deps/bootstrap-5.3.1/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3i54rwkxduz8A.woff2
new file mode 100644
index 00000000..ccf6b8e6
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3i54rwkxduz8A.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3i54rwlBduz8A.woff2 b/docs/deps/bootstrap-5.3.1/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3i54rwlBduz8A.woff2
new file mode 100644
index 00000000..8b03f91b
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3i54rwlBduz8A.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3i54rwlxdu.woff2 b/docs/deps/bootstrap-5.3.1/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3i54rwlxdu.woff2
new file mode 100644
index 00000000..3ca3e26c
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3i54rwlxdu.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3i54rwmBduz8A.woff2 b/docs/deps/bootstrap-5.3.1/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3i54rwmBduz8A.woff2
new file mode 100644
index 00000000..daa43962
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3i54rwmBduz8A.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3i54rwmRduz8A.woff2 b/docs/deps/bootstrap-5.3.1/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3i54rwmRduz8A.woff2
new file mode 100644
index 00000000..7916a329
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3i54rwmRduz8A.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3i54rwmhduz8A.woff2 b/docs/deps/bootstrap-5.3.1/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3i54rwmhduz8A.woff2
new file mode 100644
index 00000000..5cf09980
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3i54rwmhduz8A.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3i54rwmxduz8A.woff2 b/docs/deps/bootstrap-5.3.1/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3i54rwmxduz8A.woff2
new file mode 100644
index 00000000..de50d2b5
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3i54rwmxduz8A.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwkxduz8A.woff2 b/docs/deps/bootstrap-5.3.1/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwkxduz8A.woff2
new file mode 100644
index 00000000..cd3f1593
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwkxduz8A.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwlBduz8A.woff2 b/docs/deps/bootstrap-5.3.1/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwlBduz8A.woff2
new file mode 100644
index 00000000..d0a493f5
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwlBduz8A.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwlxdu.woff2 b/docs/deps/bootstrap-5.3.1/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwlxdu.woff2
new file mode 100644
index 00000000..134cce1d
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwlxdu.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwmBduz8A.woff2 b/docs/deps/bootstrap-5.3.1/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwmBduz8A.woff2
new file mode 100644
index 00000000..29fb3995
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwmBduz8A.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwmRduz8A.woff2 b/docs/deps/bootstrap-5.3.1/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwmRduz8A.woff2
new file mode 100644
index 00000000..889d871f
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwmRduz8A.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwmhduz8A.woff2 b/docs/deps/bootstrap-5.3.1/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwmhduz8A.woff2
new file mode 100644
index 00000000..b5e72d12
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwmhduz8A.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwmxduz8A.woff2 b/docs/deps/bootstrap-5.3.1/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwmxduz8A.woff2
new file mode 100644
index 00000000..d62d6fcf
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwmxduz8A.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwkxduz8A.woff2 b/docs/deps/bootstrap-5.3.1/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwkxduz8A.woff2
new file mode 100644
index 00000000..9f2cdfc7
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwkxduz8A.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwlBduz8A.woff2 b/docs/deps/bootstrap-5.3.1/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwlBduz8A.woff2
new file mode 100644
index 00000000..51260e3f
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwlBduz8A.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwlxdu.woff2 b/docs/deps/bootstrap-5.3.1/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwlxdu.woff2
new file mode 100644
index 00000000..86e47796
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwlxdu.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwmBduz8A.woff2 b/docs/deps/bootstrap-5.3.1/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwmBduz8A.woff2
new file mode 100644
index 00000000..e538c265
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwmBduz8A.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwmRduz8A.woff2 b/docs/deps/bootstrap-5.3.1/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwmRduz8A.woff2
new file mode 100644
index 00000000..0a9a5205
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwmRduz8A.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwmhduz8A.woff2 b/docs/deps/bootstrap-5.3.1/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwmhduz8A.woff2
new file mode 100644
index 00000000..fa70af3a
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwmhduz8A.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwmxduz8A.woff2 b/docs/deps/bootstrap-5.3.1/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwmxduz8A.woff2
new file mode 100644
index 00000000..47872fbc
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwmxduz8A.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/CSR54z1Qlv-GDxkbKVQ_dFsvWNReuQ.woff2 b/docs/deps/bootstrap-5.3.1/fonts/CSR54z1Qlv-GDxkbKVQ_dFsvWNReuQ.woff2
new file mode 100644
index 00000000..81e14769
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/CSR54z1Qlv-GDxkbKVQ_dFsvWNReuQ.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/CSR54z1Qlv-GDxkbKVQ_dFsvWNpeudwk.woff2 b/docs/deps/bootstrap-5.3.1/fonts/CSR54z1Qlv-GDxkbKVQ_dFsvWNpeudwk.woff2
new file mode 100644
index 00000000..3d9ec072
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/CSR54z1Qlv-GDxkbKVQ_dFsvWNpeudwk.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/CSR64z1Qlv-GDxkbKVQ_fO4KTet_.woff2 b/docs/deps/bootstrap-5.3.1/fonts/CSR64z1Qlv-GDxkbKVQ_fO4KTet_.woff2
new file mode 100644
index 00000000..12c485e0
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/CSR64z1Qlv-GDxkbKVQ_fO4KTet_.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/CSR64z1Qlv-GDxkbKVQ_fOAKTQ.woff2 b/docs/deps/bootstrap-5.3.1/fonts/CSR64z1Qlv-GDxkbKVQ_fOAKTQ.woff2
new file mode 100644
index 00000000..c58efa85
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/CSR64z1Qlv-GDxkbKVQ_fOAKTQ.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/HI_QiYsKILxRpg3hIP6sJ7fM7PqlONvQlMIXxw.woff2 b/docs/deps/bootstrap-5.3.1/fonts/HI_QiYsKILxRpg3hIP6sJ7fM7PqlONvQlMIXxw.woff2
new file mode 100644
index 00000000..5a5cd9c5
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/HI_QiYsKILxRpg3hIP6sJ7fM7PqlONvQlMIXxw.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/HI_QiYsKILxRpg3hIP6sJ7fM7PqlONvUlMI.woff2 b/docs/deps/bootstrap-5.3.1/fonts/HI_QiYsKILxRpg3hIP6sJ7fM7PqlONvUlMI.woff2
new file mode 100644
index 00000000..a455e2b9
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/HI_QiYsKILxRpg3hIP6sJ7fM7PqlONvUlMI.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/HI_QiYsKILxRpg3hIP6sJ7fM7PqlONvXlMIXxw.woff2 b/docs/deps/bootstrap-5.3.1/fonts/HI_QiYsKILxRpg3hIP6sJ7fM7PqlONvXlMIXxw.woff2
new file mode 100644
index 00000000..b455dfec
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/HI_QiYsKILxRpg3hIP6sJ7fM7PqlONvXlMIXxw.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/HI_QiYsKILxRpg3hIP6sJ7fM7PqlONvYlMIXxw.woff2 b/docs/deps/bootstrap-5.3.1/fonts/HI_QiYsKILxRpg3hIP6sJ7fM7PqlONvYlMIXxw.woff2
new file mode 100644
index 00000000..6fbd85ab
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/HI_QiYsKILxRpg3hIP6sJ7fM7PqlONvYlMIXxw.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/HI_QiYsKILxRpg3hIP6sJ7fM7PqlONvZlMIXxw.woff2 b/docs/deps/bootstrap-5.3.1/fonts/HI_QiYsKILxRpg3hIP6sJ7fM7PqlONvZlMIXxw.woff2
new file mode 100644
index 00000000..df5f1932
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/HI_QiYsKILxRpg3hIP6sJ7fM7PqlONvZlMIXxw.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/HI_QiYsKILxRpg3hIP6sJ7fM7PqlONvalMIXxw.woff2 b/docs/deps/bootstrap-5.3.1/fonts/HI_QiYsKILxRpg3hIP6sJ7fM7PqlONvalMIXxw.woff2
new file mode 100644
index 00000000..29531f47
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/HI_QiYsKILxRpg3hIP6sJ7fM7PqlONvalMIXxw.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/HI_QiYsKILxRpg3hIP6sJ7fM7PqlONvblMIXxw.woff2 b/docs/deps/bootstrap-5.3.1/fonts/HI_QiYsKILxRpg3hIP6sJ7fM7PqlONvblMIXxw.woff2
new file mode 100644
index 00000000..36428b18
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/HI_QiYsKILxRpg3hIP6sJ7fM7PqlONvblMIXxw.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/HI_SiYsKILxRpg3hIP6sJ7fM7PqlM-vWjMY.woff2 b/docs/deps/bootstrap-5.3.1/fonts/HI_SiYsKILxRpg3hIP6sJ7fM7PqlM-vWjMY.woff2
new file mode 100644
index 00000000..51cc9634
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/HI_SiYsKILxRpg3hIP6sJ7fM7PqlM-vWjMY.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/HI_SiYsKILxRpg3hIP6sJ7fM7PqlMOvWjMY.woff2 b/docs/deps/bootstrap-5.3.1/fonts/HI_SiYsKILxRpg3hIP6sJ7fM7PqlMOvWjMY.woff2
new file mode 100644
index 00000000..1059d866
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/HI_SiYsKILxRpg3hIP6sJ7fM7PqlMOvWjMY.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/HI_SiYsKILxRpg3hIP6sJ7fM7PqlMevWjMY.woff2 b/docs/deps/bootstrap-5.3.1/fonts/HI_SiYsKILxRpg3hIP6sJ7fM7PqlMevWjMY.woff2
new file mode 100644
index 00000000..82b2771f
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/HI_SiYsKILxRpg3hIP6sJ7fM7PqlMevWjMY.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/HI_SiYsKILxRpg3hIP6sJ7fM7PqlMuvWjMY.woff2 b/docs/deps/bootstrap-5.3.1/fonts/HI_SiYsKILxRpg3hIP6sJ7fM7PqlMuvWjMY.woff2
new file mode 100644
index 00000000..959a0596
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/HI_SiYsKILxRpg3hIP6sJ7fM7PqlMuvWjMY.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/HI_SiYsKILxRpg3hIP6sJ7fM7PqlOevWjMY.woff2 b/docs/deps/bootstrap-5.3.1/fonts/HI_SiYsKILxRpg3hIP6sJ7fM7PqlOevWjMY.woff2
new file mode 100644
index 00000000..b52412fc
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/HI_SiYsKILxRpg3hIP6sJ7fM7PqlOevWjMY.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/HI_SiYsKILxRpg3hIP6sJ7fM7PqlPevW.woff2 b/docs/deps/bootstrap-5.3.1/fonts/HI_SiYsKILxRpg3hIP6sJ7fM7PqlPevW.woff2
new file mode 100644
index 00000000..92ec082a
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/HI_SiYsKILxRpg3hIP6sJ7fM7PqlPevW.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/HI_SiYsKILxRpg3hIP6sJ7fM7PqlPuvWjMY.woff2 b/docs/deps/bootstrap-5.3.1/fonts/HI_SiYsKILxRpg3hIP6sJ7fM7PqlPuvWjMY.woff2
new file mode 100644
index 00000000..a15fcd88
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/HI_SiYsKILxRpg3hIP6sJ7fM7PqlPuvWjMY.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/JTUSjIg1_i6t8kCHKm459W1hyzbi.woff2 b/docs/deps/bootstrap-5.3.1/fonts/JTUSjIg1_i6t8kCHKm459W1hyzbi.woff2
new file mode 100644
index 00000000..5379c126
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/JTUSjIg1_i6t8kCHKm459W1hyzbi.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/JTUSjIg1_i6t8kCHKm459WRhyzbi.woff2 b/docs/deps/bootstrap-5.3.1/fonts/JTUSjIg1_i6t8kCHKm459WRhyzbi.woff2
new file mode 100644
index 00000000..4b7bc4a3
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/JTUSjIg1_i6t8kCHKm459WRhyzbi.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/JTUSjIg1_i6t8kCHKm459WZhyzbi.woff2 b/docs/deps/bootstrap-5.3.1/fonts/JTUSjIg1_i6t8kCHKm459WZhyzbi.woff2
new file mode 100644
index 00000000..6ec37309
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/JTUSjIg1_i6t8kCHKm459WZhyzbi.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/JTUSjIg1_i6t8kCHKm459Wdhyzbi.woff2 b/docs/deps/bootstrap-5.3.1/fonts/JTUSjIg1_i6t8kCHKm459Wdhyzbi.woff2
new file mode 100644
index 00000000..76691276
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/JTUSjIg1_i6t8kCHKm459Wdhyzbi.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/JTUSjIg1_i6t8kCHKm459Wlhyw.woff2 b/docs/deps/bootstrap-5.3.1/fonts/JTUSjIg1_i6t8kCHKm459Wlhyw.woff2
new file mode 100644
index 00000000..6122800c
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/JTUSjIg1_i6t8kCHKm459Wlhyw.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/KFOlCnqEu92Fr1MmEU9fABc4EsA.woff2 b/docs/deps/bootstrap-5.3.1/fonts/KFOlCnqEu92Fr1MmEU9fABc4EsA.woff2
new file mode 100644
index 00000000..cb5834ff
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/KFOlCnqEu92Fr1MmEU9fABc4EsA.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/KFOlCnqEu92Fr1MmEU9fBBc4.woff2 b/docs/deps/bootstrap-5.3.1/fonts/KFOlCnqEu92Fr1MmEU9fBBc4.woff2
new file mode 100644
index 00000000..29342a8d
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/KFOlCnqEu92Fr1MmEU9fBBc4.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/KFOlCnqEu92Fr1MmEU9fBxc4EsA.woff2 b/docs/deps/bootstrap-5.3.1/fonts/KFOlCnqEu92Fr1MmEU9fBxc4EsA.woff2
new file mode 100644
index 00000000..0933dfe8
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/KFOlCnqEu92Fr1MmEU9fBxc4EsA.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/KFOlCnqEu92Fr1MmEU9fCBc4EsA.woff2 b/docs/deps/bootstrap-5.3.1/fonts/KFOlCnqEu92Fr1MmEU9fCBc4EsA.woff2
new file mode 100644
index 00000000..064e94b7
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/KFOlCnqEu92Fr1MmEU9fCBc4EsA.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/KFOlCnqEu92Fr1MmEU9fCRc4EsA.woff2 b/docs/deps/bootstrap-5.3.1/fonts/KFOlCnqEu92Fr1MmEU9fCRc4EsA.woff2
new file mode 100644
index 00000000..8571683e
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/KFOlCnqEu92Fr1MmEU9fCRc4EsA.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/KFOlCnqEu92Fr1MmEU9fChc4EsA.woff2 b/docs/deps/bootstrap-5.3.1/fonts/KFOlCnqEu92Fr1MmEU9fChc4EsA.woff2
new file mode 100644
index 00000000..68f094cd
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/KFOlCnqEu92Fr1MmEU9fChc4EsA.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/KFOlCnqEu92Fr1MmEU9fCxc4EsA.woff2 b/docs/deps/bootstrap-5.3.1/fonts/KFOlCnqEu92Fr1MmEU9fCxc4EsA.woff2
new file mode 100644
index 00000000..6b0b4afe
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/KFOlCnqEu92Fr1MmEU9fCxc4EsA.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/KFOlCnqEu92Fr1MmSU5fABc4EsA.woff2 b/docs/deps/bootstrap-5.3.1/fonts/KFOlCnqEu92Fr1MmSU5fABc4EsA.woff2
new file mode 100644
index 00000000..9d7fb7f8
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/KFOlCnqEu92Fr1MmSU5fABc4EsA.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/KFOlCnqEu92Fr1MmSU5fBBc4.woff2 b/docs/deps/bootstrap-5.3.1/fonts/KFOlCnqEu92Fr1MmSU5fBBc4.woff2
new file mode 100644
index 00000000..60681387
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/KFOlCnqEu92Fr1MmSU5fBBc4.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/KFOlCnqEu92Fr1MmSU5fBxc4EsA.woff2 b/docs/deps/bootstrap-5.3.1/fonts/KFOlCnqEu92Fr1MmSU5fBxc4EsA.woff2
new file mode 100644
index 00000000..b289f002
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/KFOlCnqEu92Fr1MmSU5fBxc4EsA.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/KFOlCnqEu92Fr1MmSU5fCBc4EsA.woff2 b/docs/deps/bootstrap-5.3.1/fonts/KFOlCnqEu92Fr1MmSU5fCBc4EsA.woff2
new file mode 100644
index 00000000..87711c04
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/KFOlCnqEu92Fr1MmSU5fCBc4EsA.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/KFOlCnqEu92Fr1MmSU5fCRc4EsA.woff2 b/docs/deps/bootstrap-5.3.1/fonts/KFOlCnqEu92Fr1MmSU5fCRc4EsA.woff2
new file mode 100644
index 00000000..0f6e60b8
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/KFOlCnqEu92Fr1MmSU5fCRc4EsA.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/KFOlCnqEu92Fr1MmSU5fChc4EsA.woff2 b/docs/deps/bootstrap-5.3.1/fonts/KFOlCnqEu92Fr1MmSU5fChc4EsA.woff2
new file mode 100644
index 00000000..91231c9c
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/KFOlCnqEu92Fr1MmSU5fChc4EsA.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/KFOlCnqEu92Fr1MmSU5fCxc4EsA.woff2 b/docs/deps/bootstrap-5.3.1/fonts/KFOlCnqEu92Fr1MmSU5fCxc4EsA.woff2
new file mode 100644
index 00000000..c0099878
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/KFOlCnqEu92Fr1MmSU5fCxc4EsA.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/KFOlCnqEu92Fr1MmWUlfABc4EsA.woff2 b/docs/deps/bootstrap-5.3.1/fonts/KFOlCnqEu92Fr1MmWUlfABc4EsA.woff2
new file mode 100644
index 00000000..1bb7737c
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/KFOlCnqEu92Fr1MmWUlfABc4EsA.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/KFOlCnqEu92Fr1MmWUlfBBc4.woff2 b/docs/deps/bootstrap-5.3.1/fonts/KFOlCnqEu92Fr1MmWUlfBBc4.woff2
new file mode 100644
index 00000000..771fbecc
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/KFOlCnqEu92Fr1MmWUlfBBc4.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/KFOlCnqEu92Fr1MmWUlfBxc4EsA.woff2 b/docs/deps/bootstrap-5.3.1/fonts/KFOlCnqEu92Fr1MmWUlfBxc4EsA.woff2
new file mode 100644
index 00000000..cb9bfa71
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/KFOlCnqEu92Fr1MmWUlfBxc4EsA.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/KFOlCnqEu92Fr1MmWUlfCBc4EsA.woff2 b/docs/deps/bootstrap-5.3.1/fonts/KFOlCnqEu92Fr1MmWUlfCBc4EsA.woff2
new file mode 100644
index 00000000..a0d68e2b
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/KFOlCnqEu92Fr1MmWUlfCBc4EsA.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/KFOlCnqEu92Fr1MmWUlfCRc4EsA.woff2 b/docs/deps/bootstrap-5.3.1/fonts/KFOlCnqEu92Fr1MmWUlfCRc4EsA.woff2
new file mode 100644
index 00000000..63995528
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/KFOlCnqEu92Fr1MmWUlfCRc4EsA.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/KFOlCnqEu92Fr1MmWUlfChc4EsA.woff2 b/docs/deps/bootstrap-5.3.1/fonts/KFOlCnqEu92Fr1MmWUlfChc4EsA.woff2
new file mode 100644
index 00000000..94ab5fb0
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/KFOlCnqEu92Fr1MmWUlfChc4EsA.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/KFOlCnqEu92Fr1MmWUlfCxc4EsA.woff2 b/docs/deps/bootstrap-5.3.1/fonts/KFOlCnqEu92Fr1MmWUlfCxc4EsA.woff2
new file mode 100644
index 00000000..3c450111
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/KFOlCnqEu92Fr1MmWUlfCxc4EsA.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/KFOmCnqEu92Fr1Mu4WxKOzY.woff2 b/docs/deps/bootstrap-5.3.1/fonts/KFOmCnqEu92Fr1Mu4WxKOzY.woff2
new file mode 100644
index 00000000..fc71d944
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/KFOmCnqEu92Fr1Mu4WxKOzY.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/KFOmCnqEu92Fr1Mu4mxK.woff2 b/docs/deps/bootstrap-5.3.1/fonts/KFOmCnqEu92Fr1Mu4mxK.woff2
new file mode 100644
index 00000000..020729ef
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/KFOmCnqEu92Fr1Mu4mxK.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/KFOmCnqEu92Fr1Mu5mxKOzY.woff2 b/docs/deps/bootstrap-5.3.1/fonts/KFOmCnqEu92Fr1Mu5mxKOzY.woff2
new file mode 100644
index 00000000..47da3629
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/KFOmCnqEu92Fr1Mu5mxKOzY.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/KFOmCnqEu92Fr1Mu72xKOzY.woff2 b/docs/deps/bootstrap-5.3.1/fonts/KFOmCnqEu92Fr1Mu72xKOzY.woff2
new file mode 100644
index 00000000..22ddee9c
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/KFOmCnqEu92Fr1Mu72xKOzY.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/KFOmCnqEu92Fr1Mu7GxKOzY.woff2 b/docs/deps/bootstrap-5.3.1/fonts/KFOmCnqEu92Fr1Mu7GxKOzY.woff2
new file mode 100644
index 00000000..8a8de615
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/KFOmCnqEu92Fr1Mu7GxKOzY.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/KFOmCnqEu92Fr1Mu7WxKOzY.woff2 b/docs/deps/bootstrap-5.3.1/fonts/KFOmCnqEu92Fr1Mu7WxKOzY.woff2
new file mode 100644
index 00000000..6284d2e3
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/KFOmCnqEu92Fr1Mu7WxKOzY.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/KFOmCnqEu92Fr1Mu7mxKOzY.woff2 b/docs/deps/bootstrap-5.3.1/fonts/KFOmCnqEu92Fr1Mu7mxKOzY.woff2
new file mode 100644
index 00000000..72ce0e98
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/KFOmCnqEu92Fr1Mu7mxKOzY.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/QGYpz_kZZAGCONcK2A4bGOj8mNhN.woff2 b/docs/deps/bootstrap-5.3.1/fonts/QGYpz_kZZAGCONcK2A4bGOj8mNhN.woff2
new file mode 100644
index 00000000..5b052bb3
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/QGYpz_kZZAGCONcK2A4bGOj8mNhN.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/S6u8w4BMUTPHjxsAUi-qJCY.woff2 b/docs/deps/bootstrap-5.3.1/fonts/S6u8w4BMUTPHjxsAUi-qJCY.woff2
new file mode 100644
index 00000000..15be816a
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/S6u8w4BMUTPHjxsAUi-qJCY.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/S6u8w4BMUTPHjxsAXC-q.woff2 b/docs/deps/bootstrap-5.3.1/fonts/S6u8w4BMUTPHjxsAXC-q.woff2
new file mode 100644
index 00000000..851630ff
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/S6u8w4BMUTPHjxsAXC-q.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/S6u9w4BMUTPHh6UVSwaPGR_p.woff2 b/docs/deps/bootstrap-5.3.1/fonts/S6u9w4BMUTPHh6UVSwaPGR_p.woff2
new file mode 100644
index 00000000..2c8aaa86
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/S6u9w4BMUTPHh6UVSwaPGR_p.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/S6u9w4BMUTPHh6UVSwiPGQ.woff2 b/docs/deps/bootstrap-5.3.1/fonts/S6u9w4BMUTPHh6UVSwiPGQ.woff2
new file mode 100644
index 00000000..11de83fe
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/S6u9w4BMUTPHh6UVSwiPGQ.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/S6u9w4BMUTPHh7USSwaPGR_p.woff2 b/docs/deps/bootstrap-5.3.1/fonts/S6u9w4BMUTPHh7USSwaPGR_p.woff2
new file mode 100644
index 00000000..486d3ecf
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/S6u9w4BMUTPHh7USSwaPGR_p.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/S6u9w4BMUTPHh7USSwiPGQ.woff2 b/docs/deps/bootstrap-5.3.1/fonts/S6u9w4BMUTPHh7USSwiPGQ.woff2
new file mode 100644
index 00000000..aad98a33
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/S6u9w4BMUTPHh7USSwiPGQ.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/S6uyw4BMUTPHjx4wXg.woff2 b/docs/deps/bootstrap-5.3.1/fonts/S6uyw4BMUTPHjx4wXg.woff2
new file mode 100644
index 00000000..ff60934d
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/S6uyw4BMUTPHjx4wXg.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/S6uyw4BMUTPHjxAwXjeu.woff2 b/docs/deps/bootstrap-5.3.1/fonts/S6uyw4BMUTPHjxAwXjeu.woff2
new file mode 100644
index 00000000..edb9fa6f
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/S6uyw4BMUTPHjxAwXjeu.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/UcC73FwrK3iLTeHuS_fvQtMwCp50KnMa0ZL7SUc.woff2 b/docs/deps/bootstrap-5.3.1/fonts/UcC73FwrK3iLTeHuS_fvQtMwCp50KnMa0ZL7SUc.woff2
new file mode 100644
index 00000000..b655a438
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/UcC73FwrK3iLTeHuS_fvQtMwCp50KnMa0ZL7SUc.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/UcC73FwrK3iLTeHuS_fvQtMwCp50KnMa1ZL7.woff2 b/docs/deps/bootstrap-5.3.1/fonts/UcC73FwrK3iLTeHuS_fvQtMwCp50KnMa1ZL7.woff2
new file mode 100644
index 00000000..40255432
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/UcC73FwrK3iLTeHuS_fvQtMwCp50KnMa1ZL7.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/UcC73FwrK3iLTeHuS_fvQtMwCp50KnMa1pL7SUc.woff2 b/docs/deps/bootstrap-5.3.1/fonts/UcC73FwrK3iLTeHuS_fvQtMwCp50KnMa1pL7SUc.woff2
new file mode 100644
index 00000000..eb38b38e
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/UcC73FwrK3iLTeHuS_fvQtMwCp50KnMa1pL7SUc.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/UcC73FwrK3iLTeHuS_fvQtMwCp50KnMa25L7SUc.woff2 b/docs/deps/bootstrap-5.3.1/fonts/UcC73FwrK3iLTeHuS_fvQtMwCp50KnMa25L7SUc.woff2
new file mode 100644
index 00000000..3df865d7
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/UcC73FwrK3iLTeHuS_fvQtMwCp50KnMa25L7SUc.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/UcC73FwrK3iLTeHuS_fvQtMwCp50KnMa2JL7SUc.woff2 b/docs/deps/bootstrap-5.3.1/fonts/UcC73FwrK3iLTeHuS_fvQtMwCp50KnMa2JL7SUc.woff2
new file mode 100644
index 00000000..a61a0be5
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/UcC73FwrK3iLTeHuS_fvQtMwCp50KnMa2JL7SUc.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/UcC73FwrK3iLTeHuS_fvQtMwCp50KnMa2ZL7SUc.woff2 b/docs/deps/bootstrap-5.3.1/fonts/UcC73FwrK3iLTeHuS_fvQtMwCp50KnMa2ZL7SUc.woff2
new file mode 100644
index 00000000..9117b5b0
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/UcC73FwrK3iLTeHuS_fvQtMwCp50KnMa2ZL7SUc.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/UcC73FwrK3iLTeHuS_fvQtMwCp50KnMa2pL7SUc.woff2 b/docs/deps/bootstrap-5.3.1/fonts/UcC73FwrK3iLTeHuS_fvQtMwCp50KnMa2pL7SUc.woff2
new file mode 100644
index 00000000..ce21ca17
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/UcC73FwrK3iLTeHuS_fvQtMwCp50KnMa2pL7SUc.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/XRXV3I6Li01BKofIMeaBXso.woff2 b/docs/deps/bootstrap-5.3.1/fonts/XRXV3I6Li01BKofIMeaBXso.woff2
new file mode 100644
index 00000000..98074042
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/XRXV3I6Li01BKofIMeaBXso.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/XRXV3I6Li01BKofINeaB.woff2 b/docs/deps/bootstrap-5.3.1/fonts/XRXV3I6Li01BKofINeaB.woff2
new file mode 100644
index 00000000..042b9ab7
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/XRXV3I6Li01BKofINeaB.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/XRXV3I6Li01BKofIO-aBXso.woff2 b/docs/deps/bootstrap-5.3.1/fonts/XRXV3I6Li01BKofIO-aBXso.woff2
new file mode 100644
index 00000000..28fc6f21
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/XRXV3I6Li01BKofIO-aBXso.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/XRXV3I6Li01BKofIOOaBXso.woff2 b/docs/deps/bootstrap-5.3.1/fonts/XRXV3I6Li01BKofIOOaBXso.woff2
new file mode 100644
index 00000000..4e2a1826
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/XRXV3I6Li01BKofIOOaBXso.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/XRXV3I6Li01BKofIOuaBXso.woff2 b/docs/deps/bootstrap-5.3.1/fonts/XRXV3I6Li01BKofIOuaBXso.woff2
new file mode 100644
index 00000000..af0abf29
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/XRXV3I6Li01BKofIOuaBXso.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/c2f002b3a87d3f9bfeebb23d32cfd9f8.woff2 b/docs/deps/bootstrap-5.3.1/fonts/c2f002b3a87d3f9bfeebb23d32cfd9f8.woff2
new file mode 100644
index 00000000..ff275508
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/c2f002b3a87d3f9bfeebb23d32cfd9f8.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/ee91700cdbf7ce16c054c2bb8946c736.woff2 b/docs/deps/bootstrap-5.3.1/fonts/ee91700cdbf7ce16c054c2bb8946c736.woff2
new file mode 100644
index 00000000..b0e2c35f
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/ee91700cdbf7ce16c054c2bb8946c736.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqW106F15M.woff2 b/docs/deps/bootstrap-5.3.1/fonts/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqW106F15M.woff2
new file mode 100644
index 00000000..c787ad8d
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqW106F15M.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWt06F15M.woff2 b/docs/deps/bootstrap-5.3.1/fonts/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWt06F15M.woff2
new file mode 100644
index 00000000..f3b2c4d5
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWt06F15M.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWtE6F15M.woff2 b/docs/deps/bootstrap-5.3.1/fonts/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWtE6F15M.woff2
new file mode 100644
index 00000000..87f0364b
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWtE6F15M.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWtU6F15M.woff2 b/docs/deps/bootstrap-5.3.1/fonts/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWtU6F15M.woff2
new file mode 100644
index 00000000..3f5ef094
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWtU6F15M.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWtk6F15M.woff2 b/docs/deps/bootstrap-5.3.1/fonts/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWtk6F15M.woff2
new file mode 100644
index 00000000..f762e912
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWtk6F15M.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWu06F15M.woff2 b/docs/deps/bootstrap-5.3.1/fonts/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWu06F15M.woff2
new file mode 100644
index 00000000..7404f028
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWu06F15M.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWuU6F.woff2 b/docs/deps/bootstrap-5.3.1/fonts/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWuU6F.woff2
new file mode 100644
index 00000000..8e05a7ff
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWuU6F.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWuk6F15M.woff2 b/docs/deps/bootstrap-5.3.1/fonts/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWuk6F15M.woff2
new file mode 100644
index 00000000..7d385f37
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWuk6F15M.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWvU6F15M.woff2 b/docs/deps/bootstrap-5.3.1/fonts/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWvU6F15M.woff2
new file mode 100644
index 00000000..387470b8
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWvU6F15M.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWxU6F15M.woff2 b/docs/deps/bootstrap-5.3.1/fonts/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWxU6F15M.woff2
new file mode 100644
index 00000000..f53b8df9
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWxU6F15M.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTS-muw.woff2 b/docs/deps/bootstrap-5.3.1/fonts/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTS-muw.woff2
new file mode 100644
index 00000000..0beab546
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTS-muw.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTS2mu1aB.woff2 b/docs/deps/bootstrap-5.3.1/fonts/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTS2mu1aB.woff2
new file mode 100644
index 00000000..e1ce55f0
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTS2mu1aB.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSCmu1aB.woff2 b/docs/deps/bootstrap-5.3.1/fonts/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSCmu1aB.woff2
new file mode 100644
index 00000000..9c609c81
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSCmu1aB.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSGmu1aB.woff2 b/docs/deps/bootstrap-5.3.1/fonts/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSGmu1aB.woff2
new file mode 100644
index 00000000..7cd1174c
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSGmu1aB.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSKmu1aB.woff2 b/docs/deps/bootstrap-5.3.1/fonts/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSKmu1aB.woff2
new file mode 100644
index 00000000..b8521265
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSKmu1aB.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSOmu1aB.woff2 b/docs/deps/bootstrap-5.3.1/fonts/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSOmu1aB.woff2
new file mode 100644
index 00000000..612ff5d3
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSOmu1aB.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSumu1aB.woff2 b/docs/deps/bootstrap-5.3.1/fonts/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSumu1aB.woff2
new file mode 100644
index 00000000..f482ce1d
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSumu1aB.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSymu1aB.woff2 b/docs/deps/bootstrap-5.3.1/fonts/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSymu1aB.woff2
new file mode 100644
index 00000000..b7bc8626
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSymu1aB.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTUGmu1aB.woff2 b/docs/deps/bootstrap-5.3.1/fonts/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTUGmu1aB.woff2
new file mode 100644
index 00000000..18862e85
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTUGmu1aB.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTVOmu1aB.woff2 b/docs/deps/bootstrap-5.3.1/fonts/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTVOmu1aB.woff2
new file mode 100644
index 00000000..35bac5d1
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTVOmu1aB.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/q5uGsou0JOdh94bfuQltOxU.woff2 b/docs/deps/bootstrap-5.3.1/fonts/q5uGsou0JOdh94bfuQltOxU.woff2
new file mode 100644
index 00000000..28852dbb
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/q5uGsou0JOdh94bfuQltOxU.woff2 differ
diff --git a/docs/deps/bootstrap-5.3.1/fonts/q5uGsou0JOdh94bfvQlt.woff2 b/docs/deps/bootstrap-5.3.1/fonts/q5uGsou0JOdh94bfvQlt.woff2
new file mode 100644
index 00000000..886c2d72
Binary files /dev/null and b/docs/deps/bootstrap-5.3.1/fonts/q5uGsou0JOdh94bfvQlt.woff2 differ
diff --git a/docs/deps/data-deps.txt b/docs/deps/data-deps.txt
index 21592b52..693b82d1 100644
--- a/docs/deps/data-deps.txt
+++ b/docs/deps/data-deps.txt
@@ -1,4 +1,4 @@
-
-
+
+
diff --git a/docs/index.html b/docs/index.html
index 6bb72cf4..69af47ae 100644
--- a/docs/index.html
+++ b/docs/index.html
@@ -5,15 +5,15 @@
-
+
humdrumR • humdrumR
-
-
+
+
-
+
-
+
Changelog • humdrumR Changelog • humdrumR
Skip to contents
-
+
+
+
humdrumR 7.0.5
+
Version 7.0.5 includes a small patch to fix a bug related to the ::
function, as well as a new feature/behavior which builds off of that fix.
+
In previous versions, an error would occur if you used ::
inside any of the fundamental humdrumR “with/within” methods (including base
functions and dplyr
“verbs”). We’ve fixed this bug.
+
We’ve also added a new feature; specifically, we’ve made using ::
in humdrumR less necessary. Now, within a humdrumR call to any of these methods (listed below), if you use any function exported by humdrumR, humdrumR will automatically use the humdrumR version of that function, even if another package you have attached includes a function with same name. In other words, the humdrumR namespace will always takes priority within a humdrumR method call.
+
For example, the dplyr
package exports a function called lag()
and so does humdrumR (these functions do the same thing, but humdrumR’s version has a few extra features). Before this update, if you loaded dplyr
after you loaded humdrumR, then dplyr
’s lag()
function would generally take priority over humdrumR’s lag()
. So, code like this
+
library ( humdrumR )
+library ( dplyr )
+
+readHumdrum ( humdrumRroot , 'HumdrumData/BachChorales/.*krn' ) -> chorales
+
+chorales |> mutate ( Lagged = lag ( Token ) )
+
+
would call dplyr::lag()
. This sort of behavior can be confusing but wouldn’t normally be the end of the world (this is how R is supposed to work, after all). However, the lag()
function is particularly problematic because many humdrumR methods rely on our special version of lag()
. This is why we’ve implemented a change: Now, if you use lag()
within a humdrumR with/within method, it will default to using the humdrumR version, regardless of what other packages are loaded. So the code above would use humdrumR::lag()
. If you want to use dplyr
’s version (or any other package), you still can by specifying (for example) dplyr::lag()
. Another function which (in the past) could lead to frequent namespace confusion was transpose()
—now, you can safely use transpose()
and know that your system will use humdrumR::transpose()
.
+
All .humdrumR
methods for the following functions are affected by this change:
+
diff --git a/docs/pkgdown.js b/docs/pkgdown.js
index 5fccd9c0..9bd6621e 100644
--- a/docs/pkgdown.js
+++ b/docs/pkgdown.js
@@ -30,10 +30,10 @@
/* Clipboard --------------------------*/
function changeTooltipMessage(element, msg) {
- var tooltipOriginalTitle=element.getAttribute('data-original-title');
- element.setAttribute('data-original-title', msg);
+ var tooltipOriginalTitle=element.getAttribute('data-bs-original-title');
+ element.setAttribute('data-bs-original-title', msg);
$(element).tooltip('show');
- element.setAttribute('data-original-title', tooltipOriginalTitle);
+ element.setAttribute('data-bs-original-title', tooltipOriginalTitle);
}
if(ClipboardJS.isSupported()) {
@@ -60,7 +60,7 @@
e.clearSelection();
});
- clipboard.on('error', function() {
+ clipboard.on('error', function(e) {
changeTooltipMessage(e.trigger,'Press Ctrl+C or Command+C to copy');
});
diff --git a/docs/pkgdown.yml b/docs/pkgdown.yml
index 8781b6db..90711e4a 100644
--- a/docs/pkgdown.yml
+++ b/docs/pkgdown.yml
@@ -1,5 +1,5 @@
-pandoc: 3.0.1
-pkgdown: 2.0.7
+pandoc: 3.1.11
+pkgdown: 2.0.9
pkgdown_sha: ~
articles:
ComplexSyntax: ComplexSyntax.html
@@ -11,12 +11,12 @@ articles:
HumdrumSyntax: HumdrumSyntax.html
KeysAndChord: KeysAndChord.html
PitchAndTonality: PitchAndTonality.html
- RPrimer: RPrimer.html
ReadWrite: ReadWrite.html
Reshaping: Reshaping.html
RhythmAndMeter: RhythmAndMeter.html
+ RPrimer: RPrimer.html
Summary: Summary.html
-last_built: 2024-02-15T22:16Z
+last_built: 2024-09-11T16:12Z
urls:
reference: https://humdrumR.ccml.gtcmt.gatech.edu/reference
article: https://humdrumR.ccml.gtcmt.gatech.edu/articles
diff --git a/docs/reference/LO5th.html b/docs/reference/LO5th.html
index 4fd7c9a5..52441acd 100644
--- a/docs/reference/LO5th.html
+++ b/docs/reference/LO5th.html
@@ -1,6 +1,6 @@
Line of Fifths — LO5th • humdrumR Line of Fifths — LO5th • humdrumR Parse String Using Regular expressions — REparser • humdrumR Parse String Using Regular expressions — REparser • humdrumR
Skip to contents
-
+
humdrumR
-
0.7.0.4
+
0.7.0.5
@@ -117,11 +117,11 @@ Details
diff --git a/docs/reference/RegexFind.html b/docs/reference/RegexFind.html
index 7439eb32..3585a822 100644
--- a/docs/reference/RegexFind.html
+++ b/docs/reference/RegexFind.html
@@ -1,7 +1,7 @@
Match strings against regular expression — RegexFind • humdrumR Match strings against regular expression — RegexFind • humdrumR Extract accidental from pitch. — accidental • humdrumR Extract accidental from pitch. — accidental • humdrumR Swara representation — bhatk • humdrumR Skip to contents
-
+
humdrumR
-
0.7.0.4
+
0.7.0.5
@@ -352,7 +352,7 @@
diff --git a/docs/reference/bpm2sec.html b/docs/reference/bpm2sec.html
index f59ec824..e40b02d5 100644
--- a/docs/reference/bpm2sec.html
+++ b/docs/reference/bpm2sec.html
@@ -1,7 +1,7 @@
Translate between durations and tempos — bpm2sec • humdrumR Translate between durations and tempos — bpm2sec • humdrumR Tabulate records and tokens in a humdrumR corpus — census • humdrumR Tabulate records and tokens in a humdrumR corpus — census • humdrumR Apply to humdrumR data — cents.humdrumR • humdrumR Apply to humdrumR data — cents.humdrumR • humdrumR "Pop/Jazz" chord symbols — chord • humdrumR "Pop/Jazz" chord symbols — chord • humdrumR Generating ("deparsing") chord representations — chordDeparsing • humdrumR Parsing and deparsing chord information — chordFunctions • humdrumR Parsing and deparsing chord information — chordFunctions • humdrumR Parsing chord information — chordParsing • humdrumR Align data from separate spines into new fields. — cleave • humdrumR Align data from separate spines into new fields. — cleave • humdrumR
+#> REpath-pattern '/home/nat/.tmp/Rtmpj3llIw/temp_libpathf1bb188f0d5d/humdrumR/HumdrumData/MozartVariations/.*.krn' matches 8 text files in 1 directory.
#> Eight files read from disk.
#> Validating eight files...
#> all valid.
@@ -702,11 +702,11 @@ Examples
-
Developed by Nathaniel Condit-Schultz, Claire Arthur.
+ Developed by Nathaniel Condit-Schultz, Claire Arthur.
diff --git a/docs/reference/cleaveGraceNotes.html b/docs/reference/cleaveGraceNotes.html
index aec4f2d3..29a919db 100644
--- a/docs/reference/cleaveGraceNotes.html
+++ b/docs/reference/cleaveGraceNotes.html
@@ -1,16 +1,16 @@
-"Fold" grace notes into neighbos — cleaveGraceNotes • humdrumR "Fold" grace notes into neighbos — cleaveGraceNotes • humdrumR
Skip to contents
-
+
humdrumR
-
0.7.0.4
+
0.7.0.5
@@ -95,11 +95,11 @@ See also
diff --git a/docs/reference/collapseHumdrum.html b/docs/reference/collapseHumdrum.html
index 0b62a0f8..08400755 100644
--- a/docs/reference/collapseHumdrum.html
+++ b/docs/reference/collapseHumdrum.html
@@ -4,7 +4,7 @@
Data is "collapsed" either by pasting the data into a string,
or by putting them into list.
collapseStops, collapsePaths, and collapseRecords are built-in
-calls to collapseHumtab, with some additional optimizations.'>"Collapse" humdrumR data into a field — collapseHumdrum • humdrumR "Collapse" humdrumR data into a field — collapseHumdrum • humdrumR closeargument refer to the *next*
open, by referring to the
nextopen` variable:
-
context (letters, open = '[aeiou]' , close = nextopen - 1L)
+
context (letters, open = '[aeiou]' , close = nextopen - 1 L )
Conversely, open
can refer to the prevclose
close:
context (letters, open = prevclose + 1 , close = '[aeiou]' , alignToOpen = FALSE )
Notice that when we called context(letters, open = '[aeiou]', close = nextopen - 1L)
,
the window opening on "u"
is not returned.
This is because there is no "nextopen
" open to close on.
We can instead provide context()
an alternative, using |
(or):
-
context (letters, open = '[aeiou]' , close = nextopen - 1L | 26 )
+
context (letters, open = '[aeiou]' , close = nextopen - 1 L | 26 )
Here we are saying, close a window 1 index before the next open OR at index 26.
What if we don't know exactly how long our input vector is?
Refer to the end
variable:
-
context (letters, open = '[aeiou]' , close = nextopen - 1L | end)
+
context (letters, open = '[aeiou]' , close = nextopen - 1 L | end)
@@ -410,7 +410,7 @@
Separating context refere
and which aren't necessarily the thing we want to apply the windowing to.
To illustrate this last point, let's take the last command from the previous section
and make it so the x
argument is different than the reference
argument:
-
context (LETTERS, reference = letters, open = '[aeiou]' , close = nextopen - 1L | 26 )
+
context (LETTERS, reference = letters, open = '[aeiou]' , close = nextopen - 1 L | 26 )
Now, letters
is still being used as the windowing reference, but the contextual windowing is being
applied to LETTERS
.
When we use context()
on a humdrumR dataset , the data's fields()
can be used as the reference,
@@ -618,7 +618,7 @@
Examples
humData <- readHumdrum ( humdrumRroot , "HumdrumData/BachChorales/chor00[1-4].krn" )
#> Finding and reading files...
-#> REpath-pattern '/home/nat/.tmp/Rtmpz26RCR/temp_libpatha780af15d1/humdrumR/HumdrumData/BachChorales/chor00[1-4].krn' matches 4 text files in 1 directory.
+#> REpath-pattern '/home/nat/.tmp/Rtmpj3llIw/temp_libpathf1bb188f0d5d/humdrumR/HumdrumData/BachChorales/chor00[1-4].krn' matches 4 text files in 1 directory.
#> Four files read from disk.
#> Validating four files...
#> all valid.
@@ -732,11 +732,11 @@ Examples
-
Developed by Nathaniel Condit-Schultz, Claire Arthur.
+ Developed by Nathaniel Condit-Schultz, Claire Arthur.
diff --git a/docs/reference/degree.html b/docs/reference/degree.html
index 8054d6e4..73d25810 100644
--- a/docs/reference/degree.html
+++ b/docs/reference/degree.html
@@ -12,7 +12,7 @@
If no field names are specified, the first selectedField is used as x.
If deg() is applied to a humdrumR data class
you may use the data's fields as arguments.
-If no field names are specified, the first selectedField is used as x.">Tonal scale degree representation (absolute) — degree • humdrumR Tonal scale degree representation (absolute) — degree • humdrumR Skip to contents
-
diff --git a/docs/reference/delta.html b/docs/reference/delta.html
index 4ef0534e..58275922 100644
--- a/docs/reference/delta.html
+++ b/docs/reference/delta.html
@@ -1,16 +1,16 @@
-Lagged differences — delta • humdrumR Lagged differences — delta • humdrumR
Skip to contents
-
+
humdrumR
-
0.7.0.4
+
0.7.0.5
@@ -320,11 +320,11 @@ See also
diff --git a/docs/reference/diatonicSetS4.html b/docs/reference/diatonicSetS4.html
index 9ea1f169..238bbffc 100644
--- a/docs/reference/diatonicSetS4.html
+++ b/docs/reference/diatonicSetS4.html
@@ -3,7 +3,7 @@
types of tonal data, representing Western diatonic keys.
For the most part, users should not need to interact with diatonicSets directly---rather, diatonicSets work behind the scene in numerous humdrumR pitch functions.
See the keyRepresentations and keyTransformations documentation for details of usage and functionality or the Tonality in humdrumR vignette for
-a detailed explanation of the theory and specifics of diatonicSets.">Tonal (diatonic) sets — diatonicSetS4 • humdrumR Tonal (diatonic) sets — diatonicSetS4 • humdrumR Skip to contents
-
+
humdrumR
-
0.7.0.4
+
0.7.0.5
@@ -244,11 +244,11 @@ See also
diff --git a/docs/reference/distributions.html b/docs/reference/distributions.html
index 9576f666..dcab0218 100644
--- a/docs/reference/distributions.html
+++ b/docs/reference/distributions.html
@@ -3,7 +3,7 @@
The count() function is exactly like R's fundamental table() function,
except that 1) will give special treatment to humdrumR token() data 2)
has more intuitive/simple argument names 3) makes it easier to combine/manipulate
-disparate output tables.">Distributions — distributions • humdrumR Distributions — distributions • humdrumR Skip to contents
-
diff --git a/docs/reference/ditto.html b/docs/reference/ditto.html
index 6879f1e9..861861dc 100644
--- a/docs/reference/ditto.html
+++ b/docs/reference/ditto.html
@@ -3,7 +3,7 @@
with non-null values from earlier/later in the same vector.
The default, "forward," behavior fills each null value with the previous (lower index) non-null value, if there are any.
The reverse argument can be used to cause "backward" filling, where the next (higher index) non-null value is used.
-If the input begins (or ends if reverse == TRUE) with a null value, the initial argument is filled instead; defaults to NA.'>Propagate data points to "fill" null data. — ditto • humdrumR Propagate data points to "fill" null data. — ditto • humdrumR Visualize data — draw • humdrumR Visualize data — draw • humdrumR Generate duple meters — duple • humdrumR Skip to contents
-
+
humdrumR
-
0.7.0.4
+
0.7.0.5
@@ -131,11 +131,11 @@ See also
diff --git a/docs/reference/duration.html b/docs/reference/duration.html
index a12e5232..04af8943 100644
--- a/docs/reference/duration.html
+++ b/docs/reference/duration.html
@@ -5,7 +5,7 @@
If no field names are specified, the first selectedField is used as x.
If quarters() is applied to a humdrumR data class
you may use the data's fields as arguments.
-If no field names are specified, the first selectedField is used as x.">Numeric (double) representation of durations — duration • humdrumR Numeric (double) representation of durations — duration • humdrumR Skip to contents
-
diff --git a/docs/reference/entropy.html b/docs/reference/entropy.html
index c13ab7fe..b6094417 100644
--- a/docs/reference/entropy.html
+++ b/docs/reference/entropy.html
@@ -5,7 +5,7 @@
The probability of each observation maps to the information content;
The average information content of a variable is the entropy.
Information content/entropy can be calculated for discrete probabilities or continuous probabilities,
-and humdrumR defines methods for calculating both.'>Calculate Entropy or Information Content of variables — entropy • humdrumR Calculate Entropy or Information Content of variables — entropy • humdrumR "Evaluating" "Expressions" in "Environments"? — evaluatingExpressions • humdrumR "Evaluating" "Expressions" in "Environments"? — evaluatingExpressions • humdrumR
Skip to contents
-
+
humdrumR
-
0.7.0.4
+
0.7.0.5
@@ -164,11 +164,11 @@ See also
diff --git a/docs/reference/expand.html b/docs/reference/expand.html
index 6713a90d..93dcd2e6 100644
--- a/docs/reference/expand.html
+++ b/docs/reference/expand.html
@@ -1,16 +1,16 @@
-Expand numbers outwards from zero — expand • humdrumR Expand numbers outwards from zero — expand • humdrumR
Skip to contents
-
+
humdrumR
-
0.7.0.4
+
0.7.0.5
@@ -107,11 +107,11 @@ Details
diff --git a/docs/reference/expandPaths.html b/docs/reference/expandPaths.html
index 23610095..26c617b1 100644
--- a/docs/reference/expandPaths.html
+++ b/docs/reference/expandPaths.html
@@ -1,7 +1,7 @@
Expand paths into new spines — expandPaths • humdrumR Expand paths into new spines — expandPaths • humdrumR Figured bass representation of harmony — figuredBass • humdrumR Figured bass representation of harmony — figuredBass • humdrumR Translate pitches to frequency (Hz) — freq • humdrumR Translate pitches to frequency (Hz) — freq • humdrumR Make a pitch gamut — gamut • humdrumR Skip to contents
-
+
humdrumR
-
0.7.0.4
+
0.7.0.5
@@ -161,11 +161,11 @@ Details
diff --git a/docs/reference/grid.html b/docs/reference/grid.html
index 7d40f549..61923968 100644
--- a/docs/reference/grid.html
+++ b/docs/reference/grid.html
@@ -5,7 +5,7 @@
For example, "X00X00X0" or c(1, 0, 0, 1, 0, 0, 1, 0).
If grid() is applied to a humdrumR data class
you may use the data's fields as arguments.
-If no field names are specified, the first selectedField is used as x.">Drum-machine grid representation of rhythmic durations. — grid • humdrumR Drum-machine grid representation of rhythmic durations. — grid • humdrumR Skip to contents
-
diff --git a/docs/reference/groupHumdrum.html b/docs/reference/groupHumdrum.html
index a7a2ce50..716e7f40 100644
--- a/docs/reference/groupHumdrum.html
+++ b/docs/reference/groupHumdrum.html
@@ -7,7 +7,7 @@
which are always contiguous and/or exclude some data.
The ungroup() function removes grouping from a humdrumR data object.
Once groups are created, the groups() function can be used to tabulate
-the number of tokens in each group, and find their indices in the humdrum table.'>Divide humdrumR data into groups — groupHumdrum • humdrumR Divide humdrumR data into groups — groupHumdrum • humdrumR
+#> REpath-pattern '/home/nat/.tmp/Rtmpj3llIw/temp_libpathf1bb188f0d5d/humdrumR/HumdrumData/BachChorales/chor00[1-4].krn' matches 4 text files in 1 directory.
#> Four files read from disk.
#> Validating four files...
#> all valid.
@@ -209,36 +209,38 @@ ExampleshumData |>
group_by ( Piece , Spine ) |>
groups ( )
-#> Piece Spine D
-#> 1: 1 1 63
-#> 2: 1 2 59
-#> 3: 1 3 61
-#> 4: 1 4 46
-#> 5: 2 1 61
-#> 6: 2 2 62
-#> 7: 2 3 55
-#> 8: 2 4 53
-#> 9: 3 1 52
-#> 10: 3 2 50
-#> 11: 3 3 47
-#> 12: 3 4 47
-#> 13: 4 1 49
-#> 14: 4 2 45
-#> 15: 4 3 49
-#> 16: 4 4 43
+#> Piece Spine D
+#> <int> <int> <int>
+#> 1: 1 1 63
+#> 2: 1 2 59
+#> 3: 1 3 61
+#> 4: 1 4 46
+#> 5: 2 1 61
+#> 6: 2 2 62
+#> 7: 2 3 55
+#> 8: 2 4 53
+#> 9: 3 1 52
+#> 10: 3 2 50
+#> 11: 3 3 47
+#> 12: 3 4 47
+#> 13: 4 1 49
+#> 14: 4 2 45
+#> 15: 4 3 49
+#> 16: 4 4 43
humData |>
group_by ( Piece , Spine %% 2 ) |>
groups ( )
-#> Spine%%2 Piece D
-#> 1: 1 1 124
-#> 2: 0 1 105
-#> 3: 1 2 116
-#> 4: 0 2 115
-#> 5: 1 3 99
-#> 6: 0 3 97
-#> 7: 1 4 98
-#> 8: 0 4 88
+#> Spine%%2 Piece D
+#> <num> <int> <int>
+#> 1: 1 1 124
+#> 2: 0 1 105
+#> 3: 1 2 116
+#> 4: 0 2 115
+#> 5: 1 3 99
+#> 6: 0 3 97
+#> 7: 1 4 98
+#> 8: 0 4 88
humData |>
group_by ( Piece , Bar ) |>
@@ -362,11 +364,11 @@ Examples
-
Developed by Nathaniel Condit-Schultz, Claire Arthur.
+ Developed by Nathaniel Condit-Schultz, Claire Arthur.
diff --git a/docs/reference/groupingFactors.html b/docs/reference/groupingFactors.html
index c14007cf..f9399c87 100644
--- a/docs/reference/groupingFactors.html
+++ b/docs/reference/groupingFactors.html
@@ -1,16 +1,16 @@
-What are "grouping factors"? — groupingFactors • humdrumR What are "grouping factors"? — groupingFactors • humdrumR
Skip to contents
-
+
humdrumR
-
0.7.0.4
+
0.7.0.5
@@ -132,11 +132,11 @@ See also
diff --git a/docs/reference/harm.html b/docs/reference/harm.html
index 764aefe6..8ce7d815 100644
--- a/docs/reference/harm.html
+++ b/docs/reference/harm.html
@@ -8,7 +8,7 @@
The output format of roman() is very similar to **harm.
The main difference is that inversions are indicated using traditional figures
, like 653, instead of **harm's simpler system (using letters).
-So, for example, if we take the input E7/B in the key of A major, we'll get:">Roman numeral representations of harmony — harm • humdrumR Roman numeral representations of harmony — harm • humdrumR Skip to contents
-
diff --git a/docs/reference/helmholtz.html b/docs/reference/helmholtz.html
index 565d2747..5ce5e46e 100644
--- a/docs/reference/helmholtz.html
+++ b/docs/reference/helmholtz.html
@@ -2,7 +2,7 @@
Helmholtz pitch representation — helmholtz • humdrumR Helmholtz pitch representation — helmholtz • humdrumR Generate regular sequence "along" input — hop • humdrumR Skip to contents
-
diff --git a/docs/reference/humCoercion.html b/docs/reference/humCoercion.html
index fbf54a06..a0324982 100644
--- a/docs/reference/humCoercion.html
+++ b/docs/reference/humCoercion.html
@@ -3,7 +3,7 @@
without having to rely on humdrumR's with(in).humdrumR functionality.
Rather, you'd like to just get "normal" R objects out of your humdrum data.
humdrumR defines a number of functions/methods for "coercing" humdrum data into
-basic R data types.">humdrumR coercion — humCoercion • humdrumR humdrumR coercion — humCoercion • humdrumR Skip to contents
-
+
humdrumR
-
0.7.0.4
+
0.7.0.5
@@ -234,11 +234,11 @@ Padding
diff --git a/docs/reference/humMerge.html b/docs/reference/humMerge.html
index e6876f5d..cdece824 100644
--- a/docs/reference/humMerge.html
+++ b/docs/reference/humMerge.html
@@ -1,16 +1,16 @@
-Merge two (or more) humdrumR datasets — humMerge • humdrumR Merge two (or more) humdrumR datasets — humMerge • humdrumR
Skip to contents
-
+
humdrumR
-
0.7.0.4
+
0.7.0.5
@@ -90,11 +90,11 @@ Usage
diff --git a/docs/reference/humMeter.html b/docs/reference/humMeter.html
index f2f61f3f..90c6d1ed 100644
--- a/docs/reference/humMeter.html
+++ b/docs/reference/humMeter.html
@@ -1,6 +1,6 @@
Tools for analyzing rhythm and meter. — humMeter • humdrumR Tools for analyzing rhythm and meter. — humMeter • humdrumR humdrumR data size and shape — humSize • humdrumR
+#> REpath-pattern '/home/nat/.tmp/Rtmpj3llIw/temp_libpathf1bb188f0d5d/humdrumR/HumdrumData/BachChorales/*.krn' matches 10 text files in 1 directory.
#> Ten files read from disk.
#> Validating ten files...
#> all valid.
@@ -137,11 +137,11 @@ Examples
-
Developed by Nathaniel Condit-Schultz, Claire Arthur.
+ Developed by Nathaniel Condit-Schultz, Claire Arthur.
diff --git a/docs/reference/humTable.html b/docs/reference/humTable.html
index afe5db9a..61b61c05 100644
--- a/docs/reference/humTable.html
+++ b/docs/reference/humTable.html
@@ -8,7 +8,7 @@
If you want to directly access the humdrum table within a humdrumRclass object, use the getHumtab() function.
The getHumtab() function extracts the humdrum table from a humdrumR object.
Use the fields() function to list the current fields in
-a humdrumRclass object.">Humdrum tables (and their "fields") — humTable • humdrumR Humdrum tables (and their "fields") — humTable • humdrumR Skip to contents
-
+
humdrumR
-
0.7.0.4
+
0.7.0.5
@@ -401,7 +401,7 @@ Examples
humData <- readHumdrum ( humdrumRroot , "HumdrumData/BachChorales/chor00[1-4].krn" )
#> Finding and reading files...
-#> REpath-pattern '/home/nat/.tmp/Rtmpz26RCR/temp_libpatha780af15d1/humdrumR/HumdrumData/BachChorales/chor00[1-4].krn' matches 4 text files in 1 directory.
+#> REpath-pattern '/home/nat/.tmp/Rtmpj3llIw/temp_libpathf1bb188f0d5d/humdrumR/HumdrumData/BachChorales/chor00[1-4].krn' matches 4 text files in 1 directory.
#> Four files read from disk.
#> Validating four files...
#> all valid.
@@ -411,6 +411,7 @@ Examples
fields ( humData )
#> Name Class Type Selected GroupedBy Complement
+#> <char> <char> <char> <int> <lgcl> <lgcl>
#> 1: Token character Data 1 FALSE FALSE
#> 2: Bar integer Formal 0 FALSE FALSE
#> 3: BarLabel character Formal 0 FALSE FALSE
@@ -456,43 +457,47 @@ Examples#> Name Class Type Selected GroupedBy Complement
getHumtab ( humData )
-#> Token Bar BarLabel DoubleBar Formal
-#> 1: !!!COM:\tBach, Johann Sebastian NA <NA> NA <NA>
-#> 2: !!!CDT:\t1685/02/21/-1750/07/28/ NA <NA> NA <NA>
-#> 3: !!!OTL@@DE:\tAus meines Herzens Grunde NA <NA> NA <NA>
-#> 4: !!!OTL@EN: From the Depths of My Heart NA <NA> NA <NA>
-#> 5: !!!SCT:\tBWV 269 NA <NA> NA <NA>
-#> ---
-#> 1684: 4c# 11 10 0 B
-#> 1685: 4d# 11 10 0 B
-#> 1686: 4e; 11 10 0 B
-#> 1687: == 12 = 1 B
-#> 1688: *- 12 = 1 B
-#> BPM Clef Exclusive Instrument InstrumentClass Key KeySignature
-#> 1: <NA> <NA> <NA> <NA> <NA> <NA> <NA>
-#> 2: <NA> <NA> <NA> <NA> <NA> <NA> <NA>
-#> 3: <NA> <NA> <NA> <NA> <NA> <NA> <NA>
-#> 4: <NA> <NA> <NA> <NA> <NA> <NA> <NA>
-#> 5: <NA> <NA> <NA> <NA> <NA> <NA> <NA>
-#> ---
-#> 1684: MM100 clefG2 kern I"Soprano ICvox E: k[f#c#g#d#]
-#> 1685: MM100 clefG2 kern I"Soprano ICvox E: k[f#c#g#d#]
-#> 1686: MM100 clefG2 kern I"Soprano ICvox E: k[f#c#g#d#]
-#> 1687: MM100 clefG2 kern I"Soprano ICvox E: k[f#c#g#d#]
-#> 1688: MM100 clefG2 kern I"Soprano ICvox E: k[f#c#g#d#]
-#> Mensuration
-#> 1: <NA>
-#> 2: <NA>
-#> 3: <NA>
-#> 4: <NA>
-#> 5: <NA>
-#> ---
-#> 1684: met(c)
-#> 1685: met(c)
-#> 1686: met(c)
-#> 1687: met(c)
-#> 1688: met(c)
+#> Token Bar BarLabel DoubleBar
+#> <char> <int> <char> <int>
+#> 1: !!!COM:\tBach, Johann Sebastian NA <NA> NA
+#> 2: !!!CDT:\t1685/02/21/-1750/07/28/ NA <NA> NA
+#> 3: !!!OTL@@DE:\tAus meines Herzens Grunde NA <NA> NA
+#> 4: !!!OTL@EN: From the Depths of My Heart NA <NA> NA
+#> 5: !!!SCT:\tBWV 269 NA <NA> NA
+#> ---
+#> 1684: 4c# 11 10 0
+#> 1685: 4d# 11 10 0
+#> 1686: 4e; 11 10 0
+#> 1687: == 12 = 1
+#> 1688: *- 12 = 1
+#> Formal BPM Clef Exclusive Instrument InstrumentClass Key
+#> <char> <char> <char> <char> <char> <char> <char>
+#> 1: <NA> <NA> <NA> <NA> <NA> <NA> <NA>
+#> 2: <NA> <NA> <NA> <NA> <NA> <NA> <NA>
+#> 3: <NA> <NA> <NA> <NA> <NA> <NA> <NA>
+#> 4: <NA> <NA> <NA> <NA> <NA> <NA> <NA>
+#> 5: <NA> <NA> <NA> <NA> <NA> <NA> <NA>
+#> ---
+#> 1684: B MM100 clefG2 kern I"Soprano ICvox E:
+#> 1685: B MM100 clefG2 kern I"Soprano ICvox E:
+#> 1686: B MM100 clefG2 kern I"Soprano ICvox E:
+#> 1687: B MM100 clefG2 kern I"Soprano ICvox E:
+#> 1688: B MM100 clefG2 kern I"Soprano ICvox E:
+#> KeySignature Mensuration
+#> <char> <char>
+#> 1: <NA> <NA>
+#> 2: <NA> <NA>
+#> 3: <NA> <NA>
+#> 4: <NA> <NA>
+#> 5: <NA> <NA>
+#> ---
+#> 1684: k[f#c#g#d#] met(c)
+#> 1685: k[f#c#g#d#] met(c)
+#> 1686: k[f#c#g#d#] met(c)
+#> 1687: k[f#c#g#d#] met(c)
+#> 1688: k[f#c#g#d#] met(c)
#> Tandem
+#> <char>
#> 1: <NA>
#> 2: <NA>
#> 3: <NA>
@@ -505,6 +510,7 @@ Examples#> 1687: MM100,met(c),M4/4,E:,k[f#c#g#d#],clefG2,I"Soprano,Isoprn,ICvox
#> 1688: MM100,met(c),M4/4,E:,k[f#c#g#d#],clefG2,I"Soprano,Isoprn,ICvox
#> TimeSignature AGN CDT
+#> <char> <char> <char>
#> 1: <NA> \tchorale \t1685/02/21/-1750/07/28/
#> 2: <NA> \tchorale \t1685/02/21/-1750/07/28/
#> 3: <NA> \tchorale \t1685/02/21/-1750/07/28/
@@ -516,31 +522,34 @@ Examples#> 1686: M4/4 \tchorale \t1685/02/21/-1750/07/28/
#> 1687: M4/4 \tchorale \t1685/02/21/-1750/07/28/
#> 1688: M4/4 \tchorale \t1685/02/21/-1750/07/28/
-#> COM EED EEV OPR
-#> 1: \tBach, Johann Sebastian Craig Stuart Sapp 2009/05/22 <NA>
-#> 2: \tBach, Johann Sebastian Craig Stuart Sapp 2009/05/22 <NA>
-#> 3: \tBach, Johann Sebastian Craig Stuart Sapp 2009/05/22 <NA>
-#> 4: \tBach, Johann Sebastian Craig Stuart Sapp 2009/05/22 <NA>
-#> 5: \tBach, Johann Sebastian Craig Stuart Sapp 2009/05/22 <NA>
-#> ---
-#> 1684: \tBach, Johann Sebastian Craig Stuart Sapp 2009/05/22 <NA>
-#> 1685: \tBach, Johann Sebastian Craig Stuart Sapp 2009/05/22 <NA>
-#> 1686: \tBach, Johann Sebastian Craig Stuart Sapp 2009/05/22 <NA>
-#> 1687: \tBach, Johann Sebastian Craig Stuart Sapp 2009/05/22 <NA>
-#> 1688: \tBach, Johann Sebastian Craig Stuart Sapp 2009/05/22 <NA>
-#> OTL@@DE OTL@EN PC#
-#> 1: \tAus meines Herzens Grunde From the Depths of My Heart \t1
-#> 2: \tAus meines Herzens Grunde From the Depths of My Heart \t1
-#> 3: \tAus meines Herzens Grunde From the Depths of My Heart \t1
-#> 4: \tAus meines Herzens Grunde From the Depths of My Heart \t1
-#> 5: \tAus meines Herzens Grunde From the Depths of My Heart \t1
-#> ---
-#> 1684: \tEs ist das Heil uns kommen her <NA> \t4
-#> 1685: \tEs ist das Heil uns kommen her <NA> \t4
-#> 1686: \tEs ist das Heil uns kommen her <NA> \t4
-#> 1687: \tEs ist das Heil uns kommen her <NA> \t4
-#> 1688: \tEs ist das Heil uns kommen her <NA> \t4
+#> COM EED EEV OPR
+#> <char> <char> <char> <char>
+#> 1: \tBach, Johann Sebastian Craig Stuart Sapp 2009/05/22 <NA>
+#> 2: \tBach, Johann Sebastian Craig Stuart Sapp 2009/05/22 <NA>
+#> 3: \tBach, Johann Sebastian Craig Stuart Sapp 2009/05/22 <NA>
+#> 4: \tBach, Johann Sebastian Craig Stuart Sapp 2009/05/22 <NA>
+#> 5: \tBach, Johann Sebastian Craig Stuart Sapp 2009/05/22 <NA>
+#> ---
+#> 1684: \tBach, Johann Sebastian Craig Stuart Sapp 2009/05/22 <NA>
+#> 1685: \tBach, Johann Sebastian Craig Stuart Sapp 2009/05/22 <NA>
+#> 1686: \tBach, Johann Sebastian Craig Stuart Sapp 2009/05/22 <NA>
+#> 1687: \tBach, Johann Sebastian Craig Stuart Sapp 2009/05/22 <NA>
+#> 1688: \tBach, Johann Sebastian Craig Stuart Sapp 2009/05/22 <NA>
+#> OTL@@DE OTL@EN PC#
+#> <char> <char> <char>
+#> 1: \tAus meines Herzens Grunde From the Depths of My Heart \t1
+#> 2: \tAus meines Herzens Grunde From the Depths of My Heart \t1
+#> 3: \tAus meines Herzens Grunde From the Depths of My Heart \t1
+#> 4: \tAus meines Herzens Grunde From the Depths of My Heart \t1
+#> 5: \tAus meines Herzens Grunde From the Depths of My Heart \t1
+#> ---
+#> 1684: \tEs ist das Heil uns kommen her <NA> \t4
+#> 1685: \tEs ist das Heil uns kommen her <NA> \t4
+#> 1686: \tEs ist das Heil uns kommen her <NA> \t4
+#> 1687: \tEs ist das Heil uns kommen her <NA> \t4
+#> 1688: \tEs ist das Heil uns kommen her <NA> \t4
#> SCT SMS
+#> <char> <char>
#> 1: \tBWV 269 B&H, 4th ed, Alfred Dörffel, c.1875, plate V.A.10
#> 2: \tBWV 269 B&H, 4th ed, Alfred Dörffel, c.1875, plate V.A.10
#> 3: \tBWV 269 B&H, 4th ed, Alfred Dörffel, c.1875, plate V.A.10
@@ -553,6 +562,7 @@ Examples#> 1687: \tBWV 86/6 B&H, 4th ed, Alfred Dörffel, c.1875, plate V.A.10
#> 1688: \tBWV 86/6 B&H, 4th ed, Alfred Dörffel, c.1875, plate V.A.10
#> YOR
+#> <char>
#> 1: 371 vierstimmige Choralgesänge von Johann Sebastian Bach, ; 4th ed. by Alfred Dörffel (Leipzig: Breitkopf und Härtel, ; c.1875). 178 pp. Plate "V.A.10". reprint: J.S. Bach, 371 Four-Part ; Chorales (New York: Associated Music Publishers, Inc., c.1940).
#> 2: 371 vierstimmige Choralgesänge von Johann Sebastian Bach, ; 4th ed. by Alfred Dörffel (Leipzig: Breitkopf und Härtel, ; c.1875). 178 pp. Plate "V.A.10". reprint: J.S. Bach, 371 Four-Part ; Chorales (New York: Associated Music Publishers, Inc., c.1940).
#> 3: 371 vierstimmige Choralgesänge von Johann Sebastian Bach, ; 4th ed. by Alfred Dörffel (Leipzig: Breitkopf und Härtel, ; c.1875). 178 pp. Plate "V.A.10". reprint: J.S. Bach, 371 Four-Part ; Chorales (New York: Associated Music Publishers, Inc., c.1940).
@@ -564,80 +574,87 @@ Examples#> 1686: 371 vierstimmige Choralgesänge von Johann Sebastian Bach, ; 4th ed. by Alfred Dörffel (Leipzig: Breitkopf und Härtel, ; c.1875). 178 pp. Plate "V.A.10". reprint: J.S. Bach, 371 Four-Part ; Chorales (New York: Associated Music Publishers, Inc., c.1940).
#> 1687: 371 vierstimmige Choralgesänge von Johann Sebastian Bach, ; 4th ed. by Alfred Dörffel (Leipzig: Breitkopf und Härtel, ; c.1875). 178 pp. Plate "V.A.10". reprint: J.S. Bach, 371 Four-Part ; Chorales (New York: Associated Music Publishers, Inc., c.1940).
#> 1688: 371 vierstimmige Choralgesänge von Johann Sebastian Bach, ; 4th ed. by Alfred Dörffel (Leipzig: Breitkopf und Härtel, ; c.1875). 178 pp. Plate "V.A.10". reprint: J.S. Bach, 371 Four-Part ; Chorales (New York: Associated Music Publishers, Inc., c.1940).
-#> hum2abc title DataRecord File Filename
-#> 1: -Q '' @{PC#}. @{OTL@@DE} NA 1 chor001.krn
-#> 2: -Q '' @{PC#}. @{OTL@@DE} NA 1 chor001.krn
-#> 3: -Q '' @{PC#}. @{OTL@@DE} NA 1 chor001.krn
-#> 4: -Q '' @{PC#}. @{OTL@@DE} NA 1 chor001.krn
-#> 5: -Q '' @{PC#}. @{OTL@@DE} NA 1 chor001.krn
-#> ---
-#> 1684: -Q '' @{PC#}. @{OTL@@DE} 59 4 chor004.krn
-#> 1685: -Q '' @{PC#}. @{OTL@@DE} 60 4 chor004.krn
-#> 1686: -Q '' @{PC#}. @{OTL@@DE} 61 4 chor004.krn
-#> 1687: -Q '' @{PC#}. @{OTL@@DE} NA 4 chor004.krn
-#> 1688: -Q '' @{PC#}. @{OTL@@DE} NA 4 chor004.krn
-#> Filepath
-#> 1: /home/nat/.tmp/Rtmpz26RCR/temp_libpatha780af15d1/humdrumR/HumdrumData/BachChorales/chor001.krn
-#> 2: /home/nat/.tmp/Rtmpz26RCR/temp_libpatha780af15d1/humdrumR/HumdrumData/BachChorales/chor001.krn
-#> 3: /home/nat/.tmp/Rtmpz26RCR/temp_libpatha780af15d1/humdrumR/HumdrumData/BachChorales/chor001.krn
-#> 4: /home/nat/.tmp/Rtmpz26RCR/temp_libpatha780af15d1/humdrumR/HumdrumData/BachChorales/chor001.krn
-#> 5: /home/nat/.tmp/Rtmpz26RCR/temp_libpatha780af15d1/humdrumR/HumdrumData/BachChorales/chor001.krn
-#> ---
-#> 1684: /home/nat/.tmp/Rtmpz26RCR/temp_libpatha780af15d1/humdrumR/HumdrumData/BachChorales/chor004.krn
-#> 1685: /home/nat/.tmp/Rtmpz26RCR/temp_libpatha780af15d1/humdrumR/HumdrumData/BachChorales/chor004.krn
-#> 1686: /home/nat/.tmp/Rtmpz26RCR/temp_libpatha780af15d1/humdrumR/HumdrumData/BachChorales/chor004.krn
-#> 1687: /home/nat/.tmp/Rtmpz26RCR/temp_libpatha780af15d1/humdrumR/HumdrumData/BachChorales/chor004.krn
-#> 1688: /home/nat/.tmp/Rtmpz26RCR/temp_libpatha780af15d1/humdrumR/HumdrumData/BachChorales/chor004.krn
-#> Global Label ParentPath Path Piece Record Spine Stop Type Exclusive.Token
-#> 1: TRUE _1 NA NA 1 1 NA NA G <NA>
-#> 2: TRUE _1 NA NA 1 2 NA NA G <NA>
-#> 3: TRUE _1 NA NA 1 3 NA NA G <NA>
-#> 4: TRUE _1 NA NA 1 4 NA NA G <NA>
-#> 5: TRUE _1 NA NA 1 5 NA NA G <NA>
-#> ---
-#> 1684: FALSE _1 0 0 4 90 4 1 D kern
-#> 1685: FALSE _1 0 0 4 91 4 1 D kern
-#> 1686: FALSE _1 0 0 4 92 4 1 D kern
-#> 1687: FALSE _1 0 0 4 93 4 1 M kern
-#> 1688: FALSE _1 0 0 4 94 4 1 S kern
-#> _rowKey_
-#> 1: 1
-#> 2: 2
-#> 3: 3
-#> 4: 4
-#> 5: 5
-#> ---
-#> 1684: 1684
-#> 1685: 1685
-#> 1686: 1686
-#> 1687: 1687
-#> 1688: 1688
+#> hum2abc title DataRecord File Filename
+#> <char> <char> <int> <int> <char>
+#> 1: -Q '' @{PC#}. @{OTL@@DE} NA 1 chor001.krn
+#> 2: -Q '' @{PC#}. @{OTL@@DE} NA 1 chor001.krn
+#> 3: -Q '' @{PC#}. @{OTL@@DE} NA 1 chor001.krn
+#> 4: -Q '' @{PC#}. @{OTL@@DE} NA 1 chor001.krn
+#> 5: -Q '' @{PC#}. @{OTL@@DE} NA 1 chor001.krn
+#> ---
+#> 1684: -Q '' @{PC#}. @{OTL@@DE} 59 4 chor004.krn
+#> 1685: -Q '' @{PC#}. @{OTL@@DE} 60 4 chor004.krn
+#> 1686: -Q '' @{PC#}. @{OTL@@DE} 61 4 chor004.krn
+#> 1687: -Q '' @{PC#}. @{OTL@@DE} NA 4 chor004.krn
+#> 1688: -Q '' @{PC#}. @{OTL@@DE} NA 4 chor004.krn
+#> Filepath
+#> <char>
+#> 1: /home/nat/.tmp/Rtmpj3llIw/temp_libpathf1bb188f0d5d/humdrumR/HumdrumData/BachChorales/chor001.krn
+#> 2: /home/nat/.tmp/Rtmpj3llIw/temp_libpathf1bb188f0d5d/humdrumR/HumdrumData/BachChorales/chor001.krn
+#> 3: /home/nat/.tmp/Rtmpj3llIw/temp_libpathf1bb188f0d5d/humdrumR/HumdrumData/BachChorales/chor001.krn
+#> 4: /home/nat/.tmp/Rtmpj3llIw/temp_libpathf1bb188f0d5d/humdrumR/HumdrumData/BachChorales/chor001.krn
+#> 5: /home/nat/.tmp/Rtmpj3llIw/temp_libpathf1bb188f0d5d/humdrumR/HumdrumData/BachChorales/chor001.krn
+#> ---
+#> 1684: /home/nat/.tmp/Rtmpj3llIw/temp_libpathf1bb188f0d5d/humdrumR/HumdrumData/BachChorales/chor004.krn
+#> 1685: /home/nat/.tmp/Rtmpj3llIw/temp_libpathf1bb188f0d5d/humdrumR/HumdrumData/BachChorales/chor004.krn
+#> 1686: /home/nat/.tmp/Rtmpj3llIw/temp_libpathf1bb188f0d5d/humdrumR/HumdrumData/BachChorales/chor004.krn
+#> 1687: /home/nat/.tmp/Rtmpj3llIw/temp_libpathf1bb188f0d5d/humdrumR/HumdrumData/BachChorales/chor004.krn
+#> 1688: /home/nat/.tmp/Rtmpj3llIw/temp_libpathf1bb188f0d5d/humdrumR/HumdrumData/BachChorales/chor004.krn
+#> Global Label ParentPath Path Piece Record Spine Stop Type
+#> <lgcl> <char> <int> <int> <int> <int> <int> <int> <char>
+#> 1: TRUE _1 NA NA 1 1 NA NA G
+#> 2: TRUE _1 NA NA 1 2 NA NA G
+#> 3: TRUE _1 NA NA 1 3 NA NA G
+#> 4: TRUE _1 NA NA 1 4 NA NA G
+#> 5: TRUE _1 NA NA 1 5 NA NA G
+#> ---
+#> 1684: FALSE _1 0 0 4 90 4 1 D
+#> 1685: FALSE _1 0 0 4 91 4 1 D
+#> 1686: FALSE _1 0 0 4 92 4 1 D
+#> 1687: FALSE _1 0 0 4 93 4 1 M
+#> 1688: FALSE _1 0 0 4 94 4 1 S
+#> Exclusive.Token _rowKey_
+#> <char> <int>
+#> 1: <NA> 1
+#> 2: <NA> 2
+#> 3: <NA> 3
+#> 4: <NA> 4
+#> 5: <NA> 5
+#> ---
+#> 1684: kern 1684
+#> 1685: kern 1685
+#> 1686: kern 1686
+#> 1687: kern 1687
+#> 1688: kern 1688
getHumtab ( humData , dataTypes = 'D' )
-#> Token Bar BarLabel DoubleBar Formal BPM Clef Exclusive Instrument
-#> 1: 4GG 0 <NA> 0 A MM100 clefF4 kern I"Bass
-#> 2: 4G 1 1 0 A MM100 clefF4 kern I"Bass
-#> 3: 4E 1 1 0 A MM100 clefF4 kern I"Bass
-#> 4: 4F# 1 1 0 A MM100 clefF4 kern I"Bass
-#> 5: 4G 2 2 0 A MM100 clefF4 kern I"Bass
-#> ---
-#> 838: 4g# 10 9 0 B MM100 clefG2 kern I"Soprano
-#> 839: 4f# 10 9 0 B MM100 clefG2 kern I"Soprano
-#> 840: 4c# 11 10 0 B MM100 clefG2 kern I"Soprano
-#> 841: 4d# 11 10 0 B MM100 clefG2 kern I"Soprano
-#> 842: 4e; 11 10 0 B MM100 clefG2 kern I"Soprano
-#> InstrumentClass Key KeySignature Mensuration
-#> 1: ICvox G: k[f#] <NA>
-#> 2: ICvox G: k[f#] <NA>
-#> 3: ICvox G: k[f#] <NA>
-#> 4: ICvox G: k[f#] <NA>
-#> 5: ICvox G: k[f#] <NA>
-#> ---
-#> 838: ICvox E: k[f#c#g#d#] met(c)
-#> 839: ICvox E: k[f#c#g#d#] met(c)
-#> 840: ICvox E: k[f#c#g#d#] met(c)
-#> 841: ICvox E: k[f#c#g#d#] met(c)
-#> 842: ICvox E: k[f#c#g#d#] met(c)
+#> Token Bar BarLabel DoubleBar Formal BPM Clef Exclusive Instrument
+#> <char> <int> <char> <int> <char> <char> <char> <char> <char>
+#> 1: 4GG 0 <NA> 0 A MM100 clefF4 kern I"Bass
+#> 2: 4G 1 1 0 A MM100 clefF4 kern I"Bass
+#> 3: 4E 1 1 0 A MM100 clefF4 kern I"Bass
+#> 4: 4F# 1 1 0 A MM100 clefF4 kern I"Bass
+#> 5: 4G 2 2 0 A MM100 clefF4 kern I"Bass
+#> ---
+#> 838: 4g# 10 9 0 B MM100 clefG2 kern I"Soprano
+#> 839: 4f# 10 9 0 B MM100 clefG2 kern I"Soprano
+#> 840: 4c# 11 10 0 B MM100 clefG2 kern I"Soprano
+#> 841: 4d# 11 10 0 B MM100 clefG2 kern I"Soprano
+#> 842: 4e; 11 10 0 B MM100 clefG2 kern I"Soprano
+#> InstrumentClass Key KeySignature Mensuration
+#> <char> <char> <char> <char>
+#> 1: ICvox G: k[f#] <NA>
+#> 2: ICvox G: k[f#] <NA>
+#> 3: ICvox G: k[f#] <NA>
+#> 4: ICvox G: k[f#] <NA>
+#> 5: ICvox G: k[f#] <NA>
+#> ---
+#> 838: ICvox E: k[f#c#g#d#] met(c)
+#> 839: ICvox E: k[f#c#g#d#] met(c)
+#> 840: ICvox E: k[f#c#g#d#] met(c)
+#> 841: ICvox E: k[f#c#g#d#] met(c)
+#> 842: ICvox E: k[f#c#g#d#] met(c)
#> Tandem
+#> <char>
#> 1: MM100,M3/4,G:,k[f#],clefF4,I"Bass,Ibass,ICvox
#> 2: MM100,M3/4,G:,k[f#],clefF4,I"Bass,Ibass,ICvox
#> 3: MM100,M3/4,G:,k[f#],clefF4,I"Bass,Ibass,ICvox
@@ -650,6 +667,7 @@ Examples#> 841: MM100,met(c),M4/4,E:,k[f#c#g#d#],clefG2,I"Soprano,Isoprn,ICvox
#> 842: MM100,met(c),M4/4,E:,k[f#c#g#d#],clefG2,I"Soprano,Isoprn,ICvox
#> TimeSignature AGN CDT COM
+#> <char> <char> <char> <char>
#> 1: M3/4 \tchorale \t1685/02/21/-1750/07/28/ \tBach, Johann Sebastian
#> 2: M3/4 \tchorale \t1685/02/21/-1750/07/28/ \tBach, Johann Sebastian
#> 3: M3/4 \tchorale \t1685/02/21/-1750/07/28/ \tBach, Johann Sebastian
@@ -661,31 +679,34 @@ Examples#> 840: M4/4 \tchorale \t1685/02/21/-1750/07/28/ \tBach, Johann Sebastian
#> 841: M4/4 \tchorale \t1685/02/21/-1750/07/28/ \tBach, Johann Sebastian
#> 842: M4/4 \tchorale \t1685/02/21/-1750/07/28/ \tBach, Johann Sebastian
-#> EED EEV OPR OTL@@DE
-#> 1: Craig Stuart Sapp 2009/05/22 <NA> \tAus meines Herzens Grunde
-#> 2: Craig Stuart Sapp 2009/05/22 <NA> \tAus meines Herzens Grunde
-#> 3: Craig Stuart Sapp 2009/05/22 <NA> \tAus meines Herzens Grunde
-#> 4: Craig Stuart Sapp 2009/05/22 <NA> \tAus meines Herzens Grunde
-#> 5: Craig Stuart Sapp 2009/05/22 <NA> \tAus meines Herzens Grunde
-#> ---
-#> 838: Craig Stuart Sapp 2009/05/22 <NA> \tEs ist das Heil uns kommen her
-#> 839: Craig Stuart Sapp 2009/05/22 <NA> \tEs ist das Heil uns kommen her
-#> 840: Craig Stuart Sapp 2009/05/22 <NA> \tEs ist das Heil uns kommen her
-#> 841: Craig Stuart Sapp 2009/05/22 <NA> \tEs ist das Heil uns kommen her
-#> 842: Craig Stuart Sapp 2009/05/22 <NA> \tEs ist das Heil uns kommen her
-#> OTL@EN PC# SCT
-#> 1: From the Depths of My Heart \t1 \tBWV 269
-#> 2: From the Depths of My Heart \t1 \tBWV 269
-#> 3: From the Depths of My Heart \t1 \tBWV 269
-#> 4: From the Depths of My Heart \t1 \tBWV 269
-#> 5: From the Depths of My Heart \t1 \tBWV 269
-#> ---
-#> 838: <NA> \t4 \tBWV 86/6
-#> 839: <NA> \t4 \tBWV 86/6
-#> 840: <NA> \t4 \tBWV 86/6
-#> 841: <NA> \t4 \tBWV 86/6
-#> 842: <NA> \t4 \tBWV 86/6
+#> EED EEV OPR OTL@@DE
+#> <char> <char> <char> <char>
+#> 1: Craig Stuart Sapp 2009/05/22 <NA> \tAus meines Herzens Grunde
+#> 2: Craig Stuart Sapp 2009/05/22 <NA> \tAus meines Herzens Grunde
+#> 3: Craig Stuart Sapp 2009/05/22 <NA> \tAus meines Herzens Grunde
+#> 4: Craig Stuart Sapp 2009/05/22 <NA> \tAus meines Herzens Grunde
+#> 5: Craig Stuart Sapp 2009/05/22 <NA> \tAus meines Herzens Grunde
+#> ---
+#> 838: Craig Stuart Sapp 2009/05/22 <NA> \tEs ist das Heil uns kommen her
+#> 839: Craig Stuart Sapp 2009/05/22 <NA> \tEs ist das Heil uns kommen her
+#> 840: Craig Stuart Sapp 2009/05/22 <NA> \tEs ist das Heil uns kommen her
+#> 841: Craig Stuart Sapp 2009/05/22 <NA> \tEs ist das Heil uns kommen her
+#> 842: Craig Stuart Sapp 2009/05/22 <NA> \tEs ist das Heil uns kommen her
+#> OTL@EN PC# SCT
+#> <char> <char> <char>
+#> 1: From the Depths of My Heart \t1 \tBWV 269
+#> 2: From the Depths of My Heart \t1 \tBWV 269
+#> 3: From the Depths of My Heart \t1 \tBWV 269
+#> 4: From the Depths of My Heart \t1 \tBWV 269
+#> 5: From the Depths of My Heart \t1 \tBWV 269
+#> ---
+#> 838: <NA> \t4 \tBWV 86/6
+#> 839: <NA> \t4 \tBWV 86/6
+#> 840: <NA> \t4 \tBWV 86/6
+#> 841: <NA> \t4 \tBWV 86/6
+#> 842: <NA> \t4 \tBWV 86/6
#> SMS
+#> <char>
#> 1: B&H, 4th ed, Alfred Dörffel, c.1875, plate V.A.10
#> 2: B&H, 4th ed, Alfred Dörffel, c.1875, plate V.A.10
#> 3: B&H, 4th ed, Alfred Dörffel, c.1875, plate V.A.10
@@ -698,6 +719,7 @@ Examples#> 841: B&H, 4th ed, Alfred Dörffel, c.1875, plate V.A.10
#> 842: B&H, 4th ed, Alfred Dörffel, c.1875, plate V.A.10
#> YOR
+#> <char>
#> 1: 371 vierstimmige Choralgesänge von Johann Sebastian Bach, ; 4th ed. by Alfred Dörffel (Leipzig: Breitkopf und Härtel, ; c.1875). 178 pp. Plate "V.A.10". reprint: J.S. Bach, 371 Four-Part ; Chorales (New York: Associated Music Publishers, Inc., c.1940).
#> 2: 371 vierstimmige Choralgesänge von Johann Sebastian Bach, ; 4th ed. by Alfred Dörffel (Leipzig: Breitkopf und Härtel, ; c.1875). 178 pp. Plate "V.A.10". reprint: J.S. Bach, 371 Four-Part ; Chorales (New York: Associated Music Publishers, Inc., c.1940).
#> 3: 371 vierstimmige Choralgesänge von Johann Sebastian Bach, ; 4th ed. by Alfred Dörffel (Leipzig: Breitkopf und Härtel, ; c.1875). 178 pp. Plate "V.A.10". reprint: J.S. Bach, 371 Four-Part ; Chorales (New York: Associated Music Publishers, Inc., c.1940).
@@ -709,54 +731,58 @@ Examples#> 840: 371 vierstimmige Choralgesänge von Johann Sebastian Bach, ; 4th ed. by Alfred Dörffel (Leipzig: Breitkopf und Härtel, ; c.1875). 178 pp. Plate "V.A.10". reprint: J.S. Bach, 371 Four-Part ; Chorales (New York: Associated Music Publishers, Inc., c.1940).
#> 841: 371 vierstimmige Choralgesänge von Johann Sebastian Bach, ; 4th ed. by Alfred Dörffel (Leipzig: Breitkopf und Härtel, ; c.1875). 178 pp. Plate "V.A.10". reprint: J.S. Bach, 371 Four-Part ; Chorales (New York: Associated Music Publishers, Inc., c.1940).
#> 842: 371 vierstimmige Choralgesänge von Johann Sebastian Bach, ; 4th ed. by Alfred Dörffel (Leipzig: Breitkopf und Härtel, ; c.1875). 178 pp. Plate "V.A.10". reprint: J.S. Bach, 371 Four-Part ; Chorales (New York: Associated Music Publishers, Inc., c.1940).
-#> hum2abc title DataRecord File Filename
-#> 1: -Q '' @{PC#}. @{OTL@@DE} 1 1 chor001.krn
-#> 2: -Q '' @{PC#}. @{OTL@@DE} 2 1 chor001.krn
-#> 3: -Q '' @{PC#}. @{OTL@@DE} 3 1 chor001.krn
-#> 4: -Q '' @{PC#}. @{OTL@@DE} 5 1 chor001.krn
-#> 5: -Q '' @{PC#}. @{OTL@@DE} 6 1 chor001.krn
-#> ---
-#> 838: -Q '' @{PC#}. @{OTL@@DE} 56 4 chor004.krn
-#> 839: -Q '' @{PC#}. @{OTL@@DE} 57 4 chor004.krn
-#> 840: -Q '' @{PC#}. @{OTL@@DE} 59 4 chor004.krn
-#> 841: -Q '' @{PC#}. @{OTL@@DE} 60 4 chor004.krn
-#> 842: -Q '' @{PC#}. @{OTL@@DE} 61 4 chor004.krn
-#> Filepath
-#> 1: /home/nat/.tmp/Rtmpz26RCR/temp_libpatha780af15d1/humdrumR/HumdrumData/BachChorales/chor001.krn
-#> 2: /home/nat/.tmp/Rtmpz26RCR/temp_libpatha780af15d1/humdrumR/HumdrumData/BachChorales/chor001.krn
-#> 3: /home/nat/.tmp/Rtmpz26RCR/temp_libpatha780af15d1/humdrumR/HumdrumData/BachChorales/chor001.krn
-#> 4: /home/nat/.tmp/Rtmpz26RCR/temp_libpatha780af15d1/humdrumR/HumdrumData/BachChorales/chor001.krn
-#> 5: /home/nat/.tmp/Rtmpz26RCR/temp_libpatha780af15d1/humdrumR/HumdrumData/BachChorales/chor001.krn
-#> ---
-#> 838: /home/nat/.tmp/Rtmpz26RCR/temp_libpatha780af15d1/humdrumR/HumdrumData/BachChorales/chor004.krn
-#> 839: /home/nat/.tmp/Rtmpz26RCR/temp_libpatha780af15d1/humdrumR/HumdrumData/BachChorales/chor004.krn
-#> 840: /home/nat/.tmp/Rtmpz26RCR/temp_libpatha780af15d1/humdrumR/HumdrumData/BachChorales/chor004.krn
-#> 841: /home/nat/.tmp/Rtmpz26RCR/temp_libpatha780af15d1/humdrumR/HumdrumData/BachChorales/chor004.krn
-#> 842: /home/nat/.tmp/Rtmpz26RCR/temp_libpatha780af15d1/humdrumR/HumdrumData/BachChorales/chor004.krn
-#> Global Label ParentPath Path Piece Record Spine Stop Type Exclusive.Token
-#> 1: FALSE _1 0 0 1 20 1 1 D kern
-#> 2: FALSE _1 0 0 1 22 1 1 D kern
-#> 3: FALSE _1 0 0 1 23 1 1 D kern
-#> 4: FALSE _1 0 0 1 25 1 1 D kern
-#> 5: FALSE _1 0 0 1 27 1 1 D kern
-#> ---
-#> 838: FALSE _1 0 0 4 86 4 1 D kern
-#> 839: FALSE _1 0 0 4 87 4 1 D kern
-#> 840: FALSE _1 0 0 4 90 4 1 D kern
-#> 841: FALSE _1 0 0 4 91 4 1 D kern
-#> 842: FALSE _1 0 0 4 92 4 1 D kern
-#> _rowKey_
-#> 1: 29
-#> 2: 31
-#> 3: 32
-#> 4: 34
-#> 5: 36
-#> ---
-#> 838: 1680
-#> 839: 1681
-#> 840: 1684
-#> 841: 1685
-#> 842: 1686
+#> hum2abc title DataRecord File Filename
+#> <char> <char> <int> <int> <char>
+#> 1: -Q '' @{PC#}. @{OTL@@DE} 1 1 chor001.krn
+#> 2: -Q '' @{PC#}. @{OTL@@DE} 2 1 chor001.krn
+#> 3: -Q '' @{PC#}. @{OTL@@DE} 3 1 chor001.krn
+#> 4: -Q '' @{PC#}. @{OTL@@DE} 5 1 chor001.krn
+#> 5: -Q '' @{PC#}. @{OTL@@DE} 6 1 chor001.krn
+#> ---
+#> 838: -Q '' @{PC#}. @{OTL@@DE} 56 4 chor004.krn
+#> 839: -Q '' @{PC#}. @{OTL@@DE} 57 4 chor004.krn
+#> 840: -Q '' @{PC#}. @{OTL@@DE} 59 4 chor004.krn
+#> 841: -Q '' @{PC#}. @{OTL@@DE} 60 4 chor004.krn
+#> 842: -Q '' @{PC#}. @{OTL@@DE} 61 4 chor004.krn
+#> Filepath
+#> <char>
+#> 1: /home/nat/.tmp/Rtmpj3llIw/temp_libpathf1bb188f0d5d/humdrumR/HumdrumData/BachChorales/chor001.krn
+#> 2: /home/nat/.tmp/Rtmpj3llIw/temp_libpathf1bb188f0d5d/humdrumR/HumdrumData/BachChorales/chor001.krn
+#> 3: /home/nat/.tmp/Rtmpj3llIw/temp_libpathf1bb188f0d5d/humdrumR/HumdrumData/BachChorales/chor001.krn
+#> 4: /home/nat/.tmp/Rtmpj3llIw/temp_libpathf1bb188f0d5d/humdrumR/HumdrumData/BachChorales/chor001.krn
+#> 5: /home/nat/.tmp/Rtmpj3llIw/temp_libpathf1bb188f0d5d/humdrumR/HumdrumData/BachChorales/chor001.krn
+#> ---
+#> 838: /home/nat/.tmp/Rtmpj3llIw/temp_libpathf1bb188f0d5d/humdrumR/HumdrumData/BachChorales/chor004.krn
+#> 839: /home/nat/.tmp/Rtmpj3llIw/temp_libpathf1bb188f0d5d/humdrumR/HumdrumData/BachChorales/chor004.krn
+#> 840: /home/nat/.tmp/Rtmpj3llIw/temp_libpathf1bb188f0d5d/humdrumR/HumdrumData/BachChorales/chor004.krn
+#> 841: /home/nat/.tmp/Rtmpj3llIw/temp_libpathf1bb188f0d5d/humdrumR/HumdrumData/BachChorales/chor004.krn
+#> 842: /home/nat/.tmp/Rtmpj3llIw/temp_libpathf1bb188f0d5d/humdrumR/HumdrumData/BachChorales/chor004.krn
+#> Global Label ParentPath Path Piece Record Spine Stop Type
+#> <lgcl> <char> <int> <int> <int> <int> <int> <int> <char>
+#> 1: FALSE _1 0 0 1 20 1 1 D
+#> 2: FALSE _1 0 0 1 22 1 1 D
+#> 3: FALSE _1 0 0 1 23 1 1 D
+#> 4: FALSE _1 0 0 1 25 1 1 D
+#> 5: FALSE _1 0 0 1 27 1 1 D
+#> ---
+#> 838: FALSE _1 0 0 4 86 4 1 D
+#> 839: FALSE _1 0 0 4 87 4 1 D
+#> 840: FALSE _1 0 0 4 90 4 1 D
+#> 841: FALSE _1 0 0 4 91 4 1 D
+#> 842: FALSE _1 0 0 4 92 4 1 D
+#> Exclusive.Token _rowKey_
+#> <char> <int>
+#> 1: kern 29
+#> 2: kern 31
+#> 3: kern 32
+#> 4: kern 34
+#> 5: kern 36
+#> ---
+#> 838: kern 1680
+#> 839: kern 1681
+#> 840: kern 1684
+#> 841: kern 1685
+#> 842: kern 1686
@@ -765,11 +791,11 @@ Examples
-
Developed by Nathaniel Condit-Schultz, Claire Arthur.
+ Developed by Nathaniel Condit-Schultz, Claire Arthur.
diff --git a/docs/reference/humdrumDispatch.html b/docs/reference/humdrumDispatch.html
index 26548c4f..f18983f4 100644
--- a/docs/reference/humdrumDispatch.html
+++ b/docs/reference/humdrumDispatch.html
@@ -4,7 +4,7 @@
applied to a variety of character strings.
Humdrum dispatch works like normal R method dispatch, but instead of dispatching specific methods
based on their class (integer, character, etc.) it dispatches based on regular expressions.
-In addition, exclusive interpretations can be used to guide dispatch.">Regular expression method dispatch and function application — humdrumDispatch • humdrumR Regular expression method dispatch and function application — humdrumDispatch • humdrumR Skip to contents
-
diff --git a/docs/reference/humdrumPitch.html b/docs/reference/humdrumPitch.html
index 5157fdd1..c67c30ec 100644
--- a/docs/reference/humdrumPitch.html
+++ b/docs/reference/humdrumPitch.html
@@ -1,6 +1,6 @@
humdrumR and pitch — humdrumPitch • humdrumR humdrumR and pitch — humdrumPitch • humdrumR humdrumR — humdrumR • humdrumR Skip to contents
-
diff --git a/docs/reference/humdrumRclass.html b/docs/reference/humdrumRclass.html
index 9196ac21..797f0c7c 100644
--- a/docs/reference/humdrumRclass.html
+++ b/docs/reference/humdrumRclass.html
@@ -6,7 +6,7 @@
In the documentation, we refer to these objects interchangeably as
"humdrumR corpora", "humdrumR objects," or humdrumR data(sets).
In coding examples we name them "humData."
-Test is an object/variable is a humdrumR dataset using is.humdrumR().'>humdrumR class — humdrumRclass • humdrumR humdrumR class — humdrumRclass • humdrumR
+#> REpath-pattern '/home/nat/.tmp/Rtmpj3llIw/temp_libpathf1bb188f0d5d/humdrumR/HumdrumData/BachChorales/chor00[1-4].krn' matches 4 text files in 1 directory.
#> Four files read from disk.
#> Validating four files...
#> all valid.
@@ -520,11 +520,11 @@ Examples
-
Developed by Nathaniel Condit-Schultz, Claire Arthur.
+ Developed by Nathaniel Condit-Schultz, Claire Arthur.
diff --git a/docs/reference/index.html b/docs/reference/index.html
index ecd572ef..78a3af93 100644
--- a/docs/reference/index.html
+++ b/docs/reference/index.html
@@ -1,16 +1,16 @@
-Function reference • humdrumR Function reference • humdrumR
Skip to contents
-
+
humdrumR
-
0.7.0.4
+
0.7.0.5
@@ -77,7 +77,7 @@
Reading and Summarizing Data
-
These tools allow you to import, validate, and abstractly summarize the content of humdrum data.
+
These tools allow you to import, validate, and abstractly summarize the content of humdrum data.
Musical Tools
-
These pages describe the classes and functions that directly represent or engage musical/music-theoretic concepts.
+
These pages describe the classes and functions that directly represent or engage musical/music-theoretic concepts.
Pitch overviews
-
These pages overview general concepts in humdrumR pitch:
+
These pages overview general concepts in humdrumR pitch:
Pitch functions
-
These functions translate between pitch representations:
+
These functions translate between pitch representations:
Key and chord functions
-
These functions translate between diatonic and tertian representations:
+
These functions translate between diatonic and tertian representations:
@@ -471,7 +471,7 @@
Key and chord functions
Rhythm overviews
-
These pages overview general concepts in humdrumR pitch:
+
These pages overview general concepts in humdrumR pitch:
Duration and Time functions
-
These functions translate between rhythm representations:
+
These functions translate between rhythm representations:
Lyrics
-
Lyrics and text functions.
+
Lyrics and text functions.
@@ -624,13 +624,13 @@
Lyrics <
- wort()
wort()
wort()
+ wort()
- Paste sylllables together into words
+ Paste syllables together into words
Data Structures
-
These pages describe the data structures of humdrumR, and how to query or manipulate them.
+
These pages describe the data structures of humdrumR, and how to query or manipulate them.
Other Functions
-
Other useful tools.
+
@@ -921,11 +921,11 @@
Some R basics lessons
diff --git a/docs/reference/indexHumdrum.html b/docs/reference/indexHumdrum.html
index 98f78ed7..b7670aa1 100644
--- a/docs/reference/indexHumdrum.html
+++ b/docs/reference/indexHumdrum.html
@@ -6,7 +6,7 @@
the indexing operators are generally destructive (by default), meaning filtered data can no longer
be accessed after indexing.
The functions index() and index2() are synonyms for single and double brackets respectively,
-which can be used in pipes.">Indexing humdrumR objects — indexHumdrum • humdrumR Indexing humdrumR objects — indexHumdrum • humdrumR Skip to contents
-
+
humdrumR
-
0.7.0.4
+
0.7.0.5
@@ -138,6 +138,12 @@ ArgumentsExamples
humData <- readHumdrum ( humdrumRroot , "HumdrumData/RollingStoneCorpus/*.hum" )
#> Finding and reading files...
-#> REpath-pattern '/home/nat/.tmp/Rtmpz26RCR/temp_libpatha780af15d1/humdrumR/HumdrumData/RollingStoneCorpus/*.hum' matches 13 text files in 1 directory.
+#> REpath-pattern '/home/nat/.tmp/Rtmpj3llIw/temp_libpathf1bb188f0d5d/humdrumR/HumdrumData/RollingStoneCorpus/*.hum' matches 13 text files in 1 directory.
#> Thirteen files read from disk.
#> Validating thirteen files...
#> all valid.
@@ -996,122 +1002,7 @@ Examples#> *Token :: character
#>
humData [[ 'b3' , removeEmpty = TRUE ] ]
-#> #################### vvv blue_suede_shoes.hum vvv ####################
-#> 1: !!!Rolling Stone List Rank: 95
-#> 2: !!!OTL: Blue Suede Shoes
-#> 3: !!!COC: Carl Perkins
-#> 4: !!!RRD: 1956/
-#> 5: !!!In original RS 5x20 subset: True
-#> 6: **harm **harm **deg **timestamp
-#> 7: !T.d.C. !D.T. !T.d.C. !
-#> 8: =1 =1 =1 =1
-#> 9: *tb8 *tb8 *tb8 *
-#> 10: *M12/8 *M12/8 *M12/8 *
-#> 11: *A: *A: *A: *
-#> 12: *k[f#c#g#] *k[f#c#g#] *k[f#c#g#] *
-#> 25: =2 =2 =2 =2
-#> 32: . . b3 .
-#> 34: . . b3 .
-#> 38: =3 =3 =3 =3
-#> 39: *tb2. *tb2. *tb2. *
-#> 40: *M6/8 *M6/8 *M6/8 *
-#> 42: =4 =4 =4 =4
-#> 43: *tb8 *tb8 *tb8 *
-#> 44: *M12/8 *M12/8 *M12/8 *
-#> 51: . . b3 .
-#> 57: =5 =5 =5 =5
-#> 58: *tb2. *tb2. *tb2. *
-#> 59: *M6/8 *M6/8 *M6/8 *
-#> 61: =6 =6 =6 =6
-#> 62: *tb8 *tb8 *tb8 *
-#> 63: *M12/8 *M12/8 *M12/8 *
-#> 76: =7 =7 =7 =7
-#> 83: . . b3 .
-#> 88: . . b3 .
-#> 89: =8 =8 =8 =8
-#> 90: *tb4 *tb4 *tb4 *
-#> 92: . . b3 .
-#> 97: =9 =9 =9 =9
-#> 98: *tb8 *tb8 *tb8 *
-#> 105: . . b3 .
-#> 111: =10 =10 =10 =10
-#> 112: *tb1. *tb1. *tb1. *
-#> 114: =11 =11 =11 =11
-#> 115: *tb8 *tb8 *tb8 *
-#> 128: =12 =12 =12 =12
-#> 141: =13 =13 =13 =13
-#> 154: =14 =14 =14 =14
-#> 155: *tb1. *tb1. *tb1. *
-#> 157: =15 =15 =15 =15
-#> 158: *tb8 *tb8 *tb8 *
-#> 171: =16 =16 =16 =16
-#> 180: . . b3 .
-#> 184: =17 =17 =17 =17
-#> 197-869:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
-#> #################### ^^^ blue_suede_shoes.hum ^^^ ####################
-#>
-#> (six more pieces...)
-#>
-#> ####################### vvv your_song.hum vvv ########################
-#> 1-1006:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
-#> 1007: *tb16 *tb16 *tb16 *
-#> 1024: =99 =99 =99 =99
-#> 1025: *tb8 *tb8 *tb8 *
-#> 1034: =100 =100 =100 =100
-#> 1035: *tb16 *tb16 *tb16 *
-#> 1052: =101 =101 =101 =101
-#> 1053: *tb8 *tb8 *tb8 *
-#> 1062: =102 =102 =102 =102
-#> 1063: *tb16 *tb16 *tb16 *
-#> 1080: =103 =103 =103 =103
-#> 1081: *tb8 *tb8 *tb8 *
-#> 1090: =104 =104 =104 =104
-#> 1099: =105 =105 =105 =105
-#> 1108: =106 =106 =106 =106
-#> 1109: *tb1 *tb1 *tb1 *
-#> 1111: =107 =107 =107 =107
-#> 1112: *tb4 *tb4 *tb4 *
-#> 1117: =108 =108 =108 =108
-#> 1118: *tb8 *tb8 *tb8 *
-#> 1127: =109 =109 =109 =109
-#> 1136: =110 =110 =110 =110
-#> 1137: . . b3 205.287
-#> 1145: =111 =111 =111 =111
-#> 1146: *tb1 *tb1 *tb1 *
-#> 1148: =112 =112 =112 =112
-#> 1150: =113 =113 =113 =113
-#> 1151: *tb8 *tb8 *tb8 *
-#> 1160: =114 =114 =114 =114
-#> 1163: . . b3 .
-#> 1169: =115 =115 =115 =115
-#> 1178: =116 =116 =116 =116
-#> 1179: *tb1 *tb1 *tb1 *
-#> 1181: =117 =117 =117 =117
-#> 1182: *tb8 *tb8 *tb8 *
-#> 1191: =118 =118 =118 =118
-#> 1200: =119 =119 =119 =119
-#> 1209: =120 =120 =120 =120
-#> 1210: . . b3 224.253
-#> 1218: =121 =121 =121 =121
-#> 1219: *tb1 *tb1 *tb1 *
-#> 1221: =122 =122 =122 =122
-#> 1223: =123 =123 =123 =123
-#> 1225: =124 =124 =124 =124
-#> 1227: =125 =125 =125 =125
-#> 1229: *- *- *- *-
-#> 1230: !!!ONB: Translated from original encodings in the***
-#> 1231: !!!ONB: Original transcribers noted in comments i***
-#> 1232: !!!YOE: David Temperley, Trevor de Clercq
-#> 1233: !!!EED: Nathaniel Condit-Schultz (fathermckenzie.***
-#> 1234: !!!ENC: Nathaniel Condit-Schultz (fathermckenzie.***
-#> ####################### ^^^ your_song.hum ^^^ ########################
-#> (***four global comments truncated due to screen size***)
-#>
-#> humdrumR corpus of eight pieces.
-#>
-#> Data fields:
-#> *Token :: character
-#>
+#> Error in .local(x, i, ...): unused argument (removeEmpty = TRUE)
# Exclusive interpretation indexing
humData [[ deg = 1 ] ]
@@ -1244,11 +1135,11 @@ Examples
-
Developed by Nathaniel Condit-Schultz, Claire Arthur.
+ Developed by Nathaniel Condit-Schultz, Claire Arthur.
diff --git a/docs/reference/int.html b/docs/reference/int.html
index 1106aec8..0be869c7 100644
--- a/docs/reference/int.html
+++ b/docs/reference/int.html
@@ -7,7 +7,7 @@
If no field names are specified, the first selectedField is used as x.
If hint() is applied to a humdrumR data class
you may use the data's fields as arguments.
-If no field names are specified, the first selectedField is used as x.">Calculate intervals between pitches — int • humdrumR Calculate intervals between pitches — int • humdrumR Skip to contents
-
diff --git a/docs/reference/interpretations.html b/docs/reference/interpretations.html
index ef852c2e..ae499179 100644
--- a/docs/reference/interpretations.html
+++ b/docs/reference/interpretations.html
@@ -2,7 +2,7 @@
Summarize humdrum corpus interpretations. — interpretations • humdrumR Summarize humdrum corpus interpretations. — interpretations • humdrumR Tonal (pitch) interval representation — interval • humdrumR Skip to contents
-
diff --git a/docs/reference/invert.html b/docs/reference/invert.html
index df82377f..e22acc31 100644
--- a/docs/reference/invert.html
+++ b/docs/reference/invert.html
@@ -1,16 +1,16 @@
-Invert or transpose pitches. — invert • humdrumR Invert or transpose pitches. — invert • humdrumR
Skip to contents
-
+
humdrumR
-
0.7.0.4
+
0.7.0.5
@@ -96,11 +96,11 @@ See also
diff --git a/docs/reference/ioi.html b/docs/reference/ioi.html
index 5141cb1c..fea117f6 100644
--- a/docs/reference/ioi.html
+++ b/docs/reference/ioi.html
@@ -8,7 +8,7 @@
If no field names are specified, the first selectedField is used as x.
If sumTies() is applied to a humdrumR data class
you may use the data's fields as arguments.
-If no field names are specified, the first selectedField is used as x.">Sum "connected" durations — ioi • humdrumR Sum "connected" durations — ioi • humdrumR Skip to contents
-
diff --git a/docs/reference/is.major.html b/docs/reference/is.major.html
index 3f318997..4291d5d3 100644
--- a/docs/reference/is.major.html
+++ b/docs/reference/is.major.html
@@ -5,7 +5,7 @@
a major or minor chord, but rather a "broad" major/minorness:
gnerally, the presence of a minor third degree
makes a set "minor"; thus, a diminished chord is "minor"
-and the lydian key is "major."'>Test the major/minor modality of a set — is.major • humdrumR Test the major/minor modality of a set — is.major • humdrumR Test the properties of tonal information — is.simple • humdrumR Test the properties of tonal information — is.simple • humdrumR Kern pitch representation — kern • humdrumR Kern pitch representation — kern • humdrumR Skip to contents
-
diff --git a/docs/reference/key.html b/docs/reference/key.html
index 3f340487..0394d283 100644
--- a/docs/reference/key.html
+++ b/docs/reference/key.html
@@ -1,16 +1,16 @@
-Humdrum key interpretation — key • humdrumR Humdrum key interpretation — key • humdrumR
Skip to contents
-
diff --git a/docs/reference/keyDeparsing.html b/docs/reference/keyDeparsing.html
index 211f8334..dabe8038 100644
--- a/docs/reference/keyDeparsing.html
+++ b/docs/reference/keyDeparsing.html
@@ -5,7 +5,7 @@
"Under the hood" humdrumR represents all tonal chord information using the same underlying representation,
which is typically extracted from input data using the key parser.
This representation can then be "deparsed" into a variety of predefined output formats,
-or into new formats that you create!'>Generating ("deparsing") key representations — keyDeparsing • humdrumR Generating ("deparsing") key representations — keyDeparsing • humdrumR Parsing and deparsing key information — keyFunctions • humdrumR Parsing and deparsing key information — keyFunctions • humdrumR Parsing key information — keyParsing • humdrumR Lilypond pitch representation — lilypond • humdrumR Lilypond pitch representation — lilypond • humdrumR Skip to contents
-
diff --git a/docs/reference/meter.html b/docs/reference/meter.html
index 81536adb..0751ca36 100644
--- a/docs/reference/meter.html
+++ b/docs/reference/meter.html
@@ -5,7 +5,7 @@
For example, the meter 4/4 could be represented as the recip() beat-levels
c("1", "2", "4", "8", "16")---that is,
whole-note, half-note, quater-note, eighth-note, and sixteenth note.
-In addition, each meter has a tactus---the "main" beat level.'>Musical Meter in humdrumR — meter • humdrumR Musical Meter in humdrumR — meter • humdrumR )
#> Finding and reading files...
-#> REpath-pattern '/home/nat/.tmp/Rtmpz26RCR/temp_libpatha780af15d1/humdrumR/HumdrumData/BachChorales/.*krn' matches 10 text files in 1 directory.
+#> REpath-pattern '/home/nat/.tmp/Rtmpj3llIw/temp_libpathf1bb188f0d5d/humdrumR/HumdrumData/BachChorales/.*krn' matches 10 text files in 1 directory.
#> Ten files read from disk.
#> Validating ten files...
#> all valid.
@@ -490,8 +490,8 @@ Examples#> humdrumR corpus of ten pieces.
#>
#> Data fields:
-#> Token :: character
-#> *metcount(Token, pickup = Bar < 1, fill.levels = "below") :: numeric
+#> Token :: character
+#> *humdrumR:::metcount(Token, pickup = Bar < 1, fill.levels = "below") :: numeric
#>
@@ -501,11 +501,11 @@ Examples
-
Developed by Nathaniel Condit-Schultz, Claire Arthur.
+ Developed by Nathaniel Condit-Schultz, Claire Arthur.
diff --git a/docs/reference/nbeats.html b/docs/reference/nbeats.html
index fdb88886..0a7305ba 100644
--- a/docs/reference/nbeats.html
+++ b/docs/reference/nbeats.html
@@ -1,16 +1,16 @@
-Counting beats — nbeats • humdrumR Counting beats — nbeats • humdrumR
Skip to contents
-
+
humdrumR
-
0.7.0.4
+
0.7.0.5
@@ -99,11 +99,11 @@ Usage
diff --git a/docs/reference/notehead.html b/docs/reference/notehead.html
index 049d0dbf..3894e724 100644
--- a/docs/reference/notehead.html
+++ b/docs/reference/notehead.html
@@ -3,7 +3,7 @@
symbols, as in Western notation.
If notehead() is applied to a humdrumR data class
you may use the data's fields as arguments.
-If no field names are specified, the first selectedField is used as x.">Note value representation of duration — notehead • humdrumR Note value representation of duration — notehead • humdrumR Skip to contents
-
diff --git a/docs/reference/octave.html b/docs/reference/octave.html
index aef5e43f..b1c235aa 100644
--- a/docs/reference/octave.html
+++ b/docs/reference/octave.html
@@ -2,7 +2,7 @@
Extract octave. — octave • humdrumR Extract octave. — octave • humdrumR What is "partial matching"? — partialMatching • humdrumR What is "partial matching"? — partialMatching • humdrumR
Skip to contents
-
+
humdrumR
-
0.7.0.4
+
0.7.0.5
@@ -114,11 +114,11 @@ See also
diff --git a/docs/reference/pc.html b/docs/reference/pc.html
index 111a26da..9d03e79b 100644
--- a/docs/reference/pc.html
+++ b/docs/reference/pc.html
@@ -3,7 +3,7 @@
**pc interpretation.
If pc() is applied to a humdrumR data class
you may use the data's fields as arguments.
-If no field names are specified, the first selectedField is used as x.">Representation of atonal pitch classes — pc • humdrumR Representation of atonal pitch classes — pc • humdrumR Skip to contents
-
diff --git a/docs/reference/pdist.html b/docs/reference/pdist.html
index 3aae60f6..549dce5e 100644
--- a/docs/reference/pdist.html
+++ b/docs/reference/pdist.html
@@ -1,16 +1,16 @@
-Tabulate and cross proportions — pdist • humdrumR Tabulate and cross proportions — pdist • humdrumR
Skip to contents
-
+
humdrumR
-
0.7.0.4
+
0.7.0.5
@@ -98,11 +98,11 @@ Usage
diff --git a/docs/reference/pitch.html b/docs/reference/pitch.html
index 0b115e98..fb7e81f6 100644
--- a/docs/reference/pitch.html
+++ b/docs/reference/pitch.html
@@ -3,7 +3,7 @@
approach to representing pitch in traditional Western music.
If pitch() is applied to a humdrumR data class
you may use the data's fields as arguments.
-If no field names are specified, the first selectedField is used as x.">Scientific pitch representation — pitch • humdrumR Scientific pitch representation — pitch • humdrumR Skip to contents
-
diff --git a/docs/reference/pitchDeparsing.html b/docs/reference/pitchDeparsing.html
index 8ab9eae1..b5f76f2b 100644
--- a/docs/reference/pitchDeparsing.html
+++ b/docs/reference/pitchDeparsing.html
@@ -5,7 +5,7 @@
"Under the hood" humdrumR represents all tonal pitch information using the same underlying representation,
which is typically extracted from input data using the pitch parser.
This representation can then be "deparsed" into a variety of predefined output formats (like **kern),
-or into new formats that you create!'>Generating ("deparsing") pitch representations — pitchDeparsing • humdrumR Generating ("deparsing") pitch representations — pitchDeparsing • humdrumR Parsing pitch information — pitchParsing • humdrumR Parsing pitch information — pitchParsing • humdrumR
+#> REpath-pattern '/home/nat/.tmp/Rtmpj3llIw/temp_libpathf1bb188f0d5d/humdrumR/HumdrumData/BachChorales/chor00[1-4].krn' matches 4 text files in 1 directory.
#> Four files read from disk.
#> Validating four files...
#> all valid.
@@ -400,18 +400,19 @@ Examples#> [841] "4d#" "4e;"
humData |> pull_data.table ( Token , Spine )
-#> Token Spine
-#> 1: 4GG 1
-#> 2: 4G 1
-#> 3: 4E 1
-#> 4: 4F# 1
-#> 5: 4G 1
-#> ---
-#> 838: 4g# 4
-#> 839: 4f# 4
-#> 840: 4c# 4
-#> 841: 4d# 4
-#> 842: 4e; 4
+#> Token Spine
+#> <char> <char>
+#> 1: 4GG 1
+#> 2: 4G 1
+#> 3: 4E 1
+#> 4: 4F# 1
+#> 5: 4G 1
+#> ---
+#> 838: 4g# 4
+#> 839: 4f# 4
+#> 840: 4c# 4
+#> 841: 4d# 4
+#> 842: 4e; 4
humData |> pull_tibble ( everything ( ) )
#> # A tibble: 842 × 42
#> Token Bar BarLabel DoubleBar Formal BPM Clef Exclusive Instrument
@@ -441,11 +442,11 @@ Examples
-
Developed by Nathaniel Condit-Schultz, Claire Arthur.
+ Developed by Nathaniel Condit-Schultz, Claire Arthur.
diff --git a/docs/reference/quality.html b/docs/reference/quality.html
index 71d8c893..ea456da6 100644
--- a/docs/reference/quality.html
+++ b/docs/reference/quality.html
@@ -1,6 +1,6 @@
Extract quality from pitch — quality • humdrumR Extract quality from pitch — quality • humdrumR Rational numbers — rational • humdrumR Rational numbers — rational • humdrumR
Skip to contents
-
+
humdrumR
-
0.7.0.4
+
0.7.0.5
@@ -211,11 +211,11 @@ See also
diff --git a/docs/reference/readHumdrum.html b/docs/reference/readHumdrum.html
index 297f32c2..98f445d5 100644
--- a/docs/reference/readHumdrum.html
+++ b/docs/reference/readHumdrum.html
@@ -1,16 +1,16 @@
-Find and read humdrum files into R — knownInterpretations • humdrumR Find and read humdrum files into R — knownInterpretations • humdrumR
Skip to contents
-
diff --git a/docs/reference/recip.html b/docs/reference/recip.html
index 90a17ee2..19c9406d 100644
--- a/docs/reference/recip.html
+++ b/docs/reference/recip.html
@@ -6,7 +6,7 @@
which also includes pitch information and notation details.
If recip() is applied to a humdrumR data class
you may use the data's fields as arguments.
-If no field names are specified, the first selectedField is used as x.">Reciprocal representation of duration — recip • humdrumR Reciprocal representation of duration — recip • humdrumR Skip to contents
-
diff --git a/docs/reference/recordDuration.html b/docs/reference/recordDuration.html
index c9e37784..892083ce 100644
--- a/docs/reference/recordDuration.html
+++ b/docs/reference/recordDuration.html
@@ -1,16 +1,16 @@
-Calculate duration of each record in a corpus — recordDuration • humdrumR Calculate duration of each record in a corpus — recordDuration • humdrumR
Skip to contents
-
diff --git a/docs/reference/recycling.html b/docs/reference/recycling.html
index 8a6945ec..4be9375a 100644
--- a/docs/reference/recycling.html
+++ b/docs/reference/recycling.html
@@ -1,16 +1,16 @@
-What are "recycling" or "padding"? — recycling • humdrumR What are "recycling" or "padding"? — recycling • humdrumR
Skip to contents
-
+
humdrumR
-
0.7.0.4
+
0.7.0.5
@@ -154,11 +154,11 @@ See also
diff --git a/docs/reference/reference.html b/docs/reference/reference.html
index 7d8a84f8..41e5d973 100644
--- a/docs/reference/reference.html
+++ b/docs/reference/reference.html
@@ -3,7 +3,7 @@
tabulate the reference records
present in a humdrumR corpus.
reference is one of humdrumR's
-basic corpus summary functions.">Summarize reference records in a humdrumR corpus — reference • humdrumR Summarize reference records in a humdrumR corpus — reference • humdrumR Skip to contents
-
diff --git a/docs/reference/regexConstruction.html b/docs/reference/regexConstruction.html
index f541738c..7bd4f8d6 100644
--- a/docs/reference/regexConstruction.html
+++ b/docs/reference/regexConstruction.html
@@ -1,6 +1,6 @@
Making Regular Expressions — regexConstruction • humdrumR Making Regular Expressions — regexConstruction • humdrumR Separate data fields into new spines. — rend • humdrumR
+#> REpath-pattern '/home/nat/.tmp/Rtmpj3llIw/temp_libpathf1bb188f0d5d/humdrumR/HumdrumData/BachChorales/chor00[1-4].krn' matches 4 text files in 1 directory.
#> Four files read from disk.
#> Validating four files...
#> all valid.
@@ -434,11 +434,11 @@ Examples
-
Developed by Nathaniel Condit-Schultz, Claire Arthur.
+ Developed by Nathaniel Condit-Schultz, Claire Arthur.
diff --git a/docs/reference/rhythmDeparsing.html b/docs/reference/rhythmDeparsing.html
index 844d3a99..0dbf397e 100644
--- a/docs/reference/rhythmDeparsing.html
+++ b/docs/reference/rhythmDeparsing.html
@@ -5,7 +5,7 @@
"Under the hood" humdrumR represents all rhythmic duration information as rational numbers,
which is typically extracted from input data using the rhythm parser.
This rational representation can then be "deparsed" into a variety of predefined output formats (like **recip),
-or into new formats that you create!'>Generating ("deparsing") rhythm representations — rhythmDeparsing • humdrumR Generating ("deparsing") rhythm representations — rhythmDeparsing • humdrumR Parsing rhythm information — rhythmParsing • humdrumR Parsing rhythm information — rhythmParsing • humdrumR Roman Numeral — romanNumerals • humdrumR Roman Numeral — romanNumerals • humdrumR Identify contiguous segments of data in a vector — segments • humdrumR Identify contiguous segments of data in a vector — segments • humdrumR The "selected" fields of a humdrumR object — selectedFields • humdrumR
+#> REpath-pattern '/home/nat/.tmp/Rtmpj3llIw/temp_libpathf1bb188f0d5d/humdrumR/HumdrumData/BachChorales/chor00[1-4].krn' matches 4 text files in 1 directory.
#> Four files read from disk.
#> Validating four files...
#> all valid.
@@ -206,8 +206,10 @@ Examples#> [1] "Spine" "Record" "Token"
humData |> select ( Structure )
-#> Error in parse(text = text, keep.source = FALSE): <text>:1:11: unexpected symbol
-#> 1: NULL saveRDS
+#> Error: Failed to parse glue component
+#> Caused by error in `parse()`:
+#> ! <text>:1:11: unexpected symbol
+#> 1: NULL base
#> ^
humData |> select ( 4 )
@@ -671,11 +673,11 @@ Examples
-
Developed by Nathaniel Condit-Schultz, Claire Arthur.
+ Developed by Nathaniel Condit-Schultz, Claire Arthur.
diff --git a/docs/reference/semits.html b/docs/reference/semits.html
index 70fe9c37..b8b764c0 100644
--- a/docs/reference/semits.html
+++ b/docs/reference/semits.html
@@ -10,7 +10,7 @@
If no field names are specified, the first selectedField is used as x.
If midi() is applied to a humdrumR data class
you may use the data's fields as arguments.
-If no field names are specified, the first selectedField is used as x.">Atonal pitch representations — semits • humdrumR Atonal pitch representations — semits • humdrumR Skip to contents
-
+
humdrumR
-
0.7.0.4
+
0.7.0.5
@@ -429,7 +429,7 @@ Examples
exampleHumdrum <- readHumdrum ( humdrumRroot , "HumdrumData/BeethovenVariations/B075_00_05_a.krn" )
#> Finding and reading files...
-#> REpath-pattern '/home/nat/.tmp/Rtmpz26RCR/temp_libpatha780af15d1/humdrumR/HumdrumData/BeethovenVariations/B075_00_05_a.krn' matches 1 text files in 1 directory.
+#> REpath-pattern '/home/nat/.tmp/Rtmpj3llIw/temp_libpathf1bb188f0d5d/humdrumR/HumdrumData/BeethovenVariations/B075_00_05_a.krn' matches 1 text files in 1 directory.
#> One file read from disk.
#> Validating one file...
#> all valid.
@@ -456,7 +456,7 @@ Examples
exampleHumdrum <- readHumdrum ( humdrumRroot , "HumdrumData/BeethovenVariations/B075_00_05_a.krn" )
#> Finding and reading files...
-#> REpath-pattern '/home/nat/.tmp/Rtmpz26RCR/temp_libpatha780af15d1/humdrumR/HumdrumData/BeethovenVariations/B075_00_05_a.krn' matches 1 text files in 1 directory.
+#> REpath-pattern '/home/nat/.tmp/Rtmpj3llIw/temp_libpathf1bb188f0d5d/humdrumR/HumdrumData/BeethovenVariations/B075_00_05_a.krn' matches 1 text files in 1 directory.
#> One file read from disk.
#> Validating one file...
#> all valid.
@@ -478,11 +478,11 @@ Examples
-
Developed by Nathaniel Condit-Schultz, Claire Arthur.
+ Developed by Nathaniel Condit-Schultz, Claire Arthur.
diff --git a/docs/reference/sigma.html b/docs/reference/sigma.html
index 9d3dc4b2..a09eab26 100644
--- a/docs/reference/sigma.html
+++ b/docs/reference/sigma.html
@@ -1,16 +1,16 @@
-Cumulative sum of numeric vector — sigma • humdrumR Cumulative sum of numeric vector — sigma • humdrumR
Skip to contents
-
+
humdrumR
-
0.7.0.4
+
0.7.0.5
@@ -300,11 +300,11 @@ See also
diff --git a/docs/reference/signature.html b/docs/reference/signature.html
index d87d1597..596f221e 100644
--- a/docs/reference/signature.html
+++ b/docs/reference/signature.html
@@ -1,16 +1,16 @@
-Humdrum key signature — signature • humdrumR Humdrum key signature — signature • humdrumR
Skip to contents
-
diff --git a/docs/reference/solfa.html b/docs/reference/solfa.html
index 1c9afe16..79d5d7a6 100644
--- a/docs/reference/solfa.html
+++ b/docs/reference/solfa.html
@@ -1,7 +1,7 @@
Relative-do Solfege representation — solfa • humdrumR Relative-do Solfege representation — solfa • humdrumR Fixed-do Solfege representation — solfg • humdrumR Skip to contents
-
diff --git a/docs/reference/sonority.html b/docs/reference/sonority.html
index 32f9ccb6..741eaab4 100644
--- a/docs/reference/sonority.html
+++ b/docs/reference/sonority.html
@@ -5,7 +5,7 @@
Chords are output using the representation indicated by the deparser argument.
By default, with/within.humdrumR will automatically pass
sonority the groupby argument groupby = list(Piece, Record),
-so chords are estimated for each record in the dataset.">Interpret tertian sonorities from set(s) of notes. — sonority • humdrumR Interpret tertian sonorities from set(s) of notes. — sonority • humdrumR Skip to contents
-
diff --git a/docs/reference/spines.html b/docs/reference/spines.html
index 817cf5f7..065097d6 100644
--- a/docs/reference/spines.html
+++ b/docs/reference/spines.html
@@ -2,7 +2,7 @@
Summarize spines in humdrum dataset. — spines • humdrumR Summarize spines in humdrum dataset. — spines • humdrumR Extract scale step. — step • humdrumR Extract scale step. — step • humdrumR struct — struct • humdrumR struct — struct • humdrumR
Skip to contents
-
diff --git a/docs/reference/subset.humdrumR.html b/docs/reference/subset.humdrumR.html
index 4dabeba2..3a096734 100644
--- a/docs/reference/subset.humdrumR.html
+++ b/docs/reference/subset.humdrumR.html
@@ -9,7 +9,7 @@
methods.
Filtering with subset()/filter() is (by default) not destructive,
allowing you to recover the filtered data
-using removeSubset() or unfilter() (which are also synonyms).">Filter humdrum data — subset.humdrumR • humdrumR Filter humdrum data — subset.humdrumR • humdrumR Skip to contents
-
diff --git a/docs/reference/syncopation.html b/docs/reference/syncopation.html
index de188730..8ac7399b 100644
--- a/docs/reference/syncopation.html
+++ b/docs/reference/syncopation.html
@@ -3,7 +3,7 @@
and identifies which durations are syncopated, return TRUE for synocopations and FALSE
otherwise.
The output syncopation depends a lot on how meter is specified/interpreted
-so check out the meter() documentation if you are looking for more control of the output.">Identify syncopated rhythms — syncopation • humdrumR Identify syncopated rhythms — syncopation • humdrumR Skip to contents
-
+
humdrumR
-
0.7.0.4
+
0.7.0.5
@@ -148,11 +148,11 @@ Details
diff --git a/docs/reference/tactus.html b/docs/reference/tactus.html
index 070b9d65..7ce01409 100644
--- a/docs/reference/tactus.html
+++ b/docs/reference/tactus.html
@@ -3,7 +3,7 @@
specific levels from the meter.
tactus() extracts the tactus of a meter; measure() extracts the length of the full measure of a meter.
nbeats() counts the number of tactus beats in the meter.
-These functions are particularly useful as arguments to the timecount and subpos functions.">Extract levels from meters — tactus • humdrumR Extract levels from meters — tactus • humdrumR Skip to contents
-
diff --git a/docs/reference/tandem.html b/docs/reference/tandem.html
index 6612df46..fe349ae6 100644
--- a/docs/reference/tandem.html
+++ b/docs/reference/tandem.html
@@ -1,6 +1,6 @@
Get tandem interpretation information from humdrum data — tandem • humdrumR Get tandem interpretation information from humdrum data — tandem • humdrumR Find common denominator of beats — tatum • humdrumR Find common denominator of beats — tatum • humdrumR Tertian quality chord representation — tertian • humdrumR Tertian quality chord representation — tertian • humdrumR Tertian set — tertianSetS4 • humdrumR Tertian set — tertianSetS4 • humdrumR Clock-time representations of duration — time • humdrumR Skip to contents
-
diff --git a/docs/reference/timebase.html b/docs/reference/timebase.html
index d1c43b09..8fdf7f47 100644
--- a/docs/reference/timebase.html
+++ b/docs/reference/timebase.html
@@ -3,7 +3,7 @@
and converts rhythmic information in the data into a step-sequencer like
representation, with each humdrum data record representing one step.
The duration of each step is the the "timebase", which can be controlled with the tb argument.
-The timebase() function is currently in a beta-draft, so may not work well.'>Represent time on a regular grid — timebase • humdrumR Represent time on a regular grid — timebase • humdrumR
+#> REpath-pattern '/home/nat/.tmp/Rtmpj3llIw/temp_libpathf1bb188f0d5d/humdrumR/HumdrumData/BachChorales/chor00[1-4].krn' matches 4 text files in 1 directory.
#> Four files read from disk.
#> Validating four files...
#> all valid.
@@ -391,8 +391,8 @@ Examples#> humdrumR corpus of four pieces.
#>
#> Data fields:
-#> Token :: character
-#> *timecount(Token, unit = TimeSignature, pickup = Bar < 1) :: integer
+#> Token :: character
+#> *humdrumR:::timecount(...) :: integer
#>
show ( within ( humData , timecount ( Token , unit = tactus ( TimeSignature ) ) ) )
@@ -510,8 +510,8 @@ Examples#> humdrumR corpus of four pieces.
#>
#> Data fields:
-#> Token :: character
-#> *timecount(Token, unit = tactus(TimeSignature)) :: integer
+#> Token :: character
+#> *humdrumR:::timecount(Token, unit = tactus(TimeSignature)) :: integer
#>
@@ -522,11 +522,11 @@ Examples
-
Developed by Nathaniel Condit-Schultz, Claire Arthur.
+ Developed by Nathaniel Condit-Schultz, Claire Arthur.
diff --git a/docs/reference/timeline.html b/docs/reference/timeline.html
index 72db985f..628d924e 100644
--- a/docs/reference/timeline.html
+++ b/docs/reference/timeline.html
@@ -9,7 +9,7 @@
If no field names are specified, the first selectedField is used as x.
If timestamp() is applied to a humdrumR data class
you may use the data's fields as arguments.
-If no field names are specified, the first selectedField is used as x.">Rhythmic timeline of a piece — timeline • humdrumR Rhythmic timeline of a piece — timeline • humdrumR Skip to contents
-
diff --git a/docs/reference/token.html b/docs/reference/token.html
index b3f324f2..8393e4b2 100644
--- a/docs/reference/token.html
+++ b/docs/reference/token.html
@@ -5,7 +5,7 @@
They are basically atomic vectors with a known
exclusive interpretation.
You should be able to treat them exactly like their "normal" class
-of atomic vector---e.g., character, or numeric.'>Humdrum tokens — token • humdrumR Humdrum tokens — token • humdrumR Representation of tonal pitch information — tonalIntervalS4 • humdrumR Representation of tonal pitch information — tonalIntervalS4 • humdrumR German-style pitch notation. — tonh • humdrumR German-style pitch notation. — tonh • humdrumR Skip to contents
-
diff --git a/docs/reference/transpose.html b/docs/reference/transpose.html
index 45e615bc..7489ab6d 100644
--- a/docs/reference/transpose.html
+++ b/docs/reference/transpose.html
@@ -4,7 +4,7 @@
Inside the box, inputs and transpositions take place as tonalIntervals or diatonicSets,
but any numeric or character string representation of pitches can be transposed as well.
This function is incorporated directly into tonalTransform, and thence, all pitch translation
-functions, so you probably won't call it directly very often.">Transpose pitches and keys — transpose • humdrumR Transpose pitches and keys — transpose • humdrumR Skip to contents
-
+
humdrumR
-
0.7.0.4
+
0.7.0.5
@@ -231,11 +231,11 @@ See also
diff --git a/docs/reference/unfoldStops.html b/docs/reference/unfoldStops.html
index 3bc0a28a..d2a8e452 100644
--- a/docs/reference/unfoldStops.html
+++ b/docs/reference/unfoldStops.html
@@ -1,7 +1,7 @@
"Unfold" data into multiple stops — unfoldStops • humdrumR "Unfold" data into multiple stops — unfoldStops • humdrumR Validate humdrum files — validateHumdrum • humdrumR Validate humdrum files — validateHumdrum • humdrumR What is "vectorization"? — vectorization • humdrumR What is "vectorization"? — vectorization • humdrumR
Skip to contents
-
+
humdrumR
-
0.7.0.4
+
0.7.0.5
@@ -143,11 +143,11 @@ See also
diff --git a/docs/reference/withinHumdrum.html b/docs/reference/withinHumdrum.html
index 4cc14f37..d7286527 100644
--- a/docs/reference/withinHumdrum.html
+++ b/docs/reference/withinHumdrum.html
@@ -7,7 +7,7 @@
windowing, and more.
The with() and within() functions, which come from base R, are the core functions.
However, the dplyr "verbs" mutate(), summarize(), and reframe() can be used as well---they
-are equivalent to using with()/within() with particular arguments.'>Working with humdrum data fields — withinHumdrum • humdrumR Working with humdrum data fields — withinHumdrum • humdrumR package::function()---for example, dplyr::lag()
.
+This is only an issue when functions have the exact same name as a humdrumR function.
Expression pre-processing
@@ -645,7 +650,7 @@
Examples
humData <- readHumdrum ( humdrumRroot , "HumdrumData/BachChorales/chor00[1-4].krn" )
#> Finding and reading files...
-#> REpath-pattern '/home/nat/.tmp/Rtmpz26RCR/temp_libpatha780af15d1/humdrumR/HumdrumData/BachChorales/chor00[1-4].krn' matches 4 text files in 1 directory.
+#> REpath-pattern '/home/nat/.tmp/Rtmpj3llIw/temp_libpathf1bb188f0d5d/humdrumR/HumdrumData/BachChorales/chor00[1-4].krn' matches 4 text files in 1 directory.
#> Four files read from disk.
#> Validating four files...
#> all valid.
@@ -655,72 +660,72 @@ Examples
humData |> with ( count ( kern ( Token , simple = TRUE ) , Spine ) )
#> humdrumR count distribution
-#> kern(Token, simple = TRUE, Exclusive = Exclusive, Key = Key) Spine n
-#> c 1 12
-#> c 2 22
-#> c 3 .
-#> c 4 16
-#> c# 1 17
-#> c# 2 17
-#> c# 3 5
-#> c# 4 16
-#> d 1 25
-#> d 2 42
-#> d 3 12
-#> d 4 19
-#> d# 1 7
-#> d# 2 4
-#> d# 3 10
-#> d# 4 4
-#> e- 1 .
-#> e- 2 .
-#> e- 3 .
-#> e- 4 .
-#> e 1 43
-#> e 2 37
-#> e 3 46
-#> e 4 16
-#> e# 1 1
-#> e# 2 .
-#> e# 3 1
-#> e# 4 .
-#> f 1 3
-#> f 2 1
-#> f 3 3
-#> f 4 .
-#> f# 1 20
-#> f# 2 18
-#> f# 3 41
-#> f# 4 8
-#> g 1 23
-#> g 2 4
-#> g 3 24
-#> g 4 13
-#> g# 1 11
-#> g# 2 13
-#> g# 3 25
-#> g# 4 9
-#> a- 1 .
-#> a- 2 .
-#> a- 3 .
-#> a- 4 .
-#> a 1 29
-#> a 2 17
-#> a 3 27
-#> a 4 33
-#> a# 1 1
-#> a# 2 3
-#> a# 3 3
-#> a# 4 2
-#> b- 1 .
-#> b- 2 1
-#> b- 3 .
-#> b- 4 .
-#> b 1 33
-#> b 2 37
-#> b 3 15
-#> b 4 53
-#> kern(Token, simple = TRUE, Exclusive = Exclusive, Key = Key) Spine n
+#> humdrumR:::kern(Token, simple = TRUE, Exclusive = Exclusive, Spine n
+#> c 1 12
+#> c 2 22
+#> c 3 .
+#> c 4 16
+#> c# 1 17
+#> c# 2 17
+#> c# 3 5
+#> c# 4 16
+#> d 1 25
+#> d 2 42
+#> d 3 12
+#> d 4 19
+#> d# 1 7
+#> d# 2 4
+#> d# 3 10
+#> d# 4 4
+#> e- 1 .
+#> e- 2 .
+#> e- 3 .
+#> e- 4 .
+#> e 1 43
+#> e 2 37
+#> e 3 46
+#> e 4 16
+#> e# 1 1
+#> e# 2 .
+#> e# 3 1
+#> e# 4 .
+#> f 1 3
+#> f 2 1
+#> f 3 3
+#> f 4 .
+#> f# 1 20
+#> f# 2 18
+#> f# 3 41
+#> f# 4 8
+#> g 1 23
+#> g 2 4
+#> g 3 24
+#> g 4 13
+#> g# 1 11
+#> g# 2 13
+#> g# 3 25
+#> g# 4 9
+#> a- 1 .
+#> a- 2 .
+#> a- 3 .
+#> a- 4 .
+#> a 1 29
+#> a 2 17
+#> a 3 27
+#> a 4 33
+#> a# 1 1
+#> a# 2 3
+#> a# 3 3
+#> a# 4 2
+#> b- 1 .
+#> b- 2 1
+#> b- 3 .
+#> b- 4 .
+#> b 1 33
+#> b 2 37
+#> b 3 15
+#> b 4 53
+#> humdrumR:::kern(Token, simple = TRUE, Exclusive = Exclusive, Spine n
#> humdrumR count distribution
humData |> within ( Kern <- kern ( Token ) ,
@@ -736,29 +741,30 @@ ExampleshumData |>
group_by ( Piece , Spine ) |>
with ( mean ( Semits ) , drop = FALSE )
-#> mean(Semits) Piece Spine
-#> 1: -12.4126984 1 1
-#> 2: 0.2881356 1 2
-#> 3: 5.5737705 1 3
-#> 4: 10.4347826 1 4
-#> 5: -8.1639344 2 1
-#> 6: 0.7903226 2 2
-#> 7: 6.3818182 2 3
-#> 8: 10.7358491 2 4
-#> 9: -7.7115385 3 1
-#> 10: -0.1200000 3 2
-#> 11: 5.6170213 3 3
-#> 12: 10.8297872 3 4
-#> 13: -8.3265306 4 1
-#> 14: 0.3111111 4 2
-#> 15: 5.3877551 4 3
-#> 16: 10.2093023 4 4
+#> humdrumR:::mean(Semits) Piece Spine
+#> <num> <int> <int>
+#> 1: -12.4126984 1 1
+#> 2: 0.2881356 1 2
+#> 3: 5.5737705 1 3
+#> 4: 10.4347826 1 4
+#> 5: -8.1639344 2 1
+#> 6: 0.7903226 2 2
+#> 7: 6.3818182 2 3
+#> 8: 10.7358491 2 4
+#> 9: -7.7115385 3 1
+#> 10: -0.1200000 3 2
+#> 11: 5.6170213 3 3
+#> 12: 10.8297872 3 4
+#> 13: -8.3265306 4 1
+#> 14: 0.3111111 4 2
+#> 15: 5.3877551 4 3
+#> 16: 10.2093023 4 4
# tidyverse (dplyr) style:
humData <- readHumdrum ( humdrumRroot , "HumdrumData/BachChorales/chor00[1-4].krn" )
#> Finding and reading files...
-#> REpath-pattern '/home/nat/.tmp/Rtmpz26RCR/temp_libpatha780af15d1/humdrumR/HumdrumData/BachChorales/chor00[1-4].krn' matches 4 text files in 1 directory.
+#> REpath-pattern '/home/nat/.tmp/Rtmpj3llIw/temp_libpathf1bb188f0d5d/humdrumR/HumdrumData/BachChorales/chor00[1-4].krn' matches 4 text files in 1 directory.
#> Four files read from disk.
#> Validating four files...
#> all valid.
@@ -773,100 +779,101 @@ ExampleshumData |>
group_by ( Spine , Bar ) |>
summarize ( mean ( Semits ) )
-#> mean(Semits) Bar Spine
-#> 1: -8.00000000 0 1
-#> 2: -6.05882353 1 1
-#> 3: -9.00000000 2 1
-#> 4: -7.71428571 3 1
-#> 5: -10.33333333 4 1
-#> 6: -12.50000000 5 1
-#> 7: -7.19047619 6 1
-#> 8: -9.81250000 7 1
-#> 9: -8.35294118 8 1
-#> 10: -10.64285714 9 1
-#> 11: -9.75000000 10 1
-#> 12: -11.57142857 11 1
-#> 13: -6.44444444 12 1
-#> 14: -8.22222222 13 1
-#> 15: -15.40000000 14 1
-#> 16: -14.50000000 15 1
-#> 17: -16.66666667 16 1
-#> 18: -13.33333333 17 1
-#> 19: -12.50000000 18 1
-#> 20: -7.50000000 19 1
-#> 21: -6.33333333 20 1
-#> 22: -10.00000000 21 1
-#> 23: -17.00000000 22 1
-#> 24: 2.00000000 0 2
-#> 25: 0.38095238 1 2
-#> 26: -0.05555556 2 2
-#> 27: 0.43750000 3 2
-#> 28: -2.30769231 4 2
-#> 29: -2.50000000 5 2
-#> 30: 0.40000000 6 2
-#> 31: 1.14285714 7 2
-#> 32: 1.81250000 8 2
-#> 33: -0.14285714 9 2
-#> 34: -0.63157895 10 2
-#> 35: -0.21428571 11 2
-#> 36: 1.30000000 12 2
-#> 37: 2.44444444 13 2
-#> 38: 1.50000000 14 2
-#> 39: 1.00000000 15 2
-#> 40: 0.25000000 16 2
-#> 41: 1.33333333 17 2
-#> 42: 0.33333333 18 2
-#> 43: 2.00000000 19 2
-#> 44: 3.00000000 20 2
-#> 45: 2.00000000 21 2
-#> 46: -1.00000000 22 2
-#> 47: 5.50000000 0 3
-#> 48: 6.47058824 1 3
-#> 49: 5.18750000 2 3
-#> 50: 5.47368421 3 3
-#> 51: 3.91666667 4 3
-#> 52: 6.00000000 5 3
-#> 53: 6.88888889 6 3
-#> 54: 6.06250000 7 3
-#> 55: 6.47058824 8 3
-#> 56: 5.06250000 9 3
-#> 57: 4.38888889 10 3
-#> 58: 5.00000000 11 3
-#> 59: 6.70000000 12 3
-#> 60: 8.00000000 13 3
-#> 61: 5.33333333 14 3
-#> 62: 5.50000000 15 3
-#> 63: 7.33333333 16 3
-#> 64: 6.50000000 17 3
-#> 65: 5.40000000 18 3
-#> 66: 6.50000000 19 3
-#> 67: 7.33333333 20 3
-#> 68: 6.50000000 21 3
-#> 69: 2.00000000 22 3
-#> 70: 9.50000000 0 4
-#> 71: 11.00000000 1 4
-#> 72: 10.37500000 2 4
-#> 73: 9.42105263 3 4
-#> 74: 9.54545455 4 4
-#> 75: 12.40000000 5 4
-#> 76: 10.56250000 6 4
-#> 77: 10.93333333 7 4
-#> 78: 11.37500000 8 4
-#> 79: 9.46153846 9 4
-#> 80: 11.40000000 10 4
-#> 81: 9.92307692 11 4
-#> 82: 12.83333333 12 4
-#> 83: 11.75000000 13 4
-#> 84: 10.00000000 14 4
-#> 85: 9.00000000 15 4
-#> 86: 13.00000000 16 4
-#> 87: 10.00000000 17 4
-#> 88: 9.00000000 18 4
-#> 89: 10.00000000 19 4
-#> 90: 13.00000000 20 4
-#> 91: 10.00000000 21 4
-#> 92: 7.00000000 22 4
-#> mean(Semits) Bar Spine
+#> humdrumR:::mean(Semits) Bar Spine
+#> <num> <int> <int>
+#> 1: -8.00000000 0 1
+#> 2: -6.05882353 1 1
+#> 3: -9.00000000 2 1
+#> 4: -7.71428571 3 1
+#> 5: -10.33333333 4 1
+#> 6: -12.50000000 5 1
+#> 7: -7.19047619 6 1
+#> 8: -9.81250000 7 1
+#> 9: -8.35294118 8 1
+#> 10: -10.64285714 9 1
+#> 11: -9.75000000 10 1
+#> 12: -11.57142857 11 1
+#> 13: -6.44444444 12 1
+#> 14: -8.22222222 13 1
+#> 15: -15.40000000 14 1
+#> 16: -14.50000000 15 1
+#> 17: -16.66666667 16 1
+#> 18: -13.33333333 17 1
+#> 19: -12.50000000 18 1
+#> 20: -7.50000000 19 1
+#> 21: -6.33333333 20 1
+#> 22: -10.00000000 21 1
+#> 23: -17.00000000 22 1
+#> 24: 2.00000000 0 2
+#> 25: 0.38095238 1 2
+#> 26: -0.05555556 2 2
+#> 27: 0.43750000 3 2
+#> 28: -2.30769231 4 2
+#> 29: -2.50000000 5 2
+#> 30: 0.40000000 6 2
+#> 31: 1.14285714 7 2
+#> 32: 1.81250000 8 2
+#> 33: -0.14285714 9 2
+#> 34: -0.63157895 10 2
+#> 35: -0.21428571 11 2
+#> 36: 1.30000000 12 2
+#> 37: 2.44444444 13 2
+#> 38: 1.50000000 14 2
+#> 39: 1.00000000 15 2
+#> 40: 0.25000000 16 2
+#> 41: 1.33333333 17 2
+#> 42: 0.33333333 18 2
+#> 43: 2.00000000 19 2
+#> 44: 3.00000000 20 2
+#> 45: 2.00000000 21 2
+#> 46: -1.00000000 22 2
+#> 47: 5.50000000 0 3
+#> 48: 6.47058824 1 3
+#> 49: 5.18750000 2 3
+#> 50: 5.47368421 3 3
+#> 51: 3.91666667 4 3
+#> 52: 6.00000000 5 3
+#> 53: 6.88888889 6 3
+#> 54: 6.06250000 7 3
+#> 55: 6.47058824 8 3
+#> 56: 5.06250000 9 3
+#> 57: 4.38888889 10 3
+#> 58: 5.00000000 11 3
+#> 59: 6.70000000 12 3
+#> 60: 8.00000000 13 3
+#> 61: 5.33333333 14 3
+#> 62: 5.50000000 15 3
+#> 63: 7.33333333 16 3
+#> 64: 6.50000000 17 3
+#> 65: 5.40000000 18 3
+#> 66: 6.50000000 19 3
+#> 67: 7.33333333 20 3
+#> 68: 6.50000000 21 3
+#> 69: 2.00000000 22 3
+#> 70: 9.50000000 0 4
+#> 71: 11.00000000 1 4
+#> 72: 10.37500000 2 4
+#> 73: 9.42105263 3 4
+#> 74: 9.54545455 4 4
+#> 75: 12.40000000 5 4
+#> 76: 10.56250000 6 4
+#> 77: 10.93333333 7 4
+#> 78: 11.37500000 8 4
+#> 79: 9.46153846 9 4
+#> 80: 11.40000000 10 4
+#> 81: 9.92307692 11 4
+#> 82: 12.83333333 12 4
+#> 83: 11.75000000 13 4
+#> 84: 10.00000000 14 4
+#> 85: 9.00000000 15 4
+#> 86: 13.00000000 16 4
+#> 87: 10.00000000 17 4
+#> 88: 9.00000000 18 4
+#> 89: 10.00000000 19 4
+#> 90: 13.00000000 20 4
+#> 91: 10.00000000 21 4
+#> 92: 7.00000000 22 4
+#> humdrumR:::mean(Semits) Bar Spine
# dataTypes argument
@@ -1397,11 +1404,11 @@ Examples
-
Developed by Nathaniel Condit-Schultz, Claire Arthur.
+ Developed by Nathaniel Condit-Schultz, Claire Arthur.
diff --git a/docs/reference/wort.html b/docs/reference/wort.html
index b156d6ce..5296c1db 100644
--- a/docs/reference/wort.html
+++ b/docs/reference/wort.html
@@ -7,7 +7,7 @@
The resulting word is aligned with the first syllable of each word in **silbe.
If wort() is applied to a humdrumR data class
you may use the data's fields as arguments.
-If no field names are specified, the first selectedField is used as x.">Paste sylllables together into words — wort • humdrumR Paste syllables together into words — wort • humdrumR Skip to contents
-
+
humdrumR
-
0.7.0.4
+
0.7.0.5
@@ -87,7 +87,7 @@
diff --git a/docs/reference/writeHumdrum.html b/docs/reference/writeHumdrum.html
index bbac68fb..06c0532a 100644
--- a/docs/reference/writeHumdrum.html
+++ b/docs/reference/writeHumdrum.html
@@ -2,7 +2,7 @@
Write humdrumR data to humdrum files — writeHumdrum • humdrumR Write humdrumR data to humdrum files — writeHumdrum • humdrumR NEEDS DOCUMENTATION <-------------------------------------------","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/RegexFind.html"],"dir":"Reference","previous_headings":"","what":"Match strings against regular expression — RegexFind","title":"Match strings against regular expression — RegexFind","text":"functions give concise way search regular expressions character vectors. \"infix\" functions, meaning write function two arguments: myvector %~% regex.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/RegexFind.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Match strings against regular expression — RegexFind","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/RegexFind.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Match strings against regular expression — RegexFind","text":"x character vector search . Must character. regex One regular expressions. Must character. one regex supplied, matches regexes returned. (See \"Multiple regexes\" section.)","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/RegexFind.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Match strings against regular expression — RegexFind","text":"version function returns different type information regex matches () input vector: %~l%: returns logical (TRUE/FALSE) indicating x matches. %~%: returns integer indicating indices matches x. %~n%: returns integer indicating number (count) matches string. %~m%: returns character string matched string . Returns NA match. basic function (%~%) %~l%. also negative versions l functions: giving strings match given regular expression. %!~%, %!~l%, %!~%. functions simply syntactic sugar existing R regular expression matching functions: %~l%: base::grepl() %~%: base::grep() %~n%: stringi::stri_count_regex() %~m%: stringi::stri_extract_first_regex()","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/RegexFind.html"],"id":"multiple-regexes","dir":"Reference","previous_headings":"","what":"Multiple regexes","title":"Match strings against regular expression — RegexFind","text":"one regex supplied, %~l% %~% return indices regexes match. case %~n%, matching regex counted separately, summed. case %~m%, matches () pasted together, including multiple matches string.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/accidental.html"],"dir":"Reference","previous_headings":"","what":"Extract accidental from pitch. — accidental","title":"Extract accidental from pitch. — accidental","text":"Use want extract accidentals pitch data, discarding octave step information. Set explicitNaturals = FALSE want explicit naturals.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/accidental.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Extract accidental from pitch. — accidental","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/accidental.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Extract accidental from pitch. — accidental","text":"x Input data parse pitch information. x argument can (atomic) vector, tonalInterval, NULL. ... Arguments passed pitch deparser. also two hidden (advanced) arguments can specify: memoize deparse (see details ). generic \"specific\" pitch information (accidentals qualites) discarded? Defaults FALSE. Must singleton logical value: /switch. simple \"compound\" pitch information (octave/contour) discarded? Defaults FALSE. Must singleton logical value: /switch. Key input Key used parser, deparser, transposer. Defaults NULL. Must diatonicSet something coercable diatonicSet; must either length 1 length(x) transposeArgs optional list arguments passed special transpose() call. Defaults empty list(). Must list named arguments transpose(). parseArgs optional list arguments passed pitch parser. Defaults empty list(). Must list named arguments pitch parser. inPlace non-pitch information retained output string. Defaults FALSE. Must singleton logical value: /switch. argument effect input (x argument) character strings, extra, non-pitch information input strings \"besides\" pitch information. , inPlace = TRUE, output placed output string beside original non-pitch information. inPlace = FALSE, pitch output information returned (details ).","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/accidental.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Extract accidental from pitch. — accidental","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/bhatk.html"],"dir":"Reference","previous_headings":"","what":"Swara representation — bhatk","title":"Swara representation — bhatk","text":"Swara syllabes used represent scale degrees hindustani music---like solfege. bhatk() applied humdrumR data class may use data's fields arguments. field names specified, first selectedField used x.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/bhatk.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Swara representation — bhatk","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/bhatk.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Swara representation — bhatk","text":"x Input data parse pitch information. x argument can (atomic) vector, tonalInterval, NULL. ... Arguments passed pitch deparser. also two hidden (advanced) arguments can specify: memoize deparse (see details ). generic \"specific\" pitch information (accidentals qualites) discarded? Defaults FALSE. Must singleton logical value: /switch. simple \"compound\" pitch information (octave/contour) discarded? Defaults FALSE. Must singleton logical value: /switch. Key input Key used parser, deparser, transposer. Defaults NULL. Must diatonicSet something coercable diatonicSet; must either length 1 length(x) transposeArgs optional list arguments passed special transpose() call. Defaults empty list(). Must list named arguments transpose(). parseArgs optional list arguments passed pitch parser. Defaults empty list(). Must list named arguments pitch parser. inPlace non-pitch information retained output string. Defaults FALSE. Must singleton logical value: /switch. argument effect input (x argument) character strings, extra, non-pitch information input strings \"besides\" pitch information. , inPlace = TRUE, output placed output string beside original non-pitch information. inPlace = FALSE, pitch output information returned (details ).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/bhatk.html"],"id":"basic-pitch-arguments","dir":"Reference","previous_headings":"","what":"Basic pitch arguments","title":"Swara representation — bhatk","text":"pitch function standard arguments control details output. important generic simple arguments, allow control type pitch information returned.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/bhatk.html"],"id":"generic-vs-specific","dir":"Reference","previous_headings":"","what":"Generic vs Specific","title":"Swara representation — bhatk","text":"generic = TRUE, specific pitch information (accidentals qualities) omitted output. alternative way controlling functionality, can use specific argument, specific == !generic. case atonal functions, \"generic\" version pitch output: example, semits('c#', generic = TRUE) return 0, \"generic\" version C# C, corresponds 0. However, note generic version pitch follows key, semits('c#', generic = TRUE, Key = ':') return 1!","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/bhatk.html"],"id":"simple-vs-compound","dir":"Reference","previous_headings":"","what":"Simple vs Compound","title":"Swara representation — bhatk","text":"simple = TRUE, compound pitch information (octave contour) omitted output. alternative way controlling functionality, can use compound argument ,compound == !simple. actually one way might want divide compound intervals simple octave parts. example, might like call output -M2 (descending major 2nd) +m7 (ascending minor 7th octave ). functionality can controlled octave.round argument: see pitch deparsing documentation.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/bhatk.html"],"id":"key","dir":"Reference","previous_headings":"","what":"Key","title":"Swara representation — bhatk","text":"Key argument must diatonicSet, something can parsed one. Key argument passed parser, deparser, transpose---unless alternate Key passed transposeArgs parseArgs. Various deparsing options use Key argument; example, use implicitSpecies (see advanced parsing section) dependent Key. use pitch function within special call withinHumdrum, humdrumR automatically pass Key field humdrum data function---means, cases, need explicitly anything Key argument! (want happen, need explicitly specify Key argument, Key = NULL.)","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/bhatk.html"],"id":"parse-arguments","dir":"Reference","previous_headings":"","what":"Parse arguments","title":"Swara representation — bhatk","text":"parseArgs argument must list() (named) arguments passed input parser. example, input representation uses \"X\" represent double sharps, specify kern('CX5', parseArgs = list(doublesharp = 'X')) get correct result (\"cc##\"). convenient shorthand, \"syntactic sugar,\" can specify parseArgs alternate way: Simply input parse(args...) unnamed argument pitch function. example, can get exact result typing kern('CX5', parse(doublesharp = 'X')).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/bhatk.html"],"id":"transpose-arguments","dir":"Reference","previous_headings":"","what":"Transpose arguments","title":"Swara representation — bhatk","text":"transposeArgs argument must list() (named) arguments passed internal call transpose(), allowing us easily transpose pitch information. example, type kern(c('C', 'D', 'E'), transposeArgs = list(= 'M9')) can get output c('d', 'e', 'f#'). possible transpose args : (tonalInterval, length == 1 | length == (x)) (diatonicSet, length == 1 | length == (x)) (diatonicSet, length == 1 | length == (x)) real (logical, length == 1) transposition real tonal? relative (logical, length == 1) key-wise transposition based relative parallel keys? convenient shorthand, \"syntactic sugar,\" can specify transposeArgs alternate way: Simply input transpose(args...) unnamed argument pitch function. example, can get exact result typing kern(c('C', 'D', 'E'), transpose(= 'M9')).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/bhatk.html"],"id":"transposing-by-interval","dir":"Reference","previous_headings":"","what":"Transposing by interval","title":"Swara representation — bhatk","text":"calling transpose() directly, argument can anything coercable tonalInterval, output transposed amount. real = FALSE, tonal transposition (within Key) performed. details transposition behavior, check transpose() docs.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/bhatk.html"],"id":"transposing-by-key","dir":"Reference","previous_headings":"","what":"Transposing by key","title":"Swara representation — bhatk","text":"Another way transposing specifying input (\"\") key output (\"\") key. default, Key argument passed transpose , nothing actually happens. Thus, specify either key key, transposition happen /key Key. course, specify transposition happen keys specify. use pitch function within special call withinHumdrum, humdrumR automatically pass Key field humdrum data function. specify key, Key field passed transpose key, result, pitches input transposed whatever keys target () key! real relative arguments give special control key-wise transposition works, check transpose() docs details!","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/bhatk.html"],"id":"in-place-parsing","dir":"Reference","previous_headings":"","what":"In-place parsing","title":"Swara representation — bhatk","text":"humdrum data, character strings often encoded multiple pieces musical information right besides : example, **kern data might include tokens like \"4.ee-[. humdrumR parser (tonalInterval) automatically \"pull \" pitch information within strings, can find using appropriate known regular expressions. example, pitch('4.ee-[') returns Eb5. However, pitch functions (like pitch() kern()) option keep \"extra\" information return result \"place\"---.e., embedded right found input string. controlled inPlace argument, FALSE default. , pitch('4.ee-[', inPlace = TRUE) return 4.Eb5[---keeping \"4.\" \"[\". (obviously works input string, numeric!) Note inPlace = TRUE force functions like semits, normally return numeric values, return character strings input character string.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/bhatk.html"],"id":"pitch-gamut-levels","dir":"Reference","previous_headings":"","what":"Pitch-Gamut Levels","title":"Swara representation — bhatk","text":"table() automatically generate factor levels pitch data using gamut() function. makes sure tabulated data sorted logical order, includes missing pitches. simple/complex generic/specific arguments automatically passed gamut(); additional arguments can passed gamut using gamutArgs = list(...), syntactic sugar gamut(...). (Read gamut() docs explanation gamut generation.) feature used control table layout pitch data, well assure consistent tables grouping data. inPlace = TRUE special tabulation occur.","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/bhatk.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Swara representation — bhatk","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/bpm2sec.html"],"dir":"Reference","previous_headings":"","what":"Translate between durations and tempos — bpm2sec","title":"Translate between durations and tempos — bpm2sec","text":"Functions translating durations (seconds) tempos---expressed BPM (beats-per-minute). \"beats\" beats-per-minute specified using unit argument; unit defaults .25 (quarter-note), conventional.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/bpm2sec.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Translate between durations and tempos — bpm2sec","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/bpm2sec.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Translate between durations and tempos — bpm2sec","text":"BPM tempo. Defaults 60. Must number character string format \"MM120\" (120 bpm). default, ().humdrumR passes BPM field, present. unit \"Beat\" BPM. Defaults quarter-note. Must value can interpreted rhythmic duration.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/bpm2sec.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Translate between durations and tempos — bpm2sec","text":"pairs functions involving ms (milliseconds) sec (seconds), identical except change scale seconds milliseconds.","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/census.html"],"dir":"Reference","previous_headings":"","what":"Tabulate records and tokens in a humdrumR corpus — census","title":"Tabulate records and tokens in a humdrumR corpus — census","text":"census tabulates raw \"size\" humdrumR corpus, including total number records tokens. census one humdrumR's basic corpus summary functions.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/census.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Tabulate records and tokens in a humdrumR corpus — census","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/census.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Tabulate records and tokens in a humdrumR corpus — census","text":"humdrumR HumdrumR data. Must humdrumR data object. dataTypes types humdrum records include census. Defaults \"GLIMDd\". Must character. Legal values 'G', 'L', '', 'M', 'D', 'd' combination (e.g., \"LIM\"). (see humdrum table documentation Fields section explanation.). arbitrary expression indicates group data. Defaults Piece (humdrumR data field). removeEmpty Whether include zero tokens. Defaults FALSE Must singleton logical value: /switch. set TRUE, groups zero tokens included humCensus table. drop Whether return normal data.table humCensus table. Defaults FALSE. Must singleton logical value: /switch. drop = TRUE, normal data.table returned instead humCensus table. Index rows. numeric, selects rows index. character, string matched regular expression \"-group\" names.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/census.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Tabulate records and tokens in a humdrumR corpus — census","text":"census returns special data.frame called humCensus table. humCensus table five columns information: Records total number records. Tokens total number tokens. (unique) number unique tokens Characters total number characters. (includes humdrum control characters like * !!.) (per token) simply Characters / Tokens, indicating mean length token. default, census tabulates data within pieces corpus, piece tabulated row humCensus table. Rows labeled file name. humCensus object printed, totals across pieces printed well---(unique) (per token) values calculated across pieces well, summed. argument can used tabulate data across divisions data (see next section).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/census.html"],"id":"tabulate-by-other-groups","dir":"Reference","previous_headings":"","what":"Tabulate \"by\" other groups","title":"Tabulate records and tokens in a humdrumR corpus — census","text":"argument census indicates groupings data tabulate within, grouping across pieces corpus default. can arbitrary expression evaluated inside humdrum table, like groupby argument /within call. expression must full length humdrum table.","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/census.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Tabulate records and tokens in a humdrumR corpus — census","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/cents.html"],"dir":"Reference","previous_headings":"","what":"Apply to humdrumR data — cents.humdrumR","title":"Apply to humdrumR data — cents.humdrumR","text":"cents() applied humdrumR data class may use data's fields arguments. field names specified, first selectedField used x.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/cents.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Apply to humdrumR data — cents.humdrumR","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/chord.html"],"dir":"Reference","previous_headings":"","what":"","title":"","text":"functions outputs jazz/pop-style chord symbols. universal standard notate chord symbols, particular plain text. chord() function outputs chord symbol representation roughly consistent \"standard practices.\"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/chord.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/chord.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"","text":"x atomic vector. x argument can (atomic) vectors Key diatonic key used parser, deparser, transposer. Defaults NULL, interpreted C major. Must diatonicSet something coercable diatonicSet; must either length 1 length(x). transposeArgs optional list arguments passed transpose() call. Defaults empty list(). Must list named arguments transpose(). parseArgs optional list arguments chord parser. Defaults empty list(). Must list named arguments chord parser. inPlace non-chord information retained output string. Defaults FALSE. Must singleton logical value: /switch.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/chord.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"","text":"rigorous, consistent work, recommend Harte notation, standard used MIREX, etc. harte() function output standard Harte symbols.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/chord.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/chordDeparsing.html"],"dir":"Reference","previous_headings":"","what":"Generating (","title":"Generating (","text":"humdrumR includes easy--use system generating variety tertian harmony (chord) representations, can flexibly modified users. \"hood\" humdrumR represents tonal chord information using underlying representation, typically extracted input data using chord parser. representation can \"deparsed\" variety predefined output formats (like **harm), new formats create!","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/chordDeparsing.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Generating (","text":"Deparsing second step chord function processing pipeline: Input representation |> Parsing |> Intermediate (tertianSet) representation |> Transformation |> Deparsing (DEPARSING ARGS GO ) |> Output representation Various pitch representations can generated using predefined chord functions like chord() tertian(), roman(). functions use common deparsing framework, specified using different combinations arguments deparser. modifying \"deparsing\" arguments, can exercise fine control want pitch information represented output.","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/chordFunctions.html"],"dir":"Reference","previous_headings":"","what":"Parsing and deparsing chord information — chordFunctions","title":"Parsing and deparsing chord information — chordFunctions","text":"functions can used extract \"translate,\" otherwise modify, data representing tertian harmony information. functions :","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/chordFunctions.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Parsing and deparsing chord information — chordFunctions","text":"x atomic vector. x argument can (atomic) vectors Key diatonic key used parser, deparser, transposer. Defaults NULL, interpreted C major. Must diatonicSet something coercable diatonicSet; must either length 1 length(x). parseArgs optional list arguments chord parser. Defaults empty list(). Must list named arguments chord parser. transposeArgs optional list arguments passed transpose() call. Defaults empty list(). Must list named arguments transpose(). inPlace non-chord information retained output string. Defaults FALSE. Must singleton logical value: /switch.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/chordFunctions.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Parsing and deparsing chord information — chordFunctions","text":"Jazz/Pop chord() harte() Classical figuredBass() tertian() Roman Numerals harm() roman()","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/chordParsing.html"],"dir":"Reference","previous_headings":"","what":"Parsing chord information — chordParsing","title":"Parsing chord information — chordParsing","text":"humdrumR includes easy--use powerful system parsing tertian harmony information: various basic chord representations (including numeric character-string representations) can \"parsed\"---read interpreted humdrumR. part, parsing automatically happens \"behind scenes\" whenever use humdrumR chord function, like harm() roman(), chord().","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/chordParsing.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Parsing chord information — chordParsing","text":"","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/cleave.html"],"dir":"Reference","previous_headings":"","what":"Align data from separate spines into new fields. — cleave","title":"Align data from separate spines into new fields. — cleave","text":"Cleave, \"cleave together,\" moves data separate spines (paths) new fields spine(s). hood, cleave() essentially runs specialized call make humdrum table \"wider,\" similar R functions like cast(), spread(), pivot_wider(). fact, humdrumR method pivot_wider() defined, equivalent cleave(). cleave() function essentially inverse rend().","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/cleave.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Align data from separate spines into new fields. — cleave","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/cleave.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Align data from separate spines into new fields. — cleave","text":"humdrumR HumdrumR data. Must humdrumR data object. ... cleave? Must natural numbers, character strings representing exclusive interpretations, lists either. field field cleave data . Defaults first selected field. Must character string partially matching name data field humdrumR input. example, \"Tok\" match Token field. newFields Names use new fields created cleave. default generates names structure/number (like Spine2) exclusive interpretation (like Silbe). Must non-empty character string.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/cleave.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Align data from separate spines into new fields. — cleave","text":"Many humdrum datasets encode data across multiple spines, spine-paths, stops. default, humdrumR parses separate spine, spine-path, stop individual data points, taking one row humdrum table. want treat data multiple spines/paths/stops different aspects data easiest reshape data information different humdrumR fields rather separate spines/paths/stops. humdrum syntax view, spines (path/stops) moved \"top\" , cleaving together. convenient cleaveSpines(), cleaveStops(), cleavePaths() functions automatically cleave stops/paths dataset onto first spine/stop/path, creating new fields named, e.g., Path1, Path2, etc.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/cleave.html"],"id":"syntax","dir":"Reference","previous_headings":"","what":"Syntax","title":"Align data from separate spines into new fields. — cleave","text":"cleave() function takes number ... arguments specifying groups spines/paths/stops cleave together. cleave(humData, Spine = 1:2) cleave first second spine. cleave(humData, Spine = 1:4) cleave first four spines. cleave(humData, Spine = 1:2, Spine = 3:4) cleave spine 1 spine 2, separately, spine 3 spine 4. default cleave spines, can actually omit Spine = part: e.g., cleave(humData, 1:2) cleave(humData, Spine = 1:2). want cleave spine paths, need explicitly call something like cleave(humData, Path = 0:1). first element group used original location spines/paths/stops cleaved . ordering remaining elements irrelevant.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/cleave.html"],"id":"piece-specific-cleaving","dir":"Reference","previous_headings":"","what":"Piece-specific cleaving","title":"Align data from separate spines into new fields. — cleave","text":"default, cleaving applied pieces (pieces target spines/paths/stops). However, can use alternate argument structure apply differerent cleaves different pieces. , provide groups cleave arguments list, element list representing cleave group one piece. listed groups unnamed, groups mapped pieces index. example, call cleave(humData, list(1:2, 2:3, 3:4, NULL, 1:3)) result following cleaves: piece 1, cleave spines 1 2. piece 2, cleave spines 2 3. piece 3, cleave spines 3 4. piece 4, cleave (changes). piece 5, cleave first three spines. remaining pieces (6 greater), cleaves. Alternatively, can name list elements integers corresponding pieces. example, cleave(humData, Path = list(\"1\" = 0:1, 5 = 0:2\")) cleave paths 0 1 piece 1, paths 0:2 piece 5.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/cleave.html"],"id":"exclusive-interpretations","dir":"Reference","previous_headings":"","what":"Exclusive interpretations","title":"Align data from separate spines into new fields. — cleave","text":"cleaving spines, can specify spines using character strings representing exclusive interpretations. can call cleave(humData, c('kern', 'silbe')), cause **kern **silbe spines piece cleaved. Note exclusive interpretations \"mentioned\" call remain original field. behavior exclusive cleaving depends relative number target exclusive interpretation piece. equal numbers interpretation, spines grouped parallel. example, piece spines **kern **silbe **kern **silbe, command cleave(humData, c('kern', 'silbe')) see two **kern/**silbe pairs, cleave just like cleave(humData, 1:2, 3:4). different numbers spines matching exclusive interpretation, cleave behavior depends field first field input argument---call \"target\" exclusive. Consider file spines **kern **kern **harm. specify cleave call cleave(humData, c('kern', 'harm')) means want **kern \"target\" exclusive. Since fewer **harm spines **kern spines, data **harm spine duplicated, can cleaved **kern spines parallel. instead call cleave(humData, c('harm', 'kern')), making **harm \"target\", two **kern spines \"piled\" atop single **harm spine, making two new **kern fields.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/cleave.html"],"id":"fields","dir":"Reference","previous_headings":"","what":"Fields","title":"Align data from separate spines into new fields. — cleave","text":"Cleaving can (now) applied one field data, defaults first selected field; can change target field field argument. Cleaving always introduce new fields data. first spine/path/stop cleave group left original (target) field. spine/path/stops put new fields. call humData |> select(Token) |> cleave(humData, 1:2), spine 1 remain Token field spine 2 data put new field. default, new field(s) automatically named appending type cleave (spine vs path vs stop) number. cleave(humData, 1:2) case, new field called Spine2. can control name newFields argument, must character vector. can provide many new field names new fields. provide field names, name(s) numbers appended necceasary cover new fields; provide many field names, extra names simply ignored. cleaving exclusive interpretation newFields can used exact way. However, default (newFields NULL), cleave() names fields exclusive interpretation. Note original target field (specified field) argument name changed. example, humData |> select(Token) |> cleave(humData, c('kern', 'silbe')) result spines Token Silbe. Kern field created, Kern data left Token field.","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/cleave.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Align data from separate spines into new fields. — cleave","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/cleaveGraceNotes.html"],"dir":"Reference","previous_headings":"","what":"","title":"","text":"\"Fold\" grace notes neighbos","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/cleaveGraceNotes.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"","text":"","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/collapseHumdrum.html"],"dir":"Reference","previous_headings":"","what":"","title":"","text":"collapseHumdrum allows collapse data field across across groups within data indicated argument. Data \"collapsed\" either pasting data string, putting list. collapseStops, collapsePaths, collapseRecords built-calls collapseHumtab, additional optimizations.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/collapseHumdrum.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/collapseHumdrum.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"","text":"humdrumR HumdrumR data. Must humdrumR data object. Fields collapse data within. Must character. Must character strings partially matching name(s) field(s) humdrumR input. Data fields collapsed within fields. fields target field(s) humdrumR data collapse. Defaults selectedFields(humdrumR). Must character strings partially matching name(s) data field(s) humdrumR input. dataTypes types humdrum record(s) collapse. Defaults \"GLIMDd\". Must character. Legal values 'G', 'L', '', 'M', 'D', 'd' combination (e.g., \"LIM\"). (See humdrum table documentation Fields section explanation.) collapseAtomic Whether collapse data character strings. Defaults TRUE. Must singleton logical value: /switch. TRUE, data collapsed single character string. FALSE, data conctanated list. sep separator collapsed strings. Defaults \" \" (space). Must single character string. effect collapseAtomic == TRUE.","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/combineFields.html"],"dir":"Reference","previous_headings":"","what":"Combine one or more fields into a new field — combineFields","title":"Combine one or more fields into a new field — combineFields","text":"Combine one fields new field","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/combineFields.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Combine one or more fields into a new field — combineFields","text":"","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/context.html"],"dir":"Reference","previous_headings":"","what":"Group vectors into contextual windows — context","title":"Group vectors into contextual windows — context","text":"context() command can used group input data (vectors fields) arbitrary contextual windows. Unlike grouping vectors, context() windows 1) always contiguous relative reference vector(s)/field(s) (can depend order); 2) can overlap; 3) necesarily exhaustively divide data. context() function generally called humdrumR data, can also called directly vectors. uncontext() function removes contextual windows humdrumR data object. contextual windows created, windows() function can used view data.table representing windows. Open Close columns indicate row indices humdrum table.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/context.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Group vectors into contextual windows — context","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/context.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Group vectors into contextual windows — context","text":"x Input data group windows. Must atomic vector. open \"open\" (start) windows. Can natural numbers, logical vectors (length x), single character string (interpreted regular expression). May also arbitrary expression returns natural numbers; expression can refer named elements reference, end (last index), close, prevclose (previous close). close \"close\" (end) windows. Can natural numbers, logical vectors (length x), single character string (interpreted regular expression). May also arbitrary expression returns natural numbers; expression can refer named elements reference, end (previous index), open, nextopen (next open). reference Vector(s) use identify window open/closes. Defaults x. Must either atomic vector length x, list()/data.frame vectors, named. context() applied humdrumR dataset, fields data's humdrum table used reference. overlap overlapping windows treated/created? Defaults 'paired'. Must single character, partially matching either \"paired\", \"nested\", \"edge\", \"none\". depth \"deep\" can windows overlap? Defaults NULL. Must NULL, vector non-zero whole numbers. rightward window alignment/overlap determined left right? Defaults TRUE. Must singleton logical value: /switch. duplicate_indices Can index open/close multiple windows? Defaults TRUE. Must singleton logical value: /switch. min_length, max_length minimum/maximum lengths output windows. Default two infinity (maximum) respectively. Must single, positive whole numbers. inPlace output padded length input? Defaults FALSE. Must singleton logical value: /switch. complement input \"outside\" windows, output? Defaults FALSE. Must singleton logical value: /switch. alignToOpen 'inPlace' output aligned open window? Defaults TRUE. Must singleton logical value: /switch. collapse output windows collapsed single character strings? Defaults TRUE. Must singleton logical value: /switch. sep Separator collapsed output. Defaults comma (\",\"). Must single character string. stripRegex regular expressions matched open/close arguments removed output? Defaults FALSE. Must singleton logical value: /switch. groupby Optional vectors group windows within. Defaults empty list(). Must list(), either empty contains vectors length x. calls /within.humdrumR, groupby passed list(Piece, Spine, Path) default. Windows cross group boundaries. humdrumR HumdrumR data. Must humdrumR data object.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/context.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Group vectors into contextual windows — context","text":"context() function determines contextual windows begin end based expressions open close arguments. open close expressions evaluated using reference vector, set vectors/fields() length. cases, apply context() humdrumR data object, windows defined evaluating open close arguments using fields() humdrum table reference. done, humdrumR object show many windows identified printed console. use /within/mutate/summarize/reframe data, methods evaluate argument expressions within every contextual window defined context(). means can basically anything want /contextual windows. can also apply context() directly single input vector x, providing vector list/data.frame equal-length vectors reference open close arguments. default, x reused reference, windows based input x . applied vector, context() simply group elements x windows defined, arguments control done: complement: \"complement\" refers elements input vector fall inside indicated windows: complement = FALSE (default), \"outside\" values dropped; complement = TRUE, retained. inPlace: inPlace = TRUE, windows output vector length input, padded NA needed---otherwise (default), windows returned collapse: collapse = TRUE, windows collapsed strings (separated sep), otherwise, list() windows returned. sep separator used collapse = TRUE. alignToOpen: padded output (inPlace = TRUE) aligned openning (left-side) window? stripRegex: regular expressions used identify windows (details ) stripped output? rest man page, apply context() simple vectors (like letters vector) illustrate windows defined. actual analyses, likely apply context() humdrumR data. Note , using context() inside , within, etc., alignToOpen argument effect. Instead, use alignLeft = FALSE argument ()/within(), argument context().","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/context.html"],"id":"groupby","dir":"Reference","previous_headings":"","what":"groupby","title":"Group vectors into contextual windows — context","text":"groupby argument optional list grouping vectors, length x/reference. Contextual windows cross boundaries indicated groupby. applying context() humdrumR data, groupby automatically passed list(Piece, Spine, Path), prevents windows crossing normal \"melodic\" boundaries data.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/context.html"],"id":"defining-windows","dir":"Reference","previous_headings":"","what":"Defining windows","title":"Group vectors into contextual windows — context","text":"system context() uses define/identify windows data quite sophisticated, can take time master! basic idea must indicate want windows start (\"open\") want end (\"close\"): indicate using open close arguments. introduce usage, first simple examples applying context() built-letters vector, (default) act reference vector target vector x contextualize. show techniques can used multiple vectors/fields(). open close arguments expressions , evaluated, must indicate indices reference vector(s)/field(s); example, want window open 4th 11th indices, close 15th 24th index, can write: quite trivial. However, open close expressions can number special tricks, including refering . example, either argument includes call hop(), hop() automatically applied along input vector. Consider example: example, hop() command generates open indices every odd number 1 25. close argument references open indices, adds 3 --- result pairs like 1:4, 2:5, 3:6, 4:7, etc. give hop() different arguments (like ), can modify process. fact, use default value hop() (1), can use approach create standard N-grams. can also indicate open/closes providing logical vectors (length x/reference). example:","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/context.html"],"id":"regular-expressions","dir":"Reference","previous_headings":"","what":"Regular Expressions","title":"Group vectors into contextual windows — context","text":"either open close provided character string, string treated regular expression matched reference vector. example, make windows alphabet starting ending vowel: stripRegex = TRUE (default), matching open close regular expressions removed output. can useful character/tokens used indicate windows longer needed windowing done.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/context.html"],"id":"special-variables","dir":"Reference","previous_headings":"","what":"Special variables","title":"Group vectors into contextual windows — context","text":"open close expressions understand special variable names: nextopen: represents index next open---can used close argument. prevclose: represents index previous close---can used open argument. end: represents last index reference vector(s). |: \"\"---specify alternative window open/close criteria. like windows close right next window opens? can making thecloseargument refer *next*open, referring nextopen` variable: Conversely, open can refer prevclose close: Notice called context(letters, open = '[aeiou]', close = nextopen - 1L), window opening \"u\" returned. \"nextopen\" open close . can instead provide context() alternative, using | (): saying, close window 1 index next open index 26. know exactly long input vector ? Refer end variable:","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/context.html"],"id":"separating-context-reference-from-application","dir":"Reference","previous_headings":"","what":"Separating context reference from application","title":"Group vectors into contextual windows — context","text":"previous examples illustrate basic concepts using open/close; grasp work, study examples play around . can also define open close expressions reference one vector(s)/field, necessarily thing want apply windowing . illustrate last point, take last command previous section make x argument different reference argument: Now, letters still used windowing reference, contextual windowing applied LETTERS. use context() humdrumR dataset, data's fields() can used reference, (), within(), mutate() can used manipulate fields.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/context.html"],"id":"multi-vector-field-reference","dir":"Reference","previous_headings":"","what":"Multi-vector/field reference","title":"Group vectors into contextual windows — context","text":"open close arguments can reference one reference vector. applying context() vector x, can provide named list() data.frame() reference argument---long vectors contain length x. can refer vectors name: created data.frame columns Threes Fours. referenced columns defining windows open close.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/context.html"],"id":"using-humdrumr-data","dir":"Reference","previous_headings":"","what":"Using humdrumR data","title":"Group vectors into contextual windows — context","text":"apply context() humdrumR data, can refer data's fields() open close. can also use open/close's special tricks (described ), like hop(), nextopen, prevclose, end. example, create 4-grams humdrum dataset: mentioned , apply context() humdrumR data, groupby automatically passed list(Piece, Spine, Path), prevents windows crossing normal \"melodic\" boundaries data. can overrriden providing explicit groupby argument. Grouping fields already defined data, also used.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/context.html"],"id":"filtering-windows","dir":"Reference","previous_headings":"","what":"Filtering windows","title":"Group vectors into contextual windows — context","text":"open close identified windows can start end, still options open close indices associate create window. example, mentioned , groupby argument can used make sure windows cross grouping boundaries---even one group extra open index next extra close index. minimum maximum length windows can also controlled using min_length max_length arguments. overlap, depth, rightward, duplicate_indices arguments provide number additional options, useful use cases (details ).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/context.html"],"id":"nested-windows","dir":"Reference","previous_headings":"","what":"Nested windows","title":"Group vectors into contextual windows — context","text":"common use-case context() analyzing phrases indicated music. **kern, phrases indicated opening (() close ()) parentheses, can capture regular expressions open close. example: Perfect. However, nested phrasing indicators? want! default, context() \"pairs\" open next close, often makes sense. case, want different behavior. can get want specifying overlap = 'nested': Now context aligns open corresponding close nesting level. interested highest (lowest) level nesting? Use depth argument, can non-zero integers: highest level 1, \"deeper\" levels incrementing . can also use negative depth specify deepest levels outward. example, case depth == -1 get us deepest level: depth NULL (default), depths returned.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/context.html"],"id":"controlling-overlap","dir":"Reference","previous_headings":"","what":"Controlling overlap","title":"Group vectors into contextual windows — context","text":"options controlling windows can, , overlap. Perhaps like look every melodic phrase moving (dominant) (tonic). output probably want. , context() (default) pairs opening next close already paired. case, means third getting pairs third , even though another ! might want try either \"edge\" \"none\" options overlap argument: \"edge\" option allows closing edge windows share close---case, second third (open) paired . hand, overlap = \"none\", overlapping windows simply allowed, third open simply get paired anything. like pair windows left (opening) edge? specify rightward = FALSE, overlap argument works backwards (right--left) input vector, starting close ending open. combining righward = FALSE various overlap options, can achieve lot windowing options might need.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/context.html"],"id":"repeated-indices","dir":"Reference","previous_headings":"","what":"Repeated indices","title":"Group vectors into contextual windows — context","text":"Note duplicates_indices = TRUE (default) open close arguments can incorporate repeated indices, including multiple matches regular expression index. useful , example, nested phrases: cases, might want turn duplicate_indices = FALSE.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/context.html"],"id":"complements-removing-context-","dir":"Reference","previous_headings":"","what":"Complements (removing context)","title":"Group vectors into contextual windows — context","text":"uncontext() command, like ungroup() command, needed remove contextual windows humdrumR data, calls within()/mutate()/etc. applied context. uncontext() command can also used access data outside contextual windows using complement argument, similar unfilter() function. complement must existing field data. uncontext() used given complement field, currently selected data field (unless Token selected) contents complement field inserted points outside contextual windows. can used keep","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/context.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Group vectors into contextual windows — context","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/counts.html"],"dir":"Reference","previous_headings":"","what":"Tabulate and/or cross-tabulate data — show,counts-method","title":"Tabulate and/or cross-tabulate data — show,counts-method","text":"count() function exactly like R's fundamental table() function, except 1) give special treatment humdrumR token() data 2) intuitive/simple argument names 3) makes easier combine/manipulate disparate output tables.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/counts.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Tabulate and/or cross-tabulate data — show,counts-method","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/counts.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Tabulate and/or cross-tabulate data — show,counts-method","text":"count() function essentially wrapper around base::table() function. However, token() class arguments treated like factors(), calling generating levels. assures , example, pitch data tabulated order pitch height, \"missing\" pitches counted zero. count() , default, count NA values present---want count NAs, specify na.rm = TRUE. can also tell count() exclude (count) arbitrary values provide vector exclude argument. count() always give names dimensions table creates. can specify names directly argument names, like count(Kern = kern(Token)); specify name, count() make name(s) based expression(s) tallying. (Note count() copy base::table()'s obtusely-named dnn deparse.level arguments.)","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/counts.html"],"id":"manipulating-humdrum-tables","dir":"Reference","previous_headings":"","what":"Manipulating humdrum tables","title":"Tabulate and/or cross-tabulate data — show,counts-method","text":"output count() special form R table, counts. Given two countss, apply basic R operators (e.g., arithmetic, comparisons) row/column binding (cbind/rbind) humdrumR align tables dimension-names operation. means, two tables pitch data, one table includes specific pitch , can still add together bind matrix. See examples!","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/counts.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Tabulate and/or cross-tabulate data — show,counts-method","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/crossEntropy.html"],"dir":"Reference","previous_headings":"","what":"Calculate cross entropy between two distributions — crossEntropy","title":"Calculate cross entropy between two distributions — crossEntropy","text":"TBA","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/crossEntropy.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Calculate cross entropy between two distributions — crossEntropy","text":"","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/degree.html"],"dir":"Reference","previous_headings":"","what":"Tonal scale degree representation (absolute) — degree","title":"Tonal scale degree representation (absolute) — degree","text":"humdrum **degree **deg interpretations represent Western \"scale degrees\" two slightly different formats. **degree representation, octave pitch represented \"absolutely,\" standard octave scheme scientific pitch. **deg representation, octave pitch indicated relative previous pitch--- \"^\" indicates pitch higher previous pitch \"v\" indicates pitch lower previous pitch. degree() applied humdrumR data class may use data's fields arguments. field names specified, first selectedField used x. deg() applied humdrumR data class may use data's fields arguments. field names specified, first selectedField used x.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/degree.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Tonal scale degree representation (absolute) — degree","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/degree.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Tonal scale degree representation (absolute) — degree","text":"x Input data parse pitch information. x argument can (atomic) vector, tonalInterval, NULL. ... Arguments passed pitch deparser. also two hidden (advanced) arguments can specify: memoize deparse (see details ). generic \"specific\" pitch information (accidentals qualites) discarded? Defaults FALSE. Must singleton logical value: /switch. simple \"compound\" pitch information (octave/contour) discarded? Defaults FALSE. Must singleton logical value: /switch. Key input Key used parser, deparser, transposer. Defaults NULL. Must diatonicSet something coercable diatonicSet; must either length 1 length(x) transposeArgs optional list arguments passed special transpose() call. Defaults empty list(). Must list named arguments transpose(). parseArgs optional list arguments passed pitch parser. Defaults empty list(). Must list named arguments pitch parser. inPlace non-pitch information retained output string. Defaults FALSE. Must singleton logical value: /switch. argument effect input (x argument) character strings, extra, non-pitch information input strings \"besides\" pitch information. , inPlace = TRUE, output placed output string beside original non-pitch information. inPlace = FALSE, pitch output information returned (details ).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/degree.html"],"id":"basic-pitch-arguments","dir":"Reference","previous_headings":"","what":"Basic pitch arguments","title":"Tonal scale degree representation (absolute) — degree","text":"pitch function standard arguments control details output. important generic simple arguments, allow control type pitch information returned.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/degree.html"],"id":"generic-vs-specific","dir":"Reference","previous_headings":"","what":"Generic vs Specific","title":"Tonal scale degree representation (absolute) — degree","text":"generic = TRUE, specific pitch information (accidentals qualities) omitted output. alternative way controlling functionality, can use specific argument, specific == !generic. case atonal functions, \"generic\" version pitch output: example, semits('c#', generic = TRUE) return 0, \"generic\" version C# C, corresponds 0. However, note generic version pitch follows key, semits('c#', generic = TRUE, Key = ':') return 1!","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/degree.html"],"id":"simple-vs-compound","dir":"Reference","previous_headings":"","what":"Simple vs Compound","title":"Tonal scale degree representation (absolute) — degree","text":"simple = TRUE, compound pitch information (octave contour) omitted output. alternative way controlling functionality, can use compound argument ,compound == !simple. actually one way might want divide compound intervals simple octave parts. example, might like call output -M2 (descending major 2nd) +m7 (ascending minor 7th octave ). functionality can controlled octave.round argument: see pitch deparsing documentation.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/degree.html"],"id":"key","dir":"Reference","previous_headings":"","what":"Key","title":"Tonal scale degree representation (absolute) — degree","text":"Key argument must diatonicSet, something can parsed one. Key argument passed parser, deparser, transpose---unless alternate Key passed transposeArgs parseArgs. Various deparsing options use Key argument; example, use implicitSpecies (see advanced parsing section) dependent Key. use pitch function within special call withinHumdrum, humdrumR automatically pass Key field humdrum data function---means, cases, need explicitly anything Key argument! (want happen, need explicitly specify Key argument, Key = NULL.)","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/degree.html"],"id":"parse-arguments","dir":"Reference","previous_headings":"","what":"Parse arguments","title":"Tonal scale degree representation (absolute) — degree","text":"parseArgs argument must list() (named) arguments passed input parser. example, input representation uses \"X\" represent double sharps, specify kern('CX5', parseArgs = list(doublesharp = 'X')) get correct result (\"cc##\"). convenient shorthand, \"syntactic sugar,\" can specify parseArgs alternate way: Simply input parse(args...) unnamed argument pitch function. example, can get exact result typing kern('CX5', parse(doublesharp = 'X')).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/degree.html"],"id":"transpose-arguments","dir":"Reference","previous_headings":"","what":"Transpose arguments","title":"Tonal scale degree representation (absolute) — degree","text":"transposeArgs argument must list() (named) arguments passed internal call transpose(), allowing us easily transpose pitch information. example, type kern(c('C', 'D', 'E'), transposeArgs = list(= 'M9')) can get output c('d', 'e', 'f#'). possible transpose args : (tonalInterval, length == 1 | length == (x)) (diatonicSet, length == 1 | length == (x)) (diatonicSet, length == 1 | length == (x)) real (logical, length == 1) transposition real tonal? relative (logical, length == 1) key-wise transposition based relative parallel keys? convenient shorthand, \"syntactic sugar,\" can specify transposeArgs alternate way: Simply input transpose(args...) unnamed argument pitch function. example, can get exact result typing kern(c('C', 'D', 'E'), transpose(= 'M9')).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/degree.html"],"id":"transposing-by-interval","dir":"Reference","previous_headings":"","what":"Transposing by interval","title":"Tonal scale degree representation (absolute) — degree","text":"calling transpose() directly, argument can anything coercable tonalInterval, output transposed amount. real = FALSE, tonal transposition (within Key) performed. details transposition behavior, check transpose() docs.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/degree.html"],"id":"transposing-by-key","dir":"Reference","previous_headings":"","what":"Transposing by key","title":"Tonal scale degree representation (absolute) — degree","text":"Another way transposing specifying input (\"\") key output (\"\") key. default, Key argument passed transpose , nothing actually happens. Thus, specify either key key, transposition happen /key Key. course, specify transposition happen keys specify. use pitch function within special call withinHumdrum, humdrumR automatically pass Key field humdrum data function. specify key, Key field passed transpose key, result, pitches input transposed whatever keys target () key! real relative arguments give special control key-wise transposition works, check transpose() docs details!","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/degree.html"],"id":"in-place-parsing","dir":"Reference","previous_headings":"","what":"In-place parsing","title":"Tonal scale degree representation (absolute) — degree","text":"humdrum data, character strings often encoded multiple pieces musical information right besides : example, **kern data might include tokens like \"4.ee-[. humdrumR parser (tonalInterval) automatically \"pull \" pitch information within strings, can find using appropriate known regular expressions. example, pitch('4.ee-[') returns Eb5. However, pitch functions (like pitch() kern()) option keep \"extra\" information return result \"place\"---.e., embedded right found input string. controlled inPlace argument, FALSE default. , pitch('4.ee-[', inPlace = TRUE) return 4.Eb5[---keeping \"4.\" \"[\". (obviously works input string, numeric!) Note inPlace = TRUE force functions like semits, normally return numeric values, return character strings input character string.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/degree.html"],"id":"pitch-gamut-levels","dir":"Reference","previous_headings":"","what":"Pitch-Gamut Levels","title":"Tonal scale degree representation (absolute) — degree","text":"table() automatically generate factor levels pitch data using gamut() function. makes sure tabulated data sorted logical order, includes missing pitches. simple/complex generic/specific arguments automatically passed gamut(); additional arguments can passed gamut using gamutArgs = list(...), syntactic sugar gamut(...). (Read gamut() docs explanation gamut generation.) feature used control table layout pitch data, well assure consistent tables grouping data. inPlace = TRUE special tabulation occur.","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/degree.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Tonal scale degree representation (absolute) — degree","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/delta.html"],"dir":"Reference","previous_headings":"","what":"Lagged differences — delta","title":"Lagged differences — delta","text":"Calculate sequential differences values numeric vectors.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/delta.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Lagged differences — delta","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/delta.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Lagged differences — delta","text":"x input vector. Must atomic numbers. NULL values returned NULL. lag lag use. Defaults 1. Must single natural number. Results look like: x[] - x[- lag]. skip function indicate values skip. Defaults .na. must function can applied x return logical vector length. TRUE values skipped calculations. default, skip function .na, NA values input (x argument) skipped. skipped values returned output vector. init Initial value fill beginning calculation. Defaults 0. class x; length must longer lag. NA values beginning (end right == TRUE) filled values summing. right init padding \"right\" (end vector)? Defaults FALSE. Must singleton logical value: /switch. default, right == FALSE init padding beginning output. groupby group data. Defaults list(). vector list vectors; must length length(x). Differences calculated across groups indicated groupby vector(s). orderby order calculating difference. Defaults list(). vector list vectors; must length length(x). Differences x calculated based order orderby vector(s), determined base::order().","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/delta.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Lagged differences — delta","text":"delta similar base-R diff(). However, delta favored humdrumR use : output always length input. achieved padding beginning end output with1 NA values (options). groupby argument, automatically used humdrumR () commands constrain differences within pieces/spines/paths humdrum data. groupby approach (details ) generally faster applying commands within groupby groups. (can) automatically skip NA () values. applied matrix, delta applied separately column, unless margin set 1 (rows) , higher-dimensional array, higher value.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/delta.html"],"id":"initial-padding-values","dir":"Reference","previous_headings":"","what":"Initial/padding values","title":"Lagged differences — delta","text":"lagged pair numbers vector summed/subtracted. leaves abs(lag) numbers end nothing pair . example, lag == 1, indices getting subtracted look like : \\(x_1 - x_?\\) \\(x_2 - x_1\\) \\(x_3 - x_2\\) \\(x_4 - x_3\\) \\(x_5 - x_4\\) lag == 3: \\(x_1 - x_?\\) \\(x_2 - x_?\\) \\(x_3 - x_?\\) \\(x_4 - x_1\\) \\(x_5 - x_2\\) init argument (\"initial\") value, values, pair first lag values. default, init NA, since n + NA n - NA , NA, output vector padded NA values. lag == 3 : \\(x_1 - NA\\) \\(x_2 - NA\\) \\(x_3 - NA\\) \\(x_4 - x_1\\) \\(x_5 - x_2\\) However, init argument can 1 abs(lag) numeric values. result, lag==3 : \\(x_1 - init_1\\) \\(x_2 - init_2\\) \\(x_3 - init_3\\) \\(x_4 - x_1\\) \\(x_5 - x_2\\) right == TRUE, init values placed end, like: \\(x_4 - x_1\\) \\(x_5 - x_2\\) \\(init[1] - x_3\\) \\(init[2] - x_4\\) \\(init[3] - x_5\\) init argument functions similarly init argument Reduce().","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/delta.html"],"id":"negative-lag","dir":"Reference","previous_headings":"","what":"Negative lag","title":"Lagged differences — delta","text":"lag negative, differences simply reversed, resulting numbers equivalent positive lag, * -1. \\(x_1 - NA\\) \\(x_2 - x_1\\) \\(x_3 - x_2\\) \\(x_4 - x_3\\) \\(x_5 - x_5\\) \\(NA - x_1\\) \\(x_1 - x_2\\) \\(x_2 - x_3\\) \\(x_3 - x_4\\) \\(x_4 - x_5\\)","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/delta.html"],"id":"grouping","dir":"Reference","previous_headings":"","what":"Grouping","title":"Lagged differences — delta","text":"many cases want perform lagged calculations vector, across certain boundaries. example, vector includes data multiple pieces, want calculate melodic intervals pieces, within pieces. groupby argument indicates one, , grouping vectors, break x (input) argument groups. groupby vectors given, change vector indicates boundary. Value pairs cross groups treated beginning. Basically, using groupby argument function similar identical using tapply(x, groupby, laggedFunction, ...) using groupby expession call ().humdrumR. However, using groupby argument directly usually much faster, specially optimized functions. common use case humdrum data, looking \"melodies\" within spines. , want groupby = list(Piece, Spine, Path). fact, humdrumR () calls automatically feed three fields groupby arguments certain functions: mint, delta, sigma, lag, ditto, ioi, sumTies, hop, wort, wort.character. use delta call (), automatically calculate delta \"melodic\" way, within spine path piece. However, wanted, instance, calculate differences across spines (like harmonic intervals) manually set groupby = list(Piece, Record).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/delta.html"],"id":"order","dir":"Reference","previous_headings":"","what":"Order","title":"Lagged differences — delta","text":"performing lagged calculations, typically assume order values input vector (x) order want \"lag\" across. E.g., first element \"\" second element, \"\" third element, etc. [Humdrum tables][humTable] always ordered Piece > Piece > Spine > Path > Record > Stop. Thus, lagged calculations across fields humtable , default, \"melodic\": next element next element spine path. example, consider data: default order tokens (Token field) b c d e f. wanted instead lag across tokens harmonically (across records) need specifiy different order example, say orderby = list(Pice, Record, Spine)---lagged function interpret Token field d b e c f. another example, note Stop comes last order. consider happens stops data:","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/delta.html"],"id":"invertability","dir":"Reference","previous_headings":"","what":"Invertability","title":"Lagged differences — delta","text":"sigma delta functions inverses , meaning right arguments set, sigma(delta(x)) == x delta(sigma(x)) == x. words, two functions \"reverse\" . key init argument needs set 0, arguments (lag, skip, groupby, etc.) need match. actually, sigma(delta(x, init = 0, ...)) == x delta(sigma(x), init = 0)) == x. take differences values (delta(x)), resulting differences tell us fully reconstruct original unless know \"start\" (constant offset). example, delta(c(5, 7, 5, 6)) == c(NA, 2, -2, 1) know input goes 2, back 2, 1, starting value (first 5) lost. call sigma , get: sigma(c(NA, 2, -2, 1)) == c(0, 2,0, 1) get right contour, offset constant 5. call delta(x, init = 0) necessary constant (first value) kept beginning vector delta(c(5, 7, 5, 6), init = 0) == c(5, 2, -2, 1) sigma gets want, full invertability: sigma(delta(c(5, 7, 5, 6), init = 0)) == c(5, 7, 5, 6) Alternatively, specify necessary constant init argument sigma: sigma(delta(c(5, 7, 5, 6)), init = 5) == c(5, 7, 5, 6) init arguments two functions complementary. Currently, right argument delta complement sigma, invertability holds true right = FALSE (default).","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/diatonicSetS4.html"],"dir":"Reference","previous_headings":"","what":"Tonal (diatonic) sets — diatonicSetS4","title":"Tonal (diatonic) sets — diatonicSetS4","text":"diatonicSet one humdrumR's types tonal data, representing Western diatonic keys. part, users need interact diatonicSets directly---rather, diatonicSets work behind scene numerous humdrumR pitch functions. See keyRepresentations keyTransformations documentation details usage functionality Tonality humdrumR vignette detailed explanation theory specifics diatonicSets.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/diatonicSetS4.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Tonal (diatonic) sets — diatonicSetS4","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/diatonicSetS4.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Tonal (diatonic) sets — diatonicSetS4","text":"diatonicSet S4 subclass humdrumR's virtual class struct, inherits lot useful \"vector-like\" behaviors/functionality. constructor function dset can used create diatonicSets directly. three arguments corespond three slots: root, mode, alteration. inputs coerced match length. root argument attempt coerce character strings tonalIntervals, use LO5th value root. default, .character method, thus (via struct) show method, diatonicSets call key(). Thus, return diatonicSet command line (call print one one), see key interpretation representation printed.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/diatonicSetS4.html"],"id":"slots","dir":"Reference","previous_headings":"","what":"Slots","title":"Tonal (diatonic) sets — diatonicSetS4","text":"Root integers representing root key line--fifths Signature integers representing signature (number accidentals) key. key represented two integers, Root Signature. Root simply tonic note key circle fifths. Signature value circle fifths, indicating diatonic mode. can think Signature value indicating number accidentals, negative numbers flats positive numbers sharps. can also think signature indicating much \"natural key\" (C major) slid line--fifths. traditional diatonic modes Western music occur wherever Signature - Tonic range -5:1: Signature - Tonic = +1 => Lydian Signature - Tonic = +0 => Major (Ionian) Signature - Tonic = -1 => Mixolydian Signature - Tonic = -2 => Dorian Signature - Tonic = -3 => Minor (Aeolian) Signature - Tonic = -5 => Locrian Signature - Tonic = -4 => Phyrgian Note can make diatonicSets Root outside Key. unusual, may result sets predict. Alteration integers representing alterations diatonic set (details ).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/diatonicSetS4.html"],"id":"alterations","dir":"Reference","previous_headings":"","what":"Alterations","title":"Tonal (diatonic) sets — diatonicSetS4","text":"Alteration slots (also integer) can used represent various \"altered\" scales. integer values interpreted seven-trit balanced ternary string. (\"trits\" ternary equivalent binary \"bits.\") Balanced ternary allows three digits, 0 (unaltered degree), 1 (sharpened degree), -1 (flattened degree). seven trits correspond seven scale degrees line--fifth indicated signature---.e., ordered lowest hightest line--fifths, relative root. (instance, Signature == 0, degrees c(-1, 0, 1, 2, 3, 4, 5).) ternary arrangement maps powers three scale degree, Alteration integer: ± 1: raise flatten 7th scale degree. ± 3: raise flatten 3rd scale degree. ± 9: raise flatten 6th scale degree. ± 27: raise flatten 2nd scale degree. ± 81: raise flatten 5th scale degree. ± 243: raise flatten 1st scale degree. ± 749: raise flatten 4th scale degree. example, consider Alteration == 26: balanced ternary representation, decimal integer 26 represented 1 0 0 1 0 -1 0. (words 1 \"27s place\" -1 \"ones place\"---.e., 27 - 1). represents raised 2nd (27) lowered 7th (-1). Alteration integer allows us concisely represent 2,187 possible combinations raised lowered diatonic scale degrees! However, combined Signature slot, redundancy scale representation. example, melodic minor scale can represented major scale (Signature - Root == 0) lowered third degree (Alteration == -3) minor scale (Signature - Root == -3) raised 6ths 7ths (Alteration == 10). However, though two representations result set line--fifths, might consider conceptually different contexts, consider redundancy acceptable. Another case encoding redundancy Alteration - 1 (flatten 7th) exactly equivalent Signature - 1. Similarly, Alteration + 749 (raise 4th) exactly equivalent Signature + 1. Double-flat double-sharp degrees encodable diatonicSet. However, combination Signature slot, sets double-flat/sharps (like doubly-diminished 7ths) can encoded.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/diatonicSetS4.html"],"id":"arithmetic","dir":"Reference","previous_headings":"","what":"Arithmetic","title":"Tonal (diatonic) sets — diatonicSetS4","text":"Arithmetic diatonicSets defined. However, number useful arithmetic operations diatonicSets data types defined: XXXX Elaborate XXXX Need implement special logic adding Alterations! (Taking account Signature addition.)","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/diatonicSetS4.html"],"id":"relational-operators","dir":"Reference","previous_headings":"","what":"Relational Operators","title":"Tonal (diatonic) sets — diatonicSetS4","text":"diatonicSets can compared using standard relational operations ==, !=. Two diatonicSets equal (according ==) slots (Root, Signature, Alteration) exactly identical. Ordinal comparisons (e.g., >, <=) diatonicSets Signature .","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/diatonicSetS4.html"],"id":"coercion","dir":"Reference","previous_headings":"","what":"Coercion","title":"Tonal (diatonic) sets — diatonicSetS4","text":"humdrumR knows coerce several base-R atomic types diatonicSets. can done using function---e.g., (3, \"diatonicSet\")---intuitively using function diatonicSet(). Coercision methods defined integer: interpreted root major key numeric: rounded nearest integer intepreted root major key character: interpreted using humdrumRs regular expression dispatch system, explained fully .","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/distributions.html"],"dir":"Reference","previous_headings":"","what":"Distributions — distributions","title":"Distributions — distributions","text":"HUmdrumR ways ... count() function exactly like R's fundamental table() function, except 1) give special treatment humdrumR token() data 2) intuitive/simple argument names 3) makes easier combine/manipulate disparate output tables.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/distributions.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Distributions — distributions","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/distributions.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Distributions — distributions","text":"count() function essentially wrapper around base::table() function. However, token() class arguments treated like factors(), calling generating levels. assures , example, pitch data tabulated order pitch height, \"missing\" pitches counted zero. count() , default, count NA values present---want count NAs, specify na.rm = TRUE. can also tell count() exclude (count) arbitrary values provide vector exclude argument. count() always give names dimensions table creates. can specify names directly argument names, like count(Kern = kern(Token)); specify name, count() make name(s) based expression(s) tallying. (Note count() copy base::table()'s obtusely-named dnn deparse.level arguments.)","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/distributions.html"],"id":"manipulating-humdrum-tables","dir":"Reference","previous_headings":"","what":"Manipulating humdrum tables","title":"Distributions — distributions","text":"output count() special form R table, humdrumR.table. Given two humdrumR.tables, apply basic R operators (e.g., arithmetic, comparisons) row/column binding (cbind/rbind) humdrumR align tables dimension-names operation. means, two tables pitch data, one table includes specific pitch , can still add together bind matrix. See examples!","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/distributions.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Distributions — distributions","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/ditto.html"],"dir":"Reference","previous_headings":"","what":"Propagate data points to ","title":"Propagate data points to ","text":"ditto function allow \"fill\" null values vector non-null values earlier/later vector. default, \"forward,\" behavior fills null value previous (lower index) non-null value, . reverse argument can used cause \"backward\" filling, next (higher index) non-null value used. input begins (ends reverse == TRUE) null value, initial argument filled instead; defaults NA.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/ditto.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Propagate data points to ","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/ditto.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Propagate data points to ","text":"x vector. list, atomic, matrix, data.frame. null Defines elements needs filled. Defaults function(x) .na(x) | x == \".\". either logical vector (length(x) == length(null)), numeric vector positive indices, function , applied x returns appropriate logical/numeric vector. initial Padder beginning (end, reverse == TRUE) output, needed. Defaults NA. class x; must length 1. reverse Whether excecution order reversed. Defaults FALSE. Must singleton logical value: /switch. reverse == TRUE, \"non-null\" values coped overwrite null values earlier (lower indices) vector. groupby group data. vector list vectors; must length length(x). segment x delineated groupby vector(s) treated separately. margin vector giving dimensions function applied . Defaults 2 (across columns) matrix inputs. Must natural number(s). E.g., matrix 1 indicates rows, 2 indicates columns. x named dimnames, can character vector selecting dimension names. Must single character string.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/ditto.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Propagate data points to ","text":"values considered \"null\" can controlled using null argument. null argument can either logical vector length input (x) argument, numeric vector positive indices, function , applied x returns appropriate logical/numeric vector. values x null == FALSE copied forward/backwards replace adjacent vales null == TRUE. default, null function \\(x) .na(x) | x == '.', means NA values string \".\" \"null\", overwritten adjacent values. ditto methods defined data.frames matrices. data.frame method simply applies ditto column data.frame separately. matrices, ditto can applied across columns (margin == 2), rows (margin == 1), dimensions. ditto method humdrumR object simply applies ditto , default, selected field; thus ditto(humData) equivalent within(humData, newField <- ditto(.), dataTypes = 'Dd'). field argument can used indicated different field apply . result dittoing saved new field---newField argument can used control name new field.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/ditto.html"],"id":"grouping","dir":"Reference","previous_headings":"","what":"Grouping","title":"Propagate data points to ","text":"many cases want perform lagged calculations vector, across certain boundaries. example, vector includes data multiple pieces, want calculate melodic intervals pieces, within pieces. groupby argument indicates one, , grouping vectors, break x (input) argument groups. groupby vectors given, change vector indicates boundary. Value pairs cross groups treated beginning. Basically, using groupby argument function similar identical using tapply(x, groupby, laggedFunction, ...) using groupby expession call ().humdrumR. However, using groupby argument directly usually much faster, specially optimized functions. common use case humdrum data, looking \"melodies\" within spines. , want groupby = list(Piece, Spine, Path). fact, humdrumR () calls automatically feed three fields groupby arguments certain functions: mint, delta, sigma, lag, ditto, ioi, sumTies, hop, wort, wort.character. use delta call (), automatically calculate delta \"melodic\" way, within spine path piece. However, wanted, instance, calculate differences across spines (like harmonic intervals) manually set groupby = list(Piece, Record).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/ditto.html"],"id":"order","dir":"Reference","previous_headings":"","what":"Order","title":"Propagate data points to ","text":"performing lagged calculations, typically assume order values input vector (x) order want \"lag\" across. E.g., first element \"\" second element, \"\" third element, etc. [Humdrum tables][humTable] always ordered Piece > Piece > Spine > Path > Record > Stop. Thus, lagged calculations across fields humtable , default, \"melodic\": next element next element spine path. example, consider data: default order tokens (Token field) b c d e f. wanted instead lag across tokens harmonically (across records) need specifiy different order example, say orderby = list(Pice, Record, Spine)---lagged function interpret Token field d b e c f. another example, note Stop comes last order. consider happens stops data:","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/draw.html"],"dir":"Reference","previous_headings":"","what":"Visualize data — draw","title":"Visualize data — draw","text":"draw() function humdrumR's goto plotting function. draw() can make variety graphs, depending type data give . part, draw() simply stylish, easy use wrapper around base-R graphics functions plot(), barplot(), hist().","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/draw.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Visualize data — draw","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/draw.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Visualize data — draw","text":"draw() generic function, different plots depending data pass x y arguments. x y numeric: scatter plot. x numeric : histogram. y numeric : quantile plot. x table: barplot. y numeric, x character factor: violin plot. standard arguments base-R plots can used customize plots. See par() full list.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/duple.html"],"dir":"Reference","previous_headings":"","what":"Generate duple meters — duple","title":"Generate duple meters — duple","text":"function generates meter() objects representing duple meters. desired number duple levels controlled nlevels argument. span meter (.e., highest level) indicated measure argument. Finally, tactus argument indicates level (indexe highest lowest) tactus. default arguments build 4/4 meter levels ranging whole-notes sixteenth-notes, quarter-note tactus.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/duple.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Generate duple meters — duple","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/duple.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Generate duple meters — duple","text":"nlevels number duple levels. Must singleton, positive natural number measure duration top level meter. Must singleton numeric character value. parsed duration rhythmInterval(); failure parse leads error. tactus level tactus? Must singleton, positive natural number; must less equal nlevels.","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/duration.html"],"dir":"Reference","previous_headings":"","what":"Numeric (double) representation of durations — duration","title":"Numeric (double) representation of durations — duration","text":"Output numeric (real number). duration() applied humdrumR data class may use data's fields arguments. field names specified, first selectedField used x. quarters() applied humdrumR data class may use data's fields arguments. field names specified, first selectedField used x.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/duration.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Numeric (double) representation of durations — duration","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/duration.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Numeric (double) representation of durations — duration","text":"x input vector. x argument can (atomic) vector, rational (rhythmInterval), NULL. Must parsable rhythm infromation. ... Arguments passed rhythm parser. also two hidden (advanced) arguments can specify: memoize deparse (see details ). scale numeric rational value used output unit measurement. Defaults rational(1, 1). Must numeric rational. inPlace non-rhythm information retained output string? Defaults FALSE. Must singleton logical value: /switch. Defaults FALSE. singleton logical value, NA. See \"Grace notes\" section .","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/duration.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Numeric (double) representation of durations — duration","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/entropy.html"],"dir":"Reference","previous_headings":"","what":"Calculate Entropy or Information Content of variables — entropy","title":"Calculate Entropy or Information Content of variables — entropy","text":"Information content entropy fundamental concepts information theory, quantify amount information (\"surprise\") random variable. concepts closely related probability density/mass events: improbable events higher information content. probability observation maps information content; average information content variable entropy. Information content/entropy can calculated discrete probabilities continuous probabilities, humdrumR defines methods calculating .","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/entropy.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Calculate Entropy or Information Content of variables — entropy","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/entropy.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Calculate Entropy or Information Content of variables — entropy","text":"calculate information content entropy, must assume (estimate) probability distribution. HumdrumR uses R's standard table() density() functions estimate discrte continuous probability distributions respectively. Entropy average information content variable. entropy() function can accept either table() object (discrete variables), density() object (continuous variables). entropy() passed atomic vector, values vector treated observations random variable: numeric vectors, stats::density() function used estimate probability distribution random (continuous) variable, entropy computed density. atomic vectors, table() called tabulate discrete probability mass observed level, entropy computed table. ic() function accepts atomic vectors main (x) argument, must also provided distribution argument. default, distribution argument estimated using density() (numeric input) table() (input).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/enum.html"],"dir":"Reference","previous_headings":"","what":"Enumerate vector — enum","title":"Enumerate vector — enum","text":"function enumerates values input vector x, counting along length vector 1 length(x).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/enum.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Enumerate vector — enum","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/enum.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Enumerate vector — enum","text":"x input vector enumrate. Must vector (either atomic, list()). inPlace numbers pasted onto original vector? Defaults TRUE. Must singleton logical value: /switch. sep Separator numbers vector. Defaults \":\". Can empty string (\"\"), separator desired.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/enum.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Enumerate vector — enum","text":"inPlace = TRUE (x atomic), original vector returned counts pasted front value, separated sep. inPlace = FALSE, new integer vector returned, identical calling seq_along(x).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/enum.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Enumerate vector — enum","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/evaluatingExpressions.html"],"dir":"Reference","previous_headings":"","what":"","title":"","text":"\"Evaluating\" \"Expressions\" \"Environments\"?","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/evaluatingExpressions.html"],"id":"expressions","dir":"Reference","previous_headings":"","what":"Expressions","title":"","text":"term \"expression\" just fancy way describing bit (valid) code can parsed evaluated (executed) R. example, following bits code valid R \"expressions\": 2 + 2 sqrt(2) x <- (1:10)^2 log(x, base = 10) |> mean(na.rm = TRUE) sum((x - mean(x))^2) Expressions frequently built expressions: 2 + 2 expression, sqrt(2 + 2) expression. { } operators used group valid expressions one bigger expression. can also use ; write two expressions line, like x <- 2; log(x^2)","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/evaluatingExpressions.html"],"id":"evaluation","dir":"Reference","previous_headings":"","what":"Evaluation","title":"","text":"expression like sum((x - mean(x))^2) just sequence characters something . call \"evaluating\" expression. exactly R \"interpreter\" \"run\" R code. R, evaluated expression always \"returns\" \"result\"---value, like number, character string, data. expressions might \"return\" NULL result, still result! multi-line expression, like {sqrt(2); 2 + 2} result overall expression simply result last expression---last two examples return result 4.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/evaluatingExpressions.html"],"id":"environment","dir":"Reference","previous_headings":"","what":"Environment","title":"","text":"evaluate expression, R must look variable names expression current \"environment\"; example, expression sum((x - mean(x))^2) includes variables sum, mean, x. variables sum mean base R functions, R find problem (unless remove ). However, x generally going \"defined\" unless defined . try evaluate sum((x - mean(x))^2), get error x defined. many different \"environments\" R, R search variables: run R, can save variables global environment; R-packages environments; every time call function, function environment inside ---function can \"see\" arguments, variable save inside function \"visible\" outside function. One greatest features R can often tell R evaluate expression using specific data.frame environment, can use column names data variables. humdrumR () (tidyverse equivalents) use functionality lot!","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/evaluatingExpressions.html"],"id":"incomplete-expressions","dir":"Reference","previous_headings":"","what":"Incomplete expressions","title":"","text":"One annoying things can happen R try running something kind just hangs, getting stuck nothing happening matter many times press enter. usually (accidentally) provided R incomplete expression. example, 2 + incomplete expression---+ needs number ! Failing properly paired parentheses often result incomplete expressions: example, mean(sqrt(log(x)) incomplete expression!","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/expand.html"],"dir":"Reference","previous_headings":"","what":"Expand numbers outwards from zero — expand","title":"Expand numbers outwards from zero — expand","text":"Expand complement base R rounding functions, particularly trunc.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/expand.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Expand numbers outwards from zero — expand","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/expand.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Expand numbers outwards from zero — expand","text":"four base R functions---round, ceiling, floor, trunc---follow different logic round real numbers ingegers: round: round nearest integer either direction. floor: round downward towards negative infinity. Negative numbers rounded \"negative\" numbers. ceiling: round upward towards infinity. Negative numbers rounded \"less negative\" numbers. trunc: round \"inward\" towards zero. Negative numbers rounded \"less negative\" numbers, positive numbers still rounded downwards \"less positive\" numbers. Just ceiling compliments floor, humdrumR function expand acts compliment trunc: expand rounds \"outward\" away zero. Negative numbers rounded \"negative\" numbers positive numbers rounded \"positive\" numbers. table explains better words:","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/expandPaths.html"],"dir":"Reference","previous_headings":"","what":"Expand paths into new spines — expandPaths","title":"Expand paths into new spines — expandPaths","text":"function takes humdrumR object \"expands\" content spine paths filling content parent path(s).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/expandPaths.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Expand paths into new spines — expandPaths","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/expandPaths.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Expand paths into new spines — expandPaths","text":"asSpines paths expanded new spines? Defaults TRUE. Must singleton logical value: /switch. TRUE, expanded paths copied new spines (shifting higher spines needed). humdrumR HumdrumR data. Must humdrumR data object.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/expandPaths.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Expand paths into new spines — expandPaths","text":"example, imagine humdrum representation eight-measure piano score, annotator included ossia passage seventh measure. want simply ignore ossia passage, can just specify subset() Path == 0. want study ossia passage, can grab subset() Path == 1. However, want study ossia performed, ossia measure swapped measure 7, still using measures 1-6 8 main path? expandPaths() help us just : expandPaths() copy contents measure 1-6 8 second path , asSpines = TRUE, copy path new spine. can treat new \"full\" path/spine just like path/spine.","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/figuredBass.html"],"dir":"Reference","previous_headings":"","what":"Figured bass representation of harmony — figuredBass","title":"Figured bass representation of harmony — figuredBass","text":"function outputs figured bass representation tertian harmony.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/figuredBass.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Figured bass representation of harmony — figuredBass","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/figuredBass.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Figured bass representation of harmony — figuredBass","text":"x atomic vector. x argument can (atomic) vectors Key diatonic key used parser, deparser, transposer. Defaults NULL, interpreted C major. Must diatonicSet something coercable diatonicSet; must either length 1 length(x). transposeArgs optional list arguments passed transpose() call. Defaults empty list(). Must list named arguments transpose(). parseArgs optional list arguments chord parser. Defaults empty list(). Must list named arguments chord parser. inPlace non-chord information retained output string. Defaults FALSE. Must singleton logical value: /switch.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/figuredBass.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Figured bass representation of harmony — figuredBass","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/freq.html"],"dir":"Reference","previous_headings":"","what":"Translate pitches to frequency (Hz) — freq","title":"Translate pitches to frequency (Hz) — freq","text":"freq() applied humdrumR data class may use data's fields arguments. field names specified, first selectedField used x.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/freq.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Translate pitches to frequency (Hz) — freq","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/freq.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Translate pitches to frequency (Hz) — freq","text":"x Input data parse pitch information. x argument can (atomic) vector, tonalInterval, NULL. ... Arguments passed pitch deparser. also two hidden (advanced) arguments can specify: memoize deparse (see details ). generic \"specific\" pitch information (accidentals qualites) discarded? Defaults FALSE. Must singleton logical value: /switch. simple \"compound\" pitch information (octave/contour) discarded? Defaults FALSE. Must singleton logical value: /switch. Key input Key used parser, deparser, transposer. Defaults NULL. Must diatonicSet something coercable diatonicSet; must either length 1 length(x) tonalHarmonic frequency \"tonal harmonic\" (perfect 12th). Defaults 2^(19/12), 12-tone-equal-temperament 12th. Must single number. Pythagorean tuning, set tonalHarmonic = 3. frequency.reference reference frequency. Defaults 440. Must single number. transposeArgs optional list arguments passed special transpose() call. Defaults empty list(). Must list named arguments transpose(). parseArgs optional list arguments passed pitch parser. Defaults empty list(). Must list named arguments pitch parser. inPlace non-pitch information retained output string. Defaults FALSE. Must singleton logical value: /switch. argument effect input (x argument) character strings, extra, non-pitch information input strings \"besides\" pitch information. , inPlace = TRUE, output placed output string beside original non-pitch information. inPlace = FALSE, pitch output information returned (details ). frequency.reference.note note reference.frequency tuned . Defaults \"\". Can parsable pitch representation; must length 1.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/freq.html"],"id":"basic-pitch-arguments","dir":"Reference","previous_headings":"","what":"Basic pitch arguments","title":"Translate pitches to frequency (Hz) — freq","text":"pitch function standard arguments control details output. important generic simple arguments, allow control type pitch information returned.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/freq.html"],"id":"generic-vs-specific","dir":"Reference","previous_headings":"","what":"Generic vs Specific","title":"Translate pitches to frequency (Hz) — freq","text":"generic = TRUE, specific pitch information (accidentals qualities) omitted output. alternative way controlling functionality, can use specific argument, specific == !generic. case atonal functions, \"generic\" version pitch output: example, semits('c#', generic = TRUE) return 0, \"generic\" version C# C, corresponds 0. However, note generic version pitch follows key, semits('c#', generic = TRUE, Key = ':') return 1!","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/freq.html"],"id":"simple-vs-compound","dir":"Reference","previous_headings":"","what":"Simple vs Compound","title":"Translate pitches to frequency (Hz) — freq","text":"simple = TRUE, compound pitch information (octave contour) omitted output. alternative way controlling functionality, can use compound argument ,compound == !simple. actually one way might want divide compound intervals simple octave parts. example, might like call output -M2 (descending major 2nd) +m7 (ascending minor 7th octave ). functionality can controlled octave.round argument: see pitch deparsing documentation.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/freq.html"],"id":"key","dir":"Reference","previous_headings":"","what":"Key","title":"Translate pitches to frequency (Hz) — freq","text":"Key argument must diatonicSet, something can parsed one. Key argument passed parser, deparser, transpose---unless alternate Key passed transposeArgs parseArgs. Various deparsing options use Key argument; example, use implicitSpecies (see advanced parsing section) dependent Key. use pitch function within special call withinHumdrum, humdrumR automatically pass Key field humdrum data function---means, cases, need explicitly anything Key argument! (want happen, need explicitly specify Key argument, Key = NULL.)","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/freq.html"],"id":"parse-arguments","dir":"Reference","previous_headings":"","what":"Parse arguments","title":"Translate pitches to frequency (Hz) — freq","text":"parseArgs argument must list() (named) arguments passed input parser. example, input representation uses \"X\" represent double sharps, specify kern('CX5', parseArgs = list(doublesharp = 'X')) get correct result (\"cc##\"). convenient shorthand, \"syntactic sugar,\" can specify parseArgs alternate way: Simply input parse(args...) unnamed argument pitch function. example, can get exact result typing kern('CX5', parse(doublesharp = 'X')).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/freq.html"],"id":"transpose-arguments","dir":"Reference","previous_headings":"","what":"Transpose arguments","title":"Translate pitches to frequency (Hz) — freq","text":"transposeArgs argument must list() (named) arguments passed internal call transpose(), allowing us easily transpose pitch information. example, type kern(c('C', 'D', 'E'), transposeArgs = list(= 'M9')) can get output c('d', 'e', 'f#'). possible transpose args : (tonalInterval, length == 1 | length == (x)) (diatonicSet, length == 1 | length == (x)) (diatonicSet, length == 1 | length == (x)) real (logical, length == 1) transposition real tonal? relative (logical, length == 1) key-wise transposition based relative parallel keys? convenient shorthand, \"syntactic sugar,\" can specify transposeArgs alternate way: Simply input transpose(args...) unnamed argument pitch function. example, can get exact result typing kern(c('C', 'D', 'E'), transpose(= 'M9')).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/freq.html"],"id":"transposing-by-interval","dir":"Reference","previous_headings":"","what":"Transposing by interval","title":"Translate pitches to frequency (Hz) — freq","text":"calling transpose() directly, argument can anything coercable tonalInterval, output transposed amount. real = FALSE, tonal transposition (within Key) performed. details transposition behavior, check transpose() docs.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/freq.html"],"id":"transposing-by-key","dir":"Reference","previous_headings":"","what":"Transposing by key","title":"Translate pitches to frequency (Hz) — freq","text":"Another way transposing specifying input (\"\") key output (\"\") key. default, Key argument passed transpose , nothing actually happens. Thus, specify either key key, transposition happen /key Key. course, specify transposition happen keys specify. use pitch function within special call withinHumdrum, humdrumR automatically pass Key field humdrum data function. specify key, Key field passed transpose key, result, pitches input transposed whatever keys target () key! real relative arguments give special control key-wise transposition works, check transpose() docs details!","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/freq.html"],"id":"in-place-parsing","dir":"Reference","previous_headings":"","what":"In-place parsing","title":"Translate pitches to frequency (Hz) — freq","text":"humdrum data, character strings often encoded multiple pieces musical information right besides : example, **kern data might include tokens like \"4.ee-[. humdrumR parser (tonalInterval) automatically \"pull \" pitch information within strings, can find using appropriate known regular expressions. example, pitch('4.ee-[') returns Eb5. However, pitch functions (like pitch() kern()) option keep \"extra\" information return result \"place\"---.e., embedded right found input string. controlled inPlace argument, FALSE default. , pitch('4.ee-[', inPlace = TRUE) return 4.Eb5[---keeping \"4.\" \"[\". (obviously works input string, numeric!) Note inPlace = TRUE force functions like semits, normally return numeric values, return character strings input character string.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/freq.html"],"id":"pitch-gamut-levels","dir":"Reference","previous_headings":"","what":"Pitch-Gamut Levels","title":"Translate pitches to frequency (Hz) — freq","text":"table() automatically generate factor levels pitch data using gamut() function. makes sure tabulated data sorted logical order, includes missing pitches. simple/complex generic/specific arguments automatically passed gamut(); additional arguments can passed gamut using gamutArgs = list(...), syntactic sugar gamut(...). (Read gamut() docs explanation gamut generation.) feature used control table layout pitch data, well assure consistent tables grouping data. inPlace = TRUE special tabulation occur.","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/freq.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Translate pitches to frequency (Hz) — freq","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/gamut.html"],"dir":"Reference","previous_headings":"","what":"Make a pitch gamut — gamut","title":"Make a pitch gamut — gamut","text":"function generates gamut: ordered range notes used music. used generate factor() levels pitch functions. output format gamut controlled deparser argument (function) deparseArgs passed , defaulting kern().","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/gamut.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Make a pitch gamut — gamut","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/gamut.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Make a pitch gamut — gamut","text":"generic ***gamut include generic intervals? Defaults FALSE. Must singleton logical value: /switch. simple gamut constrained one octave? Defaults FALSE. Must singleton logical value: /switch. reference optional reference vector base gamut . Defaults NULL. Must either NULL, tonalInterval(), integer, character vector. vector parsed pitch. parsed pitch, ignored. deparser pitch function format output. Defaults kern(). Must pitch function.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/gamut.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Make a pitch gamut — gamut","text":"gamut produced based two criteria: range line--fifths include, range octaves include? ranges can controlled directly min.octave, max.octave, min.lof, max.lof arguments, corresponding ranges min.octave:max.octave min.log:max.log respectively. arguments missing (default), ranges default values based simple/compound generic/specific arguments. default ranges : Line--fifths: generic = TRUE, -1:5 (F B) generic = FALSE, -4:7 (Ab C#) Octaves: simple = TRUE, 0:0 (one octave ). simple = FALSE, -1:1. tints argument provide (NULL), tints parsed pitch data line--fifth octave ranges data used set gamut ranges. assures values appear tint always make gamut. However, min.octave, max.octave, min.lof, max.lof present, override ranges tint; can used exclude values, even appear tint.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/grid.html"],"dir":"Reference","previous_headings":"","what":"Drum-machine grid representation of rhythmic durations. — grid","title":"Drum-machine grid representation of rhythmic durations. — grid","text":"functions read write sequencer-like representation rhythm. Rhythms represented either strings vectors \"\"/\"\" values, indicate rhythmic onsets occur regular time grid. example, \"X00X00X0\" c(1, 0, 0, 1, 0, 0, 1, 0). grid() applied humdrumR data class may use data's fields arguments. field names specified, first selectedField used x.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/grid.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Drum-machine grid representation of rhythmic durations. — grid","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/grid.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Drum-machine grid representation of rhythmic durations. — grid","text":"x input vector. x argument can (atomic) vector, rational (rhythmInterval), NULL. Must parsable rhythm infromation. ... Argments passed deparser. scale numeric rational value used output unit measurement. Defaults rational(1, 1). Must numeric rational. inPlace non-rhythm information retained output string? Defaults FALSE. Must singleton logical value: /switch. Defaults FALSE. singleton logical value, NA. See \"Grace notes\" section . tick unit grid? Defaults sixteenth-note (fromgrid()) tatum() x argument. Must parsed rhythm rhythmInterval(). , represents onsets (attacks) rests grid? Default \"X\" \"O\" respectively. Must singleton atomic values. collapse output collapsed single string per measure? Defaults TRUE. Must singleton logical value: /switch. sep Separator ticks collapsed output. Defaults empty string (separator). Must singleton character string. deparser output representation returned? Defaults recip(). Must function accepts rational() numbers.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/grid.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Drum-machine grid representation of rhythmic durations. — grid","text":"grid() function, fully vectorized rhythm function, translates individual durations grid-representation strings. example, 16th-note grid, dotted eighth-note represented \"XOO\". fromgrid() togrid() functions create/read fuller grid representations, representing whole rhythms : case, length input output .","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/grid.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Drum-machine grid representation of rhythmic durations. — grid","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/groupHumdrum.html"],"dir":"Reference","previous_headings":"","what":"Divide humdrumR data into groups — groupHumdrum","title":"Divide humdrumR data into groups — groupHumdrum","text":"group_by() method humdrumR objects used define grouping factors data fields. Note groups created grouping factors 1) necessarily contiguous 2) always exhaustively partition data. context() function can used, alternative, generate groups (\"windows\") always contiguous /exclude data. ungroup() function removes grouping humdrumR data object. groups created, groups() function can used tabulate number tokens group, find indices humdrum table.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/groupHumdrum.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Divide humdrumR data into groups — groupHumdrum","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/groupHumdrum.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Divide humdrumR data into groups — groupHumdrum","text":".data, x, humdrumR HumdrumR data. Must humdrumR data object. ... number expressions evaluate. expressions can reference fields() data name, well variables outside data. expressions named, names used name new fields. .add groups added existing groups? Defaults TRUE. Must single logical value: /switch. dataTypes types humdrum records include. Defaults \"D\". Must single character string. Legal values 'G', 'L', '', 'M', 'D', 'd' combination (e.g., \"LIM\"). (See humdrum table documentation Fields section explanation.)","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/groupHumdrum.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Divide humdrumR data into groups — groupHumdrum","text":"group_by() method humdrumR objects takes number expressions ... arguments. expressions may simply character strings symbols indicating existing fields() data--- example, group_by(Piece, Spine). However, expressions can also arbitrary \"expression arguments\" passed within() generate new fields grouping. example, group spines even odd groups group_by(Spine %% 2). group_by() function returns new humdrumR data object grouping fields activated. grouping fields, number groups, show humdrumR data printed. groups() can used gather information groups: group() returns data.table one row representing group, value grouping field indicated, one columns indicating number tokens type group (desired types indicated dataTypes argument). default, call group_by.humdrumR() adds groups groups already existing data. .add = FALSE, preexisting groups removed creating new groups. Groups can explicitly removed using ungroup(). .add = TRUE, call group_by() computes new fields using preexisting groups, just like normal call within(). means can, cases, create different groupings depending order create groups. example, imagine want divide piece data two groups: pitches higher average one group pitches lower average . Consider humData corpus numeric Semits field, run two different calls: first call, first group Piece, divide piece piece's average. second example, divide corpus two halves based overall (cross-piece) average, divide pieces.","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/groupHumdrum.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Divide humdrumR data into groups — groupHumdrum","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/groupingFactors.html"],"dir":"Reference","previous_headings":"","what":"What are ","title":"What are ","text":"\"grouping factors\"?","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/groupingFactors.html"],"id":"grouping-and-split-apply-combine-explained","dir":"Reference","previous_headings":"","what":"Grouping and \"split-apply-combine\" explained","title":"What are ","text":"concept \"grouping factors\" widely used R, allowing us quickly split datasets (vectors data.frames) subgroups, work subgroups independent (apply functions ), recombine needed. Various R functions specify \"grouping factors\" confusing variety subtly different ways, usually function arguments named things like INDEX, INDICES, f, , groupby. humdrumR, adopt tidyverse dplyr approach, using group_by() function (/.argument). atomic vector least two unique values, \"levels\", can used grouping factor---generally, grouping vectors coerced factors. unique level grouping vector/factor represents single group. vector, data.frame length/height grouping factor can broken groups, taking indices grouping factor equals group turn. Since generally try work data.frames, definition contain bunch vectors length, can use vector/column data.frame group vectors, rows whole data.frame. functions allow specifiy multiple grouping factors/vectors (long length). groups defined every unique combination elements vectors. , example, use vectors c('', '', '', 'B', 'B', 'B') c(1, 1, 2, 2, 3, 3) grouping factors, get four groups levels 1A, 2A, 2B, 3B. Note groups created grouping factors neccessarily contiguous. use vector like c(1, 1, 2, 2, 1, 1) grouping factor, get two groups: 1 2. 1 group include 1st, 2nd, 5th, 6th indices, even though separated grouping factor. want contiguous groups must make . humdrumR function segments() can used generate strictly contiguous grouping factors. example, segments(c(1, 1, 2, 2, 1, 1)) return c(1, 1, 2, 2, 3, 3).","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/harm.html"],"dir":"Reference","previous_headings":"","what":"Roman numeral representations of harmony — harm","title":"Roman numeral representations of harmony — harm","text":"functions output roman numeral representations tertian harmony. **harm representation widely used standard roman numeral notation humdrum data. Unlike traditional roman numerals, **harm indicate inversions figuration, using lowercase letters (, b, c, etc.) instead. roman function however output (relatively) traditional figures. output format roman() similar **harm. main difference inversions indicated using traditional figures , like 653, instead **harm's simpler system (using letters). , example, take input E7/B key major, get:","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/harm.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Roman numeral representations of harmony — harm","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/harm.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Roman numeral representations of harmony — harm","text":"x atomic vector. x argument can (atomic) vectors Key diatonic key used parser, deparser, transposer. Defaults NULL, interpreted C major. Must diatonicSet something coercable diatonicSet; must either length 1 length(x). transposeArgs optional list arguments passed transpose() call. Defaults empty list(). Must list named arguments transpose(). parseArgs optional list arguments chord parser. Defaults empty list(). Must list named arguments chord parser. inPlace non-chord information retained output string. Defaults FALSE. Must singleton logical value: /switch.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/harm.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Roman numeral representations of harmony — harm","text":"harm('E7/B', Key = ':') => \"V7c\" roman('E7/B', Key = ':') => \"V643\"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/harm.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Roman numeral representations of harmony — harm","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/helmholtz.html"],"dir":"Reference","previous_headings":"","what":"Helmholtz pitch representation — helmholtz","title":"Helmholtz pitch representation — helmholtz","text":"Helmholtz notation helmholtz() applied humdrumR data class may use data's fields arguments. field names specified, first selectedField used x.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/helmholtz.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Helmholtz pitch representation — helmholtz","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/helmholtz.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Helmholtz pitch representation — helmholtz","text":"x Input data parse pitch information. x argument can (atomic) vector, tonalInterval, NULL. ... Arguments passed pitch deparser. also two hidden (advanced) arguments can specify: memoize deparse (see details ). generic \"specific\" pitch information (accidentals qualites) discarded? Defaults FALSE. Must singleton logical value: /switch. simple \"compound\" pitch information (octave/contour) discarded? Defaults FALSE. Must singleton logical value: /switch. Key input Key used parser, deparser, transposer. Defaults NULL. Must diatonicSet something coercable diatonicSet; must either length 1 length(x) transposeArgs optional list arguments passed special transpose() call. Defaults empty list(). Must list named arguments transpose(). parseArgs optional list arguments passed pitch parser. Defaults empty list(). Must list named arguments pitch parser. inPlace non-pitch information retained output string. Defaults FALSE. Must singleton logical value: /switch. argument effect input (x argument) character strings, extra, non-pitch information input strings \"besides\" pitch information. , inPlace = TRUE, output placed output string beside original non-pitch information. inPlace = FALSE, pitch output information returned (details ).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/helmholtz.html"],"id":"basic-pitch-arguments","dir":"Reference","previous_headings":"","what":"Basic pitch arguments","title":"Helmholtz pitch representation — helmholtz","text":"pitch function standard arguments control details output. important generic simple arguments, allow control type pitch information returned.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/helmholtz.html"],"id":"generic-vs-specific","dir":"Reference","previous_headings":"","what":"Generic vs Specific","title":"Helmholtz pitch representation — helmholtz","text":"generic = TRUE, specific pitch information (accidentals qualities) omitted output. alternative way controlling functionality, can use specific argument, specific == !generic. case atonal functions, \"generic\" version pitch output: example, semits('c#', generic = TRUE) return 0, \"generic\" version C# C, corresponds 0. However, note generic version pitch follows key, semits('c#', generic = TRUE, Key = ':') return 1!","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/helmholtz.html"],"id":"simple-vs-compound","dir":"Reference","previous_headings":"","what":"Simple vs Compound","title":"Helmholtz pitch representation — helmholtz","text":"simple = TRUE, compound pitch information (octave contour) omitted output. alternative way controlling functionality, can use compound argument ,compound == !simple. actually one way might want divide compound intervals simple octave parts. example, might like call output -M2 (descending major 2nd) +m7 (ascending minor 7th octave ). functionality can controlled octave.round argument: see pitch deparsing documentation.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/helmholtz.html"],"id":"key","dir":"Reference","previous_headings":"","what":"Key","title":"Helmholtz pitch representation — helmholtz","text":"Key argument must diatonicSet, something can parsed one. Key argument passed parser, deparser, transpose---unless alternate Key passed transposeArgs parseArgs. Various deparsing options use Key argument; example, use implicitSpecies (see advanced parsing section) dependent Key. use pitch function within special call withinHumdrum, humdrumR automatically pass Key field humdrum data function---means, cases, need explicitly anything Key argument! (want happen, need explicitly specify Key argument, Key = NULL.)","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/helmholtz.html"],"id":"parse-arguments","dir":"Reference","previous_headings":"","what":"Parse arguments","title":"Helmholtz pitch representation — helmholtz","text":"parseArgs argument must list() (named) arguments passed input parser. example, input representation uses \"X\" represent double sharps, specify kern('CX5', parseArgs = list(doublesharp = 'X')) get correct result (\"cc##\"). convenient shorthand, \"syntactic sugar,\" can specify parseArgs alternate way: Simply input parse(args...) unnamed argument pitch function. example, can get exact result typing kern('CX5', parse(doublesharp = 'X')).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/helmholtz.html"],"id":"transpose-arguments","dir":"Reference","previous_headings":"","what":"Transpose arguments","title":"Helmholtz pitch representation — helmholtz","text":"transposeArgs argument must list() (named) arguments passed internal call transpose(), allowing us easily transpose pitch information. example, type kern(c('C', 'D', 'E'), transposeArgs = list(= 'M9')) can get output c('d', 'e', 'f#'). possible transpose args : (tonalInterval, length == 1 | length == (x)) (diatonicSet, length == 1 | length == (x)) (diatonicSet, length == 1 | length == (x)) real (logical, length == 1) transposition real tonal? relative (logical, length == 1) key-wise transposition based relative parallel keys? convenient shorthand, \"syntactic sugar,\" can specify transposeArgs alternate way: Simply input transpose(args...) unnamed argument pitch function. example, can get exact result typing kern(c('C', 'D', 'E'), transpose(= 'M9')).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/helmholtz.html"],"id":"transposing-by-interval","dir":"Reference","previous_headings":"","what":"Transposing by interval","title":"Helmholtz pitch representation — helmholtz","text":"calling transpose() directly, argument can anything coercable tonalInterval, output transposed amount. real = FALSE, tonal transposition (within Key) performed. details transposition behavior, check transpose() docs.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/helmholtz.html"],"id":"transposing-by-key","dir":"Reference","previous_headings":"","what":"Transposing by key","title":"Helmholtz pitch representation — helmholtz","text":"Another way transposing specifying input (\"\") key output (\"\") key. default, Key argument passed transpose , nothing actually happens. Thus, specify either key key, transposition happen /key Key. course, specify transposition happen keys specify. use pitch function within special call withinHumdrum, humdrumR automatically pass Key field humdrum data function. specify key, Key field passed transpose key, result, pitches input transposed whatever keys target () key! real relative arguments give special control key-wise transposition works, check transpose() docs details!","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/helmholtz.html"],"id":"in-place-parsing","dir":"Reference","previous_headings":"","what":"In-place parsing","title":"Helmholtz pitch representation — helmholtz","text":"humdrum data, character strings often encoded multiple pieces musical information right besides : example, **kern data might include tokens like \"4.ee-[. humdrumR parser (tonalInterval) automatically \"pull \" pitch information within strings, can find using appropriate known regular expressions. example, pitch('4.ee-[') returns Eb5. However, pitch functions (like pitch() kern()) option keep \"extra\" information return result \"place\"---.e., embedded right found input string. controlled inPlace argument, FALSE default. , pitch('4.ee-[', inPlace = TRUE) return 4.Eb5[---keeping \"4.\" \"[\". (obviously works input string, numeric!) Note inPlace = TRUE force functions like semits, normally return numeric values, return character strings input character string.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/helmholtz.html"],"id":"pitch-gamut-levels","dir":"Reference","previous_headings":"","what":"Pitch-Gamut Levels","title":"Helmholtz pitch representation — helmholtz","text":"table() automatically generate factor levels pitch data using gamut() function. makes sure tabulated data sorted logical order, includes missing pitches. simple/complex generic/specific arguments automatically passed gamut(); additional arguments can passed gamut using gamutArgs = list(...), syntactic sugar gamut(...). (Read gamut() docs explanation gamut generation.) feature used control table layout pitch data, well assure consistent tables grouping data. inPlace = TRUE special tabulation occur.","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/helmholtz.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Helmholtz pitch representation — helmholtz","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/hop.html"],"dir":"Reference","previous_headings":"","what":"Generate regular sequence ","title":"Generate regular sequence ","text":"hop() similar base R's seq(), additional features, including special sugar used humdrumR's context() command. hop() used create customizable sequences indices vector; example, want index every third value vector. useful , used context(), defining start points \"rolling-window\" analyses along vector; \"hop size\" gap start window, defined hop()'s argument.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/hop.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Generate regular sequence ","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/hop.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Generate regular sequence ","text":"along.vector want indices \"hop\" along. Must vector (either atomic, list()). pattern \"hops\" use. Defaults 1: returning indices :. Must one whole numbers. sum() must non-zero. start sequence. Defaults 1: starting first index. Must either single natural number, single character string, logical vector length along.. character-string input treated regular expression, matched along.using grepl() generate logical vector. index first TRUE used. end sequence. Defaults NULL. Must either NULL, single natural number, single character string, logical vector length along.. NULL, set last index along.(group groupby). character-string input treated regular expression, matched along.using grepl() generate logical vector. index last TRUE used. value indices returned logical TRUEs? Defaults FALSE. Must singleton logical value; /switch. groupby Optional vectors group hop sequences within. Defaults empty list(). Must list(), either empty contains vectors length along.. calls /within.humdrumR, groupby passed list(Piece, Spine, Path) default.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/hop.html"],"id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Generate regular sequence ","text":"default, hop() returns integer vector, appropriates indices along.vector. However, two options: logical = TRUE, indices returned logical vector, length along., TRUE values indicating indices. Note ordering output (due mix positive negative values argument) lost. value = TRUE, actual indixed elements along.vector returned: Thus, hop(myvector, ..., value = TRUE) simply myvector[hop(myvector, ...)]. value = TRUE, logical argument ignored.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/hop.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Generate regular sequence ","text":"hop() similar arguments base::seq(), focused along.argument, vector like generate indices . simply call hop(myvector), output 1:length(myvector). argument can used specify different \"hop\" pattern: = 2 get every index, 1, 3, 5, 7, etc. Unlike base::seq(), hop()'s argument can vector numbers, allowing specify pattern hops. example, = c(2, 3) first hop 2, hop 3, repeat---output 1, 3, 6, 8, 11, 13, etc. pattern can comprised negative numbers, mix negative positive numbers. mixes negative positive numbers, pattern can hop , climbs. example, go two, one, repeat using = c(2,-1). pattern overall (sums) negative, argument must greater argument (see next section); pattern sums zero, error occurs pattern never end! pattern changes directions, possible pattern hop outside bounds vector; happens, outside indices return NA.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/hop.html"],"id":"starting-and-ending","dir":"Reference","previous_headings":"","what":"Starting and Ending","title":"Generate regular sequence ","text":"default, hop() builds indices 1 end along.vector. arguments can used control . Either argument can simply natural number, indicating start end output sequences. (NULL, set length(along.).) alternate approach provide either argument single character string, treated regular expression matched along., logical vector length along.. first match/TRUE used index last match/TRUE index. means can say things like = Record == 33 within() call. argument overall (sums) positive, must less . argument overall (sums) negative, must greater . pattern ever actually actual index---perhaps jumping --- output stops pass .","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/hop.html"],"id":"grouping","dir":"Reference","previous_headings":"","what":"Grouping","title":"Generate regular sequence ","text":"many cases want along vectors, across certain boundaries. example, want even numbered indices, can set = 2 = 2. However, vector includes data multiple pieces, pieces odd number data points, \"even\" sequence end hitting odd numbers pieces. get around , groupby argument indicates one, , grouping vectors, break x (input) argument groups. groupby vectors given, change vector indicates boundary. grouped segement along.treated just like separate call hop(); example, = 2, hop sequence start second index group. However, output indices still represent original along.indices. Since hop() usually used context() create rolling windows within musical parts, want typically want apply hop() using groupby = list(Piece, Spine, Path). fact, humdrumR () calls automatically feed three fields groupby arguments hop(). use hop() call (), automatically generate hop sequence \"melodic\" way, within spine path piece.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/hop.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Generate regular sequence ","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/humCoercion.html"],"dir":"Reference","previous_headings":"","what":"humdrumR coercion — humCoercion","title":"humdrumR coercion — humCoercion","text":"Many users may wish work humdrum data, without rely humdrumR's ().humdrumR functionality. Rather, like just get \"normal\" R objects humdrum data. humdrumR defines number functions/methods \"coercing\" humdrum data basic R data types.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/humCoercion.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"humdrumR coercion — humCoercion","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/humCoercion.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"humdrumR coercion — humCoercion","text":"mode desired output class. Defaults \"\". Must single character string naming atomic vector type coerce output (.e., logical numeric). set \"\", output type simply whatever type selected field . humdrumR HumdrumR data. Must humdrumR data object. dataTypes types humdrum record(s) include. Defaults \"GLIMDd\" .lines() .matrix(); \"Dd\" .data.frame(); \"LIMDd\" .matrices() .data.frames(). Must single character string. Legal values 'G', 'L', '', 'M', 'D', 'd' combination (e.g., \"LIM\"). (See humdrum table documentation explanation.) padPaths Determines spine-paths aligned output. Defaults \"dont\" .lines(); \"corpus\" .matrix() .data.frame(); \"piece\" .matrices() .data.frames() Must single character string, \"corpus\", \"piece\", \"dont\". See details explanation. padder Used fill differences number columns files /spine paths. Defaults NA. Must single atomic value. sep Separator place columns collapsed lines. Defaults \"\\t\" (tab). Must single character string.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/humCoercion.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"humdrumR coercion — humCoercion","text":"Generally, coercion works evaluating humdrumR object's selected fields forcing result atomic vector. multiple field selected, pasted together, separated \", \". field atomic (like list, lm object), concise representation list object class printed. .vector(humdrumR) additional option coercing resulting vector particular type using mode argument. .matrix(humdrumR) method take things step putting evaluated fields two-dimensional matrix, rows representing records columns indicating spine paths (see Padding section ). .data.frame(humdrumR) first calls .matrix converts matrix data.frame. Note .matrix(humdrumR) places entire corpus object one matrix, even multiple pieces. contrast, plural .matrices .data.frames call respective singular versions separately individual file humdrumR corpus return list. row names matrix/data.frame(s) consist two integer values, separated ., representing: Piece.Record. .lines function converts humdrumR object character vector text lines, columns separated sep argument (defaults \"\\t\"), just see humdrum-syntax file. line single row .matrix.humdrumR, padded values right side removed. matrix's Piece.Record row names preserved lines' names. Note multiple-stop token (Stop > 1L) incorporated two dimensional matrix/data.frame. Thus, .matrix(humdrumR) calls collapseStops(collapseAtomic = TRUE, sep = \" \") humdrumR object creating matrix.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/humCoercion.html"],"id":"padding","dir":"Reference","previous_headings":"","what":"Padding","title":"humdrumR coercion — humCoercion","text":"Different pieces single humdrumR object often differ number spines /spine paths contain. squish two dimensional object (matrix data.frame) must necessarily padded number columns. (Global comments---actually NA spines---also padded, placing record column 1.) pad argument single atomic value used pad matrix. Another consideration behavior spine paths. humdrum syntax, spine path leftward spine \"bumps\" data higher spines new columns, example: beginning end file, second column holds data second spine. However, middle file, second column holds data second spine path first spine. make spine structure clearer, .matrix(humdrumR) option pad spine paths. example, using \"_\" pad argument: aspect matrix padding behavior can controlled padPaths argument, three possible values/behaviors: \"corpus\": Paths padded spine-paths across pieces corpus align columns. even one file spine path, files padded spines stay aligned. default behavior .matrix(humdrumR). \"piece\": Paths padded, within piece. spines/paths different pieces may align. \"dont\": Paths padded .","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/humMerge.html"],"dir":"Reference","previous_headings":"","what":"Merge two (or more) humdrumR datasets — humMerge","title":"Merge two (or more) humdrumR datasets — humMerge","text":"-------------------------------------------> NEEDS DOCUMENTATION <-------------------------------------------","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/humMerge.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Merge two (or more) humdrumR datasets — humMerge","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/humMeter.html"],"dir":"Reference","previous_headings":"","what":"Tools for analyzing rhythm and meter. — humMeter","title":"Tools for analyzing rhythm and meter. — humMeter","text":"humdrumR includes number useful functions working rhythms meter.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/humSize.html"],"dir":"Reference","previous_headings":"","what":"humdrumR data size and shape — humSize","title":"humdrumR data size and shape — humSize","text":"functions can used quickly get basic information size \"shape\" humdrumR corpus objects. details, use census() spines() functions instead. HumdrumR objects can divided \"subcorpora.\" anySubcorpora namesSubcorpora functions tell us subcorpora , , called.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/humSize.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"humdrumR data size and shape — humSize","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/humSize.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"humdrumR data size and shape — humSize","text":"humdrumR HumdrumR data. Must humdrumR data object. dataTypes types humdrum record(s) include census. Defaults \"GLIMDd\". Must single character string. Legal values 'G', 'L', '', 'M', 'D', 'd' combination (e.g., \"LIM\"). (See humdrum table documentation Fields section explanation.)","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/humSize.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"humdrumR data size and shape — humSize","text":"following functions defined. nfile : number input files corpus. length(humdrumR) synonym. npiece: number pieces corpus. (may multiple pieces per file.) nrecord: number records corpus. nrow(humdrumR) synonym. ntoken: number tokens corpus. ncol(humdrumR): Returns maximum number \"columns\" need represent data 2d matrix. Matches default output .matrix(humdrumR). dim(humdrumR): c(nrow(humdrumR), ncol(humdrumR)).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/humSize.html"],"id":"is-any","dir":"Reference","previous_headings":"","what":"Is/Any","title":"humdrumR data size and shape — humSize","text":"additional functions return quick TRUE/FALSE answers regarding humdrumR corpus: .empty: Returns TRUE corpus contains non-null data tokens (D tokens). anyPaths: Returns TRUE spine paths (Path > 0) pieces corpus. anyStops: Returns TRUE multi-stops (Stop > 1) pieces corpus. anySubcorpora: Returns TRUE corpus read different regex patterns matching \"subcorpora\" labels. namesSubcorpora returns names subcorpora labels (Label field). anyMultiPieceFiles: Returns TRUE files contain one piece (Piece != File).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/humSummary.html"],"dir":"Reference","previous_headings":"","what":"Summarize humdrumR corpora — humSummary","title":"Summarize humdrumR corpora — humSummary","text":"Summarizes content humdrumR corpus, calling five different corpus summary functions printing results.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/humSummary.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Summarize humdrumR corpora — humSummary","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/humSummary.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Summarize humdrumR corpora — humSummary","text":"humdrumR includes number separate functions summarizing different aspects humdrumR data objects: census() Tabulates raw size humdrumR corpus. reference() Tabulates reference records (metadata) piece. spines() Tabulates number spines spine paths pieces corpus. interpretations() Tabulates types exclusive tandem interpretations corpus. sections() Tabulates formal data (*>) corpus, including barlines. function takes humdrumR object returns data.table. summary method humdrumR objects simply calls functions prints condensed version .","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/humSummary.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Summarize humdrumR corpora — humSummary","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/humTable.html"],"dir":"Reference","previous_headings":"","what":"Humdrum tables (and their ","title":"Humdrum tables (and their ","text":"humdrumR package, fundamental data structure called humdrum table. humdrum table encodes information collection one humdrum-syntax files single data.table (data.table \"enhanced\" version R's standard data.frame). Humdrum tables stored \"inside\" every humdrumRclass object work , various humdrumR functions allow study manipulate . want directly access humdrum table within humdrumRclass object, use getHumtab() function. getHumtab() function extracts humdrum table humdrumR object. Use fields() function list current fields humdrumRclass object.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/humTable.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Humdrum tables (and their ","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/humTable.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Humdrum tables (and their ","text":"humdrumR HumdrumR data. Must humdrumR data object. dataTypes types humdrum record(s) include output. Defaults \"GLIMDd\". Must character string, specifies types data tokens/records extract. Legal values : \"G\" (global comments), \"L\" (local comments), \"\" (interpretations), \"M\" (barlines), \"D\" (non-null data), \"d\" (null data). Multiple types can specified single string: e.g., \"GLIMD\". Note \"\" also grabs \"E\" (exclusive) \"S\" (spine-control) tokens. fieldTypes types fields list. Shows fields default. Must character vector. Legal options \"Data\", \"Structure\", \"Interpretation\", \"Formal\", \"Reference\", \"Grouping\". can also pass \"selected\" extract selected fields. Types can partially matched---example, \"S\" \"Structure\".","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/humTable.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Humdrum tables (and their ","text":"humdrum table, default, humdrum data organized maximally \"long\" (\"tall\") format, every single \"token\" original data represented single row table. Even multiple-stops---tokens separated spaces---broken onto rows. Meanwhile, column humdrum table represents single piece information associated token, call field. Throughout documentation, keep mind \"token\" refers row humdrum table \"field\" refers column: Token = row Field = column","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/humTable.html"],"id":"fields-","dir":"Reference","previous_headings":"","what":"Fields:","title":"Humdrum tables (and their ","text":"six types fields humdrum table: Data fields Structure fields Interpretation fields Formal fields Reference fields Grouping fields first created call readHumdrum(), every humdrum table least nineteen fields: one data field (Token), two interpretation fields (Tandem Exclusive), three formal fields, thirteen structure fields. Additional formal, interpretation, reference fields may present depending content humdrum file(s), can create additional data fields using within.humdrumR(), mutate.humdrumR(), functions.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/humTable.html"],"id":"data-fields-","dir":"Reference","previous_headings":"","what":"Data fields:","title":"Humdrum tables (and their ","text":"Data fields used describe individual data points humdrum data (opposed groups points). Every humdrum table starts data field called Token, contains character strings representing original strings read humdrum files. Users can create many additional data fields like. Every call withinHumdrum() generates new data fields.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/humTable.html"],"id":"structure-fields-","dir":"Reference","previous_headings":"","what":"Structure fields:","title":"Humdrum tables (and their ","text":"Every humdrum table thirteen Structure fields, describe data token \"located\" original humdrum data: file, spine, record, etc. See vignette humdrum syntax fully understand terms . File info: Filename :: character unique name humdrum file. may include appended path one file name read different directories (see readHumdrum() docs). Filepath :: character full file name (always includes full path). Label :: character label specified call readHumdrum(), associated particular readHumdrum \"REpath-pattern.\" label specified, patterns just labeled \"_n\", \"n\" number pattern. File :: integer unique number associated file (ordered alphabetically, starting 1). Piece :: integer number specifying number piece corpus. identical File field except one piece read file. Location info: Spine :: integer spine, numbered (left--right) starting 1. field NA wherever Global == TRUE. Path :: integer \"spine path.\" time *^ spine path split occurs humdrum data, right side split becomes new \"path.\" original path numbered 0 additional paths numbered integers right. (spine path splits, Path field 0s.) field always NA Global == TRUE. ParentPath :: integer spine paths (.e., Path > 0), path parent path split? Path == 0, parent path also 0. Record :: integer record (.e., line) number original file. DataRecord :: integer data record enumeration file, starting 1. Stop :: integer token multi-stop token, numbered starting 1. files multi-stops, Stop field 1s. field always NA Global == TRUE. Global :: logical token come global record (opposed local record)? Global == TRUE, Spine, Path, Stop fields always NA. Token info: Type :: character type record ? \"G\" = global comment. \"L\" = local comment \"\" = interpretation \"M\" = measure/barline \"D\" = non-null data \"d\" = null data \"E\" = exclusive interpretation \"S\" = spine-control tokens (*^, *v, *-)","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/humTable.html"],"id":"interpretation-fields-","dir":"Reference","previous_headings":"","what":"Interpretation fields:","title":"Humdrum tables (and their ","text":"Interpretation fields describe interpretation metadata humdrum file(s). Humdrum interpretations tokens \"carry forward\" data points , unless cancelled subsequent interpretation. (See humdrum syntax vignette detailed explanation.) humdrum data must exclusive interpretation humdrum tables always Exclusive (:: character) field indicating exclusive interpretation associated token/row Token field. Humdrum data may, may , include additional tandem interpretations. universal rule parsing tandem interpretations impossible, ) tandem interpretations can \"overwrite\" B) users can create tandem interpretations. best can cases identify tandem interpretations appeared previously spine (counting recent first). previous interpretations encoded single character string Tandem field (see tandem() docs details). working non-standard interpretations, users can parse Tandem field using tandem() function. tandem interpretations occur file, Tandem field full empty strings (\"\"). Fortunately, many tandem interpretations widely used standardized, interpretations known humdrumR. Recognized interpretations (*clefG4 *k[b-]) automatically parsed fields call readHumdrum(). See readHumdrum() documentation details.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/humTable.html"],"id":"formal-fields-","dir":"Reference","previous_headings":"","what":"Formal fields:","title":"Humdrum tables (and their ","text":"Formal fields indicate musical sections, time windows within piece, including formal designations (\"verse\", \"chorus\", etc.) measures/bars. Humdrum data may may include formal metadata fields, indicated token \"*>\". Classified formal marks put fields matching name. Unclassified formal marks placed field called Formal default. Nested formal categories appended underscore number level descent: Formal_1, Formal_2, ..., Formal_N. part section given name lower hierarchical level, field simply empty (\"\") point. Humdrum data may, may , also include barlines (tokens beginning \"=\"). However, humdrum tables always include three formal fields related barlines: Bar :: integer many barline records (single double) passed token? \"=\" tokens occur file, Bar zeros. Note field independent whether barlines labeled numbers humdrum file! DoubleBar :: integer many double-barline records passed token? \"==\" tokens occur file, DoubleBar zeros. BarLabel :: character characters occur barline-token initial \"=\" \"==\". include \"-\" common \"implied barline\" token \"=-\", repeat tokens (like \"=:||\"), also explicit bar numbers. Note Bar field always enumerate every bar record, measure-number labels humdrum data (appear BarLabel field) may weird things like skipping numbers, repeating numbers, suffixes (e.g., \"19a\"). barline tokens appear file, BarLabel empty strings (\"\"). barline tokens present file, Bar DoubleBar nothing 0s, BarLabel NA.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/humTable.html"],"id":"reference-fields-","dir":"Reference","previous_headings":"","what":"Reference fields:","title":"Humdrum tables (and their ","text":"Reference fields describe Reference Records humdrum data. Every reference record (records beginning \"!!!\") humdrum file corpus read readHumdrum parsed field named reference code: \"XXX\" \"!!!XXX\". Reference tokens identical throughout humdrum piece. reference code appears one file another, field NA file code. reference records appear files read readHumdrum(), reference fields created. Examples common reference records \"!!!COM:\" (composer) \"!!!OTL:\" (original title). humdrum data records end COM OTL fields humdrum table.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/humTable.html"],"id":"grouping-fields-","dir":"Reference","previous_headings":"","what":"Grouping fields:","title":"Humdrum tables (and their ","text":"Grouping fields special fields may created calls group_by(). fields deleted calls ungroup(). fields generally hidden/inaccessible users.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/humTable.html"],"id":"null-data","dir":"Reference","previous_headings":"","what":"Null data","title":"Humdrum tables (and their ","text":"humdrum syntax, requirement every spine-path contains data every record. Rather, spines often padded null tokens. cases, entire records may padded null tokens. type humdrum record uses different null token: Intepretation: * Comment: ! Barline: = Data: . Many humdrumR functions automatically ignore null data, unless specifically tell (usually, using dataTypes argument). Whenever different fields() created selected, humdrumR reevaluates data locations considers null. Note humdrumR considers data locations \"null\" selected fields character data token one c(\".\", \"!\", \"!!\", \"=\", \"*\", \"**\"); selected fields NA (including NA_character_). humdrumR reevaluates null data, Type field updated, setting data records Type == \"d\" null data Type == \"D\" non-null data. main mechanism humdrumR functions use ignore null data: functions look data Type == \"D\". Whenever print export [humdrumR objecthumdrumRclass, null data selected fields prints \".\"---thus NA values print .. Thus, working numeric data NA values, NA values print \".\".","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/humTable.html"],"id":"reshaping","dir":"Reference","previous_headings":"","what":"Reshaping","title":"Humdrum tables (and their ","text":"Breaking complex syntax humdrum data \"flat\" structure humdrum table, every single token one line data.table, makes humdrum data easier analyze. course, thanks structure fields, can easily regroup reform original humdrum data use structure data (like spines) analyses. However, cases, might want work humdrum data different structure \"shape.\" humdrumR several options \"collapsing\" tokens within humdrum tables, \"cleaving\" different parts data new fields, otherwise reshaping humdrum data basic R data structures might prefer.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/humTable.html"],"id":"querying-fields","dir":"Reference","previous_headings":"","what":"Querying Fields","title":"Humdrum tables (and their ","text":"fields() function takes humdrumR object returns data.table(), row describing available field humdrum table. output table five columns: Name field name. Class class() data field. Type type field (described ). Can \"Data\", \"Structure\", \"Interpretation\", \"Formal\", \"Reference\", \"Grouping\". Selected, logical indicating fields selected. GroupedBy logical indicating , , fields currently grouping data. Using names() function humdrumR object get just field names, fields(humData)$Name.","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/humTable.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Humdrum tables (and their ","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/humdrumDispatch.html"],"dir":"Reference","previous_headings":"","what":"Regular expression method dispatch and function application — humdrumDispatch","title":"Regular expression method dispatch and function application — humdrumDispatch","text":"humdrumR regular-expression method dispatch system simple system making new functions can smartly applied variety character strings. Humdrum dispatch works like normal R method dispatch, instead dispatching specific methods based class (integer, character, etc.) dispatches based regular expressions. addition, exclusive interpretations can used guide dispatch.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/humdrumDispatch.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Regular expression method dispatch and function application — humdrumDispatch","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/humdrumDispatch.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Regular expression method dispatch and function application — humdrumDispatch","text":"dispatchDF data.frame describes function called regex input. (See details). Must data.frame. Exclusive Exclusive interpretations dispatch. Defaults NULL. NULL, regexes used dispatch. multiDispatch Whether use multiple dispatch function interpretation. Defaults FALSE. Must singleton logical value: /switch. FALSE \"best\" regex/exclusive match dispatched Exclusive segment. TRUE, differenet functions can dispatched within input vector. ... Arguments pass dispatch functions. outputClass default output class function return. Defaults \"character\". Must single character string. Generally, make sense, dispatched functions return type, explicitly indicate outputClass argument. Dispatch functions also vectorized. str input strings, dispatch called. Must character.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/humdrumDispatch.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Regular expression method dispatch and function application — humdrumDispatch","text":"Many humdrumR functions fact, humdrum-dispatch functions: example, tonalInterval.character(). call tonalInterval('ee-'), function recognize input string token **kern representation, call appropriate parser. instead call tonalInterval(''), function recognize input string token **solfa representation, call appropriate parser .","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/humdrumDispatch.html"],"id":"dispatchdf","dir":"Reference","previous_headings":"","what":"dispatchDF","title":"Regular expression method dispatch and function application — humdrumDispatch","text":"dispatchDF must data.table::data.table() created using makeDispatchDF function. makeDispatchDF takes one arguments, list three components (ordered, nameed): character vector exclusive interpretations. (Specify \"\" want exclusive dispatch). regular expression (character string) function can generate regular expression, accepts ... arguments time dispatch. function dispatch.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/humdrumDispatch.html"],"id":"makehumdrumdispatcher","dir":"Reference","previous_headings":"","what":"makeHumdrumDispatcher","title":"Regular expression method dispatch and function application — humdrumDispatch","text":"makeHumdrumDispatcher function creates new function automatically performs humdrum-dispatch. number important humdrumR functions created makeHumdrumDispatcher: tonalInterval.character diatonicSet.character tertianSet.character rhythmInterval.character","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/humdrumDispatch.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Regular expression method dispatch and function application — humdrumDispatch","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/humdrumPitch.html"],"dir":"Reference","previous_headings":"","what":"humdrumR and pitch — humdrumPitch","title":"humdrumR and pitch — humdrumPitch","text":"humdrumR includes number intertwined data structures, associated functions, representing manipulating musical pitch information.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/humdrumPitch.html"],"id":"tonality","dir":"Reference","previous_headings":"","what":"Tonality","title":"humdrumR and pitch — humdrumPitch","text":"four data types extensively used humdrumR encode/process tonal musical information: integers --- used encode \"line--fifths\" tonal information tonalInterval --- embeds line--fifth tonal integers alongside octave cent information encode tonal pitch representations (solfege, intervals, letternames, etc.) diatonicSet --- combines line--fifth tonal integer representations represent diatonic tonality, including alterations basic diatonic scale(s). tertianSet --- extension diatonicSet used encode tertian diatonic harmonies. Users rarely need engage data types. Rather, users work humdrum data pitch information encoded strings, wish manipulate analyze data. widely used humdrumR tools pitch conversion/manipulation functions, including kern(), functions like invert() transpose(). functions make use sophisticated, flexible pitch parsing deparsing functions, bridge \"core\" pitch representations listed real-world humdrum data.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/humdrumPitch.html"],"id":"atonality","dir":"Reference","previous_headings":"","what":"Atonality","title":"humdrumR and pitch — humdrumPitch","text":"SECTION INCOMPLETE addition, xxx data types used encode non-tonal (atonal) pitch information. integers --- used encode semitones (well MIDI numbers). xxx --- sets? xxx --- 12-tone rows?","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/humdrumR.html"],"dir":"Reference","previous_headings":"","what":"humdrumR — humdrumR","title":"humdrumR — humdrumR","text":"humdrumR toolkit analysis data encoded humdrum syntax. humdrum syntax incredibly flexible, powerful, scheme encoding musical data. Tens thousands musical scores (musical data) encoded humdrum syntax, many available online repositories KernScores. humdrumR package intended modernized replacement original humdrum toolkit, leveraging power R give us unprecedented power manipulate analyze humdrum data using concise, expressive syntax. humdrumRroot path humdrumR package install machine. installed humdrumR basic humdrum files stored well, subdirectories examples HumdrumData. humdrumR() function used set global package options within R session, mostly regarding viewing humdrumR datasets.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/humdrumR.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"humdrumR — humdrumR","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/humdrumR.html"],"id":"format","dir":"Reference","previous_headings":"","what":"Format","title":"humdrumR — humdrumR","text":"object class character length 1.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/humdrumR.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"humdrumR — humdrumR","text":"view humdrumR data printed? three options: \"humdrum\", \"score\", \"table\" (aliases \"data.frame\" \"tibble\"). options partially matched. Use select() determine fields show. dataTypes types humdrum record(s) view. Defaults \"GLIMDd\" .lines() .matrix(); \"Dd\" .data.frame(); \"LIMDd\" .matrices() .data.frames(). Must single character string. Legal values 'G', 'L', '', 'M', 'D', 'd' combination (e.g., \"LIM\"). (See humdrum table documentation explanation.) maxRecordsPerFile many records shown file, one file present? Defaults 40. Can positive whole number. maxTokenLength Length longer tokens censored ... Defaults 16. Can positive whole number. nullPrint null data points print? Default \"NA2dot\". Must single character string, partially matching \"NA2dot\", \"dot2NA\", 'charNA2dot\", \"asis\". \"NA2dot\" means NA values converted \".\"; \"dot2NA means \".\" converted NA; charNA2dot means NA values character vectors converted NA, atomic types; \"asis\" means either NA \".\" values may print, depending field. syntaxHighlight syntax highlighting (coloring) used printout? Defaults TRUE. Must singleton logical value; /switch. censorEmptyRecords consecutive records \"censored\" (compressed) printout? Defaults 30. Can positive whole number, Inf. Inf, censoring occur.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/humdrumR.html"],"id":"package-design","dir":"Reference","previous_headings":"","what":"Package design","title":"humdrumR — humdrumR","text":"package humdrumR seven main components: represent humdrum data R, humdrumR S4 class, core component humdrum table. create humdrumR data, sophisticated humdrum data parser: readHumdrum. humdrumR data can also written back humdrum-syntax text files using writeHumdrum. filter humdrumR data, subset()/filter() functions, well methhods R's standard indexing operators ([] [[]]). manipulate modify humdrumR data, within methods humdrumR objects, tidyverse aliases mutate(), summarise(), reframe(). facilitate development functions work humdrum tokens---simple character strings packed information---, useful API call regular-expression dispatch system. Several modules representing manipulating musical pitch information, including core tonalInterval class represent tonal pitch. module representing manipulating musical rhythm information, core rhythmInterval class represent rhythms.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/humdrumR.html"],"id":"package-options","dir":"Reference","previous_headings":"","what":"Package options","title":"humdrumR — humdrumR","text":"humdrumR() function sets general options package, mostly related humdrumR data objects viewed. argument function manipulates print/package option: argument used, option remains current setting (.e., unchanged). package options enumerated explained Arguments section .","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/humdrumR.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"humdrumR — humdrumR","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/humdrumRclass.html"],"dir":"Reference","previous_headings":"","what":"humdrumR class — humdrumRclass","title":"humdrumR class — humdrumRclass","text":"S4 class basic unit humdrumR package. humdrumR object represents data read one humdrum files. documentation, refer objects interchangeably \"humdrumR corpora\", \"humdrumR objects,\" humdrumR data(sets). coding examples name \"humData.\" Test object/variable humdrumR dataset using .humdrumR().","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/humdrumRclass.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"humdrumR class — humdrumRclass","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/humdrumRclass.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"humdrumR class — humdrumRclass","text":"humdrumR HumdrumR data. Must humdrumR data object. view humdrumR data printed? three options: \"humdrum\", \"score\", \"table\" (aliases \"data.frame\" \"tibble\"). options partially matched. Use select() determine fields show. dataTypes types humdrum record(s) view. Defaults \"GLIMDd\" .lines() .matrix(); \"Dd\" .data.frame(); \"LIMDd\" .matrices() .data.frames(). Must single character string. Legal values 'G', 'L', '', 'M', 'D', 'd' combination (e.g., \"LIM\"). (See humdrum table documentation explanation.) syntaxHighlight syntax highlighting (coloring) used printout? Defaults TRUE. Must singleton logical value; /switch. maxRecordsPerFile many records shown file, one file present? Defaults 40. Can positive whole number. maxTokenLength Length longer tokens censored ... Defaults 16. Can positive whole number. censorEmptyRecords consecutive records \"censored\" (compressed) printout? Defaults 30. Can positive whole number, Inf. Inf, censoring occur.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/humdrumRclass.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"humdrumR class — humdrumRclass","text":"important part humdrumR object humdrum table holds within ; essence, humdrumR object simply wrapper around humdrum table, helps users visualize, filter, summarize, manipulate table variety ways. Basic information size shape humdrumR objects can obtained calls nrecord, npiece, length, ncol, etc.. detailed summary information can obtained humdrumR corpus summary functions. humdrumR data can also coerced basic R data types using .matrix, .data.frame, etc.. number helpful functions also defined \"reshape\" reorganize data (e.g., cleave(), rend(), collapseHumdrum()). powerful features humdrumR tools gives ... Print readable view data shorthand/curtailed humdrum syntax. Filter humdrumR data, using subset.humdrumR() standard R indexing operators: [] [[]]. Apply arbitrary commands humtable fields using ()Humdrum routines, related tidyverse commands (mutate(), summarize(), etc.).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/humdrumRclass.html"],"id":"slots","dir":"Reference","previous_headings":"","what":"Slots","title":"humdrumR class — humdrumRclass","text":"Humtable humdrum tables---.e, data.table::data.table() particular fields. Files list two elements. first, \"Search\", contains single character representing pattern used call readHumdrum() created humdrumR object. second, \"Names,\" vector strings representing files matched pattern read humdrumR object, names() corresponding \"subcorpora\" labels (Label). Fields data.table indicating existing fields humdrumR object's humdrum table. fields divided five categories: \"Data\", \"Structure\", \"Interpretation\", \"Formal\", \"Reference.\" LoadTime POSIXct value, indicating time readHumdrum() called create humdrumR object. Context data.table two columns: Open Close. row represents contextual window apply data.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/humdrumRclass.html"],"id":"viewing-your-data","dir":"Reference","previous_headings":"","what":"Viewing your Data","title":"humdrumR class — humdrumRclass","text":"type name object R command line, R \"print\" object console. can also done explicitly using humdrumR method print() function. humdrumR print method contains number arguments, can manipulated directly calls print(). However, humdrumR print argument draws defaults global humdrumR options can also controlled humdrumR() function. Generaly, changing print options humdrumR() best option, change , automatic printing follow new settings---means can avoid explicitly calling print(). printing, selected fields data shown.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/humdrumRclass.html"],"id":"view-types","dir":"Reference","previous_headings":"","what":"View types","title":"humdrumR class — humdrumRclass","text":"three options view humdrumR data, can toggled using view argument print() humdrumR(). Since view first argument humdrumR() function, can switch views simply calling humdrumR('humdrum') humdrumR('score') humdrumR('table'). options : \"humdrum\" (default): prints humdrum-syntax score representation, record numbers enumerated left side. Token field selected, applied filters, view show original data files read. one field selected, pasted together printed output. \"table\": prints view underlying humdrum table. addition selected fields, Piece, Spine, Record fields always print output table, well Path Stop paths/stops present. \"score\": (attempt ) show rendered score (first piece) data. view likely work correctly using Rstudio connected internet. Score rendering accomplished using Craig Sapp's Humdrum Notation Plugin. table humdrum views, one pieces object, beginning first piece printed, followed end last piece; much first/last piece printed controlled maxRecordsPerFile print argument. views also highlight output different colors representing different types data tokens: can disabled using syntaxHighlight = FALSE. score view, first piece shown.","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/humdrumRclass.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"humdrumR class — humdrumRclass","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/indexHumdrum.html"],"dir":"Reference","previous_headings":"","what":"Indexing humdrumR objects — indexHumdrum","title":"Indexing humdrumR objects — indexHumdrum","text":"R's built-indexing operators, [] (single brakcets) [[]] (double brackets) can used filter humdrumR data, removing specific pieces, spines, records humdrum table. Unlike flexible/powerful subset()/filter() methods, indexing operators generally destructive (default), meaning filtered data can longer accessed indexing. functions index() index2() synonyms single double brackets respectively, can used pipes.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/indexHumdrum.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Indexing humdrumR objects — indexHumdrum","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/indexHumdrum.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Indexing humdrumR objects — indexHumdrum","text":"x HumdrumR data index. Must humdrumR data object. Index vectors matrix/data.frame rows. numeric vector character string treated regular expression. j Index matrix/data.frame columns. numeric vector character string treated regular expression.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/indexHumdrum.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Indexing humdrumR objects — indexHumdrum","text":"R, fundamental indexing operators, [] [[]], used select subsets data. many data types (instance, base R lists) [single brackets] used \"shallower\" extraction [[double brackets]] used \"deeper\" extraction. rough analogy \"shallow vs deep\" dichotomy, HumdrumR corpus indexing brackets used two ways: [single brackets] used select pieces data. [[double brackets]] used select records spines within pieces data. (Accidentally writing [] need [[]] common error, watch !) Whether, indexing piece within, humdrumR objects can use two types indexing arguments: numeric (ordinal integers) character string (interpreted regular expressions).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/indexHumdrum.html"],"id":"numeric-indexing-","dir":"Reference","previous_headings":"","what":"Numeric indexing:","title":"Indexing humdrumR objects — indexHumdrum","text":"Indexing humdrumR corpora [single brackets] accept one numeric argument---whole numbers accepted. argument used pick pieces within humdrumR object ordinally. Thus, humData[1:10] select first ten pieces data humData[42] select 42nd piece. Indexing humdrumR objects [[double brackets]] accept one two numeric arguments, j, either can used isolation combination. (j used isolation, must named placed comma, humData[[ , j ]].) used index records (.e., based humtable Record field). Thus, humData[[1:20]] indexes first twenty records piece corpus, humData[[42]] extracts 42nd record piece. avoid breaking humdrum syntax, exclusive interpretations spine-path interpretations removed. j used index spines (.e., based Spine field). Thus, humData[[ , 3:4]] returns third fourth spines piece corpus. Pieces/spines/records renumbered indexing (see Renumbering section subset()/filter() docs explantion). result, humdrumR indexing entirely ordinal. example, return 12th piece original humData object. first call [] returns 11th 20th pieces, renumbered 1:10 second index call returns new 2nd index, 12th originally. Similarly, return third spine original data.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/indexHumdrum.html"],"id":"negative-numbers","dir":"Reference","previous_headings":"","what":"Negative numbers","title":"Indexing humdrumR objects — indexHumdrum","text":"normal R indexing, negative numbers can used, causing corresponding elements removed instead retained. Thus, humData[-3:-5] remove third, fourth, fifth pieces data humData[[ , -3:-5]] remove third, fourth, fifth spines piece. Positive negative indices mixed single argument.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/indexHumdrum.html"],"id":"out-of-bounds-indices","dir":"Reference","previous_headings":"","what":"Out of bounds indices","title":"Indexing humdrumR objects — indexHumdrum","text":"cases, indices outside bounds (value 0) ignored. E.g., corpus twenty pieces call corpus[21], 21st piece, 21 \"bounds\". input indices 0 error result. input indices bounds empty humdrumR object returned. instance, humData[[401:500, ]] return empty humdrumR object pieces 400 data records.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/indexHumdrum.html"],"id":"character-indexing-","dir":"Reference","previous_headings":"","what":"Character indexing:","title":"Indexing humdrumR objects — indexHumdrum","text":"index humdrumR object character strings, strings treated regular expressions (regexes), matched non-null data tokens (\"D\") object's first selected field. match regular expressions considered match. Indexing [single brackets] accepts one vector character regular expressions. piece contains even single match retained. matches occur pieces, empty humdrumR object returned. Indexing humdrumR objects [[double brackets]] accepts one two vectors character strings, j, either can used isolation combination. (j used isolation, must placed comma, humData[[ , j]].) data record contains least one match regex(es) retained. Similarly, spine contains least one match j regex(es) retained. j used together, matching spines (j) indexed first, tokens matching regular expression(s) must found matching spines.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/indexHumdrum.html"],"id":"exclusive-indexing-","dir":"Reference","previous_headings":"","what":"Exclusive indexing:","title":"Indexing humdrumR objects — indexHumdrum","text":"Spines can also indexed ordinally exclusive interpretation. , provide double-bracket index named numeric (whole number) argument, name(s) corresponding exclusive interpretations data. example, want index 3rd **kern spine piece, use humData[[kern = 3]]. Note exclusive interpretations piece unaffected---example, kern spines () indexed!","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/indexHumdrum.html"],"id":"removeempty","dir":"Reference","previous_headings":"","what":"removeEmpty","title":"Indexing humdrumR objects — indexHumdrum","text":"removeEmpty argument humdrumR indexing controls whether filtered data completely removed data, simply set null means filtered data can recovered using unfilter() (see subset()/filter() docs explanation). default, piece-indexing spine-indexing removeEmpty = TRUE, record-indexing defaults removeEmpty = FALSE.","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/indexHumdrum.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Indexing humdrumR objects — indexHumdrum","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/int.html"],"dir":"Reference","previous_headings":"","what":"Calculate intervals between pitches — int","title":"Calculate intervals between pitches — int","text":"functions allow us calculate intervals pitches. int() basic form, calculating interval(s) two input vectors. mint() hint() special forms calculating intervals \"melodically\" \"harmonically,\" respectively. mint() applied humdrumR data class may use data's fields arguments. field names specified, first selectedField used x. hint() applied humdrumR data class may use data's fields arguments. field names specified, first selectedField used x.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/int.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Calculate intervals between pitches — int","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/int.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Calculate intervals between pitches — int","text":"x Input pitch information. Can (atomic) vector, tonalInterval, NULL. Must parsable pitch information. Pitches calculate intervals . Defaults middle C / unison. Can (atomic) vector, tonalInterval, NULL. Must parsable pitch information. deparser output representation want? Defaults interval. Must pitch function, like kern(). incomplete pad incomplete intervals (e.g., start/end input). Defaults NULL int(), kern mint() hint(). Must NULL, pitch function, atomic value length(incomplete) == abs(lag). bracket Whether print brackets around incomplete output. Defaults TRUE incomplete function, FALSE otherwise. Must singleton logical value: /switch. TRUE, square brackets (\"[]\") printed around incomplete observations. classify intervals classified step/skip/leaps? Defaults FALSE. Must singleton logical value: /switch. TRUE, deparser ignored output classified Unison, Step, Skip, Leap. parseArgs optional list arguments passed pitch parser. Defaults empty list(). Must list named arguments pitch parser. lag lag() calculate harmonic/melodic intervals . Defaults 1, means intervals immediate successors x. Must either single number, logical length(x) (see \"Logical lags\" section manual). groupby list vectors group x. Defaults list(). Must list; every element list must length length(x). orderby list vectors group x. Defaults list(). Must list; every element list must length length(x). Used interpret order elements x. Lagged computations done indicated order, output returned original order.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/int.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Calculate intervals between pitches — int","text":"Input vectors x () parsed pitches (tonal interval objects), possible. (Parsing arguments can passed via parseArgs list, parse(...) sugar. Key Exclusive arguments also passed parser.) inputs fail parse show NA output. parsed, intervals pitches calculated x - . resulting intervals \"deparsed\" standard representation; default, intervals() representation used, can set deparser argument pitch function. However, alternative deparser commonly used (besides intervals()) semits(). deparser NULL, raw tonalIntervals returned.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/int.html"],"id":"melodic-and-harmonic-intervals","dir":"Reference","previous_headings":"","what":"Melodic and Harmonic intervals","title":"Calculate intervals between pitches — int","text":"mint hint calculate \"melodic\" \"harmonic\" intervals respectively. context, \"melodies\" sequences notes within spine path, \"harmonies\" intervals notes occurring record (time). Outside () call, mint hint exactly ; used call () see different behaviors, () automatically apply across spine paths (mint()) records (hint()). achieved modifying groupby orderby arguments lag()---can manually achieve default behaviors, behaviors, setting arguments . used () expression, mint() (default) calculate melodic interval approaching note previous note: example, mint('C4', 'D4', 'Eb4') fill return c('[c]', '+M2', '+m2'), D4 approached ascending whole step C4, Eb4 approached ascending half step D4. Similarly, default () behavior hint() calculate successive intervals record (across spine paths), left right. record C3 G4 C5 return values [CC] +P12 +P4, G4 perfect 12th C3, C5 perfect fourth G4. mint() hint() work passing lagged /dittoed versions x argument int(). Basically, mint() equivalent int(x, lag(x, lag = lag, groupby = list(Piece, Spine, Path)), ...) hint() equivalent int(x, lag(x, lag = lag, groupby = list(Piece, Record), orderby = list(Piece, Record, Spine, Path)), ...). either case, parsed pitch vector copied lagged using lag(), pairs crossing outside groupby groups ignored. lag argument controls far apart melody intervals calculated. instance, lag 2 calculate intervals every note vector. Positive lags (default) calculate approaching intervals: token represents interval current note previous note. Negative lags calculate departing intervals: token represents interval current note next note. Note , passing directed = FALSE deparser, undirected (absolute value) melodic intervals can returned.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/int.html"],"id":"incomplete-value-padding","dir":"Reference","previous_headings":"","what":"Incomplete value padding","title":"Calculate intervals between pitches — int","text":"default, int return NA anywhere x NA. However, NA x NA, can ask different output \"incomplete\" pairs. using incomplete argument. incomplete atomic value, incomplete outputs indices willed value. incomplete argument pitch function (like deparser argument), function used (re)parse values x missing. bracket == TRUE, incomplete output values surrounded [], easier distinguish actual intervals. main use incomplete argument mint() hint(). lagged arguments used mint()/hint() (see previous section) necessarily padded abs(lag) NA values beginning (positive lag) end (negative lag). thus \"incomplete\" pairs passed int(), can controlled using incomplete argument. default, mint() hint() set incomplete = kern(), bracket = TRUE cause notes show bracketed kern, like [ee-] [C#]. incomplete NULL, incomplete values simply padded NA.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/int.html"],"id":"interval-classification","dir":"Reference","previous_headings":"","what":"Interval classification","title":"Calculate intervals between pitches — int","text":"classify argument set TRUE, intervals classified either \"Unison\", \"Step\", \"Skip\", \"Leap\". Alternatively, skips can interpreted leaps setting skips = FALSE. (classify = TRUE overrides deparser argument.) default, intervals categorized tonally, meaning interval tonal steps used basis classification. example, augmented 2nd step, diminished 3rd skip/leap. means augmented diminished unisons marked \"Unison\" well! However, directed = TRUE, augmented/diminished unisons marked + - indicate direction, whereas perfect unisons never marked +/-. Alternatively, may choose categorize intervals atonally setting atonal = TRUE. , intervals categorized based semitone (enharmonic) intervals: D# Eb classified .","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/int.html"],"id":"logical-ditto-lags","dir":"Reference","previous_headings":"","what":"Logical (ditto) lags","title":"Calculate intervals between pitches — int","text":"calls hint() mint() default behavior numeric lag argument passed lag(). alternate option specify lag argument logical vector length input (x argument). Rather calculating interval pitch another pitch separated regular lag, logical lag argument \"lags\" pitch back previous value lag == TRUE. means one interval can calculated TRUE indices. canonic use \"logical lag\" feature calculate harmonic intervals relative voice, like bass voice. example, consider file: read file applied hint() Token field (default arguments) result : record, see intervals lagged (lag == 1) left right: see intervals bass tenoir, tenor alto, alto soprano. wanted see intervals bass? Well, can use logical lag argument, specify Spine == 1: (humData, hint(Token, lag = Spine == 1). means values \"lagged\" back previous value Spine == 1. result : Now see intervals relative bass. logical lag takes place within groupby groups. However, note values first index lag == TRUE calculated relative first value.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/int.html"],"id":"grouping","dir":"Reference","previous_headings":"","what":"Grouping","title":"Calculate intervals between pitches — int","text":"many cases want perform lagged calculations vector, across certain boundaries. example, vector includes data multiple pieces, want calculate melodic intervals pieces, within pieces. groupby argument indicates one, , grouping vectors, break x (input) argument groups. groupby vectors given, change vector indicates boundary. Value pairs cross groups treated beginning. Basically, using groupby argument function similar identical using tapply(x, groupby, laggedFunction, ...) using groupby expession call ().humdrumR. However, using groupby argument directly usually much faster, specially optimized functions. common use case humdrum data, looking \"melodies\" within spines. , want groupby = list(Piece, Spine, Path). fact, humdrumR () calls automatically feed three fields groupby arguments certain functions: mint, delta, sigma, lag, ditto, ioi, sumTies, hop, wort, wort.character. use delta call (), automatically calculate delta \"melodic\" way, within spine path piece. However, wanted, instance, calculate differences across spines (like harmonic intervals) manually set groupby = list(Piece, Record).","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/int.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Calculate intervals between pitches — int","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/interpretations.html"],"dir":"Reference","previous_headings":"","what":"Summarize humdrum corpus interpretations. — interpretations","title":"Summarize humdrum corpus interpretations. — interpretations","text":"interpretations used summarize interpretations pieces humdrumR corpus, including exclusive (**) tandem (*) interpretations. interpretations one humdrumR's basic corpus summary functions.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/interpretations.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Summarize humdrum corpus interpretations. — interpretations","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/interpretations.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Summarize humdrum corpus interpretations. — interpretations","text":"humdrumR HumdrumR data summarize. Must humdrumR data object. Index rows. numeric, selects rows index. character, string matched regular expression filenames corpus.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/interpretations.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Summarize humdrum corpus interpretations. — interpretations","text":"interpretations returns special data.frame called humInterpretations table. row table represents single piece corpus. first column ({X}) variable indicating unique \"exclusive pattern\" associated piece---exclusive patterns tallied bottom printout. remaining columns indicate many interpretation (indicated column name) appear piece. tandem interpretations, counts returned format Total.Unique.Spines: Total: total instances interpretation, across spines. Unique: number unique versions interpretation. Spines: number spines interpretation appears . example, consider following piece: piece, several tandem key interpretations, humdrumR call Key. tabulation interpretations return Key column value 6.3.2 piece: 6 six key interpretations total. 3 three unique keys: *C:, *e: *G:. 2 key interpretations occur two spines.","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/interpretations.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Summarize humdrum corpus interpretations. — interpretations","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/interval.html"],"dir":"Reference","previous_headings":"","what":"Tonal (pitch) interval representation — interval","title":"Tonal (pitch) interval representation — interval","text":"returns standard representations intervals Western music. interval() applied humdrumR data class may use data's fields arguments. field names specified, first selectedField used x.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/interval.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Tonal (pitch) interval representation — interval","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/interval.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Tonal (pitch) interval representation — interval","text":"x Input data parse pitch information. x argument can (atomic) vector, tonalInterval, NULL. ... Arguments passed pitch deparser. also two hidden (advanced) arguments can specify: memoize deparse (see details ). generic \"specific\" pitch information (accidentals qualites) discarded? Defaults FALSE. Must singleton logical value: /switch. simple \"compound\" pitch information (octave/contour) discarded? Defaults FALSE. Must singleton logical value: /switch. Key input Key used parser, deparser, transposer. Defaults NULL. Must diatonicSet something coercable diatonicSet; must either length 1 length(x) transposeArgs optional list arguments passed special transpose() call. Defaults empty list(). Must list named arguments transpose(). parseArgs optional list arguments passed pitch parser. Defaults empty list(). Must list named arguments pitch parser. inPlace non-pitch information retained output string. Defaults FALSE. Must singleton logical value: /switch. argument effect input (x argument) character strings, extra, non-pitch information input strings \"besides\" pitch information. , inPlace = TRUE, output placed output string beside original non-pitch information. inPlace = FALSE, pitch output information returned (details ).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/interval.html"],"id":"basic-pitch-arguments","dir":"Reference","previous_headings":"","what":"Basic pitch arguments","title":"Tonal (pitch) interval representation — interval","text":"pitch function standard arguments control details output. important generic simple arguments, allow control type pitch information returned.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/interval.html"],"id":"generic-vs-specific","dir":"Reference","previous_headings":"","what":"Generic vs Specific","title":"Tonal (pitch) interval representation — interval","text":"generic = TRUE, specific pitch information (accidentals qualities) omitted output. alternative way controlling functionality, can use specific argument, specific == !generic. case atonal functions, \"generic\" version pitch output: example, semits('c#', generic = TRUE) return 0, \"generic\" version C# C, corresponds 0. However, note generic version pitch follows key, semits('c#', generic = TRUE, Key = ':') return 1!","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/interval.html"],"id":"simple-vs-compound","dir":"Reference","previous_headings":"","what":"Simple vs Compound","title":"Tonal (pitch) interval representation — interval","text":"simple = TRUE, compound pitch information (octave contour) omitted output. alternative way controlling functionality, can use compound argument ,compound == !simple. actually one way might want divide compound intervals simple octave parts. example, might like call output -M2 (descending major 2nd) +m7 (ascending minor 7th octave ). functionality can controlled octave.round argument: see pitch deparsing documentation.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/interval.html"],"id":"key","dir":"Reference","previous_headings":"","what":"Key","title":"Tonal (pitch) interval representation — interval","text":"Key argument must diatonicSet, something can parsed one. Key argument passed parser, deparser, transpose---unless alternate Key passed transposeArgs parseArgs. Various deparsing options use Key argument; example, use implicitSpecies (see advanced parsing section) dependent Key. use pitch function within special call withinHumdrum, humdrumR automatically pass Key field humdrum data function---means, cases, need explicitly anything Key argument! (want happen, need explicitly specify Key argument, Key = NULL.)","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/interval.html"],"id":"parse-arguments","dir":"Reference","previous_headings":"","what":"Parse arguments","title":"Tonal (pitch) interval representation — interval","text":"parseArgs argument must list() (named) arguments passed input parser. example, input representation uses \"X\" represent double sharps, specify kern('CX5', parseArgs = list(doublesharp = 'X')) get correct result (\"cc##\"). convenient shorthand, \"syntactic sugar,\" can specify parseArgs alternate way: Simply input parse(args...) unnamed argument pitch function. example, can get exact result typing kern('CX5', parse(doublesharp = 'X')).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/interval.html"],"id":"transpose-arguments","dir":"Reference","previous_headings":"","what":"Transpose arguments","title":"Tonal (pitch) interval representation — interval","text":"transposeArgs argument must list() (named) arguments passed internal call transpose(), allowing us easily transpose pitch information. example, type kern(c('C', 'D', 'E'), transposeArgs = list(= 'M9')) can get output c('d', 'e', 'f#'). possible transpose args : (tonalInterval, length == 1 | length == (x)) (diatonicSet, length == 1 | length == (x)) (diatonicSet, length == 1 | length == (x)) real (logical, length == 1) transposition real tonal? relative (logical, length == 1) key-wise transposition based relative parallel keys? convenient shorthand, \"syntactic sugar,\" can specify transposeArgs alternate way: Simply input transpose(args...) unnamed argument pitch function. example, can get exact result typing kern(c('C', 'D', 'E'), transpose(= 'M9')).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/interval.html"],"id":"transposing-by-interval","dir":"Reference","previous_headings":"","what":"Transposing by interval","title":"Tonal (pitch) interval representation — interval","text":"calling transpose() directly, argument can anything coercable tonalInterval, output transposed amount. real = FALSE, tonal transposition (within Key) performed. details transposition behavior, check transpose() docs.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/interval.html"],"id":"transposing-by-key","dir":"Reference","previous_headings":"","what":"Transposing by key","title":"Tonal (pitch) interval representation — interval","text":"Another way transposing specifying input (\"\") key output (\"\") key. default, Key argument passed transpose , nothing actually happens. Thus, specify either key key, transposition happen /key Key. course, specify transposition happen keys specify. use pitch function within special call withinHumdrum, humdrumR automatically pass Key field humdrum data function. specify key, Key field passed transpose key, result, pitches input transposed whatever keys target () key! real relative arguments give special control key-wise transposition works, check transpose() docs details!","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/interval.html"],"id":"in-place-parsing","dir":"Reference","previous_headings":"","what":"In-place parsing","title":"Tonal (pitch) interval representation — interval","text":"humdrum data, character strings often encoded multiple pieces musical information right besides : example, **kern data might include tokens like \"4.ee-[. humdrumR parser (tonalInterval) automatically \"pull \" pitch information within strings, can find using appropriate known regular expressions. example, pitch('4.ee-[') returns Eb5. However, pitch functions (like pitch() kern()) option keep \"extra\" information return result \"place\"---.e., embedded right found input string. controlled inPlace argument, FALSE default. , pitch('4.ee-[', inPlace = TRUE) return 4.Eb5[---keeping \"4.\" \"[\". (obviously works input string, numeric!) Note inPlace = TRUE force functions like semits, normally return numeric values, return character strings input character string.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/interval.html"],"id":"pitch-gamut-levels","dir":"Reference","previous_headings":"","what":"Pitch-Gamut Levels","title":"Tonal (pitch) interval representation — interval","text":"table() automatically generate factor levels pitch data using gamut() function. makes sure tabulated data sorted logical order, includes missing pitches. simple/complex generic/specific arguments automatically passed gamut(); additional arguments can passed gamut using gamutArgs = list(...), syntactic sugar gamut(...). (Read gamut() docs explanation gamut generation.) feature used control table layout pitch data, well assure consistent tables grouping data. inPlace = TRUE special tabulation occur.","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/interval.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Tonal (pitch) interval representation — interval","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/invert.html"],"dir":"Reference","previous_headings":"","what":"Invert or transpose pitches. — invert","title":"Invert or transpose pitches. — invert","text":"Invert transpose pitches.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/invert.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Invert or transpose pitches. — invert","text":"","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/ioi.html"],"dir":"Reference","previous_headings":"","what":"Sum ","title":"Sum ","text":"functions used sum (melodically) adjacent rhythmic duration values associated new onsets/attacks. ioi() adds duration rests previous non-rest (onset) duration, create interonset intervals (IOIs). sumTies() sums tied durations. ioi() applied humdrumR data class may use data's fields arguments. field names specified, first selectedField used x. sumTies() applied humdrumR data class may use data's fields arguments. field names specified, first selectedField used x.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/ioi.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Sum ","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/ioi.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Sum ","text":"x Input rhythm information. x argument can (atomic) vector, NULL. Must parsable rhythm information. onsets logical vector denotes onsets. Defaults logical vector TRUE wherever rests, indicated presence \"r\" character, input x. Must logical; must length length(x). durations x onsets == FALSE added previous value onsets == TRUE. finalOnset Whether count last onset. Defaults FALSE. Must singleton logical value: /switch. TRUE, last IOI computed last onset end input vector. Otherwise, last IOI undefined (NA). groupby list vectors group x. Defaults list(). Must list; every element list must length length(x). parseArgs optional list arguments passed rhythm parser. Defaults empty list(). Must list named arguments rhythm parser. inPlace non-rhythm information retained output string? Defaults TRUE. Must singleton logical value: /switch. open beginnings ties indicated x? Defaults [. Must single character string, interpreted regular expression. close ends ties indicated x? Defaults ]. Must single character string, interpreted regular expression.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/ioi.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Sum ","text":"functions return \"collapsed\" durations null data tokens. example, sumTies(c('[4a', '4a]', '2g')) returns c('2a', '.', '2g'), second (tied) duration null (\".\"). interonset intervals, last duration string durations undefined---final onset, next onset, really \"interonset\" interval. Thus, default, ioi() return NA location final duration. However, finalOnset argument set TRUE, function act like one additional onset end sequence: last \"IOI\" calculated last onset fictional \"final onset.\" example, run ioi(c('4.','8r', '4.','8r','2a', '2r')) result c(\"2a\", \".\", \"2a\", \".\", NA, \".\"), last onset (2a) returning NA. However, run ioi(c('4.','8r', '4.','8r','2a', '2r'), finalOnset = TRUE) result c(\"2a\", \".\", \"2a\", \".\", \"1a\", \".\")---last onset's whole duration end returned! Non-onsets (rests) occur first onset returned null.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/ioi.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Sum ","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/is.major.html"],"dir":"Reference","previous_headings":"","what":"Test the major/minor modality of a set — is.major","title":"Test the major/minor modality of a set — is.major","text":"functions test majorness/minorness tertian diatonic set, logical TRUE/FALSE. functions testing whether chord strictly major minor chord, rather \"broad\" major/minorness: gnerally, presence minor third degree makes set \"minor\"; thus, diminished chord \"minor\" lydian key \"major.\"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/is.major.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Test the major/minor modality of a set — is.major","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/is.major.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Test the major/minor modality of a set — is.major","text":"x Input data, interpreted diatonic keys chords. Must diatonicSet tertianSet something can parsed one. ... Parameters passed parsers (tertianSet() diatonicSet()).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/is.major.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Test the major/minor modality of a set — is.major","text":"Either function can called directly tertian diatonic sets. called anything else, functions first call tertianSet() parser. values fail parse (returning NA), diatonicSet() parser called .","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/is.simple.html"],"dir":"Reference","previous_headings":"","what":"Test the properties of tonal information — is.simple","title":"Test the properties of tonal information — is.simple","text":"functions test basic properties pitch information. .simple returns TRUE pitch information constrained one octave. .generic returns TRUE pitch information \"natural\" key (Key) argument.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/is.simple.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Test the properties of tonal information — is.simple","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/is.simple.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Test the properties of tonal information — is.simple","text":"x Pitch information. Must something can parsed pitch information. ... Parameters passed tonalInterval(). octave.round rounding function. Must rouding function. Controls simple intervals interpreted relative C. Key diatonic key used defined generic pitches. Defaults NULL. Must something can parsed diatonic key; must either length 1 length(x).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/is.simple.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Test the properties of tonal information — is.simple","text":"functions can called directly tonalIntervals; called anything else, functions first calls tonalInterval() parser. values fail parse NA returned. \"Simple\" intervals fall particular octave relative middle-C/unison. octave.floor argument can used change works: default option, floor, interprets (**kern) pitches c, d, e, f, g, , b \"simple.\" common alternative, round, identifies G, , B, c, d, e, f \"simple.\" See pitch deparsing docs detailed explanation. \"Generic\" intervals belong key.","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/kern.html"],"dir":"Reference","previous_headings":"","what":"Kern pitch representation — kern","title":"Kern pitch representation — kern","text":"Kern (**kern) common humdrum interpretation representing \"notes\" style traditional Western scores. However! humdrumR, kern function outputs pitch part **kern interpretation. **kern rhythms instead created using recip() function. kern() applied humdrumR data class may use data's fields arguments. field names specified, first selectedField used x.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/kern.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Kern pitch representation — kern","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/kern.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Kern pitch representation — kern","text":"x Input data parse pitch information. x argument can (atomic) vector, tonalInterval, NULL. ... Arguments passed pitch deparser. also two hidden (advanced) arguments can specify: memoize deparse (see details ). generic \"specific\" pitch information (accidentals qualites) discarded? Defaults FALSE. Must singleton logical value: /switch. simple \"compound\" pitch information (octave/contour) discarded? Defaults FALSE. Must singleton logical value: /switch. Key input Key used parser, deparser, transposer. Defaults NULL. Must diatonicSet something coercable diatonicSet; must either length 1 length(x) transposeArgs optional list arguments passed special transpose() call. Defaults empty list(). Must list named arguments transpose(). parseArgs optional list arguments passed pitch parser. Defaults empty list(). Must list named arguments pitch parser. inPlace non-pitch information retained output string. Defaults FALSE. Must singleton logical value: /switch. argument effect input (x argument) character strings, extra, non-pitch information input strings \"besides\" pitch information. , inPlace = TRUE, output placed output string beside original non-pitch information. inPlace = FALSE, pitch output information returned (details ).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/kern.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Kern pitch representation — kern","text":"pitch part **kern tokens breakdown tonal pitch information : Steps 1: \"C\" \"c\" 2: \"D\" \"d\" 3: \"E\" \"e\" 4: \"F\" \"f\" 5: \"G\" \"g\" 6: \"\" \"\" 7: \"B\" \"b\" Accidentals Flat: \"-\" Sharp: \"#\" Octave Octave indicated case step characters, well repetition step character. Uppercase letters used octaves ; lowercase letters middle-C octave higher. octave, octave get one character , higher lower octaves repeating character. example, using C# step value, relative octave: -3: \"CCC#\" -2: \"CC#\" -1: \"C#\" 0: \"c#\" +1: \"cc#\" +2: \"ccc#\" +3: \"cccc#\" Tokens ordered Step/Octave + Accidentals, separator. Like humdrumR pitch functions, ways kern parses deparses tokens can modified accomodate variations standard **kern pitch representation.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/kern.html"],"id":"basic-pitch-arguments","dir":"Reference","previous_headings":"","what":"Basic pitch arguments","title":"Kern pitch representation — kern","text":"pitch function standard arguments control details output. important generic simple arguments, allow control type pitch information returned.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/kern.html"],"id":"generic-vs-specific","dir":"Reference","previous_headings":"","what":"Generic vs Specific","title":"Kern pitch representation — kern","text":"generic = TRUE, specific pitch information (accidentals qualities) omitted output. alternative way controlling functionality, can use specific argument, specific == !generic. case atonal functions, \"generic\" version pitch output: example, semits('c#', generic = TRUE) return 0, \"generic\" version C# C, corresponds 0. However, note generic version pitch follows key, semits('c#', generic = TRUE, Key = ':') return 1!","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/kern.html"],"id":"simple-vs-compound","dir":"Reference","previous_headings":"","what":"Simple vs Compound","title":"Kern pitch representation — kern","text":"simple = TRUE, compound pitch information (octave contour) omitted output. alternative way controlling functionality, can use compound argument ,compound == !simple. actually one way might want divide compound intervals simple octave parts. example, might like call output -M2 (descending major 2nd) +m7 (ascending minor 7th octave ). functionality can controlled octave.round argument: see pitch deparsing documentation.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/kern.html"],"id":"key","dir":"Reference","previous_headings":"","what":"Key","title":"Kern pitch representation — kern","text":"Key argument must diatonicSet, something can parsed one. Key argument passed parser, deparser, transpose---unless alternate Key passed transposeArgs parseArgs. Various deparsing options use Key argument; example, use implicitSpecies (see advanced parsing section) dependent Key. use pitch function within special call withinHumdrum, humdrumR automatically pass Key field humdrum data function---means, cases, need explicitly anything Key argument! (want happen, need explicitly specify Key argument, Key = NULL.)","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/kern.html"],"id":"parse-arguments","dir":"Reference","previous_headings":"","what":"Parse arguments","title":"Kern pitch representation — kern","text":"parseArgs argument must list() (named) arguments passed input parser. example, input representation uses \"X\" represent double sharps, specify kern('CX5', parseArgs = list(doublesharp = 'X')) get correct result (\"cc##\"). convenient shorthand, \"syntactic sugar,\" can specify parseArgs alternate way: Simply input parse(args...) unnamed argument pitch function. example, can get exact result typing kern('CX5', parse(doublesharp = 'X')).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/kern.html"],"id":"transpose-arguments","dir":"Reference","previous_headings":"","what":"Transpose arguments","title":"Kern pitch representation — kern","text":"transposeArgs argument must list() (named) arguments passed internal call transpose(), allowing us easily transpose pitch information. example, type kern(c('C', 'D', 'E'), transposeArgs = list(= 'M9')) can get output c('d', 'e', 'f#'). possible transpose args : (tonalInterval, length == 1 | length == (x)) (diatonicSet, length == 1 | length == (x)) (diatonicSet, length == 1 | length == (x)) real (logical, length == 1) transposition real tonal? relative (logical, length == 1) key-wise transposition based relative parallel keys? convenient shorthand, \"syntactic sugar,\" can specify transposeArgs alternate way: Simply input transpose(args...) unnamed argument pitch function. example, can get exact result typing kern(c('C', 'D', 'E'), transpose(= 'M9')).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/kern.html"],"id":"transposing-by-interval","dir":"Reference","previous_headings":"","what":"Transposing by interval","title":"Kern pitch representation — kern","text":"calling transpose() directly, argument can anything coercable tonalInterval, output transposed amount. real = FALSE, tonal transposition (within Key) performed. details transposition behavior, check transpose() docs.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/kern.html"],"id":"transposing-by-key","dir":"Reference","previous_headings":"","what":"Transposing by key","title":"Kern pitch representation — kern","text":"Another way transposing specifying input (\"\") key output (\"\") key. default, Key argument passed transpose , nothing actually happens. Thus, specify either key key, transposition happen /key Key. course, specify transposition happen keys specify. use pitch function within special call withinHumdrum, humdrumR automatically pass Key field humdrum data function. specify key, Key field passed transpose key, result, pitches input transposed whatever keys target () key! real relative arguments give special control key-wise transposition works, check transpose() docs details!","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/kern.html"],"id":"in-place-parsing","dir":"Reference","previous_headings":"","what":"In-place parsing","title":"Kern pitch representation — kern","text":"humdrum data, character strings often encoded multiple pieces musical information right besides : example, **kern data might include tokens like \"4.ee-[. humdrumR parser (tonalInterval) automatically \"pull \" pitch information within strings, can find using appropriate known regular expressions. example, pitch('4.ee-[') returns Eb5. However, pitch functions (like pitch() kern()) option keep \"extra\" information return result \"place\"---.e., embedded right found input string. controlled inPlace argument, FALSE default. , pitch('4.ee-[', inPlace = TRUE) return 4.Eb5[---keeping \"4.\" \"[\". (obviously works input string, numeric!) Note inPlace = TRUE force functions like semits, normally return numeric values, return character strings input character string.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/kern.html"],"id":"pitch-gamut-levels","dir":"Reference","previous_headings":"","what":"Pitch-Gamut Levels","title":"Kern pitch representation — kern","text":"table() automatically generate factor levels pitch data using gamut() function. makes sure tabulated data sorted logical order, includes missing pitches. simple/complex generic/specific arguments automatically passed gamut(); additional arguments can passed gamut using gamutArgs = list(...), syntactic sugar gamut(...). (Read gamut() docs explanation gamut generation.) feature used control table layout pitch data, well assure consistent tables grouping data. inPlace = TRUE special tabulation occur.","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/kern.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Kern pitch representation — kern","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/key.html"],"dir":"Reference","previous_headings":"","what":"Humdrum key interpretation — key","title":"Humdrum key interpretation — key","text":"Humdrum key interpretation","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/key.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Humdrum key interpretation — key","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/key.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Humdrum key interpretation — key","text":"x Input data, interpreted diatonic keys. Must atomic vector. Key key used parser, deparser, transposer. Defaults NULL. Must diatonicSet something coercable diatonicSet; must either length 1 length(x) parseArgs optional list arguments passed key parser. Defaults empty list(). Must list named arguments key parser.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/key.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Humdrum key interpretation — key","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/keyDeparsing.html"],"dir":"Reference","previous_headings":"","what":"Generating (","title":"Generating (","text":"humdrumR includes easy--use system generating variety diatonic key representations, can flexibly modified users. \"hood\" humdrumR represents tonal chord information using underlying representation, typically extracted input data using key parser. representation can \"deparsed\" variety predefined output formats, new formats create!","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/keyDeparsing.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Generating (","text":"Deparsing second step key function processing pipeline: Input representation |> Parsing |> Intermediate (diatonicSet) representation |> Transformation |> Deparsing (DEPARSING ARGS GO ) |> Output representation Various pitch representations can generated using predefined key functions like key() signature(), romanKey(). functions use common deparsing framework, specified using different combinations arguments deparser. modifying \"deparsing\" arguments, can exercise fine control want pitch information represented output.","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/keyFunctions.html"],"dir":"Reference","previous_headings":"","what":"Parsing and deparsing key information — keyFunctions","title":"Parsing and deparsing key information — keyFunctions","text":"functions can used extract \"translate,\" otherwise modify, data representing diatonic key information. functions :","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/keyFunctions.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Parsing and deparsing key information — keyFunctions","text":"x Input data, interpreted diatonic keys. Must atomic vector. Key key used parser, deparser, transposer. Defaults NULL. Must diatonicSet something coercable diatonicSet; must either length 1 length(x) parseArgs optional list arguments passed key parser. Defaults empty list(). Must list named arguments key parser.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/keyFunctions.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Parsing and deparsing key information — keyFunctions","text":"key() romanKey() signature()","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/keyParsing.html"],"dir":"Reference","previous_headings":"","what":"Parsing key information — keyParsing","title":"Parsing key information — keyParsing","text":"humdrumR includes easy--use powerful system parsing diatonic key information: various basic key representations (including numeric character-string representations) can \"parsed\"---read interpreted humdrumR. part, parsing automatically happens \"behind scenes\" whenever use humdrumR key function, like key() signature().","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/keyParsing.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Parsing key information — keyParsing","text":"","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/lag.html"],"dir":"Reference","previous_headings":"","what":"Shift data within a vector/matrix/data.frame — lag","title":"Shift data within a vector/matrix/data.frame — lag","text":"lag lead functions take input vectors, matrices, data.frames shifts data n indices. similar data.table::shift() function, additional options.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/lag.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Shift data within a vector/matrix/data.frame — lag","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/lag.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Shift data within a vector/matrix/data.frame — lag","text":"x input argument. list, atomic, matrix, data.frame. n amount lag/lead data. Defaults 0. Must natural number. n == 0, x returned unchanged. fill Tokens used pad outputs. Defaults NA. class x. wrap = FALSE parts output padded fill argument. wrap Whether wrap data. Defaults FALSE. Must logical. Must length 1. wrap = TRUE, data end (head tail) copied end output, \"wrapping\" data within data structure. groupby group data. vector list vectors; must length length(x). segment x delineated groupby vector(s) treated separately. margin dimension shift. Must numeric. Arrays data.frames can lagged lead multiple dimensions using margin argument: margin == 1 shifts across rows margin == 2 shifts across columns.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/lag.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Shift data within a vector/matrix/data.frame — lag","text":"lagged vector values original vector, except offset n indices. lag moves value high index (n > 0); lead opposite, moving value lower index (n > 0). n can positive negative---negative lags equivalent leads, vice versa. Values near end/beginning either \"wrapped\" opposite end vector, replaced/padded value fill argument. vector , b, c, d, e, f, g can lagged n==1 NA, , b, c, d, e, f. set wrap == TRUE, \"g\" moved beginning output: g, , b, c, d, e, f.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/lag.html"],"id":"grouping","dir":"Reference","previous_headings":"","what":"Grouping","title":"Shift data within a vector/matrix/data.frame — lag","text":"many cases want perform lagged calculations vector, across certain boundaries. example, vector includes data multiple pieces, want calculate melodic intervals pieces, within pieces. groupby argument indicates one, , grouping vectors, break x (input) argument groups. groupby vectors given, change vector indicates boundary. Value pairs cross groups treated beginning. Basically, using groupby argument function similar identical using tapply(x, groupby, laggedFunction, ...) using groupby expession call ().humdrumR. However, using groupby argument directly usually much faster, specially optimized functions. common use case humdrum data, looking \"melodies\" within spines. , want groupby = list(Piece, Spine, Path). fact, humdrumR () calls automatically feed three fields groupby arguments certain functions: mint, delta, sigma, lag, ditto, ioi, sumTies, hop, wort, wort.character. use delta call (), automatically calculate delta \"melodic\" way, within spine path piece. However, wanted, instance, calculate differences across spines (like harmonic intervals) manually set groupby = list(Piece, Record).","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/lilypond.html"],"dir":"Reference","previous_headings":"","what":"Lilypond pitch representation — lilypond","title":"Lilypond pitch representation — lilypond","text":"representation used represent (Western tonal) pitches Lilypond notation format. humdrumR, lilypond function relates pitch part Lilypond notation: Lilypond-like rhythms can creating using recip function. lilypond() applied humdrumR data class may use data's fields arguments. field names specified, first selectedField used x.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/lilypond.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Lilypond pitch representation — lilypond","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/lilypond.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Lilypond pitch representation — lilypond","text":"x Input data parse pitch information. x argument can (atomic) vector, tonalInterval, NULL. ... Arguments passed pitch deparser. also two hidden (advanced) arguments can specify: memoize deparse (see details ). generic \"specific\" pitch information (accidentals qualites) discarded? Defaults FALSE. Must singleton logical value: /switch. simple \"compound\" pitch information (octave/contour) discarded? Defaults FALSE. Must singleton logical value: /switch. Key input Key used parser, deparser, transposer. Defaults NULL. Must diatonicSet something coercable diatonicSet; must either length 1 length(x) transposeArgs optional list arguments passed special transpose() call. Defaults empty list(). Must list named arguments transpose(). parseArgs optional list arguments passed pitch parser. Defaults empty list(). Must list named arguments pitch parser. inPlace non-pitch information retained output string. Defaults FALSE. Must singleton logical value: /switch. argument effect input (x argument) character strings, extra, non-pitch information input strings \"besides\" pitch information. , inPlace = TRUE, output placed output string beside original non-pitch information. inPlace = FALSE, pitch output information returned (details ).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/lilypond.html"],"id":"basic-pitch-arguments","dir":"Reference","previous_headings":"","what":"Basic pitch arguments","title":"Lilypond pitch representation — lilypond","text":"pitch function standard arguments control details output. important generic simple arguments, allow control type pitch information returned.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/lilypond.html"],"id":"generic-vs-specific","dir":"Reference","previous_headings":"","what":"Generic vs Specific","title":"Lilypond pitch representation — lilypond","text":"generic = TRUE, specific pitch information (accidentals qualities) omitted output. alternative way controlling functionality, can use specific argument, specific == !generic. case atonal functions, \"generic\" version pitch output: example, semits('c#', generic = TRUE) return 0, \"generic\" version C# C, corresponds 0. However, note generic version pitch follows key, semits('c#', generic = TRUE, Key = ':') return 1!","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/lilypond.html"],"id":"simple-vs-compound","dir":"Reference","previous_headings":"","what":"Simple vs Compound","title":"Lilypond pitch representation — lilypond","text":"simple = TRUE, compound pitch information (octave contour) omitted output. alternative way controlling functionality, can use compound argument ,compound == !simple. actually one way might want divide compound intervals simple octave parts. example, might like call output -M2 (descending major 2nd) +m7 (ascending minor 7th octave ). functionality can controlled octave.round argument: see pitch deparsing documentation.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/lilypond.html"],"id":"key","dir":"Reference","previous_headings":"","what":"Key","title":"Lilypond pitch representation — lilypond","text":"Key argument must diatonicSet, something can parsed one. Key argument passed parser, deparser, transpose---unless alternate Key passed transposeArgs parseArgs. Various deparsing options use Key argument; example, use implicitSpecies (see advanced parsing section) dependent Key. use pitch function within special call withinHumdrum, humdrumR automatically pass Key field humdrum data function---means, cases, need explicitly anything Key argument! (want happen, need explicitly specify Key argument, Key = NULL.)","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/lilypond.html"],"id":"parse-arguments","dir":"Reference","previous_headings":"","what":"Parse arguments","title":"Lilypond pitch representation — lilypond","text":"parseArgs argument must list() (named) arguments passed input parser. example, input representation uses \"X\" represent double sharps, specify kern('CX5', parseArgs = list(doublesharp = 'X')) get correct result (\"cc##\"). convenient shorthand, \"syntactic sugar,\" can specify parseArgs alternate way: Simply input parse(args...) unnamed argument pitch function. example, can get exact result typing kern('CX5', parse(doublesharp = 'X')).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/lilypond.html"],"id":"transpose-arguments","dir":"Reference","previous_headings":"","what":"Transpose arguments","title":"Lilypond pitch representation — lilypond","text":"transposeArgs argument must list() (named) arguments passed internal call transpose(), allowing us easily transpose pitch information. example, type kern(c('C', 'D', 'E'), transposeArgs = list(= 'M9')) can get output c('d', 'e', 'f#'). possible transpose args : (tonalInterval, length == 1 | length == (x)) (diatonicSet, length == 1 | length == (x)) (diatonicSet, length == 1 | length == (x)) real (logical, length == 1) transposition real tonal? relative (logical, length == 1) key-wise transposition based relative parallel keys? convenient shorthand, \"syntactic sugar,\" can specify transposeArgs alternate way: Simply input transpose(args...) unnamed argument pitch function. example, can get exact result typing kern(c('C', 'D', 'E'), transpose(= 'M9')).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/lilypond.html"],"id":"transposing-by-interval","dir":"Reference","previous_headings":"","what":"Transposing by interval","title":"Lilypond pitch representation — lilypond","text":"calling transpose() directly, argument can anything coercable tonalInterval, output transposed amount. real = FALSE, tonal transposition (within Key) performed. details transposition behavior, check transpose() docs.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/lilypond.html"],"id":"transposing-by-key","dir":"Reference","previous_headings":"","what":"Transposing by key","title":"Lilypond pitch representation — lilypond","text":"Another way transposing specifying input (\"\") key output (\"\") key. default, Key argument passed transpose , nothing actually happens. Thus, specify either key key, transposition happen /key Key. course, specify transposition happen keys specify. use pitch function within special call withinHumdrum, humdrumR automatically pass Key field humdrum data function. specify key, Key field passed transpose key, result, pitches input transposed whatever keys target () key! real relative arguments give special control key-wise transposition works, check transpose() docs details!","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/lilypond.html"],"id":"in-place-parsing","dir":"Reference","previous_headings":"","what":"In-place parsing","title":"Lilypond pitch representation — lilypond","text":"humdrum data, character strings often encoded multiple pieces musical information right besides : example, **kern data might include tokens like \"4.ee-[. humdrumR parser (tonalInterval) automatically \"pull \" pitch information within strings, can find using appropriate known regular expressions. example, pitch('4.ee-[') returns Eb5. However, pitch functions (like pitch() kern()) option keep \"extra\" information return result \"place\"---.e., embedded right found input string. controlled inPlace argument, FALSE default. , pitch('4.ee-[', inPlace = TRUE) return 4.Eb5[---keeping \"4.\" \"[\". (obviously works input string, numeric!) Note inPlace = TRUE force functions like semits, normally return numeric values, return character strings input character string.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/lilypond.html"],"id":"pitch-gamut-levels","dir":"Reference","previous_headings":"","what":"Pitch-Gamut Levels","title":"Lilypond pitch representation — lilypond","text":"table() automatically generate factor levels pitch data using gamut() function. makes sure tabulated data sorted logical order, includes missing pitches. simple/complex generic/specific arguments automatically passed gamut(); additional arguments can passed gamut using gamutArgs = list(...), syntactic sugar gamut(...). (Read gamut() docs explanation gamut generation.) feature used control table layout pitch data, well assure consistent tables grouping data. inPlace = TRUE special tabulation occur.","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/lilypond.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Lilypond pitch representation — lilypond","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/meter.html"],"dir":"Reference","previous_headings":"","what":"Musical Meter in humdrumR — meter","title":"Musical Meter in humdrumR — meter","text":"HumdrumR represents musical meter, internally, using S4-class meter. meter simply collection regular irregular beat \"levels,\" level represented musical durations. example, meter 4/4 represented recip() beat-levels c(\"1\", \"2\", \"4\", \"8\", \"16\")---, whole-note, half-note, quater-note, eighth-note, sixteenth note. addition, meter tactus---\"main\" beat level.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/meter.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Musical Meter in humdrumR — meter","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/meter.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Musical Meter in humdrumR — meter","text":"x time signature list beats used construct meter. Must character string list either numeric character values. character input parsed time signature, used extract tactus measure levels. contents list parsed durations using rhythmInterval(): durations become levels meter. Failures parse input result error. measure, tick, tactus Durations use longest (measure), shortest (tick), tactus levels. Must singleton character numeric value, list containing single vector values. parsed durations using rhythmInterval(); parse failures lead errors. fill.levels \"gaps\" specified levels added meter? Must singleton logical character value; character values must '', '', '', 'neither'. TRUE shorthand ''; FALSE shorthand 'neither'. subdiv Subdivisions (fractions) tactus add meter. Must positive natural numbers. hyper Multiples measure duration add meter. Must positive natural numbers. tatum least common denominator levels added meter? Must singleton logical value: /switch.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/meter.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Musical Meter in humdrumR — meter","text":"Generating meters humdrumR can done easily meter() function. pass character string humdrum time signature, get meter object: example, meter(\"M4/4\") meter(\"M12/8\"). Additive time signatures, like meter(M2+3/8) also parseable.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/meter.html"],"id":"adding-or-removing-levels","dir":"Reference","previous_headings":"","what":"Adding or removing levels","title":"Musical Meter in humdrumR — meter","text":"Time signatures leave lot room interpretation. Even \"standard\" 4/4 time, number questions need consider analyzing meter: fastest level want count? 16ths? 32nds? 64ths? want count half-note level, \"\" full measure (whole-note) tactus quarter-note? want treat triplets tuplets? piece uses lot triplet eighth-notes? want consider hypermeter, measure level? Fortunately, humdrumR meter() function give options precisely specify metric levels. transparent way simply pass meter() list duration values, like meter(list(\"1\", \"4\", \"8\")). However, meter() includes number helpful arguments can used quickly streamline process defining meter. understand arguments, lets first clarify metric definitions used humdrumR: Measure: duration \"measure\" meter. .e., highest metric level, least common multiple levels. Hypermeter: Metric levels measure indicated time signature. Tactus: \"main,\" usually central, level. Subdivision: level directly tactus. Tick: smallest/fastest metric level. (\"ticks\" grid.) Tatum: smallest common denominator set beats/duration. Note fully specified metric grid tick tatum identical. However, require tick tatum.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/meter.html"],"id":"meter-construction-arguments","dir":"Reference","previous_headings":"","what":"Meter construction arguments","title":"Musical Meter in humdrumR — meter","text":"measure (largest) tick (smallest) levels capture full range meter. tactus typically somewhere middle two, required. fill.levels argument can used 'fill ' levels measure, tactus, tick. means room \"fit\" (geometrically) duple triple subdivisions higher lower level, subdivisions added meter. fill.levels argument must single character string, partially matching either '', '', '', 'neither'. \"\" means fill gap tactus measure; \"\" means fill gap tactus tick. shortcut, logical TRUE FALSE can used alternative way specifiying '' 'neither', respectively. example, start levels measure-tactus-tick combination c(\"1\", \"4\", \"16\"), fill.levels = TRUE, fill levels \"2\" \"8\". tick argument can used directly specify tick meter. especially useful parsing datasets multiple meters, want force use tick value. example, meter(TimeSignature, tick = '32'). tick argument must single value can parsed rhythmic duration. subdiv argument can used explicitly control tactus subdivided. subdiv natural number (greater 1), divide tactus . Similarly, hyper argument natural number explicitly multiply measure . Thus, hyper = 2 adds two-measure hyper meter. tatum argument, TRUE, causes tatum metric levels added meter (already present). useful, example, specify meter mix duple triple levels want make sure tick meter tatum levels. example, levels c(\"4\", \"6\", \"8\"), tatum = TRUE add level \"24\" meter.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/meter.html"],"id":"constructing-meters-from-time-signatures","dir":"Reference","previous_headings":"","what":"Constructing meters from time signatures","title":"Musical Meter in humdrumR — meter","text":"\"meter construction arguments\" can also used reading time signatures. allows use time signatures datasets, maintaining precise control metric levels used. example, command meter(\"M4/4\", fill.levels = FALSE) generates meter levels c(\"1\", \"4\", \"16\"). add eighth-note level adding subdiv = 2, triple-eighth-notes subdiv = 3. add triplet-eighth-notes (subdiv = 3), might want add tatum = TRUE, automatically calculate common tatum levels---case, adding forty-eighth notes meter. opposite end, hyper = 4 add four-measure hyper meter top 4/4 bar. Finally, tactus argument used choose another tactus, like tactus = \"2\". additional, unnamed arguments meter() parsed durations, added levels meter.","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/metlev.html"],"dir":"Reference","previous_headings":"","what":"Count or measure metric position — metlev","title":"Count or measure metric position — metlev","text":"functions take vectors rhythmic duration values compute metric position rhythmic onset. metlev() identifies metric level onset; metcount() counts beats within measure; metsubpos() measures distance onset nearest metric beat. metcount() metsubpos() parallel general timecount() subpos() functions.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/metlev.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Count or measure metric position — metlev","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/metlev.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Count or measure metric position — metlev","text":"dur input vector rhythmic durations. Must character numeric vector. parsed using rhythmInterval(); Wherever input parsed duration, element treated duration zero. meter meter(s) compute levels . Defaults standard, five-level duple (4/4) meter. Must meter() object character vector. character input, string parsed using meter(); failure parse result error. pickup pickup (anacrusis)? Defaults NULL Must logical length(x), NULL. See \"Pickups\" section . value output levels represented rhythmic duration values? Defaults TRUE. Must singleton logical value: /switch. offBeats -beat onsets numbered output, NA? Defaults TRUE. Must single logical value: /switch. remainderSubdivides -beat onsets associated beat levels evenly subdivide? Defaults FALSE. singleton logical value: /switch. groupby list vectors group x. Defaults list(). Must list; every element list must length length(x). function -record timeline, groupby list music include named Piece Record fields. Luckily, automatically passed ().humdrumR, need worry ! parseArgs optional list arguments passed rhythm parser. Defaults empty list(). Must list named arguments rhythm parser. level metric level counted? Defaults tactus meter. single character value positive natural number. character string input must recip() value, matching beat level meter. numeric input directly indicates level meter, starting highest level (1).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/metlev.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Count or measure metric position — metlev","text":"Watch ! met...() functions require meter information output highly dependent interpret meter scores. full discussion meter can represented, parsed, created humdrumR, see meter() manual. Effective use meter() function essential use metlev(), metcount(), metsubpos().","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/metlev.html"],"id":"metric-levels","dir":"Reference","previous_headings":"","what":"Metric levels","title":"Count or measure metric position — metlev","text":"metlev() identifies \"highest\" (longest) metric level onset lands /: example, 4/4 time: onset downbeat highest level , whole-note level; onset beat three 4/4 measure half-note level; Onsets backbeats (beats two two) fall quarter-note level; next level eighth-note level, quarter-note beat; etc. metlev() output expresses beat levels duration level, recip() format default. whole-note level \"1\" quarter-note level (backbeats) \"4\". can specify different deparsing function (like duration()) using deparser argument. (deparser NULL, rational() numbers returned.) Another option express metric levels simply natural numbers, can achieve argument value = FALSE. case, top level meter 1, next lower-level incrementing : .e., quarter-note level (4/4) 3, sixteenth-note level 5.","code":""},{"path":[],"code":""},{"path":[],"code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/metlev.html"],"id":"metric-counts","dir":"Reference","previous_headings":"","what":"Metric counts","title":"Count or measure metric position — metlev","text":"metcount() function counts one beat level metric hierarchy, within next highest level. full duple meter, counts always simply 1, 2, 1, 2, etc. Meters triple level get 1, 2, 3, etc. level want count controlled level argument, can either character string recip() format natural number (1 top level, 2 next lowest level, etc.).","code":""},{"path":[],"code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/metlev.html"],"id":"-meter-counts--1","dir":"Reference","previous_headings":"","what":"6/8 meter counts:","title":"Count or measure metric position — metlev","text":"case 4/4, want count 1, 2, 3, 4, need make meter() object include half-note level.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/metlev.html"],"id":"-meter-with-no-half-note-level-","dir":"Reference","previous_headings":"","what":"4/4 meter with no half-note level:","title":"Count or measure metric position — metlev","text":"can meter('M4/4', fill.levels = '').","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/metlev.html"],"id":"metric-subpositions","dir":"Reference","previous_headings":"","what":"Metric subpositions","title":"Count or measure metric position — metlev","text":"cases, onsets may occur land beat specified meter. fast beat levels (e.g., 32nd notes), triplets, tuplets. cases, might consider adding levels meter(); example, want 32nd-note level 4/4, use meter('M4/4', tick = '32'). metlev() metcount(), offBeats argument can set FALSE cause offbeat onsets return NA. Another option use metsubpos(), measures far onset nearest associated beat meter. default, -beat onsets always associated closets previous position level meter. remainderSubdivides argument TRUE, -beat onsets associated previous metric level subposition makes even subdivision .","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/metlev.html"],"id":"pickups","dir":"Reference","previous_headings":"","what":"Pickups","title":"Count or measure metric position — metlev","text":"Another option pass pickup argument logical vector length input x. Within piece/group, block TRUE values beginning pickup vector indicate pickup. first index pickup logical FALSE used starting point timeline/timecount; earlier (pickup == TRUE) points negative numbers, measured backwards start index. humdrumR, datapoints first barline record (=) labeled Bar == 0 Bar field. Thus, common use pickup argument within(humData, timeline(Token, pickup = Bar < 1), makes downbeat first complete bar 1 starting point timeline---notes pickup bars negative timeline.","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/metlev.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Count or measure metric position — metlev","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/mutualInfo.html"],"dir":"Reference","previous_headings":"","what":"Calculate Mutual Information of variables — mutualInfo","title":"Calculate Mutual Information of variables — mutualInfo","text":"Calculate Mutual Information variables","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/mutualInfo.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Calculate Mutual Information of variables — mutualInfo","text":"","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/nbeats.html"],"dir":"Reference","previous_headings":"","what":"Counting beats — nbeats","title":"Counting beats — nbeats","text":"Counting beats","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/nbeats.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Counting beats — nbeats","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/notehead.html"],"dir":"Reference","previous_headings":"","what":"Note value representation of duration — notehead","title":"Note value representation of duration — notehead","text":"function outputs duration information traditional note value. symbols, Western notation. notehead() applied humdrumR data class may use data's fields arguments. field names specified, first selectedField used x.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/notehead.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Note value representation of duration — notehead","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/notehead.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Note value representation of duration — notehead","text":"x input vector. x argument can (atomic) vector, rational (rhythmInterval), NULL. Must parsable rhythm infromation. ... Arguments passed rhythm parser. also two hidden (advanced) arguments can specify: memoize deparse (see details ). scale numeric rational value used output unit measurement. Defaults rational(1, 1). Must numeric rational. inPlace non-rhythm information retained output string? Defaults FALSE. Must singleton logical value: /switch. Defaults FALSE. singleton logical value, NA. See \"Grace notes\" section .","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/notehead.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Note value representation of duration — notehead","text":"Note-value symbols simply encoded character vectors, since unicode character table includes musical symbols. course, depends system unicode font installed working: symbols might show properly machine! fact, symbols always print bit strangely (alignment) can hard manipulate like \"normal\" character strings. note-value symbols useful making labels plots. example, tabulate note values use barplot(), get nice bar labels:","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/notehead.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Note value representation of duration — notehead","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/octave.html"],"dir":"Reference","previous_headings":"","what":"Extract octave. — octave","title":"Extract octave. — octave","text":"Returns octave pitch falls . default, middle-C bottom zeroth-octave, can changed octave.offset argument. octave labels (like lilypond()-style marks) can used set octave.integer = FALSE.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/octave.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Extract octave. — octave","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/octave.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Extract octave. — octave","text":"x Input data parse pitch information. x argument can (atomic) vector, tonalInterval, NULL. ... Arguments passed pitch deparser. also two hidden (advanced) arguments can specify: memoize deparse (see details ). generic \"specific\" pitch information (accidentals qualites) discarded? Defaults FALSE. Must singleton logical value: /switch. simple \"compound\" pitch information (octave/contour) discarded? Defaults FALSE. Must singleton logical value: /switch. Key input Key used parser, deparser, transposer. Defaults NULL. Must diatonicSet something coercable diatonicSet; must either length 1 length(x) transposeArgs optional list arguments passed special transpose() call. Defaults empty list(). Must list named arguments transpose(). parseArgs optional list arguments passed pitch parser. Defaults empty list(). Must list named arguments pitch parser. inPlace non-pitch information retained output string. Defaults FALSE. Must singleton logical value: /switch. argument effect input (x argument) character strings, extra, non-pitch information input strings \"besides\" pitch information. , inPlace = TRUE, output placed output string beside original non-pitch information. inPlace = FALSE, pitch output information returned (details ).","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/octave.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Extract octave. — octave","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/p.html"],"dir":"Reference","previous_headings":"","what":"Tabulate and cross proportions — %*%,probabilityDistribution,probabilityDistribution-method","title":"Tabulate and cross proportions — %*%,probabilityDistribution,probabilityDistribution-method","text":"Tabulate cross proportions","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/p.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Tabulate and cross proportions — %*%,probabilityDistribution,probabilityDistribution-method","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/partialMatching.html"],"dir":"Reference","previous_headings":"","what":"What is ","title":"What is ","text":"\"partial matching\"?","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/partialMatching.html"],"id":"partial-matching-explained","dir":"Reference","previous_headings":"","what":"Partial matching explained","title":"What is ","text":"R useful functionality called \"partial matching,\" can match incomplete character string variable name list options. achieved using base-R function pmatch(), many R functions make use , many humdrumR functions. example, say data.frame (call df) three columns: \"Number\", \"Letter\", \"Date\": want access Number column, programming languages require write least df$Number. However, R give correct field even write df$Numb, df$Num, even df$N. partial matching! matching happens left--right, long get beginning variable right, work. course, partial matching works point string matches unambiguously. example, added Dare column df, df$D df$Da return NULL ambiguous. need write least Dar Dat get Dare Date columns respectively.","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pc.html"],"dir":"Reference","previous_headings":"","what":"Representation of atonal pitch classes — pc","title":"Representation of atonal pitch classes — pc","text":"encoded humdrum **pc interpretation. pc() applied humdrumR data class may use data's fields arguments. field names specified, first selectedField used x.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pc.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Representation of atonal pitch classes — pc","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pc.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Representation of atonal pitch classes — pc","text":"x Input data parse pitch information. x argument can (atomic) vector, tonalInterval, NULL. ... Arguments passed pitch deparser. also two hidden (advanced) arguments can specify: memoize deparse (see details ). generic \"specific\" pitch information (accidentals qualites) discarded? Defaults FALSE. Must singleton logical value: /switch. simple \"compound\" pitch information (octave/contour) discarded? Defaults FALSE. Must singleton logical value: /switch. Key input Key used parser, deparser, transposer. Defaults NULL. Must diatonicSet something coercable diatonicSet; must either length 1 length(x) transposeArgs optional list arguments passed special transpose() call. Defaults empty list(). Must list named arguments transpose(). parseArgs optional list arguments passed pitch parser. Defaults empty list(). Must list named arguments pitch parser. inPlace non-pitch information retained output string. Defaults FALSE. Must singleton logical value: /switch. argument effect input (x argument) character strings, extra, non-pitch information input strings \"besides\" pitch information. , inPlace = TRUE, output placed output string beside original non-pitch information. inPlace = FALSE, pitch output information returned (details ). ten shorthand-symbol use 10. Defaults \"\". Must single character string. NULL, \"10\" used shorthand. eleven shorthand-symbol use 11. Defaults \"B\". Must single character string. NULL, \"11\" used shorthand.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pc.html"],"id":"basic-pitch-arguments","dir":"Reference","previous_headings":"","what":"Basic pitch arguments","title":"Representation of atonal pitch classes — pc","text":"pitch function standard arguments control details output. important generic simple arguments, allow control type pitch information returned.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pc.html"],"id":"generic-vs-specific","dir":"Reference","previous_headings":"","what":"Generic vs Specific","title":"Representation of atonal pitch classes — pc","text":"generic = TRUE, specific pitch information (accidentals qualities) omitted output. alternative way controlling functionality, can use specific argument, specific == !generic. case atonal functions, \"generic\" version pitch output: example, semits('c#', generic = TRUE) return 0, \"generic\" version C# C, corresponds 0. However, note generic version pitch follows key, semits('c#', generic = TRUE, Key = ':') return 1!","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pc.html"],"id":"simple-vs-compound","dir":"Reference","previous_headings":"","what":"Simple vs Compound","title":"Representation of atonal pitch classes — pc","text":"simple = TRUE, compound pitch information (octave contour) omitted output. alternative way controlling functionality, can use compound argument ,compound == !simple. actually one way might want divide compound intervals simple octave parts. example, might like call output -M2 (descending major 2nd) +m7 (ascending minor 7th octave ). functionality can controlled octave.round argument: see pitch deparsing documentation.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pc.html"],"id":"key","dir":"Reference","previous_headings":"","what":"Key","title":"Representation of atonal pitch classes — pc","text":"Key argument must diatonicSet, something can parsed one. Key argument passed parser, deparser, transpose---unless alternate Key passed transposeArgs parseArgs. Various deparsing options use Key argument; example, use implicitSpecies (see advanced parsing section) dependent Key. use pitch function within special call withinHumdrum, humdrumR automatically pass Key field humdrum data function---means, cases, need explicitly anything Key argument! (want happen, need explicitly specify Key argument, Key = NULL.)","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pc.html"],"id":"parse-arguments","dir":"Reference","previous_headings":"","what":"Parse arguments","title":"Representation of atonal pitch classes — pc","text":"parseArgs argument must list() (named) arguments passed input parser. example, input representation uses \"X\" represent double sharps, specify kern('CX5', parseArgs = list(doublesharp = 'X')) get correct result (\"cc##\"). convenient shorthand, \"syntactic sugar,\" can specify parseArgs alternate way: Simply input parse(args...) unnamed argument pitch function. example, can get exact result typing kern('CX5', parse(doublesharp = 'X')).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pc.html"],"id":"transpose-arguments","dir":"Reference","previous_headings":"","what":"Transpose arguments","title":"Representation of atonal pitch classes — pc","text":"transposeArgs argument must list() (named) arguments passed internal call transpose(), allowing us easily transpose pitch information. example, type kern(c('C', 'D', 'E'), transposeArgs = list(= 'M9')) can get output c('d', 'e', 'f#'). possible transpose args : (tonalInterval, length == 1 | length == (x)) (diatonicSet, length == 1 | length == (x)) (diatonicSet, length == 1 | length == (x)) real (logical, length == 1) transposition real tonal? relative (logical, length == 1) key-wise transposition based relative parallel keys? convenient shorthand, \"syntactic sugar,\" can specify transposeArgs alternate way: Simply input transpose(args...) unnamed argument pitch function. example, can get exact result typing kern(c('C', 'D', 'E'), transpose(= 'M9')).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pc.html"],"id":"transposing-by-interval","dir":"Reference","previous_headings":"","what":"Transposing by interval","title":"Representation of atonal pitch classes — pc","text":"calling transpose() directly, argument can anything coercable tonalInterval, output transposed amount. real = FALSE, tonal transposition (within Key) performed. details transposition behavior, check transpose() docs.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pc.html"],"id":"transposing-by-key","dir":"Reference","previous_headings":"","what":"Transposing by key","title":"Representation of atonal pitch classes — pc","text":"Another way transposing specifying input (\"\") key output (\"\") key. default, Key argument passed transpose , nothing actually happens. Thus, specify either key key, transposition happen /key Key. course, specify transposition happen keys specify. use pitch function within special call withinHumdrum, humdrumR automatically pass Key field humdrum data function. specify key, Key field passed transpose key, result, pitches input transposed whatever keys target () key! real relative arguments give special control key-wise transposition works, check transpose() docs details!","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pc.html"],"id":"in-place-parsing","dir":"Reference","previous_headings":"","what":"In-place parsing","title":"Representation of atonal pitch classes — pc","text":"humdrum data, character strings often encoded multiple pieces musical information right besides : example, **kern data might include tokens like \"4.ee-[. humdrumR parser (tonalInterval) automatically \"pull \" pitch information within strings, can find using appropriate known regular expressions. example, pitch('4.ee-[') returns Eb5. However, pitch functions (like pitch() kern()) option keep \"extra\" information return result \"place\"---.e., embedded right found input string. controlled inPlace argument, FALSE default. , pitch('4.ee-[', inPlace = TRUE) return 4.Eb5[---keeping \"4.\" \"[\". (obviously works input string, numeric!) Note inPlace = TRUE force functions like semits, normally return numeric values, return character strings input character string.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pc.html"],"id":"pitch-gamut-levels","dir":"Reference","previous_headings":"","what":"Pitch-Gamut Levels","title":"Representation of atonal pitch classes — pc","text":"table() automatically generate factor levels pitch data using gamut() function. makes sure tabulated data sorted logical order, includes missing pitches. simple/complex generic/specific arguments automatically passed gamut(); additional arguments can passed gamut using gamutArgs = list(...), syntactic sugar gamut(...). (Read gamut() docs explanation gamut generation.) feature used control table layout pitch data, well assure consistent tables grouping data. inPlace = TRUE special tabulation occur.","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pc.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Representation of atonal pitch classes — pc","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pdist.html"],"dir":"Reference","previous_headings":"","what":"Tabulate and cross proportions — pdist","title":"Tabulate and cross proportions — pdist","text":"Tabulate cross proportions","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pdist.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Tabulate and cross proportions — pdist","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitch.html"],"dir":"Reference","previous_headings":"","what":"Scientific pitch representation — pitch","title":"Scientific pitch representation — pitch","text":"Scientific pitch standard approach representing pitch traditional Western music. pitch() applied humdrumR data class may use data's fields arguments. field names specified, first selectedField used x.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitch.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Scientific pitch representation — pitch","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitch.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Scientific pitch representation — pitch","text":"x Input data parse pitch information. x argument can (atomic) vector, tonalInterval, NULL. ... Arguments passed pitch deparser. also two hidden (advanced) arguments can specify: memoize deparse (see details ). generic \"specific\" pitch information (accidentals qualites) discarded? Defaults FALSE. Must singleton logical value: /switch. simple \"compound\" pitch information (octave/contour) discarded? Defaults FALSE. Must singleton logical value: /switch. Key input Key used parser, deparser, transposer. Defaults NULL. Must diatonicSet something coercable diatonicSet; must either length 1 length(x) transposeArgs optional list arguments passed special transpose() call. Defaults empty list(). Must list named arguments transpose(). parseArgs optional list arguments passed pitch parser. Defaults empty list(). Must list named arguments pitch parser. inPlace non-pitch information retained output string. Defaults FALSE. Must singleton logical value: /switch. argument effect input (x argument) character strings, extra, non-pitch information input strings \"besides\" pitch information. , inPlace = TRUE, output placed output string beside original non-pitch information. inPlace = FALSE, pitch output information returned (details ).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitch.html"],"id":"basic-pitch-arguments","dir":"Reference","previous_headings":"","what":"Basic pitch arguments","title":"Scientific pitch representation — pitch","text":"pitch function standard arguments control details output. important generic simple arguments, allow control type pitch information returned.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitch.html"],"id":"generic-vs-specific","dir":"Reference","previous_headings":"","what":"Generic vs Specific","title":"Scientific pitch representation — pitch","text":"generic = TRUE, specific pitch information (accidentals qualities) omitted output. alternative way controlling functionality, can use specific argument, specific == !generic. case atonal functions, \"generic\" version pitch output: example, semits('c#', generic = TRUE) return 0, \"generic\" version C# C, corresponds 0. However, note generic version pitch follows key, semits('c#', generic = TRUE, Key = ':') return 1!","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitch.html"],"id":"simple-vs-compound","dir":"Reference","previous_headings":"","what":"Simple vs Compound","title":"Scientific pitch representation — pitch","text":"simple = TRUE, compound pitch information (octave contour) omitted output. alternative way controlling functionality, can use compound argument ,compound == !simple. actually one way might want divide compound intervals simple octave parts. example, might like call output -M2 (descending major 2nd) +m7 (ascending minor 7th octave ). functionality can controlled octave.round argument: see pitch deparsing documentation.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitch.html"],"id":"key","dir":"Reference","previous_headings":"","what":"Key","title":"Scientific pitch representation — pitch","text":"Key argument must diatonicSet, something can parsed one. Key argument passed parser, deparser, transpose---unless alternate Key passed transposeArgs parseArgs. Various deparsing options use Key argument; example, use implicitSpecies (see advanced parsing section) dependent Key. use pitch function within special call withinHumdrum, humdrumR automatically pass Key field humdrum data function---means, cases, need explicitly anything Key argument! (want happen, need explicitly specify Key argument, Key = NULL.)","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitch.html"],"id":"parse-arguments","dir":"Reference","previous_headings":"","what":"Parse arguments","title":"Scientific pitch representation — pitch","text":"parseArgs argument must list() (named) arguments passed input parser. example, input representation uses \"X\" represent double sharps, specify kern('CX5', parseArgs = list(doublesharp = 'X')) get correct result (\"cc##\"). convenient shorthand, \"syntactic sugar,\" can specify parseArgs alternate way: Simply input parse(args...) unnamed argument pitch function. example, can get exact result typing kern('CX5', parse(doublesharp = 'X')).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitch.html"],"id":"transpose-arguments","dir":"Reference","previous_headings":"","what":"Transpose arguments","title":"Scientific pitch representation — pitch","text":"transposeArgs argument must list() (named) arguments passed internal call transpose(), allowing us easily transpose pitch information. example, type kern(c('C', 'D', 'E'), transposeArgs = list(= 'M9')) can get output c('d', 'e', 'f#'). possible transpose args : (tonalInterval, length == 1 | length == (x)) (diatonicSet, length == 1 | length == (x)) (diatonicSet, length == 1 | length == (x)) real (logical, length == 1) transposition real tonal? relative (logical, length == 1) key-wise transposition based relative parallel keys? convenient shorthand, \"syntactic sugar,\" can specify transposeArgs alternate way: Simply input transpose(args...) unnamed argument pitch function. example, can get exact result typing kern(c('C', 'D', 'E'), transpose(= 'M9')).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitch.html"],"id":"transposing-by-interval","dir":"Reference","previous_headings":"","what":"Transposing by interval","title":"Scientific pitch representation — pitch","text":"calling transpose() directly, argument can anything coercable tonalInterval, output transposed amount. real = FALSE, tonal transposition (within Key) performed. details transposition behavior, check transpose() docs.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitch.html"],"id":"transposing-by-key","dir":"Reference","previous_headings":"","what":"Transposing by key","title":"Scientific pitch representation — pitch","text":"Another way transposing specifying input (\"\") key output (\"\") key. default, Key argument passed transpose , nothing actually happens. Thus, specify either key key, transposition happen /key Key. course, specify transposition happen keys specify. use pitch function within special call withinHumdrum, humdrumR automatically pass Key field humdrum data function. specify key, Key field passed transpose key, result, pitches input transposed whatever keys target () key! real relative arguments give special control key-wise transposition works, check transpose() docs details!","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitch.html"],"id":"in-place-parsing","dir":"Reference","previous_headings":"","what":"In-place parsing","title":"Scientific pitch representation — pitch","text":"humdrum data, character strings often encoded multiple pieces musical information right besides : example, **kern data might include tokens like \"4.ee-[. humdrumR parser (tonalInterval) automatically \"pull \" pitch information within strings, can find using appropriate known regular expressions. example, pitch('4.ee-[') returns Eb5. However, pitch functions (like pitch() kern()) option keep \"extra\" information return result \"place\"---.e., embedded right found input string. controlled inPlace argument, FALSE default. , pitch('4.ee-[', inPlace = TRUE) return 4.Eb5[---keeping \"4.\" \"[\". (obviously works input string, numeric!) Note inPlace = TRUE force functions like semits, normally return numeric values, return character strings input character string.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitch.html"],"id":"pitch-gamut-levels","dir":"Reference","previous_headings":"","what":"Pitch-Gamut Levels","title":"Scientific pitch representation — pitch","text":"table() automatically generate factor levels pitch data using gamut() function. makes sure tabulated data sorted logical order, includes missing pitches. simple/complex generic/specific arguments automatically passed gamut(); additional arguments can passed gamut using gamutArgs = list(...), syntactic sugar gamut(...). (Read gamut() docs explanation gamut generation.) feature used control table layout pitch data, well assure consistent tables grouping data. inPlace = TRUE special tabulation occur.","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitch.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Scientific pitch representation — pitch","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchDeparsing.html"],"dir":"Reference","previous_headings":"","what":"Generating (","title":"Generating (","text":"humdrumR includes easy--use system generating variety tonal (atonal) pitch representations, can flexibly modified users. \"hood\" humdrumR represents tonal pitch information using underlying representation, typically extracted input data using pitch parser. representation can \"deparsed\" variety predefined output formats (like **kern), new formats create!","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchDeparsing.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Generating (","text":"Deparsing second step pitch function processing pipeline: Input representation |> Parsing |> Intermediate (tonalInterval) representation |> Transformation |> Deparsing (DEPARSING ARGS GO ) |> Output representation Various pitch representations like **kern, **solfa, **semits can generated using predefined pitch functions like kern() semits(), solfa() respectively. functions use common deparsing framework, specified using different combinations arguments deparser.modifying \"deparsing\" arguments, can exercise fine control want pitch information represented output. documentation talks deparsing step. overview parsing process, look .","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchDeparsing.html"],"id":"basic-pitch-arguments","dir":"Reference","previous_headings":"","what":"Basic pitch arguments","title":"Generating (","text":"pitch function standard arguments control details output. important generic simple arguments, allow control type pitch information returned.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchDeparsing.html"],"id":"generic-vs-specific","dir":"Reference","previous_headings":"","what":"Generic vs Specific","title":"Generating (","text":"generic = TRUE, specific pitch information (accidentals qualities) omitted output. alternative way controlling functionality, can use specific argument, specific == !generic. case atonal functions, \"generic\" version pitch output: example, semits('c#', generic = TRUE) return 0, \"generic\" version C# C, corresponds 0. However, note generic version pitch follows key, semits('c#', generic = TRUE, Key = ':') return 1!","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchDeparsing.html"],"id":"simple-vs-compound","dir":"Reference","previous_headings":"","what":"Simple vs Compound","title":"Generating (","text":"simple = TRUE, compound pitch information (octave contour) omitted output. alternative way controlling functionality, can use compound argument ,compound == !simple. actually one way might want divide compound intervals simple octave parts. example, might like call output -M2 (descending major 2nd) +m7 (ascending minor 7th octave ). functionality can controlled octave.round argument: see pitch deparsing documentation.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchDeparsing.html"],"id":"key","dir":"Reference","previous_headings":"","what":"Key","title":"Generating (","text":"Key argument must diatonicSet, something can parsed one. Key argument passed parser, deparser, transpose---unless alternate Key passed transposeArgs parseArgs. Various deparsing options use Key argument; example, use implicitSpecies (see advanced parsing section) dependent Key. use pitch function within special call withinHumdrum, humdrumR automatically pass Key field humdrum data function---means, cases, need explicitly anything Key argument! (want happen, need explicitly specify Key argument, Key = NULL.)","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchDeparsing.html"],"id":"parse-arguments","dir":"Reference","previous_headings":"","what":"Parse arguments","title":"Generating (","text":"parseArgs argument must list() (named) arguments passed input parser. example, input representation uses \"X\" represent double sharps, specify kern('CX5', parseArgs = list(doublesharp = 'X')) get correct result (\"cc##\"). convenient shorthand, \"syntactic sugar,\" can specify parseArgs alternate way: Simply input parse(args...) unnamed argument pitch function. example, can get exact result typing kern('CX5', parse(doublesharp = 'X')).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchDeparsing.html"],"id":"transpose-arguments","dir":"Reference","previous_headings":"","what":"Transpose arguments","title":"Generating (","text":"transposeArgs argument must list() (named) arguments passed internal call transpose(), allowing us easily transpose pitch information. example, type kern(c('C', 'D', 'E'), transposeArgs = list(= 'M9')) can get output c('d', 'e', 'f#'). possible transpose args : (tonalInterval, length == 1 | length == (x)) (diatonicSet, length == 1 | length == (x)) (diatonicSet, length == 1 | length == (x)) real (logical, length == 1) transposition real tonal? relative (logical, length == 1) key-wise transposition based relative parallel keys? convenient shorthand, \"syntactic sugar,\" can specify transposeArgs alternate way: Simply input transpose(args...) unnamed argument pitch function. example, can get exact result typing kern(c('C', 'D', 'E'), transpose(= 'M9')).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchDeparsing.html"],"id":"transposing-by-interval","dir":"Reference","previous_headings":"","what":"Transposing by interval","title":"Generating (","text":"calling transpose() directly, argument can anything coercable tonalInterval, output transposed amount. real = FALSE, tonal transposition (within Key) performed. details transposition behavior, check transpose() docs.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchDeparsing.html"],"id":"transposing-by-key","dir":"Reference","previous_headings":"","what":"Transposing by key","title":"Generating (","text":"Another way transposing specifying input (\"\") key output (\"\") key. default, Key argument passed transpose , nothing actually happens. Thus, specify either key key, transposition happen /key Key. course, specify transposition happen keys specify. use pitch function within special call withinHumdrum, humdrumR automatically pass Key field humdrum data function. specify key, Key field passed transpose key, result, pitches input transposed whatever keys target () key! real relative arguments give special control key-wise transposition works, check transpose() docs details!","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchDeparsing.html"],"id":"in-place-parsing","dir":"Reference","previous_headings":"","what":"In-place parsing","title":"Generating (","text":"humdrum data, character strings often encoded multiple pieces musical information right besides : example, **kern data might include tokens like \"4.ee-[. humdrumR parser (tonalInterval) automatically \"pull \" pitch information within strings, can find using appropriate known regular expressions. example, pitch('4.ee-[') returns Eb5. However, pitch functions (like pitch() kern()) option keep \"extra\" information return result \"place\"---.e., embedded right found input string. controlled inPlace argument, FALSE default. , pitch('4.ee-[', inPlace = TRUE) return 4.Eb5[---keeping \"4.\" \"[\". (obviously works input string, numeric!) Note inPlace = TRUE force functions like semits, normally return numeric values, return character strings input character string.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchDeparsing.html"],"id":"deparsing-arguments","dir":"Reference","previous_headings":"","what":"Deparsing arguments","title":"Generating (","text":"following \"advanced\" deparsing arguments available (read details ): Steps step.labels step.signed Species (accidentals qualities) qualities specifier.maximum Accidentals natural, flat, sharp, doubleflat, doublesharp Qualities perfect, major, minor, augment, diminish Implicit vs Explicit Species implicitSpecies absoluteSpecies explicitNaturals cautionary memory, memoryWindows Octave octave.integer , , octave.offset octave.round octave.relative, octave.absolute String parsing parts sep Note deparsing arguments similar (sometimes identical) parallel parsing arguments. \"advanced\" arguments can used directly pitch function: example, kern(x, qualities = TRUE). humdrumR pitch functions associated default deparsing arguments. example, use kern(), flat set (default) \"-\". However, wanted print **kern-like pitch data, except different flat symbol, like \"_\", modify deparser: kern('Eb5', flat = \"_\"). overrides default value **kern, output \"ee_\" instead \"ee-\".","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchDeparsing.html"],"id":"steps","dir":"Reference","previous_headings":"","what":"Steps","title":"Generating (","text":"representations \"tonal\" pitch information include representation diatonic steps. can control deparser writes diatonic steps using step.labels argument. step.labels argument must atomic vector unique values, length positive multiple seven. Examples step.labels arguments currently used humdrumR pitch functions include: step.labels = c('', 'B', 'C', 'D', 'E', 'F', 'G') step.labels = c('', 'II', 'III', 'IV', 'V', 'VI', 'VII') step.labels = c('d', 'r', 'm', 'f', 's', 'l', 't') step.labels NULL, steps assumed printed integers, including negative integers representing downward steps. also step.signed (logical, length == 1) argument: step.signed = TRUE, lowercase versions step.labels interpreted negative (downward) steps uppercase versions step.labels interpreted positive (upwards) steps. option used, example, default kern() helmholtz() parsers.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchDeparsing.html"],"id":"species","dir":"Reference","previous_headings":"","what":"Species","title":"Generating (","text":"tonal pitch representations, \"specific\" versions tonal pitches---tonal \"species\"---indicated \"specifiers\": either accidentals qualities. qualities (logical, length == 1) argument indicates whether accidentals used (qualities = FALSE) qualities (qualities = TRUE). specifiers can repeated number times, like \"triple sharps\" \"doubly augmented\"; specifier.maximum (integer, length == 1) argument sets maximum limit number specifiers write. example, force triple sharps (\"###\") double sharps (\"##\") deparse just \"#\", specifying specifier.maximum = 1L.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchDeparsing.html"],"id":"accidentals","dir":"Reference","previous_headings":"","what":"Accidentals","title":"Generating (","text":"qualities = FALSE deparser print accidentals three types: naturals, flats, sharps. natural, flat, /sharp (character, length == 1) arguments can used indicate accidentals printed output. example, set kern('Eb5', flat = 'flat') get output \"eeflat\". Examples accidental argument combinations currently used humdrumR pitch functions include: (flat = \"b\", sharp = \"#\") -> pitch() (flat = \"-\", sharp = \"#\") -> kern() (flat = \"es\", sharp = \"\") -> lilypond() (flat = \"-\", sharp = \"+\") -> degree() doubleflat, doublesharp (character, length == 1) arguments NULL default, can set special symbol wanted represent two sharps flats. example, modify pitch() use special double sharp symbol: pitch(\"f##\", doublesharp = \"x\") output \"Fx4\". printing naturals controlled natural argument. However, default, humdrumR deparsers printing naturals. can force naturals print setting explicitNaturals (logical, length == 1) argument TRUE. exact behavior explicitNaturals depends implicitSpecies, absoluteSpecies, Key argument (details ).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchDeparsing.html"],"id":"qualities","dir":"Reference","previous_headings":"","what":"Qualities","title":"Generating (","text":"qualities = TRUE deparser print qualities, five types: perfect, minor, major, augmented, diminished. perfect, major, minor, diminish, /augment (character, length == 1) arguments can used indicate qualities printed output. (Note: talking interval/degree qualities , chord qualities!) example, can write interval(c(\"g-\", \"f#\"), augment = 'aug', diminish = 'dim') output c(\"+dim5\", \"+aug4\"). Examples quality argument combinations currently used humdrumR pitch functions include: parse(major = \"M\", minor = \"m\", perfect = \"P\", diminish = \"d\", augment = \"\") parse(diminish = \"o\", augment = \"+\")","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchDeparsing.html"],"id":"implicit-vs-explicit-species","dir":"Reference","previous_headings":"","what":"Implicit vs Explicit Species","title":"Generating (","text":"musical data, specifiers (e.g., accidentals qualities) explicitly indicated; instead, must infer species pitch context---like key signature!.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchDeparsing.html"],"id":"from-the-key","dir":"Reference","previous_headings":"","what":"From the Key","title":"Generating (","text":"important argument implicitSpecies (logical, length == 1): implicitSpecies = TRUE, species input without explicit species indicated interpreted using Key. example, kern('C', Key = ':', parse(implicitSpecies = TRUE)) parsed \"C#\" C sharp major. kern('C', Key = ':', parse(implicitSpecies = TRUE)) parsed \"C\" C natural minor. kern('C', Key = '-:', parse(implicitSpecies = TRUE)) parsed \"C-\" C flat -flat minor. default, input already specifiers, interpreted absolutely---overriding \"implicit\" Key---, even implicitSpecies = TRUE. Thus, major: kern(\"C#\", Key = ':', parse(implicitSpecies = TRUE)) parsed \"C#\". \"#\" unnecessary. kern(\"Cn\", Key = ':', parse(implicitSpecies = TRUE)) parsed \"C\". \"n\" overrides Key. kern(\"C#\", Key = ':', parse(implicitSpecies = TRUE)) parsed \"C#\". \"#\" overrides Key. However! can also change behavior setting absoluteSpecies (logical, length == 1) argument FALSE. , specifiers input interpreted \"top \" key accidental: kern(\"C#\", Key = ':', parse(implicitSpecies = TRUE, absoluteSpecies = FALSE)) parsed \"C##\". \"#\" input added \"#\" Key, resulting double sharp! unusual behavior, absolute pitch representations like **kern. However, use scale chord degrees, absoluteSpecies = FALSE might appropriate. example, reading figured bass key E minor, \"b7\" figure E bass interpreted double flat (diminished) 7th (Db E)! data encoded, use absoluteSpecies = FALSE.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchDeparsing.html"],"id":"memory","dir":"Reference","previous_headings":"","what":"Memory","title":"Generating (","text":"musical data, assume accidental note \"stays effect\" scale step next bar, different accidental replaces . Fortunately, humdrumR parser (tonalInterval()) also knows parse data encoded \"memory\" way. memory = TRUE, accidental (quality) input note \"remembered\" previous appearances scale step. example, kern(c(\"D#\", \"E\", \"D\", \"E\", \"Dn\", \"C\", \"D\"), parse(memory = TRUE)) parsed c(\"D#\", \"E\", \"D#\", \"E\", \"D\", \"C\", \"D\") want \"memory\" last specific time windows (like bars), can also specify memoryWindows argument. memoryWindows must atomic vector length input (x argument). unique value within memoryWindows vector treated \"window\" within memory operates. common use case pass Bar field humdrumR dataset memoryWindows! memory memoryWindows argument work whatever values implicitSpecies absoluteSpecies specified! Though examples use accidentals, arguments effect parsing qualities (qualities = TRUE).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchDeparsing.html"],"id":"octave","dir":"Reference","previous_headings":"","what":"Octave","title":"Generating (","text":"final piece information encoded () pitch representations indication \"compound pitch\"--- incorporating octave information. humdrumR octaves always defined terms scale steps: two notes scale degree/letter name always octave. mainly comes regards Cb B#: Cb4 semitone ; B#3 enharmonically middle-C.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchDeparsing.html"],"id":"integer-octaves","dir":"Reference","previous_headings":"","what":"Integer Octaves","title":"Generating (","text":"simplest way octave information can encoded integer value, Scientific Pitch. need parse integer-encoded octaves, set octave.integer (logical, length == 1) argument TRUE. default, humdrumR considers \"central\" octave (octave == 0) octave , equivalently, unison. However, different octave used central octave, can specify octave.offset (integer, length == 1) argument. illustrate, default Scientific Pitch parser used arguments: kern('C5', parse(octave.integer = TRUE, octave.offset = 4) Returns \"cc\" (octave middle C).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchDeparsing.html"],"id":"non-integer-octave-markers","dir":"Reference","previous_headings":"","what":"Non-integer Octave Markers","title":"Generating (","text":"octave.integer = FALSE, humdrumR parser instead looks three possible symbols indicate octave information. symbols controlled using , , (character, length == 1) arguments. symbol, symbol, interpreted \"central\" octave; repeating strings symbols indicate increasing positive () negative () octaves. example, lilypond notation, , represents lower octaves, ' (single apostrophe) represents upper octaves. default lilypond() parser uses arguments: pitch(c(\"c\", \"c\", \"c'\"), parse(octave.integer = FALSE, = \"'\", = \",\", octave.offset = 1)) Returns c(\"C2\", \"C3\", \"C4\"). (Note lilypond makes octave central octave, using octave.offset = 1.)","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchDeparsing.html"],"id":"octave-rounding-","dir":"Reference","previous_headings":"","what":"Octave \"Rounding\"","title":"Generating (","text":"situations, pitch data might interpret \"groupby\" octaves little differently. absolute pitch representations (e.g., kern(), pitch()), \"boundary\" one octave next B (degree 7) C (degree 1). However, example, working data representing intervals, might think \"octave\" spanning range -P4 (G) +P4 (f). case, \"octave boundary\" centered around unison (), rather starting middle-C/unison. data represented way, use octave.round argument; octave.round must rounding function, either round, floor, ceiling, trunc, expand. functions indicate interpret simple pitches \"rounding\" nearest C/unison. default behavior pitch representations octave.round = floor: scale step rounded downwards nearest C. B associated C 7 steps . , hand, octave.round = round, scale-steps \"rounded\" closest C, B associated closer C . Indeed, octave.round = round gets us -P4 <-> +P4 behavior mentioned earlier! working parsing intervals, octave.round option allows control \"simple part\" (less octave) compound interval represented. example, might think ascending major 12th ascending octave plus ascending perfect 5th: ** +P8 + P5**. encode interval two ascending octaves minus perfect fourth: + P15 - P4. following table illustrates different octave.round arguments \"partition\" compound intervals simple parts octaves: Notice , octave.floor used, simple intervals represented ascending. parsing \"absolute\" pitch representations, octave.round option allows control octave notes associated . following table illustrates:","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchDeparsing.html"],"id":"absolute-or-relative-contour-octave","dir":"Reference","previous_headings":"","what":"Absolute or Relative (contour) Octave","title":"Generating (","text":"notation encoding schemes, \"octave\" note interpreted relative previous note, rather absolute reference. prominent system Lilypond's relative octave entry style. style often used combination scale degree representations---RS200 corpus. example, data set might say Re Mi vSo La Ti , \"v\" indicating jump . activate relative-octave parsing, set octave.relative = TRUE---alternatively, can use octave.absolute = FALSE, equivalent. relative-octave data, assume octave indications indicate shift relative previous note. usually used combination octave markers like \"^\" () \"v\" (). Different combinations octave.round allow us parse different behaviors: octave.round = round, marker (marker) indicates note pitch closest previous pitch. Octave markers indicate alterations assumption. always, based scale steps, semitones! fourth \"closer\" fifth, regardless quality: C F# ascending C Gb descending! ascending diminished 5th written C ^Gb---= ^. octave.round = floor, marker (marker) indicates note octave previous pitch. Octave markers indicate alterations assumption. setting, going C B always requires mark.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchDeparsing.html"],"id":"string-parsing","dir":"Reference","previous_headings":"","what":"String Parsing","title":"Generating (","text":"addition three types musical parsing considerations reviewed (steps, species, octaves), also general string-parsing issues can consider/control.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchDeparsing.html"],"id":"parts-and-order","dir":"Reference","previous_headings":"","what":"Parts and Order","title":"Generating (","text":"far () discussed various ways tonal pitch information (step, species, octave) can encoded, humdrumR parser can modified handle different options. However, two general parsing issues/options consider: information encoded, order? parts argument can specifyied indicate . parts argument must character vector length 1--3. characters must partial match either \"step\", \"species\", \"octave\". presense strings parts vector indicate information parsed. order strings indicates order pieces pitch information encoded input strings. illustrate, imagine input data identical standard interval representation---e.g., M2 P5---except quality appears step---e.g., 2M 5P. call interval(c(\"2M\", \"5P\"), parse(parts = c(\"step\", \"species\"))) sure enough get correct parse! One final string-parsing argument sep, indicates character string separating pitch information components: common case comma space. example, use parse command like : kern(\"E flat 5\", parse(flat = \"flat\", sep = \" \")).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchDeparsing.html"],"id":"pitch-gamut-levels","dir":"Reference","previous_headings":"","what":"Pitch-Gamut Levels","title":"Generating (","text":"table() automatically generate factor levels pitch data using gamut() function. makes sure tabulated data sorted logical order, includes missing pitches. simple/complex generic/specific arguments automatically passed gamut(); additional arguments can passed gamut using gamutArgs = list(...), syntactic sugar gamut(...). (Read gamut() docs explanation gamut generation.) feature used control table layout pitch data, well assure consistent tables grouping data. inPlace = TRUE special tabulation occur.","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchFunctions.html"],"dir":"Reference","previous_headings":"","what":"Translate between pitch representations. — pitchFunctions","title":"Translate between pitch representations. — pitchFunctions","text":"functions used extract translate different representations pitch information. functions can also things like transposing simplifying pitches.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchFunctions.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Translate between pitch representations. — pitchFunctions","text":"x Input data parse pitch information. x argument can (atomic) vector, tonalInterval, NULL. ... Arguments passed pitch deparser. also two hidden (advanced) arguments can specify: memoize deparse (see details ). generic \"specific\" pitch information (accidentals qualites) discarded? Defaults FALSE. Must singleton logical value: /switch. simple \"compound\" pitch information (octave/contour) discarded? Defaults FALSE. Must singleton logical value: /switch. Key input Key used parser, deparser, transposer. Defaults NULL. Must diatonicSet something coercable diatonicSet; must either length 1 length(x) parseArgs optional list arguments passed pitch parser. Defaults empty list(). Must list named arguments pitch parser. transposeArgs optional list arguments passed special transpose() call. Defaults empty list(). Must list named arguments transpose(). inPlace non-pitch information retained output string. Defaults FALSE. Must singleton logical value: /switch. argument effect input (x argument) character strings, extra, non-pitch information input strings \"besides\" pitch information. , inPlace = TRUE, output placed output string beside original non-pitch information. inPlace = FALSE, pitch output information returned (details ).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchFunctions.html"],"id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Translate between pitch representations. — pitchFunctions","text":"NULL inputs (x argument) return NULL output. Otherwise, returns vector/matrix length/dimension x. NA values input x propagated output.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchFunctions.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Translate between pitch representations. — pitchFunctions","text":"full list pitch functions : Tonal pitch representations Absolute pitch representations kern() pitch() lilypond() helmholtz() tonh() (German-style notation) Relative pitch representations interval() solfa() (relative-solfege) solfg() (French-style fixed-solfege) degree() (absolute scale degrees) deg() (melodic scale degrees) bhatk() (hindustani swara) Partial pitch representations step() accidental() quality() octave() Atonal pitch representations Musical pitch representations semits() midi() cents() pc() (pitch classes) Physical pitch representations freq() pitch functions work similar ways, similar arguments functionality. function takes input pitch representation (can anything) outputs pitch representation. example, kern() takes input representation outputs **kern (pitch) data. Underneath hood, full processing function looks like : Input representation (e.g., **pitch **semits) |> Parsing (done tonalInterval()) |> Intermediate (tonalInterval) representation |> Transformation (e.g., transpose()) |> Deparsing |> Output representation (e.g. **kern **solfa) read details parsing step, read . read details \"deparsing\" step, read . read details specific function, click links list , type ?func R command line: example, ?kern. \"partial\" pitch functions octave(), step(), accidental(), quality() -called return one part/aspect pitch information, part. example, accidental() returns accidentals () pitches.","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchParsing.html"],"dir":"Reference","previous_headings":"","what":"Parsing pitch information — pitchParsing","title":"Parsing pitch information — pitchParsing","text":"humdrumR includes easy--use powerful system parsing pitch information: various basic pitch representations (including numeric character-string representations) can \"parsed\"---read interpreted humdrumR. part, parsing automatically happens \"behind scenes\" whenever use humdrumR pitch function, like kern() semit(), solfa().","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchParsing.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Parsing pitch information — pitchParsing","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchParsing.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Parsing pitch information — pitchParsing","text":"Exclusive exclusive interpretation guide parsing input. Must NULL, character vector either length 1 length(x). str input vector. Must either character numeric. Key diatonic key used interpret pitch information. Defaults NULL. Must diatonicSet something coercable diatonicSet; must either length 1 length(x) example, use implicitSpecies (see advanced parsing section) dependent Key. output tonalInterval output within key: thus, tonalInterval('C#', Key = \":\") returns tint representing Major 3rd, C# major third major.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchParsing.html"],"id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Parsing pitch information — pitchParsing","text":"tonalInterval() returns tonalInterval object length dimensions x. NULL inputs (x argument) return NULL output. NA values input x propagated output.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchParsing.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Parsing pitch information — pitchParsing","text":"underlying parser used humdrumR pitch functions can called explicitly using function tonalInterval(). tonalInterval parser attempt parse input information tonalInterval object---back-end pitch representation probably need care ! use one main pitch functions, like kern() semits(), input parsed tonalInterval object, immediately deparsed representation asked (e.g., **kern **semits). Thus, underlying pipeline humdrumR pitch functions looks something like: Input representation (e.g., **pitch **semits) |> Parsing (done tonalInterval()) |> Intermediate (tonalInterval) representation |> Deparsing |> Output representation (e.g. **kern **solfa) documentation talks parsing step. overview \"deparsing\" process, look . learn \"deparsing\" specific representations, start go straight docs specific functions--- example, call ?kern learn kern().","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchParsing.html"],"id":"dispatch","dir":"Reference","previous_headings":"","what":"Dispatch","title":"Parsing pitch information — pitchParsing","text":"pitch parser (tonalInterval()) generic function, meaning accepts variety inputs automatically \"dispatches\" appropriate method parsing ehe input. R's standard S3 system used dispatch either numeric character-string input: Generally, numeric (integer) inputs interpreted various atonal pitch representations character strings interpreted various tonal pitch representations. Given either character string number, humdrumR uses either regular-expression matching humdrum exclusive interpretation matching dispatch specific parsing methods.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchParsing.html"],"id":"tonal-parsing-character-string-inputs-","dir":"Reference","previous_headings":"","what":"Tonal Parsing (character-string inputs)","title":"Parsing pitch information — pitchParsing","text":"Since humdrum data inherently string-based, powerful part humdrumR pitch-parser system parsing pitch (mostly tonal) information character strings. (includes character tokens pitch information embedded alongside information; Details .) pitch parser (tonalInterval()) uses combination regular-expressions exclusive interpretations decide parse input string. twelve regular-expression patterns pitch tonalInterval() knows parse automatically:","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchParsing.html"],"id":"exclusive-dispatch","dir":"Reference","previous_headings":"","what":"Exclusive Dispatch","title":"Parsing pitch information — pitchParsing","text":"call tonalInterval() (pitch function) character-string vector, non-NULL Exclusive argument, Exclusive argument used choose input interpretation want, based \"Exclusive\" column table . example, kern(x, Exclusive = 'solfa') force parser interpret x **solfa data. Similarly, solfa(x, Exclusive = 'kern') force parser interpret x **kern data. use pitch function within special call withinHumdrum, humdrumR automatically pass Exclusive field humdrum data function---means, cases, need explicitly anything Exclusive argument! (want happen, need explicitly specify Exclusive argument, Exclusive = NULL.)","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchParsing.html"],"id":"regex-dispatch","dir":"Reference","previous_headings":"","what":"Regex Dispatch","title":"Parsing pitch information — pitchParsing","text":"call tonalInterval() (pitch function) character-string vector, Exclusive argument missing NULL, humdrumR instead use regular-expression patterns select known interpretation. example, pitch('') automatically recognize '' solfege, interpret data accordingly (output G4). one matches, humdrumR use longest match, tie, pick based order table (topmost first). match, tonalInterval (pitch function) return NA values. Remember, Exclusive specified, overrides regex-based dispatch, means pitch('', Exclusive = 'kern') return NA, '' interpreted **kern value.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchParsing.html"],"id":"-in-place-parsing","dir":"Reference","previous_headings":"","what":"\"In place\" parsing","title":"Parsing pitch information — pitchParsing","text":"lots humdrum data, character strings encoded multiple pieces musical information right besides : example, **kern data might include tokens like \"4.ee-[. humdrumR pitch parser (tonalInterval()) automatically \"pull \" pitch information within strings, can find , using appropriate known regular expressions. Various pitch parsing functions option keep original \"extra\" data, using inPlace argument.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchParsing.html"],"id":"advanced-tonal-parsing-options","dir":"Reference","previous_headings":"","what":"Advanced Tonal Parsing Options","title":"Parsing pitch information — pitchParsing","text":"eleven tonal representations listed parsed common intesrface. using \"advanced\" parsing arguments, can tweak parsing done, accommodate even input representations! means controlling behavior tonalInterval(), second step pipeline: Input representation |> Parsing (done tonalInterval(PARSE ARGS GO !)) |> Intermediate (tonalInterval) representation |> Deparsing |> Output representation Note arguments similar identical parallel \"advanced\" deparsing arguments used various pitch functions. following \"advanced\" parsing arguments available (read details ): Steps step.labels step.signed Species (accidentals qualities) qualities specifier.maximum Accidentals natural, flat, sharp, doubleflat, doublesharp Qualities perfect, major, minor, augment, diminish Implicit vs Explicit Species implicitSpecies absoluteSpecies memory, memoryWindows Octave octave.integer , , octave.offset octave.round octave.relative, octave.absolute String parsing parts sep \"advanced\" arguments can used directly pitch function, call tonalInterval . use tonalInterval just specify directly arguments: example, tonalInterval(x, qualities = TRUE). use pitch functions, can either... Put parseArgs argument: kern(x, parseArgs = list(qualities = TRUE)) use \"syntactic sugar\" short-hand form: kern(x, parse(qualities = TRUE)) known Exclusive/Regex-dispatch combo (see table ) associated default parsing arguments. example, set Exclusive = 'kern' just use data look like **kern, flat argument set \"-\", However, , example, input data looked like **kern except used different flat symbol, like \"_\", modify parser: kern(\"EE_\", parse(flat = \"_\")) overrides default value **kern---notice, also updates **kern regular expression accordingly, works exactly standard kern() function.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchParsing.html"],"id":"steps","dir":"Reference","previous_headings":"","what":"Steps","title":"Parsing pitch information — pitchParsing","text":"representation \"tonal\" pitch information include representation diatonic steps. can control parser reads diatonic steps pitch representation using step.labels argument. step.labels argument must atomic vector unique values, length positive multiple seven. Examples step.labels arguments currently used preset humdrumR pitch parsers include: parse(step.labels = c('', 'B', 'C', 'D', 'E', 'F', 'G')) --- (**Tonh) parse(step.labels = c('d', 'r', 'm', 'f', 's', 'l', 't')) --- (**solfa) parse(step.labels = c('', 'II', 'III', 'IV', 'V', 'VI', 'VII')) --- (roman numerals) step.labels NULL, steps assumed represented integers, including negative integers representing downward steps. also step.signed (logical, length == 1) argument: step.signed = TRUE, lowercase versions step.labels interpreted negative (downward) steps uppercase versions step.labels interpreted positive (upwards) steps. option used, example, default kern() helmholtz() parsers.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchParsing.html"],"id":"species","dir":"Reference","previous_headings":"","what":"Species","title":"Parsing pitch information — pitchParsing","text":"tonal pitch representations, \"specific\" versions tonal pitches---tonal \"species\"---indicated \"specifiers\": either accidentals qualities. qualities (logical, length == 1) argument indicates whether accidentals used (qualities = FALSE) qualities (qualities = TRUE). specifiers can repeated number times, like \"triple sharps\" \"doubly augmented\"; specifier.maximum (integer, length == 1) argument sets maximum limit number specifiers read. example, force triple sharps (\"###\") double sharps (\"##\") parse just \"#\", specifying specifier.maximum = 1L.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchParsing.html"],"id":"accidentals","dir":"Reference","previous_headings":"","what":"Accidentals","title":"Parsing pitch information — pitchParsing","text":"qualities = FALSE parser look accidentals input, recognizing three types: naturals, flats, sharps. natural, flat, /sharp (character, length == 1) arguments can used indicate accidentals represented input. example, input strings look like c(\"Eflat\", \"C\"), set argument flat = \"flat\". Examples accidental argument combinations currently used preset humdrumR pitch parsers include: parse(flat = \"b\", sharp = \"#\") -> **pitch parse(flat = \"-\", sharp = \"#\") -> **kern parse(flat = \"-\", sharp = \"+\") -> **degree doubleflat, doublesharp (character, length == 1) arguments NULL default, can set special symbol used represent two sharps flats. example, might input represents double sharps \"x\". call kern(\"Fx\", parse(doublesharp = \"x\")) output \"F##\".","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchParsing.html"],"id":"qualities","dir":"Reference","previous_headings":"","what":"Qualities","title":"Parsing pitch information — pitchParsing","text":"qualities = TRUE parser look qualities input, recognizing five types: perfect, minor, major, augmented, diminished. perfect, major, minor, diminish, /augment (character, length == 1) arguments can used indicate qualities represented input. (Note: talking interval/degree qualities , chord qualities!) example, input strings look like c(\"maj3\", \"p4\"), set arguments major = \"maj\" perfect = \"p\". Examples quality argument combinations currently used humdrumR pitch functions include: parse(major = \"M\", minor = \"m\", perfect = \"P\", diminish = \"d\", augment = \"\") parse(diminish = \"o\", augment = \"+\")","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchParsing.html"],"id":"implicit-vs-explicit-species","dir":"Reference","previous_headings":"","what":"Implicit vs Explicit Species","title":"Parsing pitch information — pitchParsing","text":"musical data, specifiers (e.g., accidentals qualities) explicitly indicated; instead, must infer species pitch context---like key signature!.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchParsing.html"],"id":"from-the-key","dir":"Reference","previous_headings":"","what":"From the Key","title":"Parsing pitch information — pitchParsing","text":"important argument implicitSpecies (logical, length == 1): implicitSpecies = TRUE, species input without explicit species indicated interpreted using Key. example, kern('C', Key = ':', parse(implicitSpecies = TRUE)) parsed \"C#\" C sharp major. kern('C', Key = ':', parse(implicitSpecies = TRUE)) parsed \"C\" C natural minor. kern('C', Key = '-:', parse(implicitSpecies = TRUE)) parsed \"C-\" C flat -flat minor. default, input already specifiers, interpreted absolutely---overriding \"implicit\" Key---, even implicitSpecies = TRUE. Thus, major: kern(\"C#\", Key = ':', parse(implicitSpecies = TRUE)) parsed \"C#\". \"#\" unnecessary. kern(\"Cn\", Key = ':', parse(implicitSpecies = TRUE)) parsed \"C\". \"n\" overrides Key. kern(\"C#\", Key = ':', parse(implicitSpecies = TRUE)) parsed \"C#\". \"#\" overrides Key. However! can also change behavior setting absoluteSpecies (logical, length == 1) argument FALSE. , specifiers input interpreted \"top \" key accidental: kern(\"C#\", Key = ':', parse(implicitSpecies = TRUE, absoluteSpecies = FALSE)) parsed \"C##\". \"#\" input added \"#\" Key, resulting double sharp! unusual behavior, absolute pitch representations like **kern. However, use scale chord degrees, absoluteSpecies = FALSE might appropriate. example, reading figured bass key E minor, \"b7\" figure E bass interpreted double flat (diminished) 7th (Db E)! data encoded, use absoluteSpecies = FALSE.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchParsing.html"],"id":"memory","dir":"Reference","previous_headings":"","what":"Memory","title":"Parsing pitch information — pitchParsing","text":"musical data, assume accidental note \"stays effect\" scale step next bar, different accidental replaces . Fortunately, humdrumR parser (tonalInterval()) also knows parse data encoded \"memory\" way. memory = TRUE, accidental (quality) input note \"remembered\" previous appearances scale step. example, kern(c(\"D#\", \"E\", \"D\", \"E\", \"Dn\", \"C\", \"D\"), parse(memory = TRUE)) parsed c(\"D#\", \"E\", \"D#\", \"E\", \"D\", \"C\", \"D\") want \"memory\" last specific time windows (like bars), can also specify memoryWindows argument. memoryWindows must atomic vector length input (x argument). unique value within memoryWindows vector treated \"window\" within memory operates. common use case pass Bar field humdrumR dataset memoryWindows! memory memoryWindows argument work whatever values implicitSpecies absoluteSpecies specified! Though examples use accidentals, arguments effect parsing qualities (qualities = TRUE).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchParsing.html"],"id":"octave","dir":"Reference","previous_headings":"","what":"Octave","title":"Parsing pitch information — pitchParsing","text":"final piece information encoded () pitch representations indication \"compound pitch\"--- incorporating octave information. humdrumR octaves always defined terms scale steps: two notes scale degree/letter name always octave. mainly comes regards Cb B#: Cb4 semitone ; B#3 enharmonically middle-C.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchParsing.html"],"id":"integer-octaves","dir":"Reference","previous_headings":"","what":"Integer Octaves","title":"Parsing pitch information — pitchParsing","text":"simplest way octave information can encoded integer value, Scientific Pitch. need parse integer-encoded octaves, set octave.integer (logical, length == 1) argument TRUE. default, humdrumR considers \"central\" octave (octave == 0) octave , equivalently, unison. However, different octave used central octave, can specify octave.offset (integer, length == 1) argument. illustrate, default Scientific Pitch parser used arguments: kern('C5', parse(octave.integer = TRUE, octave.offset = 4) Returns \"cc\" (octave middle C).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchParsing.html"],"id":"non-integer-octave-markers","dir":"Reference","previous_headings":"","what":"Non-integer Octave Markers","title":"Parsing pitch information — pitchParsing","text":"octave.integer = FALSE, humdrumR parser instead looks three possible symbols indicate octave information. symbols controlled using , , (character, length == 1) arguments. symbol, symbol, interpreted \"central\" octave; repeating strings symbols indicate increasing positive () negative () octaves. example, lilypond notation, , represents lower octaves, ' (single apostrophe) represents upper octaves. default lilypond() parser uses arguments: pitch(c(\"c\", \"c\", \"c'\"), parse(octave.integer = FALSE, = \"'\", = \",\", octave.offset = 1)) Returns c(\"C2\", \"C3\", \"C4\"). (Note lilypond makes octave central octave, using octave.offset = 1.)","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchParsing.html"],"id":"octave-rounding-","dir":"Reference","previous_headings":"","what":"Octave \"Rounding\"","title":"Parsing pitch information — pitchParsing","text":"situations, pitch data might interpret \"boundaries\" octaves little differently. absolute pitch representations (e.g., kern(), pitch()), \"boundary\" one octave next B (degree 7) C (degree 1). However, example, working data representing intervals, might think \"octave\" spanning range -P4 (G) +P4 (f). case, \"octave boundary\" centered around unison (), rather starting middle-C/unison. data represented way, use octave.round argument; octave.round must rounding function, either round, floor, ceiling, trunc, expand. functions indicate interpret simple pitches \"rounding\" nearest C/unison. default behavior pitch representations octave.round = floor: scale step rounded downwards nearest C. B associated C 7 steps . , hand, octave.round = round, scale-steps \"rounded\" closest C, B associated closer C . Indeed, octave.round = round gets us -P4 <-> +P4 behavior mentioned earlier! working parsing intervals, octave.round option allows control \"simple part\" (less octave) compound interval represented. example, might think ascending major 12th ascending octave plus ascending perfect 5th: ** +P8 + P5**. encode interval two ascending octaves minus perfect fourth: + P15 - P4. following table illustrates different octave.round arguments \"partition\" compound intervals simple parts octaves: Notice , octave.floor used, simple intervals represented ascending. parsing \"absolute\" pitch representations, octave.round option allows control octave notes associated . following table illustrates:","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchParsing.html"],"id":"absolute-or-relative-contour-octave","dir":"Reference","previous_headings":"","what":"Absolute or Relative (contour) Octave","title":"Parsing pitch information — pitchParsing","text":"notation encoding schemes, \"octave\" note interpreted relative previous note, rather absolute reference. prominent system Lilypond's relative octave entry style. style often used combination scale degree representations---RS200 corpus. example, data set might say Re Mi vSo La Ti , \"v\" indicating jump . activate relative-octave parsing, set octave.relative = TRUE---alternatively, can use octave.absolute = FALSE, equivalent. relative-octave data, assume octave indications indicate shift relative previous note. usually used combination octave markers like \"^\" () \"v\" (). Different combinations octave.round allow us parse different behaviors: octave.round = round, marker (marker) indicates note pitch closest previous pitch. Octave markers indicate alterations assumption. always, based scale steps, semitones! fourth \"closer\" fifth, regardless quality: C F# ascending C Gb descending! ascending diminished 5th written C ^Gb---= ^. octave.round = floor, marker (marker) indicates note octave previous pitch. Octave markers indicate alterations assumption. setting, going C B always requires mark.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchParsing.html"],"id":"string-parsing","dir":"Reference","previous_headings":"","what":"String Parsing","title":"Parsing pitch information — pitchParsing","text":"addition three types musical parsing considerations reviewed (steps, species, octaves), also general string-parsing issues can consider/control.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchParsing.html"],"id":"parts-and-order","dir":"Reference","previous_headings":"","what":"Parts and Order","title":"Parsing pitch information — pitchParsing","text":"far () discussed various ways tonal pitch information (step, species, octave) can encoded, humdrumR parser can modified handle different options. However, two general parsing issues/options consider: information encoded, order? parts argument can specifyied indicate . parts argument must character vector length 1--3. characters must partial match either \"step\", \"species\", \"octave\". presense strings parts vector indicate information parsed. order strings indicates order pieces pitch information encoded input strings. illustrate, imagine input data identical standard interval representation---e.g., M2 P5---except quality appears step---e.g., 2M 5P. call interval(c(\"2M\", \"5P\"), parse(parts = c(\"step\", \"species\"))) sure enough get correct parse! One final string-parsing argument sep, indicates character string separating pitch information components: common case comma space. example, use parse command like : kern(\"E flat 5\", parse(flat = \"flat\", sep = \" \")).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchParsing.html"],"id":"atonal-parsing-numeric-inputs-","dir":"Reference","previous_headings":"","what":"Atonal Parsing (numeric inputs)","title":"Parsing pitch information — pitchParsing","text":"humdrumR pitch parser (tonalInterval()) interpret numeric inputs atonal pitch information. default, numbers interpreted semitones. However, parses midi(), cents(), frequencies also defined. Dispatch different parsers controlled Exclusive argument.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchParsing.html"],"id":"enharmonic-interpretation","dir":"Reference","previous_headings":"","what":"Enharmonic Interpretation","title":"Parsing pitch information — pitchParsing","text":"converting atonal representation tonal one, must decide interpret tonality input---specifically, enharmonic spelling notes use. humdrumR numeric parser interprets atonal pitches \"enharmonic window\" 12 steps line--fifths. position window set enharmonic.center (integer, length == 1) argument. default, enharmonic.center = 0, creates window -5 (b2) +6) (#4). prefer #1 instead b2, set enharmonic.center = 1. flats, set enharmonic.center = -1. sharps, set enharmonic.center = 4. enharmonic.center argument work translating pitch representation, like kern(). However, present table terms scale degrees atonal -> enharmonic calculation centered key. , Key argument specified, \"enharmonic window\" centered around key. translating kern Key = F#:, output range Gn B#. want , set Key = NULL.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchParsing.html"],"id":"melodic-interpretation-of-chromatic-notes","dir":"Reference","previous_headings":"","what":"Melodic Interpretation of Chromatic Notes","title":"Parsing pitch information — pitchParsing","text":"common chromatic notes melodic passages labeled based melodic contour: .e., ascending chromatic notes labeled sharp descending chromatic notes labeled flat. behavior can engaged setting accidental.melodic (logical, length == 1) argument. accidental.melodic = TRUE, input first centered enharmonic window (), places chromatic alteration proceeds upwards non-chromatic note altered (necessary) sharp, vice verse descending notes flats. example, kern(0:2) returns c(\"c\", \"d-\", \"d\"), kern(0:2, parse(accidental.melodic = TRUE)) returns c(\"c\", \"c#\", \"d\").","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchParsing.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Parsing pitch information — pitchParsing","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pullHumdrum.html"],"dir":"Reference","previous_headings":"","what":"Extract field(s) from humdrumR data — pullHumdrum","title":"Extract field(s) from humdrumR data — pullHumdrum","text":"Individual fields humdrum table can extracted using pull(). Multiple fields can extracted using pull_data.frame(), pull_data.table, pull_tibble() ---resulting data.frames column-subset humdrum table. can also use $ operator extract single field, just like pull().","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pullHumdrum.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Extract field(s) from humdrumR data — pullHumdrum","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pullHumdrum.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Extract field(s) from humdrumR data — pullHumdrum","text":"humdrumR, .data, x HumdrumR data. Must humdrumR data object. ... fields output. arguments provided, object's selected fields pulled. arguments can combination character strings, numbers, symbols used match fields humdrumR input using tidyverse semantics. Unlike tidyverse select(), field names can partially matched. can also include character strings partially matching \"Data\", \"Structure\", \"Interpretation\", \"Formal\", \"Reference\" \"Grouping\", select fields types (see fields() explanation). dataTypes types humdrum record(s) include. non-null data tokens (\"D\") returned default. Must single character string. Legal values 'G', 'L', '', 'M', 'D', 'd' combination (e.g., \"LIM\"). (See humdrum table documentation explanation.) null null data points output? Default \"charNA2dot\". Must single character string, partially matching \"NA2dot\", \"dot2NA\", 'charNA2dot\", \"asis\". var field output. Defaults selectedFields(humdrumR)[1]. Must either single character string symbol partially matches field name, single whole-number, selects field row index fields() output. negative number provided, nth--last index used---example, -1 grab last field.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pullHumdrum.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Extract field(s) from humdrumR data — pullHumdrum","text":"functions pull(), pull.data.xxx(), pull.tibble(), $ \"escape hatch\" pull data humdrumR data world \"normal\" R. Use pull() function $ access actual vector content single field. functions always return data.frame/data.table/tibble, even one column. Choose field(s) return using ..., var, name arguments. var ... options use tidyverse style select semantics (see select()). fields indicated, data's selected fields pulled; case pull() $, first selected field pulled. dataTypes argument controls types data pulled---default, non-null data (Type == \"D\") pulled. $ operator can grab non-null data. null argument controls null data returned, four options: \"NA2dot\" means NA values converted \".\"; note cause output coerced character. \"dot2NA\" means \".\" converted NA. \"charNA2dot\" means NA values character vectors converted NA, atomic types. \"asis\" means either NA \".\" values may print, depending field. Note pull_tibble() work independently load tibble (tidyverse) package--- .e., call library(tibble).","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pullHumdrum.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Extract field(s) from humdrumR data — pullHumdrum","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/quality.html"],"dir":"Reference","previous_headings":"","what":"Extract quality from pitch — quality","title":"Extract quality from pitch — quality","text":"Use want extract tonal qualities pitch data, discarding octave step information.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/quality.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Extract quality from pitch — quality","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/quality.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Extract quality from pitch — quality","text":"x Input data parse pitch information. x argument can (atomic) vector, tonalInterval, NULL. ... Arguments passed pitch deparser. also two hidden (advanced) arguments can specify: memoize deparse (see details ). generic \"specific\" pitch information (accidentals qualites) discarded? Defaults FALSE. Must singleton logical value: /switch. simple \"compound\" pitch information (octave/contour) discarded? Defaults FALSE. Must singleton logical value: /switch. Key input Key used parser, deparser, transposer. Defaults NULL. Must diatonicSet something coercable diatonicSet; must either length 1 length(x) transposeArgs optional list arguments passed special transpose() call. Defaults empty list(). Must list named arguments transpose(). parseArgs optional list arguments passed pitch parser. Defaults empty list(). Must list named arguments pitch parser. inPlace non-pitch information retained output string. Defaults FALSE. Must singleton logical value: /switch. argument effect input (x argument) character strings, extra, non-pitch information input strings \"besides\" pitch information. , inPlace = TRUE, output placed output string beside original non-pitch information. inPlace = FALSE, pitch output information returned (details ).","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/quality.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Extract quality from pitch — quality","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/rational.html"],"dir":"Reference","previous_headings":"","what":"Rational numbers — rational","title":"Rational numbers — rational","text":"R built rational number representation; humdrumR defines one.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/rational.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Rational numbers — rational","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/rational.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Rational numbers — rational","text":"Using rational numbers, can represent numbers like 1/3 without numeric inaccuracies. words, \\(1/3 * 3 = 3\\), never \\(.999999999\\). hand, rational numbers start numerators demoninators large, can run integer overflow problems. Since rational numbers using context music analysis relatively simple, can safely use numbers without numeric inaccuracy. fraction class (associated constructor) represents rational numbers character strings. Unlike rational, fraction class numeric thus arithmetic. However, fraction can converted /rational.","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/readHumdrum.html"],"dir":"Reference","previous_headings":"","what":"Find and read humdrum files into R — knownInterpretations","title":"Find and read humdrum files into R — knownInterpretations","text":"functions find valid humdrum files local machine read humdrumR.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/readHumdrum.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Find and read humdrum files into R — knownInterpretations","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/readHumdrum.html"],"id":"format","dir":"Reference","previous_headings":"","what":"Format","title":"Find and read humdrum files into R — knownInterpretations","text":"object class data.table (inherits data.frame) 24 rows 5 columns.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/readHumdrum.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Find and read humdrum files into R — knownInterpretations","text":"... One patterns used identify files read. Must character strings. details: see \"REpath-patterns\" section . contains REGEX filtering files. Defaults NULL. Must character. !.null(contains), contains argument treated regular expressions: files contain matches regular expressions read. Thus, readHumdrum('.*krn$', contains = \"EEE\") read kern files contain matches \"EE\"---kern E two octaves middle C (lower). recursive files found recursively sub directories? Defaults FALSE. Must singleton logical value: /switch. TRUE, final part search pattern (.e., file search) searched recursively sub directories. allowDuplicates Indicating happen multiple search patterns match files. Defaults FALSE. Must singleton logical value: /switch. allowDuplicates = TRUE, files read multiple times, grouped respective corpora Label field. allowDuplicates = FALSE, redundant files read corpus first pattern match. verbose Whether print filename reading . Defaults FALSE. Must singleton logical value: /switch. TRUE, names matching files printed parsing begins. useful check make sure reading wrong files! tandems Controls , , tandem interpretations parsed fields. Defaults \"known\". Must character. reference reference records parsed fields. Defaults \"\". Must character.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/readHumdrum.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Find and read humdrum files into R — knownInterpretations","text":"findHumdrum work finding reading text files R. readHumdrum utilizes findHumdrum read files, parses create humdrum table build humdrumR data object around table.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/readHumdrum.html"],"id":"repath-patterns","dir":"Reference","previous_headings":"","what":"REpath-patterns","title":"Find and read humdrum files into R — knownInterpretations","text":"\"REpath-patterns\" specified using ... arguments. combination, ... arguments used search file paths. part search path specify (\"dirpart/dirpart/filepart\", etc) matched regular expressions directories/files disc. Thus, can say things like findHumdrum(\"../^.*/.*krn$\"), match kern files directory beginning capital \"\" directory current working directory. conveniance, can break path across multiple arguments instead using delimited strings: example, code findHumdrum(\"..\", \"^.*\", \".*krn$\") give identical result previous example (findHumdrum(\"../^.*/,*krn$\")). useful searching one pattern (see next paragraph) directory. want search one pattern, can input character vector: instance, readHumdrum(c(\"mozart\", \"beethoven\")---command search filenames containing \"mozart\" \"beethoven.\" works directories : readHumdrum(c(\"Mozart\", \"Beethoven\"), \".*krn$\") look kern files directories containing \"Mozart\" \"Beethoven.\" patterns named, names show identifying patterns [humdrumR][humdrumR] object's Label field. Unnamed patterns simply labeled numbers. refer files matched regex patterns \"subcorpora\" total corpus. Normal (system appropriate) conventions (.e., directories separated \"/\", '~' beginning indicate home, \"..\" indicate directory working directory, etc.) followed. pattern contains solo dot followed file sep---e.g., \"./\", \"x/./y\"---treated current directory, regular expression. pattern contains two dots---e.g., \"../\"---treated directory , regular expression. want create regular expression match directory, use \".*/\". regex pattern \"\" matches file (changed \".*\"). specifiy ... argument, findHumdrum (readHumdrum) default \".*\" well. Thus, readHumdrum() read humdrum files working directory. (two files different directories share name, unique name created file appending names directories occupy, recursively names unique.) single humdrum file multiple pieces ---meaning spine paths close *-, open **---parsed separately. distinguished Piece field. multi-piece files, Piece File identical.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/readHumdrum.html"],"id":"validity","dir":"Reference","previous_headings":"","what":"Validity","title":"Find and read humdrum files into R — knownInterpretations","text":"findHumdrum readHumdrum automatically ignore non-text files. , files contain humdrum syntax errors (checked validateHumdrum()) automatically skipped. want see specifically errors occurred, call validateHumdrum() directly use errorReport.path argument.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/readHumdrum.html"],"id":"tandem-interpretations","dir":"Reference","previous_headings":"","what":"Tandem Interpretations","title":"Find and read humdrum files into R — knownInterpretations","text":"tandem interpretations humdrum dataset summarized humdrum table's Tandem field, described detail . addition, certain \"known\" tandem interpretations parsed fields automatically. example, *clefG4 \"*clefF2 parsed Clef data, *k[b-] parsed KeySignature. \"known\" tandem interpretations humdrumR recognizes encoded built-table called knownInterpretations. interpretation humdrumR name (\"Clef\", \"TimeSignature\", etc.) well regular expression associated . tandems argument readHumdrum controls tandem interpretations parsed fields. can helpful either save processing time memory parsing interpretations need, parse interpretations humdrumR recognize. default value tandems argument \"known\". tandems argument contains \"known\" tandem interpretations built-knownInterpretations table parsed. Users may specify different interpretations parse two ways: character strings matching one name values Name column knownInterpretations. instance, specify tandems = c('Clef', 'TimeSignature'), clef (e.g., \"*clefG2\"), time signature (e.g., \"*M3/4\") intepretations parsed. character string(s) tandem exactly match one names knownInterpretations$Name, treated regular expressions used match tandem interpretations data. allows users parse non-standard tandem interpretations humdrumR already know . values tandems named, names used resulting fields. matches given interpretation found, field created interpretation. tandems = NULL, tandem interpretations parsed.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/readHumdrum.html"],"id":"reference-records","dir":"Reference","previous_headings":"","what":"Reference Records","title":"Find and read humdrum files into R — knownInterpretations","text":"default (reference = \"\"), humdrumR reads reference records data. reference code record (e.g, \"OTL\", \"!!!OTL: xxx\") used name associated field. (reference record reference code (.e., lacks colon), field called \"Unkeyed.\") large datasets many reference records, reference data can actually make large portion humdrum table, eat lot memory. cases, might want read () reference records---can instead read reference records planning use analyses (). reference = NULL, reference records parsed. Otherwise, character values reference treated reference codes matching reference records parsed. instance, readHumdrum(_, reference = \"OTL\") parse OTL reference records. values reference named, names used name associated fields. Thus, specifing reference = c(Title = 'OTL'), can use \"OTL\" reference records populate field called \"Title\". one reference records reference code, either explicitely numbered (e.g., \"!!!COM1:\", \"!!!COM2:\") read rather making two fields, single field created (\"COM\" ) multiple values separated \";\". humdrum data includes files containing multiple pieces, special consideration needed determine (guess) reference records (global comments) \"go \" piece. Obviously, reference records beginning end file grouped first last pieces respectively. However, reference records pieces multi-piece file require guess work. readHumdrum() look reference codes attempt group -reference records pieces logical way avoiding duplicated reference codes.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/readHumdrum.html"],"id":"spines-and-paths","dir":"Reference","previous_headings":"","what":"Spines and Paths","title":"Find and read humdrum files into R — knownInterpretations","text":"humdrum syntax, data placed \"spines,\" \"columns\" spreadsheet. \"column\" refers tab-delineated group values. \"Spines\" can single column, may (time) split multiple columns, can turn split , using \"*^\" interpretation token. reverse can happen well, two columns merging single column, using \"v\" token. means , humdrum data first glance looks like simple two-dimensional table, actually flexible tree structure. spines split merge, total number columns can change piece, creating \"ragged\" edge. Another similar issue corpus humdrum files may varying numbers spines/columns, pieces. (\"Global\" comment/reference records also special case, always single value, even interspersed multi-column local records.) readHumdrum assumes slightly strict version humdrum syntax: spines appear beginning file (headed exclusive interpretations like \"**kern\") can never merge . Thus, humdrum file read humdrumR must end fewer columns starts. Spine merges (\"*v\") can happen within spine paths originally split spine. extra-strict specification spine paths humdrum syntax , fortunately, something informally followed humdrum datasets. strict spine-path definition makes everything work fairly simply: Within piece, spines appear beginning piece \"true\" spines throughout piece, numbered left right, starting 1L. local token, value Spine field integer indicating \"true\" spines belongs ---global tokens NA value Spine field, belong spine. spine path splits (\"*^\") main spines form spine paths. Every spine's paths numbered Path field, right left, starting 0L. spine splits 0Ls Path field.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/readHumdrum.html"],"id":"result","dir":"Reference","previous_headings":"","what":"Result","title":"Find and read humdrum files into R — knownInterpretations","text":"findHumdrum returns \"fileFrame\" (data.table), listing file names, patterns match, directories found , raw text content files. readHumdrum returns fully parsed humdrumR object.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/readHumdrum.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Find and read humdrum files into R — knownInterpretations","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/recip.html"],"dir":"Reference","previous_headings":"","what":"Reciprocal representation of duration — recip","title":"Reciprocal representation of duration — recip","text":"standard approach representing conventional note values humdrum \"reciprocal\" **recip. Representation. **recip rhythmic values often used part **kern representation, also includes pitch information notation details. recip() applied humdrumR data class may use data's fields arguments. field names specified, first selectedField used x.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/recip.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Reciprocal representation of duration — recip","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/recip.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Reciprocal representation of duration — recip","text":"x input vector. x argument can (atomic) vector, rational (rhythmInterval), NULL. Must parsable rhythm infromation. ... Arguments passed rhythm parser. also two hidden (advanced) arguments can specify: memoize deparse (see details ). sep separator printed numerator denominator. single character string. Must single character string. scale numeric rational value used output unit measurement. Defaults rational(1, 1). Must numeric rational. inPlace non-rhythm information retained output string? Defaults FALSE. Must singleton logical value: /switch. Defaults FALSE. singleton logical value, NA. See \"Grace notes\" section .","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/recip.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Reciprocal representation of duration — recip","text":"**recip values literally reciprocal duration value. Since note values conventional music notation simple fractions reciprocal approach highly concise similar conventional western notation terminology. \"quarter note\" represented reciprocal 1/4: simply \"4\". Full reciprocal fractions can specified: \"2%3\" indicate 3/2. % separator can changed using sep argument. conventional note values, \"dots\" can added value increase duration ratio (2 - (2^{-n})), n number dots. (One dot 3/2; two dots 7/4; etc.).","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/recip.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Reciprocal representation of duration — recip","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/recordDuration.html"],"dir":"Reference","previous_headings":"","what":"Calculate duration of each record in a corpus — recordDuration","title":"Calculate duration of each record in a corpus — recordDuration","text":"Calculate duration record corpus","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/recordDuration.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Calculate duration of each record in a corpus — recordDuration","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/recordDuration.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Calculate duration of each record in a corpus — recordDuration","text":"humdrumR HumdrumR data.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/recycling.html"],"dir":"Reference","previous_headings":"","what":"What are ","title":"What are ","text":"\"recycling\" \"padding\"?","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/recycling.html"],"id":"recycling-and-padding-results","dir":"Reference","previous_headings":"","what":"Recycling and Padding results","title":"What are ","text":"Many R functions \"recycle\" results; functions \"pad\" results. mean? two options refer different strategies R code often provides maintain vectorization. key idea vectorization want length/size function inputs outputs . give 100-long vector function input, want 100-long vector output.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/recycling.html"],"id":"result-is-too-short-pad-or-recycle-","dir":"Reference","previous_headings":"","what":"Result is too short (pad or recycle)","title":"What are ","text":"happens outputs result shorter input, need length? Well, one option \"pad\" output NA values. example, call mean(1:9), 9-long input results scalar (1-long) output (5). force output 9-long (match input), pad NA like c(5, NA, NA, NA, NA, NA, NA, NA, NA). many cases, padding result like mean(1:9) useful---useful information (mean, case) stuck one index! Instead, useful \"recycle\" result. take result duplicate (\"recycle\") matches length input. recycle result mean(1:9) c(5, 5, 5, 5, 5, 5, 5, 5, 5). often (always) useful! common (best) case recycling , like example , result recycle \"scalar\" (single) value. one value simply copied length(input) times. can also recycle results non-scalar. example, imagine function summ() calculates minimum, median, maximum vector: call summ(1:9) return c(1, 5, 9). result recycled get c(1, 5, 9, 1, 5, 9, 1, 5, 9). sort recycling less likely useful, can confusing sometimes---example, probably meaningful reason median line original input values c(2, 5, 8). However, R (generally) happily ! good practice rely scalar recycling, avoid non-scalar recycling unless really sure want. One final note: result recycling length evenly divides input, see warning message saying longer object length multiple shorter object length. give example, image used range() function, returns minimum maximum median, input: result range(1:9) c(1, 9), recycle c(1, 9, 1, 9, 1, 9, 1, 9, 1). last repetition result cut short, two evenly divide nine. Since non-scalar recycling results often useful meaningful general, R takes particularly bad sign result evenly divide input, get warning.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/recycling.html"],"id":"result-is-too-long-index-","dir":"Reference","previous_headings":"","what":"Result is too long (index)","title":"What are ","text":"happens function outputs result longer input, need length? Well, obvious thing cut excess---something like head(output, n = length(input). course, may may make sense depending function !","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/reference.html"],"dir":"Reference","previous_headings":"","what":"Summarize reference records in a humdrumR corpus — reference","title":"Summarize reference records in a humdrumR corpus — reference","text":"reference used tabulate reference records present humdrumR corpus. reference one humdrumR's basic corpus summary functions.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/reference.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Summarize reference records in a humdrumR corpus — reference","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/reference.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Summarize reference records in a humdrumR corpus — reference","text":"x Input extracting reference information. Must character string (look reference code) humdrumR. drop Whether return normal data.table humCensus table. Defaults FALSE. Must singleton logical value: /switch. drop = TRUE, normal data.table returned instead humCensus table. Index rows. numeric, selects rows index. character, string matched regular expression filenames corpus. j Index columns. numeric, selects columns index. character, partially matched column names (reference codes).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/reference.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Summarize reference records in a humdrumR corpus — reference","text":"reference can used look information common reference codes: supply reference code character string reference check known reference codes print information matching codes (one). instance, reference('OTL') returns description standard humdrum !!!OTL reference record (original title metadata). applied humdrumR corpus reference returns special data.frame called humReference table. humReference table one column reference code appears corpus. Since reference records can long print one screen, humdrum files can multiple type reference code, humReference table normally prints number type reference record appear piece. However, one type reference code present humReference table, complete reference records code printed piece. Likewise, one piece present table, piece's complete reference records printed. Thus, want see actual reference records, try indexing humReference table one column row (see ). humReference table one row piece corpus. Rows labeled file name piece number index. addition, humReference object printed, three different summary totals printed reference code: indicates many pieces corpus contain least one example code. Sum indicates total number reference code appear corpus, including multiple appearances one piece (like multiple \"!!!COM\" records). Unique tabulates number unique token corpus, code. corpus two unique composers (encoded \"!!!COM\"), Unique total 2. assumes tokens exactly identical, including white space; \"!!!COM: J.S. Bach\" \"!!!COM: JS Bach\" counted two unique reference records.","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/reference.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Summarize reference records in a humdrumR corpus — reference","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/regexConstruction.html"],"dir":"Reference","previous_headings":"","what":"Making Regular Expressions — regexConstruction","title":"Making Regular Expressions — regexConstruction","text":"humdrumR includes helpful functions creating new regular expressions work stringr package.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/regexConstruction.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Making Regular Expressions — regexConstruction","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/regexConstruction.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Making Regular Expressions — regexConstruction","text":"captureRE take character vector collapse \"capture group.\" n argument can used append number tag, instance '*' (zero ) group. .e., captureRE(c(\"\", \"b\", \"c\"), '*') output \"[abc]*\". captureUniq make similar capture group captureRE, expression makes sure 1 character repeats. instance, captureUniq(c('', 'b','c')) return \"([abc])\\\\1*\"---expression match \"aaa\" \"bb\" \"aabb\".","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/rend.html"],"dir":"Reference","previous_headings":"","what":"Separate data fields into new spines. — rend","title":"Separate data fields into new spines. — rend","text":"Rend, \"rend apart,\" splits data separate fields separate spines paths. hood, rend() essentially runs specialized call make humdrum table \"longer\"/\"taller,\" similar R functions like melt(), gather(), pivot_longer(). fact, humdrumR method pivot_longer() defined, equivalent rend(). rend() function essentially inverse cleave().","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/rend.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Separate data fields into new spines. — rend","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/rend.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Separate data fields into new spines. — rend","text":"humdrumR HumdrumR data. Must humdrumR data object. ... fields rend? arguments can combination character strings, numbers, symbols used match fields humdrumR input using tidyverse semantics. See select() docs details. fieldName name newly rended field. Defaults pasting names selected fields (...) together, separated .. Must either NULL, single non-empty character string. removeRended rended fields removed output? Defaults TRUE. Must singleton logical value: /switch. rendEmpty Empty spines rended? Defaults TRUE. Must singleton logical value: /switch.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/rend.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Separate data fields into new spines. — rend","text":"rend() function takes number ... arguments select fields humdrumR data. identified fields split new spines. fields provided, data's selected fields rended. New spines generated existing spines; start spines 1, 2, 3, rend two fields... original spine 1 rended new spines 1 2; original spine 2 rended new spines 3 4; original spine 3 rended new spines 5 6. However, default, spines rended contain non-null data points target fields. example, original spine 2 non-null data one rended fields, rended two spines. However, rendEmpty set TRUE, spines rended even empty (null data). Note , since differnt fields may different data types, rend() generally coerce result character.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/rend.html"],"id":"fields","dir":"Reference","previous_headings":"","what":"Fields","title":"Separate data fields into new spines. — rend","text":"rend fields, new field generated. name new field specified newField---default, newField NULL names rended fields simply pasted together. removeRended = TRUE (default), original fields removed data. However, certain fields, like Token structural fields removed data. Therefore, rend fields, deleted, even removeRended = TRUE. provide one field name rend, automatically take Token. Thus, rend(humData, 'Solfa') equivalent rend(humData, 'Token', 'Solfa').","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/rend.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Separate data fields into new spines. — rend","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/rhythmDeparsing.html"],"dir":"Reference","previous_headings":"","what":"Generating (","title":"Generating (","text":"humdrumR includes easy--use system generating variety rhythm (time duration) representations, can flexibly modified users. \"hood\" humdrumR represents rhythmic duration information rational numbers, typically extracted input data using rhythm parser. rational representation can \"deparsed\" variety predefined output formats (like **recip), new formats create!","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/rhythmDeparsing.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Generating (","text":"Deparsing second step rhythm function processing pipeline: Input representation |> Parsing |> Intermediate (rational) representation |> Deparsing (DEPARSING ARGS GO ) |> Output representation Various rhythm representations like **recip, **dur, **duration can generated using predefined rhythm functions like recip() dur(), duration() respectively. functions use common deparsing framework. documentation talks deparsing step. overview parsing process, look .","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/rhythmDeparsing.html"],"id":"basic-rhythm-arguments","dir":"Reference","previous_headings":"","what":"Basic rhythm arguments","title":"Generating (","text":"Different rhythms share standard arguments control details output. important scale argument.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/rhythmDeparsing.html"],"id":"scalar-unit","dir":"Reference","previous_headings":"","what":"Scalar unit","title":"Generating (","text":"scale argument numeric rational value indicates reference unit used duration values: \"1\" duration? default, unit \"whole note\" duration. changing unit, can rescale output. example, recip value represents fraction unit: e.g., \"2\" equals 1/2 unit. call recip('2', scale = 1/16) telling us get half sixteenth: case '32'.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/rhythmDeparsing.html"],"id":"in-place-parsing","dir":"Reference","previous_headings":"","what":"In-place parsing","title":"Generating (","text":"humdrum data, character strings often encoded multiple pieces musical information right besides : example, **recip data might include tokens like \"4.ee-[. humdrumR parser (rhythmInterval) automatically \"pull \" rhythm information within strings, can find using appropriate known regular expressions. example, duration('4.ee-[') returns 0.375. However, pitch functions (like recip() dur()) option keep \"extra\" information return result \"place\"---.e., embedded right found input string. controlled inPlace argument, FALSE default. , duration('4.ee-[', inPlace = TRUE) return 0.375ee-[---keeping \"ee-[\". Note inPlace = TRUE force functions like duration, normally return numeric values, return character strings input character string.","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/rhythmFunctions.html"],"dir":"Reference","previous_headings":"","what":"Translate between rhythm representations. — rhythmFunctions","title":"Translate between rhythm representations. — rhythmFunctions","text":"functions used extract translate different representations rhythmic (time duration) information.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/rhythmFunctions.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Translate between rhythm representations. — rhythmFunctions","text":"x input vector. x argument can (atomic) vector, rational (rhythmInterval), NULL. Must parsable rhythm infromation. ... Arguments passed rhythm parser. also two hidden (advanced) arguments can specify: memoize deparse (see details ). scale numeric rational value used output unit measurement. Defaults rational(1, 1). Must numeric rational. Exclusive, parseArgs vector exclusive interpretations /optional list arguments passed rhythm parser. Default NULL empty list() respectively. Exclusive must NULL, character vector either length 1 length(x); parseArgs must list named arguments rhythm parser. inPlace non-rhythm information retained output string? Defaults FALSE. Must singleton logical value: /switch. Defaults FALSE. singleton logical value, NA. See \"Grace notes\" section .","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/rhythmFunctions.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Translate between rhythm representations. — rhythmFunctions","text":"full list rhythm functions : Metric rhythm representations Symbolic rhythm representations recip() (reciprocal note values) notehead() (traditional note-value symbols) Numeric rhythm representations duration() (Whole notes) quarters() (quarter notes/crotchets) Ametric rhythm representations Symbolic rhythm representations dur() (durations time) Numeric rhythm representations seconds() ms() (milliseconds) rhythm functions work similar ways, similar arguments functionality. function takes input rhythm (time duration) representation (can anything) outputs rhythm representation. example, recip() takes input representation outputs **recip (reciprocal durations) data. Underneath hood, full processing function looks like : Input representation (e.g., **recip **dur) |> Parsing (done rhythmInterval()) |> Intermediate (rational) representation |> Deparsing |> Output representation (e.g. **recip **duration) read details parsing step, read . read details \"deparsing\" step, read . read details specific function, click links list , type ?func R command line: example, ?notehead.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/rhythmFunctions.html"],"id":"grace-notes","dir":"Reference","previous_headings":"","what":"Grace notes","title":"Translate between rhythm representations. — rhythmFunctions","text":"**recip **kern data sometime include tokens indicating grace notes---special category duration, usually used indicate \"freely\" -metric notes otherwise metric context. humdrum data, grace notes marked \"q\" \"Q\"; q reserved tokens () duration information, Q marked along duration information: example, aa-q 16aa-Q. practice, distinction always made, rarely important. default, **recip parser treats input marked grace notes duration zero. However, pass grace argument rhythm parser, can control behavior. parse(grace = TRUE), grace-note durations (like 16 \"16aa-Q\") parsed like duration. grace = NA, grace-notes return NA. grace = FALSE, duration returns zero (default behavior).","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/rhythmParsing.html"],"dir":"Reference","previous_headings":"","what":"Parsing rhythm information — rhythmParsing","title":"Parsing rhythm information — rhythmParsing","text":"humdrumR includes easy--use powerful system parsing rhythm (time duration) information: various basic rhythm representations (including numeric character-string representations) can \"parsed\"---read interpreted humdrumR. part, parsing automatically happens \"behind scenes\" whenever use humdrumR rhythm function, like recip(), dur(), duration().","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/rhythmParsing.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Parsing rhythm information — rhythmParsing","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/rhythmParsing.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Parsing rhythm information — rhythmParsing","text":"underlying parser used humdrumR rhythm functions can called explicitly using function rhythmInterval(). rhythmInterval parser attempt parse input information ratioanl number object. use one main rhythm functions, like recip() dur(), input parsed rational object, immediately deparsed representation asked (e.g., **recip **dur). Thus, underlying pipeline humdrumR rhythm functions looks something like: Input representation (e.g., **recip **dur) |> Parsing (done rhythmInterval()) |> Intermediate (rational) representation |> Deparsing |> Output representation (e.g. **recip **duration) documentation talks parsing step. overview \"deparsing\" process, look . learn \"deparsing\" specific representations, start go straight docs specific functions--- example, call ?recip learn recip().","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/rhythmParsing.html"],"id":"dispatch","dir":"Reference","previous_headings":"","what":"Dispatch","title":"Parsing rhythm information — rhythmParsing","text":"rhythm parser (rhythmInterval()) generic function, meaning accepts variety inputs automatically \"dispatches\" appropriate method input. R's standard S3 system used dispatch either numeric character-string input: Though rhythmic representations essentially numbers, several standard representations included mix numeric non-numeric symbols. Given either character string number, humdrumR uses either regular-expression matching humdrum exclusive interpretation matching dispatch specific parsing methods.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/rhythmParsing.html"],"id":"symbolic-parsing","dir":"Reference","previous_headings":"","what":"Symbolic Parsing","title":"Parsing rhythm information — rhythmParsing","text":"Since humdrum data inherently string-based, input data ultimately starts character strings. (includes character tokens rhythm information embedded alongside information; Details .) rhythm parser (rhythmInterval()) uses combination regular-expressions exclusive interpretations decide parse input string. three regular-expression patterns rhythm rhythmInterval() knows parse automatically:","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/rhythmParsing.html"],"id":"exclusive-dispatch","dir":"Reference","previous_headings":"","what":"Exclusive Dispatch","title":"Parsing rhythm information — rhythmParsing","text":"call rhythmInterval() (rhythm function) character-string vector, non-NULL Exclusive argument, Exclusive argument used choose input interpretation want, based \"Exclusive\" column table . example, seconds(x, Exclusive = 'recip') force parser interpret x **recip data. Similarly, recip(x, Exclusive = 'dur') force parser interpret x **dur data. use rhythm function within special call withinHumdrum, humdrumR automatically pass Exclusive field humdrum data function---means, cases, need explicitly anything Exclusive argument! (want happen, need explicitly specify Exclusive argument, Exclusive = NULL.)","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/rhythmParsing.html"],"id":"regex-dispatch","dir":"Reference","previous_headings":"","what":"Regex Dispatch","title":"Parsing rhythm information — rhythmParsing","text":"call rhythmInterval() (rhythm function) character-string vector, Exclusive argument missing NULL, humdrumR instead use regular-expression patterns select known interpretation. example, seconds('4.') automatically recognize '4.' **recip token, interpret data accordingly (output 1.5). one matches, humdrumR use longest match, tie, pick based order table (topmost first). match, rhythmInterval() (rhythm function) return NA values. Remember, Exclusive specified, overrides regex-based dispatch, means pitch('4.', Exclusive = 'notevalue') return NA, '4.' interpreted **notevalue.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/rhythmParsing.html"],"id":"-in-place-parsing","dir":"Reference","previous_headings":"","what":"\"In place\" parsing","title":"Parsing rhythm information — rhythmParsing","text":"lots humdrum data, character strings encoded multiple pieces musical information right besides : example, **kern data might include tokens like \"4.ee-[. humdrumR rhythm parser (rhythmInterval()) automatically \"pull \" rhythm information within strings, can find , using appropriate known regular expressions. Various rhythm parsing functions option keep original \"extra\" data, using inPlace argument.","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/romanKey.html"],"dir":"Reference","previous_headings":"","what":"Roman numeral key areas — romanKey","title":"Roman numeral key areas — romanKey","text":"Roman numeral key areas","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/romanKey.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Roman numeral key areas — romanKey","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/romanKey.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Roman numeral key areas — romanKey","text":"x Input data, interpreted diatonic keys. Must atomic vector. Key key used parser, deparser, transposer. Defaults NULL. Must diatonicSet something coercable diatonicSet; must either length 1 length(x) parseArgs optional list arguments passed key parser. Defaults empty list(). Must list named arguments key parser.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/romanKey.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Roman numeral key areas — romanKey","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/romanNumerals.html"],"dir":"Reference","previous_headings":"","what":"Roman Numeral — romanNumerals","title":"Roman Numeral — romanNumerals","text":"Roman numerals can calculated diatonicSets (keys) tertian sets (chords). later case standard meaning \"roman numeral.\" However, former case used well, instance represent modulation schemes analyses classical music. instance, modulate -V, vi/V. importantly, many \"roman numerals\" harmonic analyses implicitely combine tertian diatonic roman numerals: \"applied\" roman numerals. Given roman numeral like \"V65/V\", \"V65\" represents chord \"/V\" represents key.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/segments.html"],"dir":"Reference","previous_headings":"","what":"Identify contiguous segments of data in a vector — segments","title":"Identify contiguous segments of data in a vector — segments","text":"segments() changes() extremely useful functions finding contiguous \"segments\" indicated vector. can particularly useful use segments() create grouping factors.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/segments.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Identify contiguous segments of data in a vector — segments","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/segments.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Identify contiguous segments of data in a vector — segments","text":"... list atomic vectors. vectors differ length, recycled match length longest vector. first first index (last index reverse == TRUE) marked \"change.\" Defaults TRUE. Must singleton logical value: /switch. Whether mark changes input vectors. Defaults TRUE. Must singleton logical value: /switch. TRUE, change input vector marked change. FALSE, changes must occur input vectors marked change. reverse Whether excecution order reversed. Defaults FALSE. Must singleton logical value: /switch. TRUE function excecuted backwards input vector(s). value Whether return changed value matrix. Defaults FALSE. Must singleton logical value: /switch. TRUE, input values changes occur returned matrix, row matching change column containing value associated input vector.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/segments.html"],"id":"changes","dir":"Reference","previous_headings":"","what":"Changes","title":"Identify contiguous segments of data in a vector — segments","text":"changes takes input vector finds indices value x[] != x[-1]---.e., value one index \"changed\" since last index. default, changes returns logical vector length input, TRUE indices change occured. first argument indicates whether first index (== 1) marked TRUE. changes can accept one input vector. argument set TRUE (default), change input marked change (TRUE) output. == FALSE, changes must happen vectors marked output. Finally, reverse argument reverses behavior changes, checkig instead x[] != x[+ 1].","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/segments.html"],"id":"values","dir":"Reference","previous_headings":"","what":"Values","title":"Identify contiguous segments of data in a vector — segments","text":"default, values input vector(s) change occurs placed matrix put values attribute logical output. However, value argument set TRUE, values returned.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/segments.html"],"id":"segments","dir":"Reference","previous_headings":"","what":"Segments","title":"Identify contiguous segments of data in a vector — segments","text":"segments builds changes function. segments function takes logical input cummulatively tallies TRUE value vector, left right (right left, reverse == TRUE). Thus, input c(TRUE, FALSE, TRUE, FALSE, FALSE, TRUE, TRUE, FALSE) return c(1, 1, 2, 2, 2, 3, 4, 4). creates contiguous blocks values can used groupby argument call within.humdrumR(), similar functions like base::tapply(). input vector(s) segments logical, first fed changes create logical input.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/segments.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Identify contiguous segments of data in a vector — segments","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/selectedFields.html"],"dir":"Reference","previous_headings":"","what":"The ","title":"The ","text":"Every humdrumR object , given time, one fields \"selected.\" selected fields fields shown humdrumR object prints console. (bottom printout, selected fields also marked *.) selected fields can also queried directly using selectedFields() function, inspecting output fields(). selected fields also play important roles humdrumR (see details).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/selectedFields.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"The ","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/selectedFields.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"The ","text":"humdrumR, .data HumdrumR data. Must humdrumR data object. ... fields output. arguments provided, Token field selected. arguments can combination character strings, numbers, symbols used match fields humdrumR input using tidyverse semantics. Unlike tidyverse select(), field names can partially matched. can also include character strings partially matching \"Data\", \"Structure\", \"Interpretation\", \"Formal\", \"Reference\" \"Grouping\", select fields types (see fields() explanation). fieldTypes field types available numeric selecting? Defaults \"\", fields counted numeric selection. Must character vector. Legal options \"Data\", \"Structure\", \"Interpretation\", \"Formal\", \"Reference\", \"Grouping\", \"\", corresponding Type column output fields(). Types can partially matched---example, \"S\" \"Structure\".","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/selectedFields.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"The ","text":"\"selected\" fields play important role humdrumR. addition controlling fields() \"see\" console printout, select fields fields many humdrumR functions automatically apply . example, call ditto(), timecount(), kern() humdrumR data object, functions applied selected field(s). (However, functions applied first selected field, one; see manuals details.) first selected field also passed hidden . variable calls ()/within()/, mutate()/summarize()/reframe()---remember fields selected can just put .! selected fields also role identifying \"null\" data. Whenever new fields selected, data tokens checked NA values null tokens (\".\"). Anywhere selected fields null, Type field updated \"d\"; wherever field null, Type field updated \"D\". Many functions ignore d (null data) tokens default, selecting fields can way controlling data want analyze .","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/selectedFields.html"],"id":"selecting-fields","dir":"Reference","previous_headings":"","what":"Selecting fields","title":"The ","text":"Fields can selected using tidyverse select() function, can use select()'s special select features. call select() argument, original Token field selected default. use select() numeric selections , like select(1:3), fields numbered (row) order shown call fields(). Fields always sorted first Type (Data first), name. provide fieldTypes argument, numeric selection reduced fields choose, matching row-numbers see call fields(humData, fieldTypes = ...). , example, select(humData, 1:3, fieldTypes = 'Structure') select first three structural fields. can also simply provide keywords \"Data\", \"Structure\", \"Interpretation\", \"Reference\", \"Formal\" select fields field type. Note call select() humdrumR data, selected field(s) change place, meaning selection changes even (re)assign output!","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/selectedFields.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"The ","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/semits.html"],"dir":"Reference","previous_headings":"","what":"Atonal pitch representations — semits","title":"Atonal pitch representations — semits","text":"function translates pitch information basic atonal pitch values: midi semits map pitches standard 12-tone-equal-temperament semitone (integer) values. semits 0 (zero) middle-C (unison). contrast, MIDI pitch values output midi place middle-C/unison 60. cents returns cents, one hundredth semitone. semits() applied humdrumR data class may use data's fields arguments. field names specified, first selectedField used x. midi() applied humdrumR data class may use data's fields arguments. field names specified, first selectedField used x.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/semits.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Atonal pitch representations — semits","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/semits.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Atonal pitch representations — semits","text":"x Input data parse pitch information. x argument can (atomic) vector, tonalInterval, NULL. ... Arguments passed pitch deparser. also two hidden (advanced) arguments can specify: memoize deparse (see details ). generic \"specific\" pitch information (accidentals qualites) discarded? Defaults FALSE. Must singleton logical value: /switch. simple \"compound\" pitch information (octave/contour) discarded? Defaults FALSE. Must singleton logical value: /switch. Key input Key used parser, deparser, transposer. Defaults NULL. Must diatonicSet something coercable diatonicSet; must either length 1 length(x) transposeArgs optional list arguments passed special transpose() call. Defaults empty list(). Must list named arguments transpose(). parseArgs optional list arguments passed pitch parser. Defaults empty list(). Must list named arguments pitch parser. inPlace non-pitch information retained output string. Defaults FALSE. Must singleton logical value: /switch. argument effect input (x argument) character strings, extra, non-pitch information input strings \"besides\" pitch information. , inPlace = TRUE, output placed output string beside original non-pitch information. inPlace = FALSE, pitch output information returned (details ). tonalHarmonic frequency \"tonal harmonic\" (perfect 12th). Defaults 2^(19/12), 12-tone-equal-temperament 12th. Must single number. Pythagorean tuning, set tonalHarmonic = 3.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/semits.html"],"id":"cents","dir":"Reference","previous_headings":"","what":"Cents","title":"Atonal pitch representations — semits","text":"default, output cents simply semits(x) * 100. However, tonalHarmonic value can modified cents produce cent-values alternate tunings. example, cents('g', tonalHarmonic = 3) returns 701.9550009, \"pure\" third harmonic (3) 1.955 sharper equal-temperment. Thus, whereas midi semits return integers, cents always returns real-number (double) values. TonalIntervals parsed frequencies might also arbitrary cent deviations. example, cents(440 * 10/9, Exclusive = 'freq') returns 1082.404---correspond \"minor tone\" =440.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/semits.html"],"id":"basic-pitch-arguments","dir":"Reference","previous_headings":"","what":"Basic pitch arguments","title":"Atonal pitch representations — semits","text":"pitch function standard arguments control details output. important generic simple arguments, allow control type pitch information returned.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/semits.html"],"id":"generic-vs-specific","dir":"Reference","previous_headings":"","what":"Generic vs Specific","title":"Atonal pitch representations — semits","text":"generic = TRUE, specific pitch information (accidentals qualities) omitted output. alternative way controlling functionality, can use specific argument, specific == !generic. case atonal functions, \"generic\" version pitch output: example, semits('c#', generic = TRUE) return 0, \"generic\" version C# C, corresponds 0. However, note generic version pitch follows key, semits('c#', generic = TRUE, Key = ':') return 1!","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/semits.html"],"id":"simple-vs-compound","dir":"Reference","previous_headings":"","what":"Simple vs Compound","title":"Atonal pitch representations — semits","text":"simple = TRUE, compound pitch information (octave contour) omitted output. alternative way controlling functionality, can use compound argument ,compound == !simple. actually one way might want divide compound intervals simple octave parts. example, might like call output -M2 (descending major 2nd) +m7 (ascending minor 7th octave ). functionality can controlled octave.round argument: see pitch deparsing documentation.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/semits.html"],"id":"key","dir":"Reference","previous_headings":"","what":"Key","title":"Atonal pitch representations — semits","text":"Key argument must diatonicSet, something can parsed one. Key argument passed parser, deparser, transpose---unless alternate Key passed transposeArgs parseArgs. Various deparsing options use Key argument; example, use implicitSpecies (see advanced parsing section) dependent Key. use pitch function within special call withinHumdrum, humdrumR automatically pass Key field humdrum data function---means, cases, need explicitly anything Key argument! (want happen, need explicitly specify Key argument, Key = NULL.)","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/semits.html"],"id":"parse-arguments","dir":"Reference","previous_headings":"","what":"Parse arguments","title":"Atonal pitch representations — semits","text":"parseArgs argument must list() (named) arguments passed input parser. example, input representation uses \"X\" represent double sharps, specify kern('CX5', parseArgs = list(doublesharp = 'X')) get correct result (\"cc##\"). convenient shorthand, \"syntactic sugar,\" can specify parseArgs alternate way: Simply input parse(args...) unnamed argument pitch function. example, can get exact result typing kern('CX5', parse(doublesharp = 'X')).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/semits.html"],"id":"transpose-arguments","dir":"Reference","previous_headings":"","what":"Transpose arguments","title":"Atonal pitch representations — semits","text":"transposeArgs argument must list() (named) arguments passed internal call transpose(), allowing us easily transpose pitch information. example, type kern(c('C', 'D', 'E'), transposeArgs = list(= 'M9')) can get output c('d', 'e', 'f#'). possible transpose args : (tonalInterval, length == 1 | length == (x)) (diatonicSet, length == 1 | length == (x)) (diatonicSet, length == 1 | length == (x)) real (logical, length == 1) transposition real tonal? relative (logical, length == 1) key-wise transposition based relative parallel keys? convenient shorthand, \"syntactic sugar,\" can specify transposeArgs alternate way: Simply input transpose(args...) unnamed argument pitch function. example, can get exact result typing kern(c('C', 'D', 'E'), transpose(= 'M9')).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/semits.html"],"id":"transposing-by-interval","dir":"Reference","previous_headings":"","what":"Transposing by interval","title":"Atonal pitch representations — semits","text":"calling transpose() directly, argument can anything coercable tonalInterval, output transposed amount. real = FALSE, tonal transposition (within Key) performed. details transposition behavior, check transpose() docs.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/semits.html"],"id":"transposing-by-key","dir":"Reference","previous_headings":"","what":"Transposing by key","title":"Atonal pitch representations — semits","text":"Another way transposing specifying input (\"\") key output (\"\") key. default, Key argument passed transpose , nothing actually happens. Thus, specify either key key, transposition happen /key Key. course, specify transposition happen keys specify. use pitch function within special call withinHumdrum, humdrumR automatically pass Key field humdrum data function. specify key, Key field passed transpose key, result, pitches input transposed whatever keys target () key! real relative arguments give special control key-wise transposition works, check transpose() docs details!","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/semits.html"],"id":"in-place-parsing","dir":"Reference","previous_headings":"","what":"In-place parsing","title":"Atonal pitch representations — semits","text":"humdrum data, character strings often encoded multiple pieces musical information right besides : example, **kern data might include tokens like \"4.ee-[. humdrumR parser (tonalInterval) automatically \"pull \" pitch information within strings, can find using appropriate known regular expressions. example, pitch('4.ee-[') returns Eb5. However, pitch functions (like pitch() kern()) option keep \"extra\" information return result \"place\"---.e., embedded right found input string. controlled inPlace argument, FALSE default. , pitch('4.ee-[', inPlace = TRUE) return 4.Eb5[---keeping \"4.\" \"[\". (obviously works input string, numeric!) Note inPlace = TRUE force functions like semits, normally return numeric values, return character strings input character string.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/semits.html"],"id":"pitch-gamut-levels","dir":"Reference","previous_headings":"","what":"Pitch-Gamut Levels","title":"Atonal pitch representations — semits","text":"table() automatically generate factor levels pitch data using gamut() function. makes sure tabulated data sorted logical order, includes missing pitches. simple/complex generic/specific arguments automatically passed gamut(); additional arguments can passed gamut using gamutArgs = list(...), syntactic sugar gamut(...). (Read gamut() docs explanation gamut generation.) feature used control table layout pitch data, well assure consistent tables grouping data. inPlace = TRUE special tabulation occur.","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/semits.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Atonal pitch representations — semits","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/sigma.html"],"dir":"Reference","previous_headings":"","what":"Cumulative sum of numeric vector — sigma","title":"Cumulative sum of numeric vector — sigma","text":"Calculate sequential cummulative sum values numeric vectors.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/sigma.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Cumulative sum of numeric vector — sigma","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/sigma.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Cumulative sum of numeric vector — sigma","text":"x input vector. Must atomic numbers. NULL values returned NULL. lag lag use. Defaults 1. Must natural number. (See Greater lags section, .) skip function indicate values skip. Defaults .na. must function can applied x return logical vector length. TRUE values skipped calculations. default, skip function .na, NA values input (x argument) skipped. skipped values returned output vector. init Initial value fill beginning calculation. Defaults 0. class x; length must longer lag. NA values beginning (end right == TRUE) filled values summing. groupby group data. Defaults list(). vector list vectors; must length length(x). Differences calculated across groups indicated groupby vector(s). orderby order calculating difference. Defaults list(). vector list vectors; must length length(x). Differences x calculated based order orderby vector(s), determined base::order(). right init padding \"right\" (end vector)? Defaults FALSE. Must singleton logical value: /switch. default, right == FALSE init padding beginning output.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/sigma.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Cumulative sum of numeric vector — sigma","text":"sigma similar base-R cumsum(). However, sigma favored humdrumR use : groupby argument, automatically used humdrumR () commands constrain differences within pieces/spines/paths humdrum data. Using groupby argument function (details ) generally faster using groupby argument withinHumdrum(). (can) automatically skip NA () values. sigma also init argument can used ensure full invertability delta(). See \"Invertability\" section . applied matrix, sigma applied separately column, unless margin set 1 (rows) , higher-dimensional array, higher value.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/sigma.html"],"id":"invertability","dir":"Reference","previous_headings":"","what":"Invertability","title":"Cumulative sum of numeric vector — sigma","text":"sigma delta functions inverses , meaning right arguments set, sigma(delta(x)) == x delta(sigma(x)) == x. words, two functions \"reverse\" . key init argument needs set 0, arguments (lag, skip, groupby, etc.) need match. actually, sigma(delta(x, init = 0, ...)) == x delta(sigma(x), init = 0)) == x. take differences values (delta(x)), resulting differences tell us fully reconstruct original unless know \"start\" (constant offset). example, delta(c(5, 7, 5, 6)) == c(NA, 2, -2, 1) know input goes 2, back 2, 1, starting value (first 5) lost. call sigma , get: sigma(c(NA, 2, -2, 1)) == c(0, 2,0, 1) get right contour, offset constant 5. call delta(x, init = 0) necessary constant (first value) kept beginning vector delta(c(5, 7, 5, 6), init = 0) == c(5, 2, -2, 1) sigma gets want, full invertability: sigma(delta(c(5, 7, 5, 6), init = 0)) == c(5, 7, 5, 6) Alternatively, specify necessary constant init argument sigma: sigma(delta(c(5, 7, 5, 6)), init = 5) == c(5, 7, 5, 6) init arguments two functions complementary. Currently, right argument delta complement sigma, invertability holds true right = FALSE (default).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/sigma.html"],"id":"greater-lags","dir":"Reference","previous_headings":"","what":"Greater lags","title":"Cumulative sum of numeric vector — sigma","text":"behavior sigma abs(lag) > 1 easiest understand inverse behavior delta(abs(lag) > 1), intuitive. (sigma inverse delta(), see Invertability section ). Generally, abs(lag) > 1, x grouped indices modulo lag, cumulative sum calculated separately set modulo indices. example, consider lag == 2 following input: cumulative sum 1 0 modulo-index groups : Index 1: cumsum(c(1,2,5)) == c(1, 3, 8). Index 0: cumsum(c(3,2)) == c(3, 5) Interleaved back order, result c(1,3,3,5,8). may clear, sure enough delta(c(1, 3, 3, 5, 8), lag = 2, init = 0) returns original c(1,3,2,2,5) vector! , understanding delta(..., lag = n) easier sigma(..., lag = n) (see Invtertability section .)","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/sigma.html"],"id":"negative-lag","dir":"Reference","previous_headings":"","what":"Negative lag","title":"Cumulative sum of numeric vector — sigma","text":"lag negative, output equivalent positive lag, except sign reversed (output * -1). behavior easiest understand inverse behavior delta(lag < 0), intuitive. (sigma inverse delta(), see Invertability section ).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/sigma.html"],"id":"grouping","dir":"Reference","previous_headings":"","what":"Grouping","title":"Cumulative sum of numeric vector — sigma","text":"many cases want perform lagged calculations vector, across certain boundaries. example, vector includes data multiple pieces, want calculate melodic intervals pieces, within pieces. groupby argument indicates one, , grouping vectors, break x (input) argument groups. groupby vectors given, change vector indicates boundary. Value pairs cross groups treated beginning. Basically, using groupby argument function similar identical using tapply(x, groupby, laggedFunction, ...) using groupby expession call ().humdrumR. However, using groupby argument directly usually much faster, specially optimized functions. common use case humdrum data, looking \"melodies\" within spines. , want groupby = list(Piece, Spine, Path). fact, humdrumR () calls automatically feed three fields groupby arguments certain functions: mint, delta, sigma, lag, ditto, ioi, sumTies, hop, wort, wort.character. use delta call (), automatically calculate delta \"melodic\" way, within spine path piece. However, wanted, instance, calculate differences across spines (like harmonic intervals) manually set groupby = list(Piece, Record).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/sigma.html"],"id":"order","dir":"Reference","previous_headings":"","what":"Order","title":"Cumulative sum of numeric vector — sigma","text":"performing lagged calculations, typically assume order values input vector (x) order want \"lag\" across. E.g., first element \"\" second element, \"\" third element, etc. [Humdrum tables][humTable] always ordered Piece > Piece > Spine > Path > Record > Stop. Thus, lagged calculations across fields humtable , default, \"melodic\": next element next element spine path. example, consider data: default order tokens (Token field) b c d e f. wanted instead lag across tokens harmonically (across records) need specifiy different order example, say orderby = list(Pice, Record, Spine)---lagged function interpret Token field d b e c f. another example, note Stop comes last order. consider happens stops data:","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/signature.html"],"dir":"Reference","previous_headings":"","what":"Humdrum key signature — signature","title":"Humdrum key signature — signature","text":"Humdrum key signature","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/signature.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Humdrum key signature — signature","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/signature.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Humdrum key signature — signature","text":"x Input data, interpreted diatonic keys. Must atomic vector. Key key used parser, deparser, transposer. Defaults NULL. Must diatonicSet something coercable diatonicSet; must either length 1 length(x) parseArgs optional list arguments passed key parser. Defaults empty list(). Must list named arguments key parser.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/signature.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Humdrum key signature — signature","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/silbeFormat.html"],"dir":"Reference","previous_headings":"","what":"silbeFormat — silbeFormat","title":"silbeFormat — silbeFormat","text":"Check formatting lyrics correct, -'s right places (.e., denote start end syllable)","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/silbeFormat.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"silbeFormat — silbeFormat","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/silbeFormat.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"silbeFormat — silbeFormat","text":"cVector data checked improper formatting. Must data.frame. now, please read spine dataframe 1 column.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/silbeFormat.html"],"id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"silbeFormat — silbeFormat","text":"\"Formatted properly.\" lyrics formatted properly, else print error message corrections.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/silbeFormat.html"],"id":"note","dir":"Reference","previous_headings":"","what":"Note","title":"silbeFormat — silbeFormat","text":"function might detect multiple inconsistencies/errors given value particular index, help user determine exact issue(s) transcription.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/solfa.html"],"dir":"Reference","previous_headings":"","what":"Relative-do Solfege representation — solfa","title":"Relative-do Solfege representation — solfa","text":"solfa() applied humdrumR data class may use data's fields arguments. field names specified, first selectedField used x.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/solfa.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Relative-do Solfege representation — solfa","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/solfa.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Relative-do Solfege representation — solfa","text":"x Input data parse pitch information. x argument can (atomic) vector, tonalInterval, NULL. ... Arguments passed pitch deparser. also two hidden (advanced) arguments can specify: memoize deparse (see details ). generic \"specific\" pitch information (accidentals qualites) discarded? Defaults FALSE. Must singleton logical value: /switch. simple \"compound\" pitch information (octave/contour) discarded? Defaults FALSE. Must singleton logical value: /switch. Key input Key used parser, deparser, transposer. Defaults NULL. Must diatonicSet something coercable diatonicSet; must either length 1 length(x) transposeArgs optional list arguments passed special transpose() call. Defaults empty list(). Must list named arguments transpose(). parseArgs optional list arguments passed pitch parser. Defaults empty list(). Must list named arguments pitch parser. inPlace non-pitch information retained output string. Defaults FALSE. Must singleton logical value: /switch. argument effect input (x argument) character strings, extra, non-pitch information input strings \"besides\" pitch information. , inPlace = TRUE, output placed output string beside original non-pitch information. inPlace = FALSE, pitch output information returned (details ).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/solfa.html"],"id":"basic-pitch-arguments","dir":"Reference","previous_headings":"","what":"Basic pitch arguments","title":"Relative-do Solfege representation — solfa","text":"pitch function standard arguments control details output. important generic simple arguments, allow control type pitch information returned.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/solfa.html"],"id":"generic-vs-specific","dir":"Reference","previous_headings":"","what":"Generic vs Specific","title":"Relative-do Solfege representation — solfa","text":"generic = TRUE, specific pitch information (accidentals qualities) omitted output. alternative way controlling functionality, can use specific argument, specific == !generic. case atonal functions, \"generic\" version pitch output: example, semits('c#', generic = TRUE) return 0, \"generic\" version C# C, corresponds 0. However, note generic version pitch follows key, semits('c#', generic = TRUE, Key = ':') return 1!","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/solfa.html"],"id":"simple-vs-compound","dir":"Reference","previous_headings":"","what":"Simple vs Compound","title":"Relative-do Solfege representation — solfa","text":"simple = TRUE, compound pitch information (octave contour) omitted output. alternative way controlling functionality, can use compound argument ,compound == !simple. actually one way might want divide compound intervals simple octave parts. example, might like call output -M2 (descending major 2nd) +m7 (ascending minor 7th octave ). functionality can controlled octave.round argument: see pitch deparsing documentation.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/solfa.html"],"id":"key","dir":"Reference","previous_headings":"","what":"Key","title":"Relative-do Solfege representation — solfa","text":"Key argument must diatonicSet, something can parsed one. Key argument passed parser, deparser, transpose---unless alternate Key passed transposeArgs parseArgs. Various deparsing options use Key argument; example, use implicitSpecies (see advanced parsing section) dependent Key. use pitch function within special call withinHumdrum, humdrumR automatically pass Key field humdrum data function---means, cases, need explicitly anything Key argument! (want happen, need explicitly specify Key argument, Key = NULL.)","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/solfa.html"],"id":"parse-arguments","dir":"Reference","previous_headings":"","what":"Parse arguments","title":"Relative-do Solfege representation — solfa","text":"parseArgs argument must list() (named) arguments passed input parser. example, input representation uses \"X\" represent double sharps, specify kern('CX5', parseArgs = list(doublesharp = 'X')) get correct result (\"cc##\"). convenient shorthand, \"syntactic sugar,\" can specify parseArgs alternate way: Simply input parse(args...) unnamed argument pitch function. example, can get exact result typing kern('CX5', parse(doublesharp = 'X')).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/solfa.html"],"id":"transpose-arguments","dir":"Reference","previous_headings":"","what":"Transpose arguments","title":"Relative-do Solfege representation — solfa","text":"transposeArgs argument must list() (named) arguments passed internal call transpose(), allowing us easily transpose pitch information. example, type kern(c('C', 'D', 'E'), transposeArgs = list(= 'M9')) can get output c('d', 'e', 'f#'). possible transpose args : (tonalInterval, length == 1 | length == (x)) (diatonicSet, length == 1 | length == (x)) (diatonicSet, length == 1 | length == (x)) real (logical, length == 1) transposition real tonal? relative (logical, length == 1) key-wise transposition based relative parallel keys? convenient shorthand, \"syntactic sugar,\" can specify transposeArgs alternate way: Simply input transpose(args...) unnamed argument pitch function. example, can get exact result typing kern(c('C', 'D', 'E'), transpose(= 'M9')).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/solfa.html"],"id":"transposing-by-interval","dir":"Reference","previous_headings":"","what":"Transposing by interval","title":"Relative-do Solfege representation — solfa","text":"calling transpose() directly, argument can anything coercable tonalInterval, output transposed amount. real = FALSE, tonal transposition (within Key) performed. details transposition behavior, check transpose() docs.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/solfa.html"],"id":"transposing-by-key","dir":"Reference","previous_headings":"","what":"Transposing by key","title":"Relative-do Solfege representation — solfa","text":"Another way transposing specifying input (\"\") key output (\"\") key. default, Key argument passed transpose , nothing actually happens. Thus, specify either key key, transposition happen /key Key. course, specify transposition happen keys specify. use pitch function within special call withinHumdrum, humdrumR automatically pass Key field humdrum data function. specify key, Key field passed transpose key, result, pitches input transposed whatever keys target () key! real relative arguments give special control key-wise transposition works, check transpose() docs details!","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/solfa.html"],"id":"in-place-parsing","dir":"Reference","previous_headings":"","what":"In-place parsing","title":"Relative-do Solfege representation — solfa","text":"humdrum data, character strings often encoded multiple pieces musical information right besides : example, **kern data might include tokens like \"4.ee-[. humdrumR parser (tonalInterval) automatically \"pull \" pitch information within strings, can find using appropriate known regular expressions. example, pitch('4.ee-[') returns Eb5. However, pitch functions (like pitch() kern()) option keep \"extra\" information return result \"place\"---.e., embedded right found input string. controlled inPlace argument, FALSE default. , pitch('4.ee-[', inPlace = TRUE) return 4.Eb5[---keeping \"4.\" \"[\". (obviously works input string, numeric!) Note inPlace = TRUE force functions like semits, normally return numeric values, return character strings input character string.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/solfa.html"],"id":"pitch-gamut-levels","dir":"Reference","previous_headings":"","what":"Pitch-Gamut Levels","title":"Relative-do Solfege representation — solfa","text":"table() automatically generate factor levels pitch data using gamut() function. makes sure tabulated data sorted logical order, includes missing pitches. simple/complex generic/specific arguments automatically passed gamut(); additional arguments can passed gamut using gamutArgs = list(...), syntactic sugar gamut(...). (Read gamut() docs explanation gamut generation.) feature used control table layout pitch data, well assure consistent tables grouping data. inPlace = TRUE special tabulation occur.","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/solfa.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Relative-do Solfege representation — solfa","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/solfg.html"],"dir":"Reference","previous_headings":"","what":"Fixed-do Solfege representation — solfg","title":"Fixed-do Solfege representation — solfg","text":"Based common French system notating pitches, encoded humdrum **solfg interpretation. solfg() applied humdrumR data class may use data's fields arguments. field names specified, first selectedField used x.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/solfg.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Fixed-do Solfege representation — solfg","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/solfg.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Fixed-do Solfege representation — solfg","text":"x Input data parse pitch information. x argument can (atomic) vector, tonalInterval, NULL. ... Arguments passed pitch deparser. also two hidden (advanced) arguments can specify: memoize deparse (see details ). generic \"specific\" pitch information (accidentals qualites) discarded? Defaults FALSE. Must singleton logical value: /switch. simple \"compound\" pitch information (octave/contour) discarded? Defaults FALSE. Must singleton logical value: /switch. Key input Key used parser, deparser, transposer. Defaults NULL. Must diatonicSet something coercable diatonicSet; must either length 1 length(x) transposeArgs optional list arguments passed special transpose() call. Defaults empty list(). Must list named arguments transpose(). parseArgs optional list arguments passed pitch parser. Defaults empty list(). Must list named arguments pitch parser. inPlace non-pitch information retained output string. Defaults FALSE. Must singleton logical value: /switch. argument effect input (x argument) character strings, extra, non-pitch information input strings \"besides\" pitch information. , inPlace = TRUE, output placed output string beside original non-pitch information. inPlace = FALSE, pitch output information returned (details ).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/solfg.html"],"id":"basic-pitch-arguments","dir":"Reference","previous_headings":"","what":"Basic pitch arguments","title":"Fixed-do Solfege representation — solfg","text":"pitch function standard arguments control details output. important generic simple arguments, allow control type pitch information returned.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/solfg.html"],"id":"generic-vs-specific","dir":"Reference","previous_headings":"","what":"Generic vs Specific","title":"Fixed-do Solfege representation — solfg","text":"generic = TRUE, specific pitch information (accidentals qualities) omitted output. alternative way controlling functionality, can use specific argument, specific == !generic. case atonal functions, \"generic\" version pitch output: example, semits('c#', generic = TRUE) return 0, \"generic\" version C# C, corresponds 0. However, note generic version pitch follows key, semits('c#', generic = TRUE, Key = ':') return 1!","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/solfg.html"],"id":"simple-vs-compound","dir":"Reference","previous_headings":"","what":"Simple vs Compound","title":"Fixed-do Solfege representation — solfg","text":"simple = TRUE, compound pitch information (octave contour) omitted output. alternative way controlling functionality, can use compound argument ,compound == !simple. actually one way might want divide compound intervals simple octave parts. example, might like call output -M2 (descending major 2nd) +m7 (ascending minor 7th octave ). functionality can controlled octave.round argument: see pitch deparsing documentation.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/solfg.html"],"id":"key","dir":"Reference","previous_headings":"","what":"Key","title":"Fixed-do Solfege representation — solfg","text":"Key argument must diatonicSet, something can parsed one. Key argument passed parser, deparser, transpose---unless alternate Key passed transposeArgs parseArgs. Various deparsing options use Key argument; example, use implicitSpecies (see advanced parsing section) dependent Key. use pitch function within special call withinHumdrum, humdrumR automatically pass Key field humdrum data function---means, cases, need explicitly anything Key argument! (want happen, need explicitly specify Key argument, Key = NULL.)","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/solfg.html"],"id":"parse-arguments","dir":"Reference","previous_headings":"","what":"Parse arguments","title":"Fixed-do Solfege representation — solfg","text":"parseArgs argument must list() (named) arguments passed input parser. example, input representation uses \"X\" represent double sharps, specify kern('CX5', parseArgs = list(doublesharp = 'X')) get correct result (\"cc##\"). convenient shorthand, \"syntactic sugar,\" can specify parseArgs alternate way: Simply input parse(args...) unnamed argument pitch function. example, can get exact result typing kern('CX5', parse(doublesharp = 'X')).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/solfg.html"],"id":"transpose-arguments","dir":"Reference","previous_headings":"","what":"Transpose arguments","title":"Fixed-do Solfege representation — solfg","text":"transposeArgs argument must list() (named) arguments passed internal call transpose(), allowing us easily transpose pitch information. example, type kern(c('C', 'D', 'E'), transposeArgs = list(= 'M9')) can get output c('d', 'e', 'f#'). possible transpose args : (tonalInterval, length == 1 | length == (x)) (diatonicSet, length == 1 | length == (x)) (diatonicSet, length == 1 | length == (x)) real (logical, length == 1) transposition real tonal? relative (logical, length == 1) key-wise transposition based relative parallel keys? convenient shorthand, \"syntactic sugar,\" can specify transposeArgs alternate way: Simply input transpose(args...) unnamed argument pitch function. example, can get exact result typing kern(c('C', 'D', 'E'), transpose(= 'M9')).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/solfg.html"],"id":"transposing-by-interval","dir":"Reference","previous_headings":"","what":"Transposing by interval","title":"Fixed-do Solfege representation — solfg","text":"calling transpose() directly, argument can anything coercable tonalInterval, output transposed amount. real = FALSE, tonal transposition (within Key) performed. details transposition behavior, check transpose() docs.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/solfg.html"],"id":"transposing-by-key","dir":"Reference","previous_headings":"","what":"Transposing by key","title":"Fixed-do Solfege representation — solfg","text":"Another way transposing specifying input (\"\") key output (\"\") key. default, Key argument passed transpose , nothing actually happens. Thus, specify either key key, transposition happen /key Key. course, specify transposition happen keys specify. use pitch function within special call withinHumdrum, humdrumR automatically pass Key field humdrum data function. specify key, Key field passed transpose key, result, pitches input transposed whatever keys target () key! real relative arguments give special control key-wise transposition works, check transpose() docs details!","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/solfg.html"],"id":"in-place-parsing","dir":"Reference","previous_headings":"","what":"In-place parsing","title":"Fixed-do Solfege representation — solfg","text":"humdrum data, character strings often encoded multiple pieces musical information right besides : example, **kern data might include tokens like \"4.ee-[. humdrumR parser (tonalInterval) automatically \"pull \" pitch information within strings, can find using appropriate known regular expressions. example, pitch('4.ee-[') returns Eb5. However, pitch functions (like pitch() kern()) option keep \"extra\" information return result \"place\"---.e., embedded right found input string. controlled inPlace argument, FALSE default. , pitch('4.ee-[', inPlace = TRUE) return 4.Eb5[---keeping \"4.\" \"[\". (obviously works input string, numeric!) Note inPlace = TRUE force functions like semits, normally return numeric values, return character strings input character string.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/solfg.html"],"id":"pitch-gamut-levels","dir":"Reference","previous_headings":"","what":"Pitch-Gamut Levels","title":"Fixed-do Solfege representation — solfg","text":"table() automatically generate factor levels pitch data using gamut() function. makes sure tabulated data sorted logical order, includes missing pitches. simple/complex generic/specific arguments automatically passed gamut(); additional arguments can passed gamut using gamutArgs = list(...), syntactic sugar gamut(...). (Read gamut() docs explanation gamut generation.) feature used control table layout pitch data, well assure consistent tables grouping data. inPlace = TRUE special tabulation occur.","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/solfg.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Fixed-do Solfege representation — solfg","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/sonority.html"],"dir":"Reference","previous_headings":"","what":"Interpret tertian sonorities from set(s) of notes. — sonority","title":"Interpret tertian sonorities from set(s) of notes. — sonority","text":"sonority() function accepts vectors notes, usually grouped multiple chords groupby argument, interprets notes tertian sonority. Chords output using representation indicated deparser argument. default, /within.humdrumR automatically pass sonority groupby argument groupby = list(Piece, Record), chords estimated record dataset.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/sonority.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Interpret tertian sonorities from set(s) of notes. — sonority","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/sonority.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Interpret tertian sonorities from set(s) of notes. — sonority","text":"x Input data, interpreted pitches. vector interpreted pitch information using tonalInterval(). deparser output representation want? Defaults chord(). Must chord function, like roman(), harm() chord(). Key input key used deparser. Defaults NULL, indicating c major. However, /within.humdrum automatically pass Key field data sonority, one. Must diatonicSet something coercable diatonicSet; must either length 1 length(x) chord parsers use Key, irrelevant, want use Key roman numerals. inversions interpret note sets inversions? Defaults TRUE. Must singleton logical value: /switch. incomplete return incomplete chords? Defaults TRUE. Must singleton logical value: /switch. enharmonic pitches interpreted enharmonically? Defaults FALSE. Must singleton logical value: /switch. inPlace output always match input? Defaults FALSE groupby list; TRUE . Must singleton logical value: /switch. fill output duplicate chord every note input? Defaults TRUE. Must singleton logical value: /switch. argument effect inPlace = TRUE.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/sonority.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Interpret tertian sonorities from set(s) of notes. — sonority","text":"inPlace = TRUE, sonority()returns vectorized output, output matching length input vector. default,fill = FALSE, output chord repeated align notes chord. fill = FALSE, chord returned , padded null tokens match length input. Finally, inPlace = FALSEonly one chord returned group ingroupby`. inversions = TRUE, notes interpreted chordal inversion compact (triad like) circle thirds. inversions = FALSE, lowest note always interpreted root. incomplete = TRUE, incomplete chords returns , might see things like \"C7no5\" (seventh chord fifth). incomplete = FALSE, sonority() (attempt) fill missing \"implied\" triad notes, note like missing 5ths. default, sonority() interpret spelling notes strictly, \"mispelled\" triad, like B, E♭, F♯ interpreted something weird---case augmented Eb chord third sharp 9! Note case cross relations---example, B♭ B♮ chord---sonority() simply ignore later species appears. However, enharmonic = TRUE, sonority() reinterpret input notes collapsing single diatonic set circle--fifths. means set B, Eb, F♯ interpreted B, D♯, F♯ set B♭, D, F, B♮ interpreted B♭, D, F, C♭.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/sonority.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Interpret tertian sonorities from set(s) of notes. — sonority","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/spines.html"],"dir":"Reference","previous_headings":"","what":"Summarize spines in humdrum dataset. — spines","title":"Summarize spines in humdrum dataset. — spines","text":"spines tabulates spines spine paths within files humdrumR corpus. spines one humdrumR's basic corpus summary functions.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/spines.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Summarize spines in humdrum dataset. — spines","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/spines.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Summarize spines in humdrum dataset. — spines","text":"humdrumR HumdrumR data summarize. Must humdrumR data object. drop Whether return normal data.table humCensus table. Defaults FALSE. Must singleton logical value: /switch. drop = TRUE, normal data.table returned instead humCensus table. Index rows. numeric, selects rows index. character, string matched regular expression filenames corpus.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/spines.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Summarize spines in humdrum dataset. — spines","text":"spines returns special data.frame called humSpines table. humSpines table five columns information piece: Spines number spines. Paths total number spine paths. number spines contain spine paths. *^ total number spine splits (\"*^\"). *v total number spine joins (\"*v\"). humSpine table prints command line, \"tallies\" unique combinations spines paths files also printed.","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/spines.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Summarize spines in humdrum dataset. — spines","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/step.html"],"dir":"Reference","previous_headings":"","what":"Extract scale step. — step","title":"Extract scale step. — step","text":"equivalent using pitch function arguments generic = TRUE, simple = TRUE, step.labels = NULL. default, step() returns steps relative key---set Key = NULL want .","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/step.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Extract scale step. — step","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/step.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Extract scale step. — step","text":"x Input data parse pitch information. x argument can (atomic) vector, tonalInterval, NULL. ... Arguments passed pitch deparser. also two hidden (advanced) arguments can specify: memoize deparse (see details ). generic \"specific\" pitch information (accidentals qualites) discarded? Defaults FALSE. Must singleton logical value: /switch. simple \"compound\" pitch information (octave/contour) discarded? Defaults FALSE. Must singleton logical value: /switch. Key input Key used parser, deparser, transposer. Defaults NULL. Must diatonicSet something coercable diatonicSet; must either length 1 length(x) transposeArgs optional list arguments passed special transpose() call. Defaults empty list(). Must list named arguments transpose(). parseArgs optional list arguments passed pitch parser. Defaults empty list(). Must list named arguments pitch parser. inPlace non-pitch information retained output string. Defaults FALSE. Must singleton logical value: /switch. argument effect input (x argument) character strings, extra, non-pitch information input strings \"besides\" pitch information. , inPlace = TRUE, output placed output string beside original non-pitch information. inPlace = FALSE, pitch output information returned (details ).","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/step.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Extract scale step. — step","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/struct.html"],"dir":"Reference","previous_headings":"","what":"struct — struct","title":"struct — struct","text":"Virtual class help create atomic-vector-like composite data objects.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/struct.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"struct — struct","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/struct.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"struct — struct","text":"humdrumR defines number S4 classes , underneath surface, composite data types made collections base-R atomic vectors, stuck together. \"vectorized\" nature R's atomic types one R's key strengths, humdrumR try ) mostly use standard atomic types B) make new types define act much like atomic vectors possible. struct virtual S4 class serves purpose: creating composite atomic vectors act (mostly) like base-R atomic vectors. \"virtual class\" structs really exist independent objects, struct class defines (abstractly) necessarry methods treat collection atomic vectors single vector/matrix-like object---simply make new subclass inherit struct taken care . (, specify contains = \"struct\" call setClass.) Important humdrumR classes inherit struct include: tonal intervals diatonicSet tertianSet rational() warned, R's S4 object-system limited regard: really define S4 classes act fully like R atomics, many features hard-coded R replicated. important limitation struct may encounter , though struct classes work (ok) data.frames, data.tables tibbles either work give strange behaviors put structs .","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/struct.html"],"id":"slots","dir":"Reference","previous_headings":"","what":"Slots","title":"struct — struct","text":"dim Either NULL non-negative integer-vector length == 2L, representing number rows columns respectively. Dimensions can zero. rownames Either NULL integer/character-vector length either ) dim == NULL, length struct B) dim != NULL, number rows struct. colnames Either NULL (must NULL dim == NULL) integer/character-vector length equal number columns struct.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/struct.html"],"id":"behavior","dir":"Reference","previous_headings":"","what":"Behavior","title":"struct — struct","text":"struct subclasses (.e., classes inherit struct) behave similarly normal R atomic vectors/matrices. However, differ respects, mostly ways intended avoid quirky behaviors R matrices: general, distinction dimensionless vectors dimensioned vectors (matrices) slightly weaker structs normal R atomic vectors/matrices. importantly, dimensioned structs drop dimensions various common operations (c, [], etc.), way base-R matrices . general, easier interact multi-column (matrix-)struct way dimensionless (vector-)struct. example, struct dimensions length(struct) == nrow(struct), instead length(matrix) == nrow(matrix) * ncol(matrix)---.e., \"height\" struct (number rows) length. Another big difference behaviors c: c always cause structs lose dimensions c can used concatinated multi-column structs, even mixes dimensionless dimensioned structs: struct arguments c dimensions, structs concatinated via call rbind, dimensionless vectors coerced 1-column matrices. course, (resulting) number columns must error occur! differences: structs can either dimensions (dim(struct) == NULL) two dimensions. Higher dimensional structs supported (yet). rowSums colSums coerce dimensionless struct column matrix. structs always throw error try index index value greater length/nrow struct. different atomic vectors, pad vector length index give---sometimes useful quirky behavior. structs two dimensions cartesian indexing argument. cartesian = TRUE, j arguments treated cartesian coordinates. (behavior can achieved base R matrices (structs) inputing matrix two columns.)","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/struct.html"],"id":"requirements","dir":"Reference","previous_headings":"","what":"Requirements","title":"struct — struct","text":"work, struct makes assumptions class. class must one slots vectors, length. struct's indexing method cause vectors indexed one. define new subclass struct, inherit validObject method assures elements dimension. Thus, writing validObject method (using setValidity) just worry specifically validity information slots, slots length.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/struct.html"],"id":"initialize","dir":"Reference","previous_headings":"","what":"Initialize","title":"struct — struct","text":"initialize method automatically makes slots length predefined structs. want make specialized initialize method, can still take advantage inherited method using callNextMethod beginning method.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/struct.html"],"id":"predefined-methods","dir":"Reference","previous_headings":"","what":"Predefined methods","title":"struct — struct","text":"main purpose struct virtual class defines many basic methods need manipulate subclass objects. importantly, indexing methods fully defined (mimic base-R atomic vector/matrix indexing), well basic \"structural\" methods like (col/row)names, dim, length, ncol, nrow, etc. addition: define > >=, < <= automatically defined. define .character subclass, show format methods automatically defined. , default arithmetic methods addition, subtraction, (scalar-integer) multiplication, negation (-x) defined. default addition behavior numeric (base::integer base::numeric) slot subclasses added together. Thus, struct1 + struct2 extract numeric/integer slot struct, add together create new struct result. -struct negate numeric fields, subtraction simply defined adding negation. Since scalar multiplication defined, two structs multiplied, struct can multiplied integer (numeric fields multiplied integer(s)). definitions work subclass, need create , specific, method!","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/struct.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"struct — struct","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/subset.humdrumR.html"],"dir":"Reference","previous_headings":"","what":"Filter humdrum data — subset.humdrumR","title":"Filter humdrum data — subset.humdrumR","text":"HumdrumR defines subset() (base R) filter() (tidyverse) methods humdrumR data---two .humdrumR methods synonymous, working exactly . used \"filter\" contents underlying humdrum table. R's standard indexing operators ([] [[]]) can also used filter data--- can read indexing options ---however, subset()/filter() can accomplish much sophisticated filtering commands indexing methods. Filtering subset()/filter() (default) destructive, allowing recover filtered data using removeSubset() unfilter() (also synonyms).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/subset.humdrumR.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Filter humdrum data — subset.humdrumR","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/subset.humdrumR.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Filter humdrum data — subset.humdrumR","text":"x, .data, humdrumR HumdrumR data. Must humdrumR data object. ... Arbitrary expressions passed (). \"within\" expression(s) must evaluate either scalar full-length logical values. dataTypes types humdrum records include. Defaults \"D\". Must single character string. Legal values 'G', 'L', '', 'M', 'D', 'd' combination (e.g., \"LIM\"). (See humdrum table documentation Fields section explanation.) .Optional grouping fields; alternative using group_by(). Defaults NULL. Must NULL, character strings partially match one fields() data. NULL, fields used group data. grouping fields already set call group_by(), .argument overrides . removeEmptyPieces empty pieces removed? Defaults TRUE. Must singleton logical value: /switch. fields fields unfilter complement? Defaults data fields humdrumR data. Must character strings, partially matching data field input data. complement field use subset complement restore? default NULL, means data field's original complement used. Must single character string, partially matching field input data.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/subset.humdrumR.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Filter humdrum data — subset.humdrumR","text":"subset() filter() passed one expressions using fields humdrum table using call within. evaluation can thus include within.humdrumR()'s functionality (arguments) including group-apply. requirement expressions/functions fed subset()/filter() must return logical (TRUE/FALSE) vector (NA values treated FALSE). returned vector must either scalar (length 1), length input data (number rows humdrum table). logical result scalar, recycled match input length: useful combination group_by(); example, can split data groups, return single TRUE FALSE group, causing whole group filtered . Note subset()/filter() incompatible contextual windows; data contextual windows defined, removed (warning message) filtering.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/subset.humdrumR.html"],"id":"nullifying-data","dir":"Reference","previous_headings":"","what":"Nullifying data","title":"Filter humdrum data — subset.humdrumR","text":"using subset()/filter(), humdrumR actually delete data filter . Instead, functions set filtered data fields NA (null) values, changing data type \"d\". ensures humdrum-syntax data broken filtering! Thus, print filtered humdrumR object see filtered data points turned null data (.). Since, humdrumR functions ignore null data (d) default, data effectively filtered practical purposes. However, need use null ('d') data points (like, ditto()), can accessed setting dataTypes = 'Dd' many functions. See ditto() documentation examples.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/subset.humdrumR.html"],"id":"truly-removing-data","dir":"Reference","previous_headings":"","what":"Truly removing data","title":"Filter humdrum data — subset.humdrumR","text":"many cases, filtering large parts data leaves bunch empty null data points (\".\") printout...maybe difficult read. want actually remove filtered data points, can call removeEmptyFiles(), removeEmptyPieces(), removeEmptySpines(), removeEmptyPaths(), removeEmptyRecords(), removeEmptyStops(). functions safely remove null data without breaking humdrum syntax; going piece/spine/path/record checking data region null; , , data null, portion data removed. default, subset.humdrumR() automatically calls removeEmptyPieces() returning. However, can stop specifying removeEmptyPieces = FALSE.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/subset.humdrumR.html"],"id":"renumbering","dir":"Reference","previous_headings":"","what":"Renumbering","title":"Filter humdrum data — subset.humdrumR","text":"filtered pieces, files, spines removed corpus (using removeEmptyPieces() removeEmptySpines()) File, Piece, Record /Spine fields renumbered represented remaining regions, starting 1. example, corpus 10 pieces remove first piece (Piece == 1), remaining pieces renumbered 2:10 1:9. Spine/record renumbering works , except done independently within piece.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/subset.humdrumR.html"],"id":"complements-unfiltering-","dir":"Reference","previous_headings":"","what":"Complements (unfiltering)","title":"Filter humdrum data — subset.humdrumR","text":"subset() applied, humdrumR stores complement subset data field retained (unless explicit removeEmpty...() function called). removeSubset() unfilter() functions can used restore original data, combining subset complement. fields argument can used control data fields unfiltered---default, data fields unfiltered. Normally, data field restored complement data. However, complement argument can used specify field use complement. allows , instance, different parts separate fields single field. complement() function directly swap data-field subsets complements.","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/subset.humdrumR.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Filter humdrum data — subset.humdrumR","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/syncopation.html"],"dir":"Reference","previous_headings":"","what":"Identify syncopated rhythms — syncopation","title":"Identify syncopated rhythms — syncopation","text":"syncopation() function takes vector rhythmic duration values meter identifies durations syncopated, return TRUE synocopations FALSE otherwise. output syncopation depends lot meter specified/interpreted check meter() documentation looking control output.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/syncopation.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Identify syncopated rhythms — syncopation","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/syncopation.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Identify syncopated rhythms — syncopation","text":"dur input vector rhythmic durations. Must character numeric vector. parsed using rhythmInterval(); Wherever input parsed duration, element treated duration zero. meter meter(s) compute levels . Defaults standard, five-level duple (4/4) meter. Must meter() object character vector. character input, string parsed using meter(); failure parse result error. levels metrics levels identify syncopations? Defaults \"\". Must non-empty character numeric vector. levels simply singleton string \"\", syncopations metric level identified. Otherwise, levels parsed rhythmInterval(); fail parse may lead error. parsed levels must levels given meter(). groupby list vectors group x. Defaults list(). Must list; every element list must length length(x). function -record timeline, groupby list music include named Piece Record fields. Luckily, automatically passed ().humdrumR, need worry !","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/syncopation.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Identify syncopated rhythms — syncopation","text":"syncopation occurs whenever rhythmic duration longer highest metric level lands . cases, might want restrict attention syncopations occur specific metric level: example, \"eighth-note syncpations.\" can proved set metric levels levels argument, restriction. levels must parsable durations match levels meter().","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/tabulation.html"],"dir":"Reference","previous_headings":"","what":"Tabulate and/or cross-tabulate data — tabulation","title":"Tabulate and/or cross-tabulate data — tabulation","text":"count() function exactly like R's fundamental table() function, except 1) give special treatment humdrumR token() data 2) intuitive/simple argument names 3) makes easier combine/manipulate disparate output tables.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/tabulation.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Tabulate and/or cross-tabulate data — tabulation","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/tabulation.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Tabulate and/or cross-tabulate data — tabulation","text":"count() function essentially wrapper around base::table() function. However, token() class arguments treated like factors(), calling generating levels. assures , example, pitch data tabulated order pitch height, \"missing\" pitches counted zero. count() , default, count NA values present---want count NAs, specify na.rm = TRUE. can also tell count() exclude (count) arbitrary values provide vector exclude argument. count() always give names dimensions table creates. can specify names directly argument names, like count(Kern = kern(Token)); specify name, count() make name(s) based expression(s) tallying. (Note count() copy base::table()'s obtusely-named dnn deparse.level arguments.)","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/tabulation.html"],"id":"manipulating-humdrum-tables","dir":"Reference","previous_headings":"","what":"Manipulating humdrum tables","title":"Tabulate and/or cross-tabulate data — tabulation","text":"output count() special form R table, humdrum.table. Given two humdrum.tables, apply basic R operators (e.g., arithmetic, comparisons) row/column binding (cbind/rbind) humdrumR align tables dimension-names operation. means, two tables pitch data, one table includes specific pitch , can still add together bind matrix. See examples!","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/tabulation.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Tabulate and/or cross-tabulate data — tabulation","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/tactus.html"],"dir":"Reference","previous_headings":"","what":"Extract levels from meters — tactus","title":"Extract levels from meters — tactus","text":"functions take meter() objects---values parseable meters---return specific levels meter. tactus() extracts tactus meter; measure() extracts length full measure meter. nbeats() counts number tactus beats meter. functions particularly useful arguments timecount subpos functions.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/tactus.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Extract levels from meters — tactus","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/tactus.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Extract levels from meters — tactus","text":"x input compute desired duration . Must meter() object character vector. character input parsed using meter(); failures parse result errors. deparser output format desired? default recip(). Must rhythm function NULL. sep Seperator irregular beat patterns. Defaults \"+\". singleton character value. tactus pattern irregular beats, pasted together using separator.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/tactus.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Extract levels from meters — tactus","text":"default, tactus() measure() deparse output recip(); alternative deparser (output format) can chosen using deparser argument.","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/tactus.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Extract levels from meters — tactus","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/tandem.html"],"dir":"Reference","previous_headings":"","what":"Get tandem interpretation information from humdrum data — tandem","title":"Get tandem interpretation information from humdrum data — tandem","text":"extractTandem extracts tandem interpretations raw Tandem spine humdrumR object.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/tandem.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Get tandem interpretation information from humdrum data — tandem","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/tandem.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Get tandem interpretation information from humdrum data — tandem","text":"regex regular expression match tandem interpretations. Must single character string. include * beginning---* marker tandem interpretations already removed Tandem field. Tandem Parsed tandem interpretation data. Must atomic. always Tandem field humdrumR object.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/tandem.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Get tandem interpretation information from humdrum data — tandem","text":"Every humdrumR object field called Tandem, vector strings accumulates tandem interpretations Spine. record, previous tandems occured spine listed (comma separated), recent appearing first. example, consider file: Tandem field two spines look like : Notice \"C:\" erased appearance \"G:\"---naive parser \"know\" \"C:\" \"G:\" related. earlier tandem (\"C:\") just pushed back onto stack. worry, humdrumR data parser recognize many common tandem interpretations (like *C: *G:) automatically parse present---case, put Key field automatically. However, Tandem field retained case data contains novel tandem intepretations humdrumR recognize.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/tandem.html"],"id":"extracttandem","dir":"Reference","previous_headings":"","what":"extractTandem","title":"Get tandem interpretation information from humdrum data — tandem","text":"data contain novel/unknown tandem interpretations, can use extractTandem function pull Tandem field. first argument extractTandem must Tandem field humdrumR object. second argument (regex) regular expression matched tandem interpretations. token Tandem, recent match () retained. example, wanted manually extract key information Tandem field (humdrumR automatically ), call extractTandem(Tandem, \"[-Ga-g][#-]*:\").","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/tatum.html"],"dir":"Reference","previous_headings":"","what":"Find common denominator of beats — tatum","title":"Find common denominator of beats — tatum","text":"humdrumR, define tatum greatest common denominator set durations. words, given set durations, largest duration divides given beats tatum---common unit can measure durations","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/tatum.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Find common denominator of beats — tatum","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/tatum.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Find common denominator of beats — tatum","text":"x input compute tatum . Must meter() object, singleton character value, vector either character, numeric, rational() values. character input, valuest match regular expression \"^\\*?M\" parsed time signature using meter(), strings parsed durations using rhythmInterval(). numeric input also parsed using rhythmInterval(); parse failures result errors. deparser output format desired? character meter input, default recip(); numeric input, default duration(). Must rhythm function NULL.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/tatum.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Find common denominator of beats — tatum","text":"tatum() generic function; can read input can parsed rhythm parser. can also take meter() object character string form \"MX/Y\". tatum meter() tatum meters metric levels. meters durations provided---like tatum(c('M4/4', '6')---, tatum meters' levels durations computed. deparser argument rhythm function controls output format. deparser NULL, tatum returned rational() value.","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/tatum.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Find common denominator of beats — tatum","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/tertian.html"],"dir":"Reference","previous_headings":"","what":"Tertian quality chord representation — tertian","title":"Tertian quality chord representation — tertian","text":"functions generic form tertian harmony representation, commonly used music theory. representation, root chord indicated **kern, followed one quality indicators, like \"CMM\" (C major seventh).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/tertian.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Tertian quality chord representation — tertian","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/tertian.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Tertian quality chord representation — tertian","text":"x atomic vector. x argument can (atomic) vectors Key diatonic key used parser, deparser, transposer. Defaults NULL, interpreted C major. Must diatonicSet something coercable diatonicSet; must either length 1 length(x). transposeArgs optional list arguments passed transpose() call. Defaults empty list(). Must list named arguments transpose(). parseArgs optional list arguments chord parser. Defaults empty list(). Must list named arguments chord parser. inPlace non-chord information retained output string. Defaults FALSE. Must singleton logical value: /switch.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/tertian.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Tertian quality chord representation — tertian","text":"first quality root indicates quality triad. Subsequent qualities, present, indicate quality 7th, 9th, 11th, 13th respectively. examples: M: major triad Mm: dominant-seventh chord MM: major-seventh chord Mmm: dominant-seventh--flat-9 chord. oo: fully-diminished-seventh chord. Missing extensions can indicated position using .. example, E-Mm.P indicates E-flat dominant-11th chord 9th. Missing members triad can indicated specifying either 5 3 immediately root, quality indicators. example, C5M indicates C major chord 3rd, G3mm indicates G-minor-seventh chord missing 5th. default quality indicators P (perfect), M (major), m (minor), o (diminished), + (augmented), can overridden calls respective arguments: example, tertian('Cdim', diminish = 'd').","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/tertian.html"],"id":"inversions","dir":"Reference","previous_headings":"","what":"Inversions","title":"Tertian quality chord representation — tertian","text":"Inversions indicated slash notation, scale degree right slash. example, first-inversion major chord /3.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/tertian.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Tertian quality chord representation — tertian","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/tertianSetS4.html"],"dir":"Reference","previous_headings":"","what":"Tertian set — tertianSetS4","title":"Tertian set — tertianSetS4","text":"tertianSet one humdrumR's types tonal data, representing Western tertian harmonies. tertianSet subclass diatonicSet (thence, struct).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/tertianSetS4.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Tertian set — tertianSetS4","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/tertianSetS4.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Tertian set — tertianSetS4","text":"structural addition, compared diatonicSet, Extensions slot. slot indicates tertian chord members active chord. seven possible chord members: root, third, fifth, seventh, ninth, eleventh, thirteenth. Every possible combination seven degrees represented single integer, corresponding 7-bit representation /offs seven degrees reverse order (13, 11, 9, 7, 5, 3, 1). example, integer 15 corresponds seventh chord: binary, 15 0001111. initial three zeros indicate 13th, 11th, 9th part harmony, four ones indicate root, third, fifth, seventh part harmony. Ultimately, adding removing chord degree harmony can achieved adding power two associated degree: Root: \\(\\pm 1\\) Third: \\(\\pm 2\\) Fifth: \\(\\pm 4\\) Seventh: \\(\\pm 8\\) Ninth: \\(\\pm 16\\) Eleventh: \\(\\pm 32\\) Thirteenth: \\(\\pm 64\\) tertianSet many specific methods defined reading/writing harmonic information.","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/time.html"],"dir":"Reference","previous_headings":"","what":"Clock-time representations of duration — time","title":"Clock-time representations of duration — time","text":"functions convert duration values clock-time representations. seconds() ms() output numeric values. dur() outputs character string encoding humdrum **dur representation time. seconds() applied humdrumR data class may use data's fields arguments. field names specified, first selectedField used x. ms() applied humdrumR data class may use data's fields arguments. field names specified, first selectedField used x. dur() applied humdrumR data class may use data's fields arguments. field names specified, first selectedField used x.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/time.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Clock-time representations of duration — time","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/time.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Clock-time representations of duration — time","text":"x input vector. x argument can (atomic) vector, rational (rhythmInterval), NULL. Must parsable rhythm infromation. ... Arguments passed rhythm parser. also two hidden (advanced) arguments can specify: memoize deparse (see details ). scale numeric rational value used output unit measurement. Defaults rational(1, 1). Must numeric rational. inPlace non-rhythm information retained output string? Defaults FALSE. Must singleton logical value: /switch. Defaults FALSE. singleton logical value, NA. See \"Grace notes\" section . minutes (logical, T/F) dur output include minutes? hours (logical, T/F) dur output include hours? days (logical, T/F) dur output include days? months (logical, T/F) dur output include months? years (logical, T/F) dur output include years?","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/time.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Clock-time representations of duration — time","text":"functions require BPM (beats-per-minute) argument specified. default, value 60 bpm.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/time.html"],"id":"dur","dir":"Reference","previous_headings":"","what":"dur","title":"Clock-time representations of duration — time","text":"**dur output can modified include different clock-time units: minutes, hours, days, months, years arguments true/false logical arguments, indicating whether use unit output (default FALSE). example, minutes = FALSE, input 90 seconds return \":90\" (90 seconds!), minutes = TRUE, output :1:30 (one minute thirty seconds).","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/time.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Clock-time representations of duration — time","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/timebase.html"],"dir":"Reference","previous_headings":"","what":"Represent time on a regular grid — timebase","title":"Represent time on a regular grid — timebase","text":"timebase() function takes humdrumR dataset converts rhythmic information data step-sequencer like representation, humdrum data record representing one step. duration step \"timebase\", can controlled tb argument. timebase() function currently beta-draft, may work well.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/timebase.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Represent time on a regular grid — timebase","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/timebase.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Represent time on a regular grid — timebase","text":"humdrumR HumdrumR data. data must least one spine rhythmic (duration) encoded. timebase duration step output sequence. Defaults sixteenth-note. Must single atomic value, can parsed duration.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/timecount.html"],"dir":"Reference","previous_headings":"","what":"Count beats or measures — timecount","title":"Count beats or measures — timecount","text":"timecount() function takes vector rhythmic duration values counts (musical sense) number beats (measures) occurred since starting point, associating rhythmic onsets beat. subpos() function paired timecount(), computing far (rhythmic time) onset associated beat; subpos() returns 0, means onset beat. Finally, onbeat() simply convenient shorthand subpos() == 0, returning logical vector indicating onsets fall beat.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/timecount.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Count beats or measures — timecount","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/timecount.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Count beats or measures — timecount","text":"dur input vector rhythmic durations. Must character numeric vector. parsed using rhythmInterval(); Wherever input parsed duration, element treated duration zero. unit size \"beat\" (measure) count. Defaults whole-note (one measure 4/4 time). Must character numeric vector, list vectors; must singleton length dur. parsed duration using rhythmInterval(); input parsed duration, output NA. start number start counting . Must single whole-number value (either numeric integer). phase phase offset onsets beats. Defaults 0. Must character numeric vector; must length 1 length dur; duration phase must smaller smallest duration value unit. parsed duration using rhythmInterval(); input parsed duration, error occurs. pickup Indicates leading values input pickups, . Defaults NULL. Must NULL, logical vector length dur. offBeats -beat onsets numbered output, NA? Defaults TRUE. Must single logical value: /switch. groupby Optional vectors group count within. Defaults empty list(). Must list(), either empty contains vectors length dur. function -record timeline, groupby list must include named Piece Record vectors. Luckily, automatically passed ().humdrumR, need worry !","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/timecount.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Count beats or measures — timecount","text":"many basic use cases, using timecount() essentially using floor(timeline()). However, timecount() gives us additional options add musicological power compared timeline(). (timecount() also starts 1 0, timeline() .) first beat input vector assigned value start argument, defaults start = 1L. 'zeroth' count, first beat occurs instant starting time---.e., first onset input vector. Every rhythmic onset associated one beat, multiple onsets may occur within beat---thus output timecount() assigns (rounds) onset previous beat onset. However, offBeats = FALSE, onsets land beat counted, offbeat values returning NA. phase controls offbeat onsets associated nearby beats. phase parsed rhythmic value must rhythmic values smaller smallest beat value. phase argument shifts \"boundary\" beats backwards, beat onset. default, phase = 0 beat-association boundary lands beat: onsets beat \"belong\" beat. phase = '8', beat boundary pushed back capture one eighth-note beat . can used , example, associate last 3/8s measure next measure (like pick ups); achieved command like timecount(dur, beat = '1', phase = 3/8).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/timecount.html"],"id":"-beats-","dir":"Reference","previous_headings":"","what":"\"Beats\"","title":"Count beats or measures — timecount","text":"unit argument used indicate size beat want count. default unit whole note, equivalent measure M4/4 time. unit argument uses rhythm parser, can understand unit values input variety formats: thus, specify quarter-note units either unit = '4' unit = 0.25. parser also understands parse (full) duration time signature: example, unit = 'M3/4' use dotted-half-note unit ('2.').","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/timecount.html"],"id":"changing-meter","dir":"Reference","previous_headings":"","what":"Changing meter","title":"Count beats or measures — timecount","text":"data changing meters (either pieces, within pieces), can specify unit argument vector length dur, indicating beat size moment/index. feature easy use dataset includes time signature interpretations, like \"*M4/4\"; interpetations, present, automatically read field called TimeSignature. dataset, can simply pass TimeSignature field unit argument timecount(), measures piece correctly counted (even changing!): timecount(x, unit = TimeSignature). Alternatively, can use tactus() command extract tactus beat time signature, like timecount(x, unit = tactus(TimeSignature)).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/timecount.html"],"id":"irregular-meter","dir":"Reference","previous_headings":"","what":"Irregular meter","title":"Count beats or measures — timecount","text":"musical meters consist pattern irregular beats. example, meter M7/8 often realized two \"short\" beats (two eigth-notes ) one \"long\" beat (three eigth-notes), forming 2 + 2 + 3 pattern. want count eighth-note, can simply specify unit = '8' get M7/8 beats counted c(1, 3, 5). However, want count short long beat single unit, must specify desired pattern list beat durations: example, unit = list(c(\"4\", \"4\", \"4.\")). see two cases look like, applied two M7/8 measures straight eighth-notes: accommodate changing meters, unit argument can still accept list patterns, long list length dur.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/timecount.html"],"id":"pickups","dir":"Reference","previous_headings":"","what":"Pickups","title":"Count beats or measures — timecount","text":"Another option pass pickup argument logical vector length input dur. Within piece/group, block TRUE values beginning pickup vector indicate pickup. first index pickup logical FALSE used location beat 1: earlier (pickup == TRUE) points negative counts, counting backwards start. humdrumR, datapoints first barline record (=) labeled Bar == 0 Bar field. Thus, common use pickup argument within(humData, timecount(Token, pickup = Bar < 1), makes downbeat first complete bar 1 stating point---notes pickup bars give negative counts. Note never 'beat zero'. Beats starting point progress directly -1 1 (start). result, arithmetic math beat \"counts\" can problematic using pickup argument. may better use round(timeline()) cases want much math counts.","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/timecount.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Count beats or measures — timecount","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/timeline.html"],"dir":"Reference","previous_headings":"","what":"Rhythmic timeline of a piece — timeline","title":"Rhythmic timeline of a piece — timeline","text":"functions calculate ammount time (either beats, seconds) unfolded since beginning piece, giving sense timeline events unfold. music21 information described \"offsets\"---however, prefer reserve words \"onset\" \"offset\" refer beginning (attack) end (release) rhythmic events. timeline() applied humdrumR data class may use data's fields arguments. field names specified, first selectedField used x. timestamp() applied humdrumR data class may use data's fields arguments. field names specified, first selectedField used x.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/timeline.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Rhythmic timeline of a piece — timeline","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/timeline.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Rhythmic timeline of a piece — timeline","text":"x Input rhythm information. Must atomic, NULL. parsed duration information. start timeline begin? Defaults 0. Must single number. pickup pickup (anacrusis)? Defaults NULL Must logical length(x), NULL. See \"Pickups\" section . threadNA rhythm-less tokens return NA? Defaults TRUE. Must singleton logical value: /switch. parseArgs optional list arguments passed rhythm parser. Defaults empty list(). Must list named arguments rhythm parser. groupby list vectors group x. Defaults list(). Must list; every element list must length length(x). function -record timeline, groupby list music include named Piece Record fields. Luckily, automatically passed ().humdrumR, need worry ! BPM tempo. Defaults 60. Must single number character string format \"MM120\" (120 bpm). default, ().humdrumR passes BPM field, present. minutes minutes counted output? Defaults TRUE. Must singleton logical value: /switch. TRUE, output seconds converted character string encoding minutes, seconds, milliseconds format MM.SS.ms.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/timeline.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Rhythmic timeline of a piece — timeline","text":"Music unfolds time, humdrum data typically represents placing simultaneous events record, successive events ever higher records---progressing \"top \" file. humdrum data, (implicit) ordering data time present. Record DataRecord fields capture ordering data parsed humdrumR. However, many (probably ) humdrum data files contain least information relative duration events, representing detailed information timing rhythm. timeline() parses input vector x durations, computes cumulative sum durations, start argument appended beginning. result numeric vector representing total duration since beginning vector (plus value start, defaults zero). cumulative durations timeline() represent musical duration units, 1 equals whole note. timestamp() converts durations seconds, either using BPM argument/field determine tempo using default tempo 60 beats per minute. minutes == TRUE, output formatted \"minute:seconds.milliseconds\" character strings. groupby argument provided, localDuration() used compute minimum durations group computing cumulative sum unique values Record groupby. default, ().humdrumR automatically pass groupby = list(Piece = Piece, Record = Record) calls timeline() timestamp(). Thus, call like within(humData, timeline(Token)) compute correct timeline position tokens across spines/paths/stops---values record . Note , timeline() timestamp() follow default behavior duration() treating grace-notes duration 0. means position timeline simply inherited previous event timeline, occur time. want use specified duration(s) grace notes, specify grace = TRUE. default, tokens without (parsable) rhythm information returned NA. However, threadNA = FALSE, rhythm-less tokens treated duration 0 well, thus (shared) position timeline.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/timeline.html"],"id":"pickups","dir":"Reference","previous_headings":"","what":"Pickups","title":"Rhythmic timeline of a piece — timeline","text":"Another option pass pickup argument logical vector length input x. Within piece/group, block TRUE values beginning pickup vector indicate pickup. first index pickup logical FALSE used starting point timeline/timecount; earlier (pickup == TRUE) points negative numbers, measured backwards start index. humdrumR, datapoints first barline record (=) labeled Bar == 0 Bar field. Thus, common use pickup argument within(humData, timeline(Token, pickup = Bar < 1), makes downbeat first complete bar 1 starting point timeline---notes pickup bars negative timeline.","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/timeline.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Rhythmic timeline of a piece — timeline","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/token.html"],"dir":"Reference","previous_headings":"","what":"Humdrum tokens — token","title":"Humdrum tokens — token","text":"token S4 class acts simple \"wrapper\" around atomic data, allowing humdrumR give data special treatment. basically atomic vectors known exclusive interpretation. able treat exactly like \"normal\" class atomic vector---e.g., character, numeric.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/token.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Humdrum tokens — token","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/tonalIntervalS4.html"],"dir":"Reference","previous_headings":"","what":"Representation of tonal pitch information — tonalIntervalS4","title":"Representation of tonal pitch information — tonalIntervalS4","text":"tonalInterval core tonal pitch representation humdrumR. tonalInterval abstract representation tonal pitch, can translated /standard \"concrete\" pitch representations: solfege, scientific pitch, semitones, frequencies, scale degrees, intervals, etc. part, users need interact tonalIntervals directly---rather, tonalIntervals work behind scene numerous humdrumR pitch functions. See pitch functions pitch parsing documentation details tonalIntervals used humdrumR.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/tonalIntervalS4.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Representation of tonal pitch information — tonalIntervalS4","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/tonalIntervalS4.html"],"id":"slots","dir":"Reference","previous_headings":"","what":"Slots","title":"Representation of tonal pitch information — tonalIntervalS4","text":"Octave integers representing octave offset. Fifth integers representing \"line--fifths\" value. Cent numeric values representing cents (1200th octave). tonalInterval S4 subclass humdrumR's virtual class struct, inherits lot useful \"vector-like\" behaviors/functionality.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/tonalIntervalS4.html"],"id":"creating-tonal-intervals","dir":"Reference","previous_headings":"","what":"Creating tonal intervals","title":"Representation of tonal pitch information — tonalIntervalS4","text":"Generally, tonalIntervals created using tonalInterval() function, various methods. tonalInterval function primarily parser, documented elsewhere, interprets various input representations generates tonalInterval S4 objects (documented ). Alternatively, constructor function tint can used directly create tonalInterval objects. three arguments tint correspond three slots: octave, LO5th (Fifth), cent. inputs coerced match length. octave argument can left blank, case appropriate octave automatically computed place interval octave . default, .character method, thus (via struct) show method, tonalIntervals call interval(). Thus, return tonalInterval command line see **interval representation printed.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/tonalIntervalS4.html"],"id":"predefined-intervals-","dir":"Reference","previous_headings":"","what":"Predefined Intervals:","title":"Representation of tonal pitch information — tonalIntervalS4","text":"humdrumR automatically exports bunch tonalIntervals, named musical interval representation. Every generic interval 1 15 combined every interval quality dd (doubly diminished), d (diminished), m (minor), M (major), (augumented) AA (doubly augmented). Thus, loading humdrumR, can type things like M3 + M3 get A5. addition, variables unison (= P1 = tint(0, 0)) pythagorean.comma (= d2 = tint(-19,12)) exported well.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/tonalIntervalS4.html"],"id":"arithmetic-","dir":"Reference","previous_headings":"","what":"Arithmetic:","title":"Representation of tonal pitch information — tonalIntervalS4","text":"Technically, tonalIntervals examples algebraic modules integers. means certain arithmetic operations defined tonalIntervals can called using standard arithmetic operators (+, -, etc.): Addition: tonalIntervals can added together, acting exactly expect (.e., \\(M3 + m3 = P5\\)). Subtraction: tonalIntervals can subtracted just added. Also, can negated single - operator (like -M3). Multiplication: tonalIntervals can multiplied together. However, scalar (integer) multiplication defined: thus, tonalIntervals can multiplied integers create new tonalIntervals: e.g., \\(M2 * 3 = A4\\). Division: natural inverse scale multiplication, Euclidean division defined tonalIntervals---.e., division /whole (integer) pieces, often leftover \"remainders\" (modulo). R, Euclidean division achieved %/% operator---/---, associated %% used remainder/modulo. Two tonalIntervals can divided produced integer; Conversely, tonalInterval can divided integer produce tonalInterval. Take note way humdrumR defines Euclidean division based tonal space---.e., line--fifths---frequency atonal-semitone space. example, augmented-fourth divided major-second 3L, diminished-fifth divided major-second 3L---d5 %/% M2 equals -3L remainder P8 (plus octave)! division algorithm works applying standard Euclidean division @Fifth slot (line--fifths tonal space), shifting @Octave value remainder match appropriate octave. attempt addition tonalInterval non-tonalInterval atomic vector (e.g., integer, character), humdrumR attempt coerce input tonalInterval, using tonalInterval() parser, math output answer original format (non-tonalInterval) format. instance, M3 + 2 interpret 2 two semitones add major-second major-third, resulting 6 semitones. \"-place\" parsing/deparsing used, \"extra\" characters input passed . example, M3 + 4.ee- return 4.gg.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/tonalIntervalS4.html"],"id":"relational-operators","dir":"Reference","previous_headings":"","what":"Relational Operators","title":"Representation of tonal pitch information — tonalIntervalS4","text":"tonalIntervals can compared using standard relational operations, like ==, !=, >, >=. Two tonalIntervals equal (according ==) slots (Octave, Fifth, Cent) exactly identical. Thus, enharmonic notes (like C Db) equal. contrast, ordinal comparisons (e.g., >, <=) tonalIntervals based semitone (equal temperament) size, enharmonicity irrelevant. Thus, m3 >= A2 A2 >= m3 TRUE, even though m3 == A2 .","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/tonalIntervalS4.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Representation of tonal pitch information — tonalIntervalS4","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/tonh.html"],"dir":"Reference","previous_headings":"","what":"German-style pitch notation. — tonh","title":"German-style pitch notation. — tonh","text":"Based common German system notating pitches, encoded humdrum **Tonh interpretation. tonh() applied humdrumR data class may use data's fields arguments. field names specified, first selectedField used x.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/tonh.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"German-style pitch notation. — tonh","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/tonh.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"German-style pitch notation. — tonh","text":"x Input data parse pitch information. x argument can (atomic) vector, tonalInterval, NULL. ... Arguments passed pitch deparser. also two hidden (advanced) arguments can specify: memoize deparse (see details ). generic \"specific\" pitch information (accidentals qualites) discarded? Defaults FALSE. Must singleton logical value: /switch. simple \"compound\" pitch information (octave/contour) discarded? Defaults FALSE. Must singleton logical value: /switch. Key input Key used parser, deparser, transposer. Defaults NULL. Must diatonicSet something coercable diatonicSet; must either length 1 length(x) transposeArgs optional list arguments passed special transpose() call. Defaults empty list(). Must list named arguments transpose(). parseArgs optional list arguments passed pitch parser. Defaults empty list(). Must list named arguments pitch parser. inPlace non-pitch information retained output string. Defaults FALSE. Must singleton logical value: /switch. argument effect input (x argument) character strings, extra, non-pitch information input strings \"besides\" pitch information. , inPlace = TRUE, output placed output string beside original non-pitch information. inPlace = FALSE, pitch output information returned (details ). S special shorthand Eb Ab used?. Defaults TRUE. S = TRUE, E-flat (Ees) output \"S\" -flat (Aes) output \"\".","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/tonh.html"],"id":"basic-pitch-arguments","dir":"Reference","previous_headings":"","what":"Basic pitch arguments","title":"German-style pitch notation. — tonh","text":"pitch function standard arguments control details output. important generic simple arguments, allow control type pitch information returned.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/tonh.html"],"id":"generic-vs-specific","dir":"Reference","previous_headings":"","what":"Generic vs Specific","title":"German-style pitch notation. — tonh","text":"generic = TRUE, specific pitch information (accidentals qualities) omitted output. alternative way controlling functionality, can use specific argument, specific == !generic. case atonal functions, \"generic\" version pitch output: example, semits('c#', generic = TRUE) return 0, \"generic\" version C# C, corresponds 0. However, note generic version pitch follows key, semits('c#', generic = TRUE, Key = ':') return 1!","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/tonh.html"],"id":"simple-vs-compound","dir":"Reference","previous_headings":"","what":"Simple vs Compound","title":"German-style pitch notation. — tonh","text":"simple = TRUE, compound pitch information (octave contour) omitted output. alternative way controlling functionality, can use compound argument ,compound == !simple. actually one way might want divide compound intervals simple octave parts. example, might like call output -M2 (descending major 2nd) +m7 (ascending minor 7th octave ). functionality can controlled octave.round argument: see pitch deparsing documentation.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/tonh.html"],"id":"key","dir":"Reference","previous_headings":"","what":"Key","title":"German-style pitch notation. — tonh","text":"Key argument must diatonicSet, something can parsed one. Key argument passed parser, deparser, transpose---unless alternate Key passed transposeArgs parseArgs. Various deparsing options use Key argument; example, use implicitSpecies (see advanced parsing section) dependent Key. use pitch function within special call withinHumdrum, humdrumR automatically pass Key field humdrum data function---means, cases, need explicitly anything Key argument! (want happen, need explicitly specify Key argument, Key = NULL.)","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/tonh.html"],"id":"parse-arguments","dir":"Reference","previous_headings":"","what":"Parse arguments","title":"German-style pitch notation. — tonh","text":"parseArgs argument must list() (named) arguments passed input parser. example, input representation uses \"X\" represent double sharps, specify kern('CX5', parseArgs = list(doublesharp = 'X')) get correct result (\"cc##\"). convenient shorthand, \"syntactic sugar,\" can specify parseArgs alternate way: Simply input parse(args...) unnamed argument pitch function. example, can get exact result typing kern('CX5', parse(doublesharp = 'X')).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/tonh.html"],"id":"transpose-arguments","dir":"Reference","previous_headings":"","what":"Transpose arguments","title":"German-style pitch notation. — tonh","text":"transposeArgs argument must list() (named) arguments passed internal call transpose(), allowing us easily transpose pitch information. example, type kern(c('C', 'D', 'E'), transposeArgs = list(= 'M9')) can get output c('d', 'e', 'f#'). possible transpose args : (tonalInterval, length == 1 | length == (x)) (diatonicSet, length == 1 | length == (x)) (diatonicSet, length == 1 | length == (x)) real (logical, length == 1) transposition real tonal? relative (logical, length == 1) key-wise transposition based relative parallel keys? convenient shorthand, \"syntactic sugar,\" can specify transposeArgs alternate way: Simply input transpose(args...) unnamed argument pitch function. example, can get exact result typing kern(c('C', 'D', 'E'), transpose(= 'M9')).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/tonh.html"],"id":"transposing-by-interval","dir":"Reference","previous_headings":"","what":"Transposing by interval","title":"German-style pitch notation. — tonh","text":"calling transpose() directly, argument can anything coercable tonalInterval, output transposed amount. real = FALSE, tonal transposition (within Key) performed. details transposition behavior, check transpose() docs.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/tonh.html"],"id":"transposing-by-key","dir":"Reference","previous_headings":"","what":"Transposing by key","title":"German-style pitch notation. — tonh","text":"Another way transposing specifying input (\"\") key output (\"\") key. default, Key argument passed transpose , nothing actually happens. Thus, specify either key key, transposition happen /key Key. course, specify transposition happen keys specify. use pitch function within special call withinHumdrum, humdrumR automatically pass Key field humdrum data function. specify key, Key field passed transpose key, result, pitches input transposed whatever keys target () key! real relative arguments give special control key-wise transposition works, check transpose() docs details!","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/tonh.html"],"id":"in-place-parsing","dir":"Reference","previous_headings":"","what":"In-place parsing","title":"German-style pitch notation. — tonh","text":"humdrum data, character strings often encoded multiple pieces musical information right besides : example, **kern data might include tokens like \"4.ee-[. humdrumR parser (tonalInterval) automatically \"pull \" pitch information within strings, can find using appropriate known regular expressions. example, pitch('4.ee-[') returns Eb5. However, pitch functions (like pitch() kern()) option keep \"extra\" information return result \"place\"---.e., embedded right found input string. controlled inPlace argument, FALSE default. , pitch('4.ee-[', inPlace = TRUE) return 4.Eb5[---keeping \"4.\" \"[\". (obviously works input string, numeric!) Note inPlace = TRUE force functions like semits, normally return numeric values, return character strings input character string.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/tonh.html"],"id":"pitch-gamut-levels","dir":"Reference","previous_headings":"","what":"Pitch-Gamut Levels","title":"German-style pitch notation. — tonh","text":"table() automatically generate factor levels pitch data using gamut() function. makes sure tabulated data sorted logical order, includes missing pitches. simple/complex generic/specific arguments automatically passed gamut(); additional arguments can passed gamut using gamutArgs = list(...), syntactic sugar gamut(...). (Read gamut() docs explanation gamut generation.) feature used control table layout pitch data, well assure consistent tables grouping data. inPlace = TRUE special tabulation occur.","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/tonh.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"German-style pitch notation. — tonh","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/transpose.html"],"dir":"Reference","previous_headings":"","what":"Transpose pitches and keys — transpose","title":"Transpose pitches and keys — transpose","text":"function transposes pitches keys various intervals target keys. Inside box, inputs transpositions take place tonalIntervals diatonicSets, numeric character string representation pitches can transposed well. function incorporated directly tonalTransform, thence, pitch translation functions, probably call directly often.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/transpose.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Transpose pitches and keys — transpose","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/transpose.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Transpose pitches and keys — transpose","text":"x ***input pitch(es) transpose. *** Can tonalInterval something intepretable pitch information. Transpose interval. Can tonalInterval something intepretable tonalInterval. Key Transpose key (key). Can diatonicSet something intepretable diatonicSet. tonal /transpositions, \"\" key. value NULL, defaults C major. Transpose key (Key key). Can diatonicSet something intepretable diatonicSet. real transposition real (tonal)? Defaults TRUE. Must singleon logical value: /switch. real == FALSE, transposition tonal. relative transposition keys relative (parallel)? Defaults FALSE. Must singleton logical value: /switch. relavent using transposing keys (Key ) different modes. relative == FALSE, transposition parallel.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/transpose.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Transpose pitches and keys — transpose","text":"two distinct types transposition (real tonal). also two different approaches specifying transpositions: \"\" \"\". \"\" transpositions can also either parallel relative.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/transpose.html"],"id":"types-of-transposition","dir":"Reference","previous_headings":"","what":"Types of Transposition","title":"Transpose pitches and keys — transpose","text":"two different types transposition: real transposition tonal transposition. real transposition, inputs transposed specific interval. example, pitches {C D E F G} transposed major second {C D E F# G}. tonal transposition, inputs transposed generic intervals, within key. example, sequence {C D E F G}, key C major, translated generic second {D E F G }. choose real tonal transposition, use real argument: real = TRUE real transposition, real = FALSE tonal transposition.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/transpose.html"],"id":"alterations","dir":"Reference","previous_headings":"","what":"Alterations","title":"Transpose pitches and keys — transpose","text":"Tonal transposition complicated presence alterations input pitches. instance, given pitches {C F# G D# E}`` key C major, tonally transposed second, within C major? one obvious, correct answer answer, can easily identified. algorithm implemented humdrumR` follows: Alterations/accidentals input identified. (case, F# D#). generic pitches transposed within key, resulting {D G E F}. Alterations input added output unless resulting pitches interpreted comma call tintPartion, given enharmonic wrap value (default 12). example, adding first accidental results {G#} comma. However, second accidental results {E#} comma away natural {F}. Thus, accidental added output, resulting {E}, {E#}. resulting output {D G# E F}. size enharmonicWrap effectively determines extreme accidentals allowed. default value, 12, assures output notes enharmonically equivalent notes key. illustrate, sequence {C F# G D# E, B- - G C# D, B D- C} transposed tonally within C major seven possible generic intervals, enharmonicWrap = 12:","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/transpose.html"],"id":"specifying-transpositions","dir":"Reference","previous_headings":"","what":"Specifying Transpositions","title":"Transpose pitches and keys — transpose","text":"two approaches specifying transpositions, arguments. argument must interval, input translated interval. interval specific real = FALSE, input treated generic interval, tranposition takes place within key indicated Key argument. argument translates input desired key. example, input key E major want transposed G major, say = '*E:'. real = TRUE, input simply translated root key, exact intervals. real = FALSE, input translated root new key, intervals changed match new key well. either case, result depends input's key , indicated standard Key argument. Key arguments like \"\" key. Key = NULL, input key interpreted C major. Consider input notes {D B C # B, D C# D E D} key G major. specify = e:, real = TRUE, output {B G# F## G#, B # B C# B}. (Notice even though key minor, output still clearly E major). specify = e:, real = FALSE, output instead {B G F# G, B # B C B}. Building previous example, consider input key matters well. use input notes ({D B C # B, D C# D E D}) input Key C major, : specify = e:, real = TRUE, output {F# D# E C## D#, F# E# F# G# F#}. specify = e:, real = FALSE, output instead {F# D E C# D, F# E F# G F#}. specified, transposition applied first, followed transposition. real = FALSE, transposition happens within key, Key key.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/transpose.html"],"id":"relative-vs-parallel","dir":"Reference","previous_headings":"","what":"Relative vs Parallel","title":"Transpose pitches and keys — transpose","text":"transposing , diferent approaches determining relationship \"\" key (Key argument) \"\" key (argument). think \"parallel\" relationships keys, match roots keys regardless modes. instance, C major C minor parallel keys. instead think \"relative\" relationships keys, match modes keys, roots. instance, C major minor relative keys. similar distinction \"la-based minor\" solfege (relative) vs \"fixed-\" solfege (parallel). transposing using argument, relative = FALSE input key (Key argument) transposed match root argument. example, input key G minor `` key C major, output transposed G minor. However, relative = TRUEthe input key transposed match mode thetokey: G minor input C majortowould translated minor, parallel minor thetokey. theKey(key) andto` (key) arguments mode, parallel relative transpositions .","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/transpose.html"],"id":"special-operators-","dir":"Reference","previous_headings":"","what":"Special Operators +-","title":"Transpose pitches and keys — transpose","text":"note, real transposition interval can achieved concisely using + - operators, long least one side operators actual tonalInterval object. humdrumR preassigns common tonalIntervals objects global environment. Thus, can type commands like \"c#\" + M2 get d#, c(\"C4\", \"E4\", \"C5\") - m6 get \"E3\" \"G#3\" \"E4\".","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/unfoldStops.html"],"dir":"Reference","previous_headings":"","what":"","title":"","text":"record/spine/path locations different numbers stops different fields, function spreads data smaller fields multiple stops.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/unfoldStops.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"","text":"","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/validateHumdrum.html"],"dir":"Reference","previous_headings":"","what":"Validate humdrum files — validateHumdrum","title":"Validate humdrum files — validateHumdrum","text":"function checks files local machine violations humdrum syntax. Detailed error reports can generated, pointing specific problematic records files.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/validateHumdrum.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Validate humdrum files — validateHumdrum","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/validateHumdrum.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Validate humdrum files — validateHumdrum","text":"... Arguments passed findHumdrum(). Used identify files local machine test humdrum validity. mainly used pass regex file-path search patterns, may also used pass recursive /contains arguments findHumdrum(). errorReport.path directory path write error report files. Defaults NULL. Must single character string. NULL (default), error report files written.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/validateHumdrum.html"],"id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Validate humdrum files — validateHumdrum","text":"validateHumdrum() returns \"error frame\" data.table object, invisibly (\"see\" output, must save variable, look ). error frame data.table three columns: Filepath: file name. Record: record contains error. Message: description error. Valid files rows error frame.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/validateHumdrum.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Validate humdrum files — validateHumdrum","text":"violations general humdrum syntax identified. example, missing exclusive interpretations, *- spine enders, null data tokens. validateHumdrum function check ill-formed data content---example, **kern spine containing token \"Lsharp\" rejected. Note validateHumdrum quite picky details! \"Hanging white space,\" even global records, marked invalid files! validateHumdrum called manner readHumdrum(), providing one regex search patterns match files machine. (..., recursive, contains arguments simply passed findHumdrum().) called, validateHumdrum prints basic messages informing result file matching validity testing.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/validateHumdrum.html"],"id":"error-reports","dir":"Reference","previous_headings":"","what":"Error reports","title":"Validate humdrum files — validateHumdrum","text":"desired, contents validateHumdrum \"error frame\" can written text files. allows us print errors tagged right alongside original raw data. write error report, set errorReport.path argument non-NULL string, pointing directory path machine. directory exist, R (attempt ) create . errorReport.path directory, complete error report(s) files (returned \"fileFrame\", see ) written single file named 'humdrumR_syntaxErrorReport_DATE.txt' (date coming Sys.Date). addition, sub directory called AnnotatedFilesis created. directory, copies files contain errors written, with_errorAnnotations` appended names. file, individual errors directly indicated record occur. output looks like :","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/validateHumdrum.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Validate humdrum files — validateHumdrum","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/vectorization.html"],"dir":"Reference","previous_headings":"","what":"What is ","title":"What is ","text":"\"vectorization\"?","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/vectorization.html"],"id":"vectorization-explained","dir":"Reference","previous_headings":"","what":"Vectorization explained","title":"What is ","text":"Many R operations/functions \"vectorized,\" meaning take vectors output vectors length. means , programmers, need worry element vector; can treat vector like single object, R oblige us. example, can math like: work strings like: get logical values: course, R functions take vectors return totally new vectors (just scalars). Examples: Vectorization works well working vectors either 1) length 2) length 1 (scalar). vectors different lengths, shorter one \"recycled\" (repeated) match longer one.","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/withinHumdrum.html"],"dir":"Reference","previous_headings":"","what":"Working with humdrum data fields — withinHumdrum","title":"Working with humdrum data fields — withinHumdrum","text":"functions primary means working humdrumR data. allow us perform arbitrary (free form) manipulation data fields held within humdrumR data object, convenient functionality ignoring null data, lagging data, grouping data, windowing, . () within() functions, come base R, core functions. However, dplyr \"verbs\" mutate(), summarize(), reframe() can used well---equivalent using ()/within() particular arguments.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/withinHumdrum.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Working with humdrum data fields — withinHumdrum","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/withinHumdrum.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Working with humdrum data fields — withinHumdrum","text":"data HumdrumR data. Must humdrumR data object. ... number expressions evaluate. expressions can reference fields() data name, well variables outside data. expressions named, names used name new fields (column names (..., drop = FALSE). dataTypes types humdrum records include. Defaults \"D\". Must single character string. Legal values 'G', 'L', '', 'M', 'D', 'd' combination (e.g., \"LIM\"). (See humdrum table documentation Fields section explanation.) recycle results \"recycled\" (padded) relative input length? within() reframe() default \"pad\"; mutate() defaults \"ifscalar\"; () defaults \"\". Must single character string. full list options \"\", \"yes\", \"pad\", \"ifscalar\", \"ifeven\", \"never\", \"summarize\", though functions accept options. See Parsing expression results section . alignLeft output shorter input aligned left? Defaults TRUE. Must singleton logical value: /switch. expandPaths spine paths expanded evaluating expressions? Defaults FALSE. Must singleton logical value: /switch. TRUE, expandPaths() function run data evaluating expressions. evaluation, expanded locations removed output. drop Whether return simplified data structure. Defaults TRUE. Must singleton logical value: /switch. argument conceptually similar drop argument R matrices. drop = TRUE, output ()/summarize() simplified much possible (trying return \"raw\" vector, list, table, etc. within ). drop = FALSE, result always data.table. .Optional grouping fields; alternative using group_by(). Defaults NULL. Must NULL, character strings partially match one fields() data. NULL, fields used group data. grouping fields already set call group_by(), .argument overrides . variables named list values, interpolate expressions. Defaults list(). Must named list. values interpolated ... expression arguments wherever variable name matches name list.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/withinHumdrum.html"],"id":"overview","dir":"Reference","previous_headings":"","what":"Overview","title":"Working with humdrum data fields — withinHumdrum","text":"functions primary means working humdrumR data. allow write code accesses manipulates raw fields() data. main differences results code: () summarize() return results normal, \"raw\" R formats, removed humdrumR data; contrast, within(), mutate(), reframe() always insert results code new fields() within humdrum data. distinctions functions recycle/pad results (see ).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/withinHumdrum.html"],"id":"expression-evaluation","dir":"Reference","previous_headings":"","what":"Expression evaluation","title":"Working with humdrum data fields — withinHumdrum","text":"(), within(), mutate(), summarize(), reframe() methods humdrumR data perform \"non-standard evalation\" expressions provide arguments. Basically, use function like (...) mutate(...), expressions write inside function call evaluated right ---instead, R takes expressions \"environment\" humdrum table, fields \"visible\" expression. means can write code (expressions) refer fields(), like Token Spine. example: Since fields humdrum table length, expressions write can , generally , vectorized. default, (), within(), etc. use whole humdrum table, instead evaluate expressions using rows containing non-null data tokens (Type == \"D\"). means interpretations, comments, barlines, null data tokens automatically ignored ! feature controlled dataTypes argument: can choose work token types providing character string containing combinations characters G (global comments), L (local comments), (interpretations), M (barlines), D (non-null data), d (null data). example, dataTypes = 'MDd' evaluate expressions barline tokens (=), non-null data, null data. See ditto() manual example application using dataTypes = 'Dd'. Keep mind humdrumR dynamically updates tokens considered \"null\" (\"d\") based fields selected. multiple expression arguments provided, expression evaluated order, left right. expression can refer variables assigned previous expression (examples ).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/withinHumdrum.html"],"id":"expression-pre-processing","dir":"Reference","previous_headings":"","what":"Expression pre-processing","title":"Working with humdrum data fields — withinHumdrum","text":"functions pre-processing expressions arguments evaluating . pre-processing provides convenient \"syntactic sugar\" working humdrum data. currently five pre-processing steps: Explicit variable interpolation. . placeholder selected fields. Automatic argument insertion. \"Lagged\"-vectors shorthand. \"Splatted\" arguments. explained .","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/withinHumdrum.html"],"id":"explicit-variable-interpolation","dir":"Reference","previous_headings":"","what":"Explicit variable interpolation","title":"Working with humdrum data fields — withinHumdrum","text":"variable argument can provided (option) list named values. names variable list appear symbols (variable names) expression argument, value interpolated place symbol. example, variable x changed TRUE, resulting : feature useful programmatic purposes, like like run expression many times slightly different parameters.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/withinHumdrum.html"],"id":"the-placeholder","dir":"Reference","previous_headings":"","what":"The . placeholder","title":"Working with humdrum data fields — withinHumdrum","text":". variable can used special placeholder representing data's first selected field. example, run count() Token field. new fields created within()/mutate()/reframe() become selected fields (details ), . makes easy refer last new field pipes. example, count() function run output mutate(kern(Token, simpe = TRUE)) expression.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/withinHumdrum.html"],"id":"automatic-argument-insertion","dir":"Reference","previous_headings":"","what":"Automatic argument insertion","title":"Working with humdrum data fields — withinHumdrum","text":"Many humdrumR functions designed work certain common fields humdrumR data. example, many pitch functions Key argument (can) take content Key readHumdrum() creates key interpretations, like *G:, data. expression argument uses one functions, explicitly set argument, humdrumR automatically insert appropriate field call (field present). , example, run data set includes Key field, expression changed : want happen, need explicitly give different Key argument, like: (Key argument can also set NULL). Another common/important automatic argument insertion functions groupby argument. functions automatically appropriate grouping fields inserted . example, mint() (melodic intervals) command automatically applied using groupby groupby = list(Piece, Spine, Path), makes sure melodic intervals calculated within spine paths...pieces/spines/paths (make sense!). humdrumR functions use automatic argument interpolation mention documentation. example, ?solfa documentation mentions treatment Key \"Key\" section.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/withinHumdrum.html"],"id":"lagged-vectors","dir":"Reference","previous_headings":"","what":"Lagged vectors","title":"Working with humdrum data fields — withinHumdrum","text":"music analysis, often want work \"lagged\" vectors data. example, want look relationship vector previous values vector---e.g., vector offset \"lagged\" one index. lag() lead() functions useful , always keeping length vectorization never hindered. expression arguments, can use convenient shorthand call lag() (lead). expression, vector can indexed integer argument named lag lead (case insensitive), causing lagged/led integer amount. (vector indexed lag = 0 returns unchanged vector.) example, following two calls : useful lag/lead index multiple values: indexed object appears within higher function call, lag inserted separate argument call. Thus, two calls also : Note lagging also automatically grouped within fields list(Piece, Spine, Path), default \"melodic\" structure data. assures vector \"lagged\" one piece another, one spine next. like turn change grouping, need override adding groupby argument lagged index, like Token[lag = 1, groupby = list(...)]. Using lagged vectors, since vectorized, fastest (computationally) easiest way working n-grams. example, want create character-string 5-grams data, call: Since lagging grouped list(Piece, Spine, Path), true \"melodic\" n-grams, created within spine-paths within piece.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/withinHumdrum.html"],"id":"splatted-arguments","dir":"Reference","previous_headings":"","what":"Splatted arguments","title":"Working with humdrum data fields — withinHumdrum","text":"\"Splatting\" refers feeding function list/vector arguments. Sometimes want divide data pieces (l\\'group_by()), rather applying expression piece, want feed separate pieces separate arguments function. can use syntactic sugar just . can index field call splat argument, must Field %% x. example, call, Token field divided two groups, one Spine == 1 Spine == 2; first group (Spine == 1) used first argument list, second group (Spine == 2) second argument. Thus, within translates previous expression : Splatting can little weird, nothing assure splatted arguments length, usually want (vectorization). example, previous example, guarantee Token[Spine == 1] Token[Spine == 2] length. just means use splatting really understand groups splatting. example, spine paths stops data, can know spines number data records, including data records (null non-null). , know stops/paths data, can run something like :","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/withinHumdrum.html"],"id":"saving-expressions-for-later","dir":"Reference","previous_headings":"","what":"Saving expressions for later","title":"Working with humdrum data fields — withinHumdrum","text":"cases may find certain arguments expressions use repeatedly. can store expressions variables \"quoting\" : common way quote expression R using ~, creates called \"formula\"---essentially quoted expression. can also quote expressions, using quote(). quoted expression can pass (), within(), mutate(), summarize(), reframe(). Image three different datasets (humData1, humData2, humData3), like evaluate expression count(kern(Token, simple = TRUE)) three. Use ~ operator quote save expression variable, use ():","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/withinHumdrum.html"],"id":"expanding-paths","dir":"Reference","previous_headings":"","what":"Expanding paths","title":"Working with humdrum data fields — withinHumdrum","text":"data includes spine paths (can check anyPaths()), analyses may require spine paths treated contiguous \"melodies.\" expandPaths() function can used \"expand\" spine paths new spines. expandPaths argument ()/within() cause expandPaths() run data evaluating argument expressions. evaluation, expanded parts data removed output.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/withinHumdrum.html"],"id":"parsing-expression-results","dir":"Reference","previous_headings":"","what":"Parsing expression results","title":"Working with humdrum data fields — withinHumdrum","text":"differences (), within(), mutate(), summarize(), reframe() humdrumR methods results expressions passed . major difference within(), mutate(), reframe() put results new fields humdrumR data, () summarize() just return results \"normal\" R. differences functions simply relate recycle drop arguments used (details ). recycle argument controls results code , , recycled (padded). write code using humdrumR data's fields() input, results inspected see long compared length input field(s). results longer input, get error message---humdrumR (yet) handle case. results shorter input, recycle argument controls happens result. seven options: \"\": result recycled padded. calls within(), mutate, reframe(), option allowed. \"yes\": result recycled, matter long . \"pad\": result padded NA values. \"ifscalar\": result scalar (length 1), recycled; otherwise see error. \"ifeven\": result length evenly divides input length, recycled; otherwise see error. \"never\": result recycled. result match input length, see error. \"summarize\": result scalar, even matches input length, see error. result recycled. result padding/recycling also depends alignLeft argument: alignLeft = TRUE, results padded right: like c(result, NA, NA, ...); alignLeft = FALSE, results padded left: like c(..., NA, NA, results). Recycling also affected result's length evenly divide input length. example, consider result c(1, 2, 3) needs recycled length 10: alignLeft = TRUE, result recycled c(1, 2, 3, 1, 2, 3, 1, 2, 3, 1); alignLeft = FALSE, result recycled c(3, 1, 2, 3, 1, 2, 3, 1, 2, 3).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/withinHumdrum.html"],"id":"with-and-summarize-","dir":"Reference","previous_headings":"","what":"with() and summarize()","title":"Working with humdrum data fields — withinHumdrum","text":"humdrumR () summarize() methods return \"normal\" R data objects. difference () summarize() methods default drop recycle arguments: (..., drop = TRUE, recycle = '') summarize(..., drop = FALSE, recycle = 'summarize') drop = TRUE, methods return whatever code's result , parsing. can kind R data, including vectors objects like lm fits tables. drop = FALSE, results instead returned data.table(). working grouped data, drop = FALSE output (data.table) include grouping columns well results expressions. drop = TRUE one result per group, grouping fields used generate names output vector.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/withinHumdrum.html"],"id":"within-mutate-and-reframe-","dir":"Reference","previous_headings":"","what":"within(), mutate(), and reframe().","title":"Working with humdrum data fields — withinHumdrum","text":"humdrumR within(), mutate(), reframe() methods always return new humdrumR data object, new fields created code results. differences methods default recycle argument types recycle argument allow: within(..., recycle = 'pad') Can accept recycle option except \"\". mutate(..., recycle = 'ifscalar') Can accept \"ifscalar\" \"never\". reframe(..., recycle = 'pad') Can accept \"pad\" \"yes\".","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/withinHumdrum.html"],"id":"creating-new-humdrumr-fields","dir":"Reference","previous_headings":"","what":"Creating new humdrumR fields","title":"Working with humdrum data fields — withinHumdrum","text":"running within(), mutate(), reframe(), new fields() added output humdrumR data. new fields become selected fields output. can explicitly name newly created fields (recommended), allow humdrumR automatically name (details ). using (..., drop = FALSE) summarize(..., drop = FALSE), column names output data.table determined way. Note within(), mutate(), reframe() (attempt ) put result back humdrumR data...even make much sense. Things work well vectors. Atomic vectors usually best work (.e., numbers, character strings, logical values), lists work well ---just remember need treat fields lists (e.g., might need use lapply() Map() work list fields.) non-vector result put list well, padded needed. example, use lm() compute linear-regression call within() result new field containing list, first element list single lm fit object, rest list empty (padded length field).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/withinHumdrum.html"],"id":"naming-new-fields","dir":"Reference","previous_headings":"","what":"Naming new fields","title":"Working with humdrum data fields — withinHumdrum","text":"explicitly name code expressions provide, new fields named capturing expression code character string. However, generally better idea explicitly name new fields. can done two ways: Base-R within() style: Use <- assignment operator inside expression. Example: within(humData, Kern <- kern(Token)). Tidyverse mutate() style: provide expression named argument =. Example: mutate(humData, Kern = kern(Token)). Either style can used humdrumR methods. using <-, top-level assignment create new field, means one field can assigned per expression. example, create two fields (Semits Recip). However, . result expressions grouped {} always last expression brackets. Thus, last example create one new field, corresponding result recip(Token). However, resulting field called Recip! top-level assignments used name expression: name multi-expression expression (using {}), something like : course, result recip(Token) saved Recip, Semits <- semits(Token) expression nothing useful .","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/withinHumdrum.html"],"id":"piped-references","dir":"Reference","previous_headings":"","what":"Piped references","title":"Working with humdrum data fields — withinHumdrum","text":"argument expressions passed ()/within() methods evaluated order, left right, assignments previous expression visible next expression. means can, example, : use Kern second expression refer Kern assigned previous expression.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/withinHumdrum.html"],"id":"evaluating-expressions-in-groups-or-windows","dir":"Reference","previous_headings":"","what":"Evaluating expressions in groups or windows","title":"Working with humdrum data fields — withinHumdrum","text":"(), within(), mutate(), summarize(), reframe() functions work grouped data, data contextual windows defined. groups windows defined, argument expressions evaluated independently within every group/window. Results processed (including recycling/padding) within group/window. Finally, results pieced back together locations corresponding original data locations. Since groups necessarily exhaustive non-overlapping, results location easy understand. hand contextual windows may overlap, means non-scalar results potentially overlap well; cases, result data lands may hard predict.","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/withinHumdrum.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Working with humdrum data fields — withinHumdrum","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/wort.html"],"dir":"Reference","previous_headings":"","what":"Paste sylllables together into words — wort","title":"Paste sylllables together into words — wort","text":"humdrum datasets include lyrics, include **silbe spine, representing syllable lyrics one line notes music. Syllables multi-syllabic words connected - markers end first syllable, beginning last syllable beginning end medial syllables. wort() command translates syllable representation words, simply collapsing together. resulting word aligned first syllable word **silbe. wort() applied humdrumR data class may use data's fields arguments. field names specified, first selectedField used x.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/wort.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Paste sylllables together into words — wort","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/wort.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Paste sylllables together into words — wort","text":"x vector exclusive intepretations control dispatch. Defaults NULL. Must NULL, character vector either length 1 length(x). sep separator input /output. Defaults \"-\". Must single, non-empty character string. keep.sep syllable separators kept output? Defaults TRUE. Must singleton logical value: /switch. number.syllables output show words numbered syllables? Defaults FALSE. Must singleton logical value: /switch. groupby Optional vectors group words within. Defaults list(). Must list; every element list must length length(x).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/wort.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Paste sylllables together into words — wort","text":"non-null Exclusive argument provided, wort() apply Exclusive == \"silbe\". used withinHumdrum() call, wort() automally passed Exclusive field humdrum data, well groupby = list(Piece, Spine, Path), words collapsed across pieces/spines/paths. output wort() always length input. collapsed syllables replaced **silbe melisma marker, \"_\". number.syllables = TRUE, whole word repeated syllable, numbered square brackets: e.g., c(\"yesterday[1], \"yesterday[2]\", \"yesterday[3]\", \"yesterday[4]\"). format seen lot computational linguistics. default, syllable separators retained collapsed output: makes possible recreate syllables necessary. mid-word melismas (indicated \"_\") kept collapsed well, reason. However, keep.sep = TRUE, seperators (mid-word melismas) removed, making function non invertible (easily get back syllables).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/wort.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Paste sylllables together into words — wort","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/writeHumdrum.html"],"dir":"Reference","previous_headings":"","what":"Write humdrumR data to humdrum files — writeHumdrum","title":"Write humdrumR data to humdrum files — writeHumdrum","text":"writeHumdrum writes humdrumR data humdrum-syntax text files. current selected field(s) evaluated generate humdrum output data. written output match printout printing data R terminal.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/writeHumdrum.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Write humdrumR data to humdrum files — writeHumdrum","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/writeHumdrum.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Write humdrumR data to humdrum files — writeHumdrum","text":"humdrumR HumdrumR data write. Must humdrumR data object. prefix prefix add output filenames. Defaults \"humdrumR_\". Must single character string. renamer function modify output filenames. Defaults force (keep original filenames). Must function accepts character vector returns new charater vector length. affix affix add output filenames. Defaults \"\". Must single character string. Affix appended end filename, extension. extension extension use new files. Defaults NULL, means file extension original files used. Must NULL, single, non-empty character string. directory directory write files . Defaults NULL. Must single character string. NULL, files written directory (directories) read . overwrite Whether overite existing files. Defaults FALSE. Must singleton logical value: /switch. FALSE, writeHumdrum refuse overwrite files. TRUE, writeHumdrum overwrite files, additional prompt user. verbose Whether show file names writing. Defaults FALSE. Must singleton logical value: /switch. TRUE, new output file name printed console writing happens. EMD string write new !!!EMD: record file. Defaults \"Edited using humdrumR, version X.X.X.XXX, current data/time.\" Must single character string. NULL, appended.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/writeHumdrum.html"],"id":"file-names","dir":"Reference","previous_headings":"","what":"File names","title":"Write humdrumR data to humdrum files — writeHumdrum","text":"main option control writeHumdrum files write . writeHumdrum uses original names files, read readHumdrum, basis new file names. default, writeHumdrum refuse overwrite original files---overwriting allowed specify overwrite == TRUE respond \"y\" prompt. writeHumdrum generates new file names modifying original read file names. renamer argument must function takes original names input character vector (excluding directory path file extension) returns new character vector length (default R's identity function force). running renamer, character-string affix prefix arguments appended/prepended renamed names. (affix affixed extension.) Finally, extension argument can used specify different file extension. files data set contain multiple pieces, can either write pieces files (seperateFiles = FALSE), originally, write piece new file (separateFiles = TRUE); writing pieces separate files, piece's file name appended _pieceN, N number piece within file. directory argument indicates file path write files. directory exist, created. directory NULL, files written original input directory (directories). EMD argument specifies character string put new !!!EMD reference record end file. EMD (Document modification description) records keep track modifications humdrum data. default behavior print string indicating humdrumR version number date. EMD set NULL, appended files.","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/news/index.html"],"id":"count-and-table-7-0-3","dir":"Changelog","previous_headings":"","what":"count() and table()","title":"humdrumR 7.0.3","text":"wanted use tally() humdrumR’s main “count stuff” function. Unfortunately, found tally() already exists dplyr (generic tally) can’t really extended ’d like. ’ve reimplemented everything focusing extension dplyr::count() function. also necessitated renaming (metric) count() function timecount(). count() method now generates cool “distribution” table, easily manipulate. mostly working pretty well, still work progress documented. ’ve also extended base::table() work humdrumR data, ’ll emphasizing using count() documentation.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/news/index.html"],"id":"harte-7-0-3","dir":"Changelog","previous_headings":"","what":"harte()","title":"humdrumR 7.0.3","text":"’ve implemented parsing deparsing Harte syntax representing chords. chord functions able read harte notation, now harte() function outputting (deparsing) **harte.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/news/index.html"],"id":"humdrumr-700","dir":"Changelog","previous_headings":"","what":"humdrumR 7.0.0","title":"humdrumR 7.0.0","text":"HumdrumR 0.7.0.0 includes pretty major changes previous (0.6.x.x) versions. Notably, updated whole package make consistent Tidy-verse. ’ve also incorporated option use humdrumR functions super-concise manner closely modeled original humdrum toolkit. Finally, changed humdrumR data objects behave little like “normal” R data.frames (tibbles), allowed easily “see” manipulate data data.frame. reference manuals articles updated reflect changes.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/news/index.html"],"id":"tidy-verse-style-7-0-0","dir":"Changelog","previous_headings":"","what":"Tidy-verse style","title":"humdrumR 7.0.0","text":"HumdrumR changed ways align Tidy-verse, particular, dplyr package. following dplyr packages now humdrumR methods: select() filter() mutate() reframe() summarize() group_by() pull()","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/news/index.html"],"id":"select-7-0-0","dir":"Changelog","previous_headings":"Tidy-verse style","what":"select()","title":"humdrumR 7.0.0","text":"biggest change package use select() function. humdrumR, dropped use term “Active Field” favor term “Selected Field.” Use select() function select fields—can longer use $ purpose.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/news/index.html"],"id":"filter-7-0-0","dir":"Changelog","previous_headings":"Tidy-verse style","what":"filter()","title":"humdrumR 7.0.0","text":"can now call filter() alternative subset()—work exactly !","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/news/index.html"],"id":"mutate-summarize-and-reframe-7-0-0","dir":"Changelog","previous_headings":"Tidy-verse style","what":"mutate(), summarize(), and reframe()","title":"humdrumR 7.0.0","text":"now use dplyr “verbs” mutate(), summarize(), reframe() main tools manipulating humdrumR data. commands work similarly within() () functions previous humdrumR versions, slightly different recycle results. base-R () within() functions can still used —fact, () still particularly useful sometimes, basically going reframe() |> pull() one step.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/news/index.html"],"id":"group_by-7-0-0","dir":"Changelog","previous_headings":"Tidy-verse style","what":"group_by()","title":"humdrumR 7.0.0","text":"Instead providing = argument humdrumR functions, now call group_by() separate command. data stay grouped call ungroup().","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/news/index.html"],"id":"pull-7-0-0","dir":"Changelog","previous_headings":"Tidy-verse style","what":"pull()","title":"humdrumR 7.0.0","text":"dplyr “verb” pull() can also used extract field humdrumR dataset. also functions pull_data.frame(), pull_data.table() (requires data.table, pull_tibble() (requires tibble), pull multiple fields “normal” R data.frame/data.table/tibble. Note $ command changed consistent base-R Tidyverse. command now simply extract field humdrumR data.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/news/index.html"],"id":"humdrum-style-7-0-0","dir":"Changelog","previous_headings":"","what":"Humdrum style","title":"humdrumR 7.0.0","text":"new feature many humdrumR’s functions can applied directly humdrumR data, without using mutate(), within(), etc. example, can take humdrum data pipe directly kern() function, like: humData |> kern().","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/news/index.html"],"id":"dataframe-view-7-0-0","dir":"Changelog","previous_headings":"","what":"Data.frame view","title":"humdrumR 7.0.0","text":"new option humdrumR 0.7.0.0 view humdrumR data normal R data.frame, instead showing data humdrum-syntax score. Call command humdrumR(\"data.frame\") switch new view. “data.frame view,” humdrumR still show selected fields. want see fields, use select(everythign()). want switch back “humdrum view” (default), call humdrumR(\"humdrum\").","code":""}]
+[{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/ComplexSyntax.html"],"id":"complex-humdrum-syntax","dir":"Articles","previous_headings":"","what":"Complex humdrum syntax","title":"Complex humdrum syntax","text":"humdrum syntax includes complex structures: spine paths multi-stops (.k.., sub-tokens). Humdrum\\(_{\\mathbb{R}}\\) incorporates complexities data model, problem, make things complicated, may require thought depending analyses trying . Understanding paths/stops used necessary data interested doesn’t include spine paths multi-stops! can always skip article come back later time. way humdrum\\(_{\\mathbb{R}}\\) incorporates paths/stops really just extension basic data model, described Data Fields article. definitely read understand article reading one. every token, including tokens various spine paths various multi-stops, recorded separate row humdrum table.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/ComplexSyntax.html"],"id":"spine-paths","dir":"Articles","previous_headings":"","what":"Spine paths","title":"Complex humdrum syntax","text":"Humdrum\\(_{\\mathbb{R}}\\) treats spine paths “sub-spines” main spine split , keeps track path () Path field. starting path (leftmost) numbered path 0—datasets spine paths, Path field zeros. paths numbered higher integers. Let’s look simple example (found humdrumRroot example files): complex example: Notice humdrum\\(_{\\mathbb{R}}\\) prints paths way readable reading humdrum syntax directly: paths “shifted” columns align. option function .matrix.humdrumR().","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/ComplexSyntax.html"],"id":"working-with-paths","dir":"Articles","previous_headings":"Spine paths","what":"Working with Paths","title":"Complex humdrum syntax","text":"work spine paths depends, always, nature data. simply global counting notes, example, tokens paths might treated differently data. data sets, information spine paths might relevant analyses—example, paths used store ossia. analyses—especially, analyzing data linear/melodic way—, incorporating/handling spine paths may difficult, obviously correct way . fact, many humdrum\\(_{\\mathbb{R}}\\)’s standard “lagged” functions—like ditto(), mint(), timeline()—can give weird results presence spine paths. Often, simplest solution simply ignore/remove spine paths data. Since Path field numbered starting 0, can achieved easily filtering anywhere Path > 0.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/ComplexSyntax.html"],"id":"expanding-paths","dir":"Articles","previous_headings":"Spine paths > Working with Paths","what":"Expanding Paths","title":"Complex humdrum syntax","text":"One way linear/melodic analyses presence spine paths “expand” paths full spines. expandPaths() function “expand” paths copying parts spines shared multiple paths separate paths (spines). Observe: Humdrum\\(_{\\mathbb{R}}\\)’s [tidyverse methods][withinHumdrum], like mutate() within(), also expandPaths argument. expandPaths = TRUE, functions expand spine paths, apply expression, “unexpand” paths back normal. Look differnce two calls: Notice , don’t use expandPaths, path counted entirely separately rest.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/ComplexSyntax.html"],"id":"stops","dir":"Articles","previous_headings":"","what":"Stops","title":"Complex humdrum syntax","text":"humdrum syntax, multiple tokens can placed “place” (.e., record, spine) simply separating spaces. (commonly used represent chords **kern data.) humdrum\\(_{\\mathbb{R}}\\), call “Stops”—always, every humdrum token, including stops, get row humdrum\\(_{\\mathbb{R}}\\) [humdrum table][humTable]. Thus, need Stop field tell us stop token came ! much data, /tokens simply Stop == 1 (first position), one tokens record/spine, numbered ascending one. Let’s look example make sense ! Let’s start looking humdrum-data view. file chords second spine: individual note tokens separated spaces. Now, can switch back table view: can see note chords gets row, numbered 1, 2, 3 Stop field!","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/ComplexSyntax.html"],"id":"working-with-multi-stops","dir":"Articles","previous_headings":"Stops","what":"Working with Multi-Stops","title":"Complex humdrum syntax","text":"Working multi-stops often even challenging working spine paths. work stops depends, always, nature data. , simply global counting notes, example, tokens stops might treated differently data. analyses—especially, analyzing data linear/melodic way—, incorporating/handling spine paths may difficult, obviously correct way . fact, many humdrum\\(_{\\mathbb{R}}\\)’s standard “lagged” functions—like ditto(), mint(), timeline()—can give weird results presence stops. Often, simplest solution simply ignore/remove stops data. Since Stop field numbered starting 1, can achieved easily filtering anywhere Stop > 1.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/Context.html"],"id":"groupby","dir":"Articles","previous_headings":"","what":"Groupby","title":"Contextualizing humdrum data","text":"conventionally “R-style” way look data context using R/humdrum\\(_{\\mathbb{R}}\\)’s various “group ” options. functionality described elsewhere, example Working Data article, within.humdrumR() man page. Group-functionality isn’t necessarily connected temporal context: can, instance, group together data instrument ensemble, across songs dataset—useful, non-temporal-context. want use groupby get temporal context, good options:","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/Context.html"],"id":"group-by-record","dir":"Articles","previous_headings":"Groupby","what":"Group by Record","title":"Contextualizing humdrum data","text":"humdrum\\(_{\\mathbb{R}}\\) data Record field, indicating data points occur time. Using group_by() can perform calculations grouped record. Let’s load trusty Bach-chorale data: Let’s count many new note onsets (rests) occur record data, tabulate results. ’ll look tokens don’t contain r (rest), using regular-expression match %~% 'r' negating bang (!). records (462 827) new notes four voices—surprise choral music—one onset next common case (211 records). Note , called group_by(), included Piece Record. ? piece data set repeats record numbers—wouldn’t want count 17th record 3rd chorale together 17th record 7th chorale, example. using group_by(), ’ll almost always want Piece grouping factor.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/Context.html"],"id":"group-by-bar","dir":"Articles","previous_headings":"Groupby","what":"Group by Bar","title":"Contextualizing humdrum data","text":"humdrum data includes bar lines, indicated =. humdrum\\(_{\\mathbb{R}}\\) reads data (?readHumdrumR) data, look barlines, count file, put count field called Bar (?fields). can use data group data bar. Remember, data set = tokens, Bar field nothing useless 0s. wanted know lowest note bar music ? Let’s first extract semits() data, easy get lowest value: can now group bars (within pieces, !), get minimum (using .min()), tabulate . highest lowest-note--bar . common lowest-note--bar AA. analysis, might want save lowest-note new field, ’ll use mutate(). default, mutate() function [recycle][recycling] scalar (length one) result throughout group, usually want: (Note use ungroup() overwriting chorales, grouping doesn’t affect future analyses.) , example, subtract bar’s lowest note note:","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/Context.html"],"id":"group-by-beat","dir":"Articles","previous_headings":"Groupby","what":"Group by Beat","title":"Contextualizing humdrum data","text":"Another useful contextual group beat. automatic “beat” field data, ’ll need make one—obviously, need data rhythmic information encoded (like **kern **recip) ! can use timecount() function count beats data. count quarter-notes setting unit = '4'; alternatively, data includes time-signature interpretations (like *M3/4) use TimeSignature field get tactus meter. Let’s try later save result new field, ’ll call Beat (anything else want). can now group beat (piece, course). Maybe want know range notes beat: Note: data includes spine paths, ’ll want set mutate(timecount(Token), expandPaths = TRUE, ...). Count (similar functions, like timeline()) won’t work correctly without paths expanded (?expandPaths).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/Context.html"],"id":"contextual-windows","dir":"Articles","previous_headings":"","what":"Contextual Windows","title":"Contextualizing humdrum data","text":"use group_by(), data exhaustively partitioned non-overlapping groups; groups also necessarily ordered—explicitly use (temporally) ordered groups like group_by(Piece, Record) want temporal context. contrast, context() function, used combination () mutate(), gives us much flexible control context want data. context() takes input vector treats ordered sequence information. identifies arbitrary contextual windows data, based criteria. windows created context() always sequentially ordered, aren’t necessarily exhaustive (data might fall window), can overlap (data falls multiple windows). use context() telling indicating “open” (begin) “close” (end) contextual windows, using open close arguments. Context can use many criteria open/close windows. following sections, layout just examples; ’ll use chorale data , well built-Beethoven variation data: examples, ’ll use within() run command paste(Token, collapse = '|'). cause tokens within contextual group collapse single string, separated |. simplest/fastest way see context() !","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/Context.html"],"id":"regular-windows","dir":"Articles","previous_headings":"Contextual Windows","what":"Regular windows","title":"Contextualizing humdrum data","text":"cases, simply want progress data open/close windows regular locations. can using hop() function. (hop() humdrum\\(_{\\mathbb{R}}\\) function similar R’s base seq() function; however, hop() special features , importantly, gets special treatment context()). Maybe want open four-note window every note: Cool, ’ve got overlapping four-note windows, running spine! ?","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/Context.html"],"id":"regular-open","dir":"Articles","previous_headings":"Contextual Windows > Regular windows","what":"Regular Open","title":"Contextualizing humdrum data","text":"first argument context() open argument; give open set indices (natural numbers) open windows data. hop() simply generates sequence numbers “along” input data—default, “hop size” 1, can change . example: use hop() inside context(), automatically knows input vector(s) (data fields) hop along . now check : saying hop(2), windows open every index. don’t want four-note windows overlap , set hop(4): Note argument can vector hop-sizes, cause hop() generate sequence irregular hops! can also use hop()’s arguments control first/last windows occur, etc. using , can refer another special variable—end—context() interpret last index. , example, say hop(= 5, = end - 5).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/Context.html"],"id":"fixed-close","dir":"Articles","previous_headings":"Contextual Windows > Regular windows","what":"Fixed Close","title":"Contextualizing humdrum data","text":"hop() telling context() open windows; telling close windows? second argument context() close argument. Like open, close argument set natural-number indices. However, cool thing close argument can refer open argument. rather manually figuring index go open (don’t try, multiple spines etc. make confusing), simply say open + 3. want five-note windows, can say open + 4. want window simply close next opening? can close argument refer nextopen variable. instead saying open + 3 say nextopen - 1L! Now ’ll get exhaustive windows matter open windows. example, can change hop size still get exhaustive windows! also close windows nextopen - 2 nextopen + 1—whatever want!","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/Context.html"],"id":"flip-it-around","dir":"Articles","previous_headings":"Contextual Windows > Regular windows","what":"Flip it around","title":"Contextualizing humdrum data","text":"don’t define open first close refer open—can also opposite! ’ve got exact result telling window closes hop along regularly (every four indices) open argument refer closing indices (close - 3). open argument can also refer prevclose (previous close). Notice output windows still “placed” align opening—can set alignLeft = FALSE call within.humdrumR(), want output align close: Note regular windows creating examples N-grams. Humdrum\\(_{\\mathbb{R}}\\) also defines another approach defining N-grams generally faster using context()—alternative approach described last section article.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/Context.html"],"id":"irregular-windows","dir":"Articles","previous_headings":"Contextual Windows","what":"Irregular Windows","title":"Contextualizing humdrum data","text":"regular windows created previous section useful, context() can lot . can tell context() open, close, windows based arbitrary criteria! example, let’s say want open window time leading tone occurs, stay open next tonic. , let’s get solfa() data Solfa field: Alright, easy thing give context()’s open/close arguments character strings, matched regular expressions active field: Pretty cool! wait, something seems odd; one outputs \"ti--fa-re---fa--la-re--fa-mi-re-di-re-ti-\". doesn’t window close hits first “”? context()s treatment overlapping windows, controlled overlap argument. default, overlap = 'paired', means context() attempts pair open next unused close—reason don’t close first “” \"ti--fa-re---fa--la-re--fa-mi-re-di-re-ti-\", “” already close previous window. analysis, might want try overlap = 'none': argument, new window open current window closed. Another option allow multiple windows close place (.e., “”). can achieved setting overlap = 'edge': lot wrap head around, one! many ways define/control contextual windows defined, ’s often difficult decide want particular analysis. can read context() documentation examples, simply play around! following sections layout examples, just illustrate possibilities.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/Context.html"],"id":"more-criteria","dir":"Articles","previous_headings":"Contextual Windows > Irregular Windows","what":"More criteria","title":"Contextualizing humdrum data","text":"want windows close tonic (), long-durations? Let’s extract duration information new field: now something like : Notice , close expression complicated now, explicitly say Solfa == '' instead using shortcut just providing single string.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/Context.html"],"id":"open-until-nextprevious","dir":"Articles","previous_headings":"Contextual Windows > Irregular Windows","what":"Open until next/previous","title":"Contextualizing humdrum data","text":"can use learned nextopen nextclose variables make windows open/close matches. example, windows close every time fermata (\";\" token **kern) data, open immediately fermata: issue : first fermata data doesn’t get paired anything, “previous close” . happen whenever use nextopen prevclose! can fix explicitly adding opening window 1: using | () command context(), saying open window 1 prevclose + 1. working nextopen might want use special end argument (available inside context()), last index input vector.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/Context.html"],"id":"semi-fixed-windows","dir":"Articles","previous_headings":"Contextual Windows > Irregular Windows","what":"Semi-fixed windows","title":"Contextualizing humdrum data","text":"cases, might want windows open (close) fixed interval, close based something irregular. can easily combining ’ve already learned. example, open window every third index, close see fermata. ’ll want use overlap = 'edge' .","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/Context.html"],"id":"slurs","dir":"Articles","previous_headings":"Contextual Windows > Irregular Windows","what":"Slurs","title":"Contextualizing humdrum data","text":"common case contextual information musical scores slurs, used indicate articulation (e.g., bowing) phrasing information. **kern, slurs indicated parentheses, like ( ). see examples, let’s look beethoven dataset, loaded . start removing multi-stops (make much complicated) extracting **kern data. can see parentheses used indicate slurs piano parts. Let’s say want get length slurred groups: slurs 2, 3, 4 notes. one 13! wonder ? ! Ok, want collapse slurred notes together, like ’ve throughout article? worked…lost unslurred notes. can recover tokens call uncontext(). Normally, uncontext() just removes contextual windows data, doesn’t actually change data fields. However, provide complement argument, must refer existing field, “complement” field filled currently selected field, wherever contextual window defined. (behavior similar complement argument unfilter().)","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/Context.html"],"id":"nested-windows","dir":"Articles","previous_headings":"Contextual Windows > Irregular Windows","what":"Nested windows","title":"Contextualizing humdrum data","text":"cases, might contextual windows “nested” inside . example, slurs sheet music might overlap represent fine gradations articulation. context() funciton can handle nested windows setting overlap = 'nested'. example file can experiment : ’ve got nested slurs. Let’s try context(..., overlap = 'nested'): good! get windows, including nested ones. (Look result differs set overlap = 'paired'.) want topmost bottommost slurs? Use depth argument: depth one non-zero integers, indicating deeply nested want windows . depth = 1 “top” (unnested) layer, 2 next-nested, etc. can also use negative numbers start nested work backwards: -1 deeply nested layer, -2 second-deeply nested, etc. Finally, can specify one depths making depth vector, like depth = c(1,2).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/Context.html"],"id":"n-grams","dir":"Articles","previous_headings":"","what":"N-grams","title":"Contextualizing humdrum data","text":"previous section, saw context() function can used create n-grams (much ). Humdrum\\(_{\\mathbb{R}}\\) also offers different, lag-based, approach n-gram analyses. lag-based approach fully vectorized context() makes extremely fast, also less general purpose. Depending n-grams, context() may way works—basically, want apply expression separately every n-gram, need use context(). idea lag-based n-grams can demonstrated quite simply using letters vector (built R) lag(n) command. lag(n) command “shifts” vector n indices: happened ? give cbind() function three separate arguments: 1) normal letters vector; 2) letters lagged 1; 3) letters lagged 3. three arguments bound together three-column matrix. can thing paste(): made three-grams! approach, used fully-vectorized functions extremely fast, even large datasets.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/Context.html"],"id":"lag-within-humdrumr","dir":"Articles","previous_headings":"N-grams","what":"Lag within humdrumR","title":"Contextualizing humdrum data","text":"[/dplyr][?withHumdrum] functions allow create lagged vectors special, concise way. Let’s work chorales, using just simple kern() data: using ()/mutate()/etc., instead writing lag(x, n = 1), can write x[lag = 1]. can paste field (like Kern) lagged, like : can use negative positive lags, depending want n-grams line : important point! ()/mutate()/etc. automatically group lagged data list(File, Spine, Path), n-grams won’t cross end one file/spine beginning next, etc. paste() isn’t vectorized function might want apply lagged data. Another common example count(): get transition matrix!","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/Context.html"],"id":"larger-n","dir":"Articles","previous_headings":"N-grams","what":"Larger N","title":"Contextualizing humdrum data","text":"functions accept unlimited arguments (...), like paste(), count(), can easily extend principle create longer n-grams: ’s even better way! Simply give lag argument vector lags! fact, lag = 0 spits unlagged vector, can single index command: Let’s create 10-grams, see frequent 10-grams : ’s want! lagged n-grams, first last n-grams get “padded” NA values. can use R function grep(invert = TRUE, value = TRUE) get rid : still doesn’t seem right, ? Actually, right: 10 chorales, 10-gram pitch patterns occur ! Let’s try 5-gram instead: Now see couple n-grams (like d e d c b) occur often.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/DataFields.html"],"id":"the-humdrumr-data-model","dir":"Articles","previous_headings":"","what":"The HumdrumR Data Model","title":"HumdrumR Data Fields","text":"Humdrum\\(_{\\mathbb{R}}\\) bridges data world humdrum coding analysis world R. mapping humdrum data syntax R data.frame. fully understand , start least basic understanding humdrum syntax! Read syntax humdrum.org check article topic. article covers humdrum\\(_{\\mathbb{R}}\\) handles basic, common humdrum syntax. humdrum syntax includes complex structures—spine paths multi-stops (.k.., sub-tokens)—discussed Complex humdrum syntax article.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/DataFields.html"],"id":"data-frames","dir":"Articles","previous_headings":"The HumdrumR Data Model","what":"data.frames","title":"HumdrumR Data Fields","text":"Data.frames heart soul R. data.frame simply two-dimensional table named columns. column vector values, length. humdrum\\(_{\\mathbb{R}}\\), every single token collection humdrum-syntax text files given row data.frame, call “humdrum table.” example, consider simple, humdrum-syntax file: file contains nineteen individual tokens. illustrate, ’ll print file, token bracketed < >: happens humdrum\\(_{\\mathbb{R}}\\) reads file? (file bundled humdrum\\(_{\\mathbb{R}}\\) \"humdrumRroot/examples\" directory; See Getting started article explanation.) see thing saw earlier, reading real humdrum data \"HumdrumData\" folder. ’s hood? can tell humdrum\\(_{\\mathbb{R}}\\) ’d like see underlying humdrum table explicitly printing data, setting view = \"table\". Compare difference two commands: use view = \"humdrum\", see default humdrum\\(_{\\mathbb{R}}\\) view data humdrum syntax. However, view = \"table\", show underling humdrum table. can see one row every token, different columns indicating File, Spine, Record token comes . humdrum\\(_{\\mathbb{R}}\\), refer columns humdrum table fields. get tired explicitly using print(), can change humdrumR’s default print method using humdrum() function, first argument view.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/DataFields.html"],"id":"humdrumr-fields","dir":"Articles","previous_headings":"The HumdrumR Data Model","what":"HumdrumR fields","title":"HumdrumR Data Fields","text":"Let’s take look humdrum table . avoid typing print(view = \"table\") , let’s set default view option table (see previous paragraph). see four fields table: Piece, Spine, Record, Token. Token primary data field humdrum\\(_{\\mathbb{R}}\\) data, containing actual data tokens originated humdrum data files read. ’ll see lots lots references Token throughout articles, humdrum\\(_{\\mathbb{R}}\\) documentation! Piece, Spine, Record “structural fields,” indicating data token located humdrum syntax. four fields just tip iceberg! Humdrum\\(_{\\mathbb{R}}\\) datasets generally many fields—can see listed using fields() commands: see one fields (columns), divided five types fields: Data fields Structure fields Interpretation fields Form fields Reference fields want detailed explanation fields , read humdrum table documentation, can always get calling ?humTable.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/DataFields.html"],"id":"selecting-fields","dir":"Articles","previous_headings":"The HumdrumR Data Model > HumdrumR fields","what":"Selecting fields","title":"HumdrumR Data Fields","text":"want see fields? can use select() command pick fields view: can also see fields particular type, specifying one types fields() function showed us: example, \"Data\", \"Structure\", \"Reference\". can also use tidyverse select shortcuts, example, everything(): call select() arguments, Token field selected. Token field always starting point humdrum\\(_{\\mathbb{R}}\\) analysis, helpful able “reset” going back Token. can also view fields default, humdrum view. humdrum view, selected fields pasted together (left right). Don’t worry, fields still separate humdrum table, just printed way! Viewing multiple fields humdrum syntax view can quite helpful small number fields, much looking 2–3 fields. want look lots fields set humdrumR(view = \"table\").","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/DataFields.html"],"id":"accessing-fields","dir":"Articles","previous_headings":"The HumdrumR Data Model > HumdrumR fields","what":"Accessing fields","title":"HumdrumR Data Fields","text":"Sometimes, might want just pull fields humdrum\\(_{\\mathbb{R}}\\) data table, turning “plain” R data. best way pull() function. can also pull fields using $ operator: want pull field, use pull_data.frame(): get “normal” R data.frame! (also pull_tibble() pull_data.table(), prefer packages.) even pull entire humdrum table really want work “normal” R:","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/DataFields.html"],"id":"working-with-fields","dir":"Articles","previous_headings":"","what":"Working with Fields","title":"HumdrumR Data Fields","text":"bunch “fields”—work ? One option “pull” fields want —explained accessing fields sections —work like normal R data structures. However, humdrum\\(_{\\mathbb{R}}\\) number useful features available keep data wrapped humdrumR data object. Instead, can access manipulate fields directly within humdrum table. following sections, ’ll use chorales data , Getting started humdrumR article.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/DataFields.html"],"id":"humdrum-style","dir":"Articles","previous_headings":"Working with Fields","what":"Humdrum style","title":"HumdrumR Data Fields","text":"quick start, showed simplest intuitive way manipulate humdrum\\(_{\\mathbb{R}}\\) data: simply pipe data directly humdrum\\(_{\\mathbb{R}}\\) function. call “humdrum style,” looks lot like way original humdrum toolkit works. learned previous example, bunch fields chorales object: write something like chorales |> pitch(), pitch() function know field work ? applied first selected field, learned . default, Token field, want!","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/DataFields.html"],"id":"new-fields","dir":"Articles","previous_headings":"Working with Fields > Humdrum style","what":"New fields","title":"HumdrumR Data Fields","text":"Notice , run chorales |> pitch(), printout tells us two data fields: original Token new Pitch field! new Pitch field can view/accessed/manipulated just like field! new field automatically selected, can continue pipe: pitch() function creates new Pitch field, selects ; count() function applied Pitch field! new field created, can immediately piped subsequent command (just saw) isn’t actually saved data object unless explicitly assign result variable. many cases ’ll want assign back variable, like : can now, select, access, manipulate new Pitch field:","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/DataFields.html"],"id":"another-new-field","dir":"Articles","previous_headings":"Working with Fields > Humdrum style","what":"Another new field","title":"HumdrumR Data Fields","text":"added Pitch field chorales data—also wanted rhythm field? careful! last command, Pitch field currently selected. apply rhythm function now, won’t work Pitch field rhythm information . need “reset” selecting Token field . start creating many fields, can easy lose track field selected, can lead common errors!","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/DataFields.html"],"id":"multiple-fields","dir":"Articles","previous_headings":"Working with Fields > Humdrum style","what":"Multiple fields","title":"HumdrumR Data Fields","text":"get one field work , gets garder use “humdrum style.” humdrum\\(_{\\mathbb{R}}\\) function wills pipe first selected field, doesn’t matter select multiple fields. However, count() function can accept multiple fields. Now ’ve created Pitch Duration fields, can stuff like:","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/DataFields.html"],"id":"tidyverse-style","dir":"Articles","previous_headings":"Working with Fields","what":"Tidyverse style","title":"HumdrumR Data Fields","text":"“humdrum style” previous section wonderful place start, limitations. main one works humdrum\\(_{\\mathbb{R}}\\) functions. try use base-R function like chorales |> mean() tidyverse function like chorales |> map(), ’ll get error. ’s , humdrum style limited complexity commands can execute. get beyond limitations, can instead use functions (“verbs”) tidyverse dplyr package: mutate(), summarize(), reframe(). call functions, can freely access manipulate field humdrumR data. example: happened ? call mint(Token, simple = TRUE) evaluated, using Token field “inside” chorales data object. resulting data (melodic intervals) put new field, calls mint(Token). course, mint() humdrum\\(_{\\mathbb{R}}\\) function, simple command without using mutate(), calling chorales |> mint() “humdrum style.” However, using mutate() can nifty things. one, can execute complex commands involving fields: can use non-humdrum\\(_{\\mathbb{R}}\\) functions, like gsub(), nchar(), mean(): can choose names new field(s): can make one field :","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/DataFields.html"],"id":"base-r-style-with-and-within","dir":"Articles","previous_headings":"Working with Fields","what":"Base-R style (With and Within)","title":"HumdrumR Data Fields","text":"addition tidyverse “verbs” mutate() summarize(), humdrum\\(_{\\mathbb{R}}\\) also defines methods base-R functions within(). functions work lot like mutate() summarize(), flexible (see ?withHumdrum details). () function particularly useful, using basically like going mutate() |> pull() one step. see () within() used many articles!","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/DataFields.html"],"id":"why-work-within-the-humdrumr-table","dir":"Articles","previous_headings":"","what":"Why work within the humdrumR table?","title":"HumdrumR Data Fields","text":"might wondering, especially already strong R user, just pull data fields humdrum\\(_{\\mathbb{R}}\\) data use “normal” base-R, perhaps tidyverse functions. certainly can ! However, humdrum\\(_{\\mathbb{R}}\\) offers number special features make particularly useful musicological analysis humdrum data.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/DataFields.html"],"id":"humdrum-syntax","dir":"Articles","previous_headings":"Why work within the humdrumR table?","what":"Humdrum syntax","title":"HumdrumR Data Fields","text":"obvious example, long data humdrum\\(_{\\mathbb{R}}\\) data object, option viewing data humdrum-syntax form. allows “see” things happening original data/score, maintains transparency affords good research. can also generate new humdrum syntax data, write new humdrum-syntax files.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/DataFields.html"],"id":"isolating-data-tokens","dir":"Articles","previous_headings":"Why work within the humdrumR table?","what":"Isolating data tokens","title":"HumdrumR Data Fields","text":"default, Humdrum\\(_{\\mathbb{R}}\\) commands operate humdrum data tokens, ignoring bar lines, intepretations, null data tokens. can override providing dataTypes argument humdrum\\(_{\\mathbb{R}}\\) functions. example, compare two commands: pull data humdrum\\(_{\\mathbb{R}}\\), ’ll manually manage data types want work .","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/DataFields.html"],"id":"automatic-field-arguments","dir":"Articles","previous_headings":"Why work within the humdrumR table?","what":"Automatic field arguments","title":"HumdrumR Data Fields","text":"functions, humdrum\\(_{\\mathbb{R}}\\) automatically pass specific fields arguments functions call. example, humdrum\\(_{\\mathbb{R}}\\) pitch functions like solfa() (solfege) need key information get information want. Many humdrum data sets Key field, automatically created read data files containing key interpretations, like G*:. Humdrum\\(_{\\mathbb{R}}\\) unless explicitly override different Key argument, humdrum\\(_{\\mathbb{R}}\\) automatically pass Key argument pitch functions. Thus: Many humdrum\\(_{\\mathbb{R}}\\) functions automatically passed Exclusive field, help decide parse data. examples “automatic arguments” include functions like metlev(), automatically called metlev(meter = TimeSignature) TimeSignature field defined. Function documentation always tell automatic arguments: example, see ?solfa ?metlev.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/DataFields.html"],"id":"automatic-musical-boundaries","dir":"Articles","previous_headings":"Why work within the humdrumR table?","what":"Automatic musical boundaries","title":"HumdrumR Data Fields","text":"special case “automatic arguments” (see previous section) “lagged” functions, like mint(), ditto(), lag(). functions work shifting “lagging” contents field. groupby argument used make data shifted across inappropriate boundaries music/data. example, don’t want first note second spine data shifted last note first spine. means following commands , automatically, respect logical (melodic) grouping boundaries data:","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/DataFields.html"],"id":"special-syntactic-sugar","dir":"Articles","previous_headings":"Why work within the humdrumR table?","what":"Special syntactic “sugar”","title":"HumdrumR Data Fields","text":"Humdrum\\(_{\\mathbb{R}}\\) also provides additional “syntatic” sugar features. simplest example . variable, automatically replaced first selected field using tidyverse-style function. helpful pipes might lose track selected field called. example, command first mutate() call creates field called lilypond(Token, simple = TRUE, generic = TRUE), don’t type : can just type .. humdrum\\(_{\\mathbb{R}}\\)’s syntactic tricks fully explained elsewhere, including ?withinHumdrum documentation.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/DataFields.html"],"id":"whats-next","dir":"Articles","previous_headings":"","what":"What’s next?","title":"HumdrumR Data Fields","text":"get hang humdrum- tidyverse- style manipulation humdrum data fields, ’ll want read important, advanced features humdrum\\(_{\\mathbb{R}}\\) offers. ready, can continue learning features humdrum\\(_{\\mathbb{R}}\\) provides manipulating analyzing humdrum data: Filtering humdrum data Grouping humdrum data Contextualizing humdrum data","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/Filtering.html"],"id":"indexing","dir":"Articles","previous_headings":"","what":"Indexing","title":"Filtering humdrum data","text":"simplest, common, way filter data “indexing,” common means programming selecting subsets data. R, use square brackets, [], index various data objects, including basic atomic vectors, data.tables, lists. example, using brackets can extract subsets vector: Watch ! R actually two different ways indexing: can use single pair matches brackets ([ ]) double pair ([[ ]]). want primer two types indexing used normal R objects, check R primer—really don’t need getting humdrum\\(_{\\mathbb{R}}\\), might want eventually. can use single-bracket [] double-bracket [[]] commands index humdrum\\(_{\\mathbb{R}}\\) data objects. single-brackets used index whole pieces data. double-brackets used index within pieces data. Either type bracket can accept either numeric character vectors index . indexing pipe, using index() ([]) index2() commands ([[]]).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/Filtering.html"],"id":"single-bracket-indexing","dir":"Articles","previous_headings":"Indexing","what":"Single-bracket indexing","title":"Filtering humdrum data","text":"single-brackets used index whole pieces data. dataset 19 files, want look files, ’d use single-brackets [].","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/Filtering.html"],"id":"numeric-indices-for-single-brackets","dir":"Articles","previous_headings":"Indexing > Single-bracket indexing","what":"Numeric indices (for single-brackets)","title":"Filtering humdrum data","text":"give numeric value single-bracket index command, number select ith file dataset. example, want look fifth chorale, can call: can also give command vector numbers: might want use R sequence command, :, select range numbers:","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/Filtering.html"],"id":"character-indices-for-single-brackets","dir":"Articles","previous_headings":"Indexing > Single-bracket indexing","what":"Character indices (for single-brackets)","title":"Filtering humdrum data","text":"supply humdrum\\(_{\\mathbb{R}}\\) object single-bracket index character string, humdrum\\(_{\\mathbb{R}}\\) treat string regular expression return files contain match expression data token—even one. example, might interested files use flat notes. Since **kern represents flats “-”, can simply write: Look , five ten chorales contain least one flat. chorales zero flats. Notice still get whole files returned us!","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/Filtering.html"],"id":"double-bracket-indexing","dir":"Articles","previous_headings":"Indexing","what":"Double-bracket indexing","title":"Filtering humdrum data","text":"double-brackets used index within pieces data. Specifically, want work certain spines records within pieces. double-brackets apply filters separately file dataset. double-bracket indexing, can provide two separate arguments, either individually together: first argument index records within file. j second argument, index spines within file. want use j (spine) argument , put comma , indicate skipping . also good practice clear put comma , actually needed. Basically, commands look like : chorales[[, ]] (records) chorales[[ , j]] (spines) chorales[[, j]] (records spines)","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/Filtering.html"],"id":"numeric-indices-for-double-brackets","dir":"Articles","previous_headings":"Indexing > Double-bracket indexing","what":"Numeric indices (for double-brackets)","title":"Filtering humdrum data","text":"Numeric values j can given double-bracket humdrum\\(_{\\mathbb{R}}\\) index commands. , number simply matched record numbers file. example, extract first fifty records file : j, number matched spines file (left right). wanted second spine file, ’d write: give indices larger number records spines file, file dropped. example, call get three files back, seven files don’t records 150! (Notice humdrum\\(_{\\mathbb{R}}\\) won’t remove Exclusive interpretation spine spine closing (*-) records…since break humdrum syntax.)","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/Filtering.html"],"id":"character-indices-for-double-brackets","dir":"Articles","previous_headings":"Indexing > Double-bracket indexing","what":"Character indices (for double-brackets)","title":"Filtering humdrum data","text":"Character string values j can also given double-bracket humdrum\\(_{\\mathbb{R}}\\) index commands. Humdrum\\(_{\\mathbb{R}}\\) treat string regular expression return records () spines (j) match expression data token—even one. example, let’s () say interesting studying flats. Since **kern represents flats “-”, can find records contain flat calling: single-bracket search flats (previous section) get five files back, five chorales contain flats . However, now see records don’t contain flat completely stripped away, leaving (handful) records least one flat. thing j (spines) looks like get one spine five files. single spines simply ever spine file contained flat. couple things notice! first file, now spine 1 old spine 2, can tell instrument interpretation *Itenor. However, look last five files see *Ibass—new spine 1 actually original spine 1 file. wait, ’s ! dig look files returned us (aren’t shown default), see now third file actually flats four spines, four spines still ! cases may find renumbering spines per file basis confusing, want keep track original spine numbers. Fortunately, option might helpful, learn : try specifying drop = FALSE. (drop argument less intuitive, standard R argument sort thing.)","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/Filtering.html"],"id":"negative-numeric-indices","dir":"Articles","previous_headings":"Indexing","what":"Negative numeric indices","title":"Filtering humdrum data","text":"nifty feature R supply negative numbers indexer, R remove numbers. works humdrum\\(_{\\mathbb{R}}\\) , want files except first file, write: want spines except fourth spine, write want remove first 20 records file: (, humdrum\\(_{\\mathbb{R}}\\) won’t remove Exclusive interpretation spine spine closing (*-) records…since break humdrum syntax.)","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/Filtering.html"],"id":"general-filtering","dir":"Articles","previous_headings":"","what":"General Filtering","title":"Filtering humdrum data","text":"indexing commands (previous sections) get far. want precise filtering, use tidy-verse filter() method humdrum\\(_{\\mathbb{R}}\\) data. filter() works exactly like mutate.humdrumR. However, expression(s) give must evaluate logical vector (TRUE FALSE), get error otherwise. filter() take logical result filter data matches FALSE. can reproduce functionality [] [[]] indexing operators (previous section) using filter(): , now can filter based arbitrary criteria want. example, extract tokens odd numbered spines odd numbered records even numbered spines even numbered records. ’ll use Rs modulo command %% separate even odd numbers (odd %% 2 == 1, even %% 2 == 0). ever want ? Probably . However, returning flats, study, lets grab flat notes: Woh, ’re seeing couple B flats files! , know lot flats fourth file (losing files flats):","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/Filtering.html"],"id":"subseting-by-group","dir":"Articles","previous_headings":"General Filtering","what":"Subseting by Group","title":"Filtering humdrum data","text":"Like mutate(), filter() evaluate logical filtering expression within groups created group_by(). can useful way get context searches. example, let’s say want find flats , want see whole bar music contains flat. can grouping Bar field (Piece field, course). ’ll want say “within bar, flats, return TRUE whole bar, else return FALSE whole bar.” default, filter() [recycle][recycling] scalar results, return single TRUE/FALSE, recycled fill whole group. enough context ? Maybe group bars even-odd pairs:","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/Filtering.html"],"id":"removing-vs-filtering","dir":"Articles","previous_headings":"General Filtering","what":"Removing vs Filtering","title":"Filtering humdrum data","text":"probably noticed , unlike indexing commands [] [[]], filter() doesn’t seem actually remove data filter . say still four spines, spines 2–4 just emptied. correct. filter() actually turn filtered data points null (d) data points. Humdrum\\(_{\\mathbb{R}}\\) ignores data automatically. ? several reasons: clear example [[ , j]] indexing flats (): simply removed spines flats hard tell spine result. Many filters break humdrum syntax data simply removed. removed tokens don’t contain flats, result humdrum data holes . possible undo filters, using unfilter() command (details ). ’ve done filtering filter(), want get rid empty parts data, can using commands removeEmptyFiles(), removeEmptySpines(), removeEmptyRecords(),removeEmptyPaths(), removeEmptyStops(). using commands, make sure 1) explicitly want remove 2) humdrum syntax broken, whole records/spines/paths/files removed. spines example: records:","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/Filtering.html"],"id":"complements","dir":"Articles","previous_headings":"","what":"Complements","title":"Filtering humdrum data","text":"humdrum\\(_{\\mathbb{R}}\\) filters, completely discard/erase data. output filter() subset original data: complement subset retained (hidden). allows us restore filtered data, using unfilter(): can also expliticely switch complement using complement() command: want unfilter complement data? functions actually allow number useful functionality immediately obvious.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/Filtering.html"],"id":"example-1","dir":"Articles","previous_headings":"Complements","what":"Example 1","title":"Filtering humdrum data","text":"Let’s say want find look notes leading third phrase ending chorale? ’d first need count phrase endings (;) chorale. filter data, simply seq_along() (enumerate) fermatas bar: Cool! now FermataN field, showing us number fermata. wait, using filter removed tokens, can see notes fermatas, leading . Luckily, can unfilter(), filter bar:","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/Filtering.html"],"id":"example-2","dir":"Articles","previous_headings":"Complements","what":"Example 2","title":"Filtering humdrum data","text":"wanted transpose bass voice octave higher, keep voices ? Well, try: successfully unfiltered…Token field unfiltered, new Transposed field. Tranposed field complement data: didn’t exist filter applied. Luckily, can tell unfiltered() use specific complement, using complement argument: Thus, unfilter() can used combine content different fields one field!","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/GettingStarted.html"],"id":"quick-start","dir":"Articles","previous_headings":"","what":"Quick Start","title":"Getting started with humdrumR","text":"Let’s just dive right ! illustrate humdrum\\(_{\\mathbb{R}}\\) works, ’ll need humdrum data work . Fortunately, humdrum\\(_{\\mathbb{R}}\\) comes packaged small number humdrum data files just play around . files stored directory computer installed humdrum\\(_{\\mathbb{R}}\\), subdirectory called “HumdrumData”. can move R session directory using R’s “set working directory” command: setwd(humdrumRroot). ’re humdrumR directory, can use base R dir function see humdrum data available . looks like six directories humdrum data available . Using dir , can look inside one: let’s start “BachChorales” directory. ten files directory, named “chor001.krn”, “chor002.krn”, etc. humdrum plain-text files, representing ten chorales J.S. Bach; file contains four spines (columns) **kern data, representing musical pitch rhythm (among things). Take minute find files computer’s finder/explorer open simple text editor. One core philosophies humdrum\\(_{\\mathbb{R}}\\) maintain direct, transparent relationship symbolic data—always take time look data! can also within Rstudio’s “Files” pane—fact, Rstudio make things extra easy can (within Files pane) click “” > “Go Working Directory” quickly find files.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/GettingStarted.html"],"id":"reading-humdrum-data","dir":"Articles","previous_headings":"Quick Start","what":"Reading humdrum data","title":"Getting started with humdrumR","text":"Now ’ve found humdrum data look , let’s read humdrum\\(_{\\mathbb{R}}\\). can using humdrum\\(_{\\mathbb{R}}\\)’s readHumdrum() command. Try : command two things: readHumdrum() function read “chor001.krn” file R create humdrum\\(_{\\mathbb{R}}\\) data object . new object saved variable called chor1. (name ‘chor1’ just name chose—welcome give different name want.) ’ve created chor1 object (whatever chose call ), can take quick look just typing name command line pressing enter: (R, enter something command line, R “prints” read.) print-see shows name file, contents file, stuff “Data fields” learn next article. Cool! Still, looking single humdrum file really exciting. whole point using computers allow us work large amounts data. Luckily, humdrum\\(_{\\mathbb{R}}\\) makes easy. Check next command: Instead writing 'chor001.krn', wrote 'chor0'. feed string 'chor0' readHumdrum(), won’t just look file called “chor0”; read file directory whose name contains sub-string \"chor0\"—case ten files! Try printing new chorales object see different: Wow! ’ve now got “humdrumR corpus ten pieces”—’s nothing: readHumdrum() work just well reading hundreds thousands files! Notice print humdrum\\(_{\\mathbb{R}}\\) object, humdrum\\(_{\\mathbb{R}}\\) shows beginning first file end last file, well telling many files total. readHumdrum() number cool options can read detail humdrumR read/write tutorial.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/GettingStarted.html"],"id":"counting-things","dir":"Articles","previous_headings":"Quick Start","what":"Counting Things","title":"Getting started with humdrumR","text":"data loaded, next thing good computational musicologist start counting! count contents data, can use count() function. ’s quite mess! done? pass chorales data count(), counted unique data tokens (ignoring non-data tokens, like barline interpretations) data. lot unique tokens data, ’s super helpful. Maybe ’d like look just twenty common tokens chorales? , can pass count two base R functions, sort() tail(): Ah, ’s promising! see common token quarter-note E4 (4e), occurs 103 times.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/GettingStarted.html"],"id":"separating-pitch-and-rhythm","dir":"Articles","previous_headings":"Quick Start > Counting Things","what":"Separating pitch and rhythm","title":"Getting started with humdrumR","text":"make tallies useful, might want count pitch rhythm part **kern data. , need able extract pitch/rhythm original **kern tokens, can using humdrum\\(_{\\mathbb{R}}\\)’s suite pitch rhythm functions. example, let’s try pitch() function: pitch() function takes original **kern tokens, reads pitch part token, translates scientific pitch notation. Let’s pass count: Pretty cool, still quite big table. Maybe ’d like ignore octave information now? Luckily, humdrum\\(_{\\mathbb{R}}\\)’s pitch functions “simple” argument, can used ask simple pitch information (octave). can make plot nice simple-pitch table, using humdrum\\(_{\\mathbb{R}}\\)’s draw() function: Instead pitch, sort counting rhythm information, example, using notehead() function:","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/GettingStarted.html"],"id":"filtering","dir":"Articles","previous_headings":"Quick Start","what":"Filtering","title":"Getting started with humdrumR","text":"Sometimes, might want look subset data. example, maybe want count notes sung soprano. Bach chorale data working , soprano voice always fourth spine (column). can use filter() function indicate subset ’d like study: Let’s try something even cooler. Notice , chorale data, tandem interpretations look like *G: *E:. indications key. Anytime read humdrum data key interpretations, humdrum\\(_{\\mathbb{R}}\\) read “field” called Key. , example, count notes sung key G major like : Guess ? bunch “fields” hidden humdrum\\(_{\\mathbb{R}}\\) data object can use…can make ! Check next article, humdrum\\(_{\\mathbb{R}}\\)’s data fields, learn .","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/GettingStarted.html"],"id":"what-next","dir":"Articles","previous_headings":"","what":"What next?","title":"Getting started with humdrumR","text":"’ve gotten started, much learn! keep learning check articles humdrumR homepage. want continue along path ’ve started , next articles check probably HumdrumR data fields, Getting know data, Filtering humdrum data, Working humdrum data. Since musicological analysis involves pitch rhythm, ’ll probably want learn relevant ideas Pitch tonality Rhythm meter articles. humdrum data working complex—e.g., including multiple different exclusive interpretations, spine paths, multi-stops—’ll probably find need check Shaping humdrum data article, give tools deal complex humdrum data sets.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/Grouping.html"],"id":"group-apply-combine","dir":"Articles","previous_headings":"","what":"Group-apply-combine","title":"Grouping humdrum data","text":"One fundamental data analysis techniques R group-apply-combine routine. break data.frames groups (row), apply calculations manipulations group independently, (optionally) recombine groups back single data.frame. example, want know average pitch height (MIDI pitch) chorales, run command: (use summarize() command getting one (scalar) value.) wanted calculate mean pitch, chorale? can use group_by() command: work? group_by() function looks unique values fields give —case Piece field—breaks humdrum table groups based values. ever Piece == 1, ’s group; wherever Piece == 2, ’s another group, etc. group_by() applied, humdrum\\(_{\\mathbb{R}}\\) dataset grouped, subsequent tidy-commands automatically applied within groups. humdrum\\(_{\\mathbb{R}}\\) dataset grouped, stay grouped call ungroup() !","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/Grouping.html"],"id":"more-complex-grouping","dir":"Articles","previous_headings":"Group-apply-combine","what":"More complex grouping","title":"Grouping humdrum data","text":"like, can pass one field group_by(). Groups formed every unique combinations values across grouping fields: can also create new grouping fields fly.F example, , instead groups four separate voices, wanted group bass/tenor alto/soprano within piece? : Grouping isn’t just good calcualting single values. can, instance, tabulate group separately:","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/Grouping.html"],"id":"by-file","dir":"Articles","previous_headings":"Group-apply-combine > Common groupings","what":"By file","title":"Grouping humdrum data","text":"common humdrum\\(_{\\mathbb{R}}\\) analyses want apply commands grouped piece. cases, two pieces music completely separate entities, makes sense apply calcualtions/manipulations separately piece. However, humdrum\\(_{\\mathbb{R}}\\) won’t (always) . might think, “want count many notes occur record” run command group_by(Record)—watch ! Grouping Record group records 1s across pieces, record 2s across pieces, etc. probably want (group_by(Piece, Record)). Don’t forget group piece…unless sure don’t want .","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/Grouping.html"],"id":"melodic-grouping","dir":"Articles","previous_headings":"Group-apply-combine > Common groupings","what":"Melodic grouping","title":"Grouping humdrum data","text":"lots humdrum data, spine (least spines) data represent musical part voice. often want isolate voice, group_by(Piece, Spine) gets used lot. However, watch spine paths multi-stops, data —might want something like group_by(Piece, Spine, Path), example, data spine paths. Check [complex syntax][ComplexSyntax.html “Complex humdrum syntax article”] ideas/options .","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/Grouping.html"],"id":"recycling-results","dir":"Articles","previous_headings":"Group-apply-combine","what":"Recycling results","title":"Grouping humdrum data","text":"usual, use mutate() grouped data, results command “recycled”—case, fill group. can useful maintaining vectorization. example, let’s say want calculate lowest note bar. command ? looked every bar file found lowest note, “recycled” note throughout bar. Since lowset-notes recycled, one value every note Token everything still neatly vectorized. means can calculate harmonic interval bar’s bass note just going:","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/HumdrumSyntax.html"],"id":"structure-vs-content","dir":"Articles","previous_headings":"","what":"Structure vs Content","title":"The humdrum syntax","text":"humdrum syntax lays simple structure encoding data, says nothing content. information encoded, information represented flexible. flexibility, structure humdrum data—humdrum syntax—always , makes easy work ! fill content humdrum files, define “interpretations. Interpretations schemes represent information characters. sounds complicated/scary, can simple! instance, wanted encode drum beats humdrum invent simple scheme encoding drum beats : Kick drum = “K” Snare drum = “S” Hi-Hat = “H” treat newline text file sixteenth-note tick (read humdrum “timebase” ) start encoding. thing need make conform humdrum syntax name : call overarching interpretations like “exclusive interpretations”, prefixed **. call **drums ’d ready create humdrum data!","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/HumdrumSyntax.html"],"id":"syntax","dir":"Articles","previous_headings":"","what":"Syntax","title":"The humdrum syntax","text":"humdrum syntax , first glance, nothing simple, tab-delineated spread sheet. (“tab-delineated” just means columns spreadsheet separated TABs.) basic idea, extra features learn! Let’s take look basic humdrum file: file can broken different types information like : file two columns data, separated tabs. However, special terminology use: “columns” humdrum file called spines. line, row, file called record. twenty records two spines file. character-string, located spine/record position, called token. Examples tokens file include *M4/4, 4A, =1, !Suspension.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/HumdrumSyntax.html"],"id":"global-vs-local","dir":"Articles","previous_headings":"Syntax","what":"Global vs Local","title":"The humdrum syntax","text":"’ll notice two records file (1 10) don’t seem two columns. Indeed, called “global” records—don’t belong particular column, whole row/file. image illustrates two spines file don’t include records 1 10: real data :","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/HumdrumSyntax.html"],"id":"time","dir":"Articles","previous_headings":"Syntax","what":"Time","title":"The humdrum syntax","text":"one fundamental assumption regarding humdrum syntax encodes information: travel downward file (top bottom) encoding information order occurs time. true data records—interpretation comment records associated moment time first data record occurs . Information appears record (within one spine, different spines) assumed happen time.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/HumdrumSyntax.html"],"id":"record-types","dir":"Articles","previous_headings":"Syntax","what":"Record Types","title":"The humdrum syntax","text":"humdrum syntax recognizes four broad types records, five sub-types: Exclusive (**) Tandem (*) Reference (!!!) Global (!!) Local (!) Barlines (=) Data know type record ’re dealing looking first character token. tokens single record must type—can’t interpretation token comment token line. result, can refer type token, type whole record, tokens within record always type.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/HumdrumSyntax.html"],"id":"interpretations","dir":"Articles","previous_headings":"Syntax > Record Types","what":"Interpretations","title":"The humdrum syntax","text":"token starts *, interpretation token. Two stars ** indicates exclusive interpretation. Every spine must start exclusive interpretation, can one. exclusive interpretation spine tells us type information encoded spine, whole spine. instance, **drums interpretation invented exclusive interpretation. examples ’re using , exclusive interpretation spines **kern, widely used humdrum interpretation, used encode music notation. Note humdrum file can different exclusive interpretations spine—don’t , example. read various humdrum interpretations defined, check humdrum.org. token starts one *, called tandem interpretation. Tandem interpretations tell us specific, localized information interpret data. can different, overlapping tandem interpretations within spine. example, *C:, *Ibass, *M4/4, *M3/4, tandem interpretations. *C: used **kern indicate key C major. *Ibass indicates instrument associated spine (bass voice). *M4/4 *M3/4 indicate 4/4 3/4 meter respectively. last case brings something important tandem interpretations: tandem interpretation applied subsequent data points, unless cancelled replaced another tandem interpretation type. Thus, humdrum file indicates 4/4 time starting record 5, switches 3/4 time record 13. However, *M4/4 record 4 doesn’t replace *C: record 3, different types tandem interpretations. One special token *- token. token indicates spine ends. *- missing end—one every spine—invalid humdrum file!","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/HumdrumSyntax.html"],"id":"comments","dir":"Articles","previous_headings":"Syntax > Record Types","what":"Comments","title":"The humdrum syntax","text":"token begins !, comment token. Comments used freely include comments data. global comments (!!) associated spine—apply whole file point appear—local comments (!) specific particular spine. example, !! Ritardando global comment, !Suspension local comment, specific second spine.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/HumdrumSyntax.html"],"id":"reference-records","dir":"Articles","previous_headings":"Syntax > Record Types > Comments","what":"Reference Records","title":"The humdrum syntax","text":"one final type comment: reference records. Reference records global comments placed beginning end file. Reference records encode global metadata entire file: things like composed piece title piece . Reference records specific “reference codes,” usually three digits, come !!!, followed colon, whatever content record . instance, code !!!OTL: refers original title piece. Learn various standard humdrum reference records .","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/KeysAndChord.html"],"id":"diatonic-sets","dir":"Articles","previous_headings":"","what":"Diatonic Sets","title":"Diatonic and tertian sets in humdrumR","text":"mentioned Pitch Tonality vignette, normative diatonic key consists set seven consecutive pitch chroma Line Fifths. diatonic set can ordered either line--fifths position: “scale-order,” corresponds steps \\(+2\\) (\\(-5\\)) modulo 7.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/KeysAndChord.html"],"id":"tertian-sets","dir":"Articles","previous_headings":"","what":"Tertian Sets","title":"Diatonic and tertian sets in humdrumR","text":"set seven notes diatonic key can reimagined chord—set notes played time. Specifically, full seven-note diatonic chord referred 13th chord. However, chords used tonal music subsets full diatonic set, particular three-note triads. viewing diatonic set chord, traditionally order set sequence ascending thirds, corresponding intervals \\(+4\\) line--fifths, modulo 7. tertian steps usually wrapped octave, resulting steps 9, 11, 13, instead 2, 4, 6. \\(2^7=\\) 128 possible subsets can formed full diatonic set. , seven possibilities built consecutive tertian steps theoretically privileged : .e., \\(\\{\\{1\\}, \\{1,3\\}, \\{1,3,5\\}, \\{1,3,5,7\\}, \\{1,3,5,7,9\\}, \\{1,3,5,7,9,11\\}, \\{1,3,5,7,9,11,13\\}\\}\\). possible sets fairly commonplace Western theory well: \\(\\{1,5, 11\\}\\) (“sus4”), \\(\\{1,3,5,9\\}\\) (“add9”), \\(\\{1,3,5,13\\}\\) (“add6”), etc.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/KeysAndChord.html"],"id":"concrete-representations","dir":"Articles","previous_headings":"Tertian Sets","what":"Concrete Representations","title":"Diatonic and tertian sets in humdrumR","text":"numerous ways tertian sets notes traditionally notated annotated character strings. Unfortunately, systems always rigorously consistent logical, convenient shorthands common chords lead ambiguity, /practices rooted traditional practices little relevance. Humdrum\\(_{\\mathbb{R}}\\) aims provide general approach make reading/writing chord annotations many forms possible. chord representation consists set least one following elements: root note. bass note. subset tertian steps present. Qualities chord steps, relative implicit explicit key. Traditional chord notation symbols often conflate merge various elements various ways, numerous common shorthands. particular, common diatonic triads—abstractly different combinations qualities 3rd 5th—represented various shorthands.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/KeysAndChord.html"],"id":"section","dir":"Articles","previous_headings":"","what":"Diatonic and tertian sets in humdrumR","title":"Diatonic and tertian sets in humdrumR","text":"Chord symbols tonal chroma practice often used indicate bass note part ostensible chord. instance, C7/Ab. consist form, unique symbol appended indicate one four unique triad types: major, minor, diminished, augmented. However, cases, major assumed default, can ommitted. cases, either major minor symbol ommited, case root symbol used indicate major minor. (cases, case root symbol also matched diminished (lower) augmented (major) symbols).) Roman numerals 7ths 753 7, 653 65, 643 43, 642 42 2 9ths 9753: 1111100 7653: 1111001 6543: 1110011 6432: 1100111 7642: 1001111 11ths 11","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/PitchAndTonality.html"],"id":"pitches-and-intervals","dir":"Articles","previous_headings":"","what":"Pitches and Intervals","title":"Pitch and tonality in humdrumR","text":"Humdrum\\(_{\\mathbb{R}}\\) defines suite “pitch functions,” like kern(), solfa(), interval(), semits(). functions work essentially way: take input argument output pitch information particular format. example, let’s take little bit **kern data: Notice data rhythmic information (4., 8, 4, 2.) pitch information (c, d, e, g). happens give data “pitch functions”?: function correctly reads **kern pitch information, ignoring rhythm information, outputs pitch information different format. allows us “translate” different ways representing pitch information. want keep non-pitch (rhythm) information, use inPlace argument: cool thing functions can read functions’ output. can things like: complete list basic pitch functions : kern pitch lilypond helmholtz tonh (German-style notation) interval solfa (relative-solfege) solfg (French-style fixed-solfege) degree (absolute scale degrees) deg (melodic scale degrees) bhatk (hindustani swara) step accidental quality octave semits midi cents pc (pitch classes) freq one functions represents different way representing equivalent pitch information.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/PitchAndTonality.html"],"id":"documentation","dir":"Articles","previous_headings":"Pitches and Intervals","what":"Documentation","title":"Pitch and tonality in humdrumR","text":"global documentation pitch functions can seen calling ?pitchFunctions. can also call documentation individual function, like ?kern.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/PitchAndTonality.html"],"id":"scale-degree","dir":"Articles","previous_headings":"Pitches and Intervals","what":"Scale degree","title":"Pitch and tonality in humdrumR","text":"pitch representations encode scale degree, depends key. can use Key argument control pitch functions interpret key—either translating degrees absolute pitches, vice versa. Pass Key argument humdrum key interpretation, like c: (c minor) -: (-flat major). Key argument vectorized (see R primer don’t know means!); means can actually read information different/changing keys.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/PitchAndTonality.html"],"id":"working-with-pitch-representations","dir":"Articles","previous_headings":"Pitches and Intervals","what":"Working with pitch representations","title":"Pitch and tonality in humdrumR","text":"Let’s look using pitch functions real data. Let’s load humdrum\\(_{\\mathbb{R}}\\)’s built-Bach chorales: chorales full **kern data (default) Token field, can easily parsed/translated. Maybe ’d like convert **kern semitones. Humdrum\\(_{\\mathbb{R}}\\)’s pitch functions can used “humdrum-style, using semits() easy: , instance, make histogram semitone values:","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/PitchAndTonality.html"],"id":"keys","dir":"Articles","previous_headings":"Pitches and Intervals > Working with pitch representations","what":"Keys","title":"Pitch and tonality in humdrumR","text":"chorale dataset key information built-Key field. use pitch function humdrum- -tidy style, Key field automatically passed Key argument function! means apply solfa(), get correct scale degrees, given keys data:","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/PitchAndTonality.html"],"id":"rests","dir":"Articles","previous_headings":"Pitches and Intervals","what":"Rests","title":"Pitch and tonality in humdrumR","text":"**kern data, like chorales, includes rests, indicated r place pitch. happens pitch function sees rest data? Let’s see: rest token, output null (.) value—null . actually R NA value. fact, token input fails parse pitch return NA/.. example:","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/PitchAndTonality.html"],"id":"pitch-arguments","dir":"Articles","previous_headings":"","what":"Pitch arguments","title":"Pitch and tonality in humdrumR","text":"Since “pitch functions” sort task, share number common arguments. complete list pitch arguments can found ?pitchParsing ?pitchDeparsing man pages, important ones described :","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/PitchAndTonality.html"],"id":"generic-vs-specific-pitch","dir":"Articles","previous_headings":"Pitch arguments","what":"Generic vs Specific pitch","title":"Pitch and tonality in humdrumR","text":"pitch functions accept logical (TRUE FALSE) generic specific arguments. generic == TRUE, generic pitch information returned. affects different pitch representations different ways: representations like kern(), pitch() lilypond(), accidentals included generic output; intervals(), interval quality removed; solfa, scale degree four “fa”, never “fi” (sharp four). specific argument simply opposite generic, choice indicating genric = TRUE specific = FALSE—equivalent. code:","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/PitchAndTonality.html"],"id":"simple-vs-compound-pitch","dir":"Articles","previous_headings":"Pitch arguments","what":"Simple vs Compound pitch","title":"Pitch and tonality in humdrumR","text":"pitch functions accept logical (TRUE FALSE) simple compound arguments. simple == TRUE, octave information stripped output, leaving “simple” pitch information. affects different pitch representations different ways: pitch() degree(), octave number removed. lilypond() helmholtz(), octave marks ' , removed. solfa() deg(), contour indicators (explanation ) v ^ removed. interval(), steps 1–7 returned (.e., 10ths). compound argument simply opposite simple, choice indicating simple = TRUE compound = FALSE—equivalent. code:","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/PitchAndTonality.html"],"id":"working-with-pitch-arguments","dir":"Articles","previous_headings":"Pitch arguments","what":"Working with pitch arguments","title":"Pitch and tonality in humdrumR","text":"generic simple arguments useful want tabulate pitch classes, example:","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/PitchAndTonality.html"],"id":"transposition","dir":"Articles","previous_headings":"Pitch arguments","what":"Transposition","title":"Pitch and tonality in humdrumR","text":"humdrum\\(_{\\mathbb{R}}\\)’s pitch functions built-transposition functionality. can use functionality passing named list arguments transpose() function, transposeArgs argument pitch function call, like example using argument: Another option transpose key. can argument tranpose(). Let’s say music major ’d like transpose C major: Key argument kern() indicates key music coming , argument tranposeArgs indicates transpose . Since humdrum/tidy functions automatically use Key information data set, makes easy , say, transpose **kern tokens data C major: looks exactly like calling solfa():","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/PitchAndTonality.html"],"id":"melodic-intervals","dir":"Articles","previous_headings":"Melody and Harmony","what":"Melodic Intervals","title":"Pitch and tonality in humdrumR","text":"want calculate melodic intervals part score? purpose mint() (melodic intervals) command. can use mint() pitch data: use mint() humdrum- tidy- style humdrum\\(_{\\mathbb{R}}\\) dataobject, mint() automatically called within spine/path file (accomplished using groupby argument mint()): mint() number special options, can read manual checking ?mint. now, ’ll just show classify argument, can used classify output intervals either Unison, Step, Skip, Leap:","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/PitchAndTonality.html"],"id":"harmonic-intervals","dir":"Articles","previous_headings":"Melody and Harmony","what":"Harmonic intervals","title":"Pitch and tonality in humdrumR","text":"parallel mint() hint() (harmonic intervals) command. hint() works just like mint() except calculates intervals left right record file: special trick use lag argument calculate harmonic intervals relation spine. example, can calculate harmonic intervals voice bass voice like : , harmonic intervals soprano like : Check “Logical lags” section ?hint manual details.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/RPrimer.html"],"id":"basic-commands","dir":"Articles","previous_headings":"","what":"Basic Commands","title":"An R primer for humdrumR users","text":"R code made “expressions” like 2 + 2, sqrt(2), (x - mean(x))^2. can see, can create intuitive arithmetic expressions, like 5 / 2 3 * 3. However, common elements R expressions “calls” functions. “function” R pre-built bit code something. functions take one input arguments, “return” kind output. example, function sqrt() takes number input argument, “returns” square root number. “call” function, write function’s name, followed parentheses (()). input arguments function must go inside parentheses, separated commas one. examples common functions “called” zero input arguments: Different functions different arguments recognize, specific names. example, function log() takes two arguments, called x base. functions can take number arguments, name. can learn function, including arguments accepts, typing ?functionName command line; example, ?sqrt ?mean. see argument called ..., tells function can take number arguments. can explicitly “name” function arguments want putting argname = argument calls: example, say log(10, base = 2). Named arguments useful creating data, like vectors data.frames (see ).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/RPrimer.html"],"id":"pipes","dir":"Articles","previous_headings":"Basic Commands","what":"Pipes","title":"An R primer for humdrumR users","text":"Complex expressions might involve large number function calls, can get tiresome read (write). example, something like calls four functions! expression like bit tricky read, can really easy make mistake put wrong number parentheses. alternative, R gives us option calling functions “pipe.” way works use “pipe” command |>, takes input left “pipes” function call right. example, can rewrite previous command : Much better! make things even cleaner, R understand spread expressions across multiple lines, putting new line |>, function argument:","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/RPrimer.html"],"id":"variables","dir":"Articles","previous_headings":"Basic Commands","what":"Variables","title":"An R primer for humdrumR users","text":"coding R, ’ll often want “save” data objects can reuse . “assigning” something (often result function) “variable”. done using assignment operators, either <- ->. variable name can combination upper lowercase letters. Let’s calculate square-root two save variable: can reuse value many times want: can also assign left right, using ->. useful combination pipes: Note variable names can also include _, ., numeric digits, long aren’t beginning name. example, X1 my_name valid names—2X.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/RPrimer.html"],"id":"basic-data-structures","dir":"Articles","previous_headings":"","what":"Basic Data Structures","title":"An R primer for humdrumR users","text":"R, two fundamental data structures used time: “atomic” vectors data.frames","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/RPrimer.html"],"id":"vectors","dir":"Articles","previous_headings":"Basic Data Structures","what":"Vectors","title":"An R primer for humdrumR users","text":"R, basic units—atoms, —information called “atomic” vectors. three basic atomic data types: Examples: 3, 4.2, -13, 254.30 Examples: \"note\", \"\", \", dear, female dear\" Examples: TRUE, FALSE might wondering, calling basic atoms “vectors”? Well, R, basic atomic data types always considered collection ordered values. ordered collections called vectors. simple examples , vector single value, just looks like one value—single values like often called “scalars”. However, R doesn’t really distinguish scalars (single values) vectors (multiple values)—everything always vector. (Still, sometimes refer length-1 vectors scalars.) make vector scratch R, use c(), : example, ’ve created five vectors. numeric vector length 3. character vector length four (composers). logical vector length 2. ’s right, c(32.3) 32.3 thing—vector length 1. Notice vectors can’t mix--match different data types; makes sense vector single type thing. means commands like c(3, \"\") actually create character vector, 3 forced character (\"3\").","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/RPrimer.html"],"id":"vectorization","dir":"Articles","previous_headings":"Basic Data Structures > Vectors","what":"Vectorization","title":"An R primer for humdrumR users","text":"everything vector time useful, allows us think use collections data single thing. give , say, ten thousand numbers, don’t worry manipulating ten thousand things: rather, just work one thing: vector, happens length 10,000. R, call vectorization—generally, R humdrum\\(_{\\mathbb{R}}\\) constantly taking advantage vectorization make lives super easy! example vectorization, watch : created two numeric vectors: first eight numbers Fibonacci sequence single number 2 multiplied together! Notice entire Fibonacci vector multiplied two! don’t worry multiplying number vector, ’s done us. two ideal circumstances working vectors. length. One vector length 1, isn’t. first case, work multiple vectors length, value vector “lined” values vector. , example, add two vectors together, “lined ” pair numbers added: second case, one vectors length-1 (“scalar”). case, scalar value paired value longer vector (Fibonacci example ). happens vectors longer one, length? Well, R generally attempt “recycle” shorter vector—means repeat — necessary match length longer vector. shorter vector evenly divides longer vector, generally won’t problem: division perfect, R still “recycle” shorter vector, ’ll get warning: see warning message R us? “longer object length multiple shorter object length” ’s R telling us ’ve got obvious mismatch lengths vectors. Generally, best work vectors length /scalar values (length-1 vectors), can avoid worrying exactly R “recycling” values. brings us …","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/RPrimer.html"],"id":"factors","dir":"Articles","previous_headings":"Basic Data Structures > Vectors","what":"Factors","title":"An R primer for humdrumR users","text":"Factors useful modification character vectors, keep track possible values (“levels”) expect data, even levels missing vector. mainly useful counting data table(). example, let’s consider built-R object called letters: happens call table() letters?: Every letter appears table, duh! randomly sample handful letters table result? Notice letters table appear output. E.g., letter never appears sample, doesn’t get counted. Let’s try something new: sampling, call command factor() letters: Ah! Now table includes possible letters, even though many appear 0 times. work? Well factor() function looks character vector outputs new “factor” vector. factor vector acts just like character vector, except remembers unique values, “levels”, vector: Even remove values factor vector, vector “remember” levels. factor also remember order levels, can make tables ordered way want . can access, set, levels factor using using levels() function, levels argument factor() function . Maybe want tabulate letters, put vowels first: Note character string contains values don’t include levels, value show NA resulting factor, may see warnigns like “invalid factor level, NA generated.”","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/RPrimer.html"],"id":"data-frames","dir":"Articles","previous_headings":"Basic Data Structures","what":"Data frames","title":"An R primer for humdrumR users","text":"Data frames heart soul R. data.frame simply collection vectors length—ideal vectorized operations! vectors data.frame arranged columns two dimension table. Let’s make data frame, feeding vectors [data.frame()] function: Notice columns/vectors can different type, problem. Also notice, column name; can inspect names using colnames() function. change : Finally, ’s also possible assign column name want creating data frame: Remember, vectors data.frame must length. tried make data.frame vectors don’t match length, ’ll get error “arguments imply differing number rows.” one exception can call data.frame scalar single values, automatically recycled match length vectors.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/RPrimer.html"],"id":"with-and-within-you","dir":"Articles","previous_headings":"Basic Data Structures > Data frames","what":"With and Within You","title":"An R primer for humdrumR users","text":"often want access columns/vectors held data frame. can several ways. One approach $ operator, combined name column want. example, can get Letters column data frame made using df$Letters. Often, ’ll want write code uses bunch different columns data.frame—fact, main thing time R! avoid writing df$ , can use () function. () allows us drop “inside” data.frame, R commands can “see” columns variables:","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/RPrimer.html"],"id":"missing-data","dir":"Articles","previous_headings":"Basic Data Structures","what":"Missing Data","title":"An R primer for humdrumR users","text":"Sometimes ’ll encounter data points irrelevant, meaningless, “applicable.” cases, may relevant data “missing.” R provides two distinct ways represent missing/irrelevant data: NULL NA. NULL special R object/variable, used represent something totally missing empty. NULL length (length(NULL) == 0) value. indexed. Many functions give error passed NULL. NA quite different NULL. atomic vector can NA value () indices—fact, can vectors NA values. NA values still “values” vector, used indicate values missing problematic. Passing vector NA values functions lead error, though ’ll often get warning message instead. example, consider happens apply command .numeric() following strings: Four strings vector converted numbers without problem, string \"apple\" makes sense number. R ? converts three strings numbers, just like .numeric() supposed , \"apple\" string appears NA outut. also get warning message: NAs introduced coercion. might see warning sometimes, now know means! happen tried applying different function onto vector NA? sqrt() function problem taking square-roots three numbers, simply “propogates” NA value input output. “propogation” missing values useful feature R: makes sure keep track data missing, keeping vectors original lengths.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/RPrimer.html"],"id":"common-functions","dir":"Articles","previous_headings":"","what":"Common Functions","title":"An R primer for humdrumR users","text":"getwd() — Get R’s current working directory. setwd() — Set R’s working directory. summary() — Summarize contents R object.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/RPrimer.html"],"id":"vector-functions","dir":"Articles","previous_headings":"Common Functions","what":"Vector functions","title":"An R primer for humdrumR users","text":"set decreasing = TRUE decreasing order. rev() — Reverse order vector. rep() — Repeat vector. unique() — Returns unique values vector. x %% y — elements vector x appear vector y? length() — long vector (list())? Provide n argument natural number control \\(N\\).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/RPrimer.html"],"id":"sequences-and-indices","dir":"Articles","previous_headings":"Common Functions > Vector functions","what":"Sequences and Indices","title":"An R primer for humdrumR users","text":"example, 1:10 makes vector integers one ten. seq() — Create arbitrary sequences numbers. example, (c(TRUE, FALSE, TRUE)) returns c(1,3).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/RPrimer.html"],"id":"string-functions","dir":"Articles","previous_headings":"Common Functions","what":"String functions","title":"An R primer for humdrumR users","text":"paste() — Paste together multiple character strings. nchar() — Counts many characters string character vector.","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/RPrimer.html"],"id":"arithmetic","dir":"Articles","previous_headings":"Common Functions > Math","what":"Arithmetic","title":"An R primer for humdrumR users","text":"x + y — Addition; \\(x + y\\). x - y — Subtraction; \\(x - y\\). -x — Negation; \\(-x\\). x * y — Multiplication; \\(xy\\) Use parentheses things like x^(1/3); \\(x^{\\frac{1}{3}}\\). x / y — Real division; \\(\\frac{x}{y}\\). E.g., whole-number division remainder. E.g., remainder whole-number division. diff(c(5, 3)) 3 - 5.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/RPrimer.html"],"id":"other-math-functions","dir":"Articles","previous_headings":"Common Functions > Math","what":"Other Math functions","title":"An R primer for humdrumR users","text":"sqrt(x) — Square-root numbers; \\(\\sqrt{x}\\). abs(x) — Absolute value numbers; \\(|x|\\) round(x) — Round number nearest integer; \\(\\lfloor x \\rceil\\) log(x) — Log number (natural log default); \\(\\log(x)\\) sign(x) — Sign (1, -1, 0) x; \\(\\text{sgn}\\ x\\)","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/RPrimer.html"],"id":"distribution-and-tendency-functions","dir":"Articles","previous_headings":"Common Functions > Math","what":"Distribution and Tendency Functions","title":"An R primer for humdrumR users","text":"sum(x) — sum numeric vector. max(x) — maximum value numeric vector. min(x) — minimum value numeric vector. get size range, use diff(range(x)). mean(x) — arithmetic mean numeric vector. median(x) — median numeric vector. quantile(x) — distribution quantiles numeric vector.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/RPrimer.html"],"id":"randomization-functions","dir":"Articles","previous_headings":"Common Functions","what":"Randomization functions","title":"An R primer for humdrumR users","text":"sample() — Takes random sample vector. Can also used randomize order vector.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/RPrimer.html"],"id":"analysis-functions","dir":"Articles","previous_headings":"Common Functions","what":"Analysis Functions","title":"An R primer for humdrumR users","text":"using humdrum\\(_{\\mathbb{R}}\\), use similar [count()] instead!","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/RPrimer.html"],"id":"useful-tricks","dir":"Articles","previous_headings":"","what":"Useful tricks","title":"An R primer for humdrumR users","text":"sum((1:100) > 55) sum(letters %% c('', 'e', '', 'o', 'u')) mean((1:100) > 55) sum(letters %% c('', 'e', '', 'o', 'u'))","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/RPrimer.html"],"id":"making-your-own-functions","dir":"Articles","previous_headings":"","what":"Making your own functions","title":"An R primer for humdrumR users","text":"make function R, use function keyword, like : example, let’s make function subtracts mean vector numbers. ’ll one argument, ’ll call numbers. ’ve created function, assigned name myfunc, just like assignment. Let’s try : Notice last expression function definition value gets “returned” function. feeling lazy, can also define function using less keystrokes using command \\() instead function(). example,","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/RPrimer.html"],"id":"common-errors-and-warnings","dir":"Articles","previous_headings":"","what":"Common Errors and Warnings","title":"An R primer for humdrumR users","text":"TBA","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/ReadWrite.html"],"id":"reading-humdrum-data","dir":"Articles","previous_headings":"","what":"Reading humdrum data","title":"Reading and writing humdrum data","text":"readHumdrum() function gateway humdrum\\(_{\\mathbb{R}}\\): function use read humdrum data, encoded humdrum-syntax text files, R. following examples, make use small number raw humdrum data files included humdrum\\(_{\\mathbb{R}}\\). access files, need navigate directory computer installed humdrum\\(_{\\mathbb{R}}\\)—fortunately, humdrum\\(_{\\mathbb{R}}\\) records directory computer variable called humdrumRroot. load humdrum\\(_{\\mathbb{R}}\\) library, just need set R “working directory” location using setwd(). humdrum data stored subdirectory called “HumdrumData”—can look contents directory using dir(recursive = TRUE): can see, six directories containing total fifty-one files.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/ReadWrite.html"],"id":"targeting-files","dir":"Articles","previous_headings":"Reading humdrum data","what":"Targeting files","title":"Reading and writing humdrum data","text":"use readHumdrum() call function one () character-string arguments. (function documentation (?readHumdrum), ’ll see arguments called ...—R, ... means number arguments.) arguments interpreted regular expressions, matched directories files system. call “REpath-patterns,” short Regular Expression directory-path patterns. example, uses REpath-pattern \"HumdrumData/BachChorales/chor.*.krn\" match files ‘HumdrumData/BachChorales’ directory whose name matches regular expression chor.*.krn. can see, REpath-pattern includes directory paths (relative absolute)—using operating system’s appropriate delimiter (“\" windows,”/” everybody else)—pattern matching file paths. directory also treated regular expression, possibly matching multiple directories. Let’s break : humdrum\\(_{\\mathbb{R}}\\) splits REpath-pattern input string three parts: \"HumdrumData\", \"BachChorales\", \"chor.*.krn\", treats three regular expressions. first two expressions used match directories, last expression used match files. , readHumdrum('HumdrumData/BeethovenVariations/.*.krn') matches files “.krn” extension “BeethovenVariations” directories readHumdrum('HumdrumData/MozartVariations/.*.krn') matches files “MozartVariations” directories, command readHumdrum('HumdrumData/.*Variations/.*.krn') match kern files directories! careful: since directory/file name always treated like regular expression, can sometimes specify something general intend. instance, command readHumdrum('MyFolder/.*') match files folder called “MyFolder,” also match folders names “MyFolder_Also”, “ThisIsMyFolder.” want sure match exactly one one directory/file, use “^” “$” regular-expression markers explicitly mark beginning end pattern: command readHumdrum('^MyFolder$/.*') read files one directory “MyFolder.” read test files can enter: Note: Since humdrum\\(_{\\mathbb{R}}\\) can read files multiple directories , possible two files file name, different directories matched. happens, humdrum\\(_{\\mathbb{R}}\\) read files, identifies file enough directory path make sure can distinguish .","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/ReadWrite.html"],"id":"multi-argument-approach","dir":"Articles","previous_headings":"Reading humdrum data > Targeting files","what":"Multi-Argument Approach","title":"Reading and writing humdrum data","text":"Earlier mentioned can one RE-path patterns. one? Well, can divided RE-path patterns across multiple arguments (left right): Instead writing readHumdrum(\"HumdrumData/BachChorales/chor.*.krn\"), can write readHumdrum(\"HumdrumData\", \"BachChorales\", \"chor.*.krn\"). Thus two approaches identical. ’s advantage approach? ’ll see next section.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/ReadWrite.html"],"id":"multiple-patterns","dir":"Articles","previous_headings":"Reading humdrum data > Targeting files","what":"Multiple Patterns","title":"Reading and writing humdrum data","text":"Sometimes, expressing files want single regular expression possible. Luckily, readHumdrum() can accept many separate patterns want, just group vector. Instead writing readHumdrum('HumdrumData/.*Variations/.*.krn'), explicit write ’ve used c command create vector two REpath-patterns. However, lot (bug-prone) typing…combine multiple patterns Multi-Argument Approach ?: get result! work exactly? ’ve fed three arguments readHumdrum(). first last arguments (\"HumdrumData\" \".*.krn\") length one. However, middle argument (\"...Variations\") length two. readHumdrum() concatenates three arguments together, making two separate REpath-patterns: Note: possible write multiple patterns match () files. argument multipleInstances = FALSE, unique file read (first matching pattern). multipleInstances = TRUE, file(s) can read .","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/ReadWrite.html"],"id":"pattern-names","dir":"Articles","previous_headings":"Reading humdrum data > Targeting files > Multiple Patterns","what":"Pattern Names","title":"Reading and writing humdrum data","text":"Whenever specific one REpath-pattern, humdrum\\(_{\\mathbb{R}}\\) gives names can access Label field resulting humdrum\\(_{\\mathbb{R}}\\) data object. can choose labels giving names patterns multi-pattern vectors: Thus, write two separate patterns matched read names \"Rap\" \"Rock\" associated resulting Label field. feature useful working multiple heterogeneous datasets want able apply analyses/parsing one data subsets.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/ReadWrite.html"],"id":"contains","dir":"Articles","previous_headings":"Reading humdrum data > Targeting files","what":"Contains","title":"Reading and writing humdrum data","text":"Sometimes want read humdrum files contain particular data. instance, might want read files minor key. One option read files corpus filter files don’t want (see humdrumR filtering vignette learn . However, cases, can save lot time effort filter files want parsing . contains argument readHumdrum() can used just way! contains argument must character vector—character string treated regular expression, files contain matches regular expressions read. Thus, read pieces minor keys writing: (regular expression matches standard humdrum tandem interpretations minor keys.)","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/ReadWrite.html"],"id":"finding-files","dir":"Articles","previous_headings":"Reading humdrum data","what":"Finding Files","title":"Reading and writing humdrum data","text":"readHumdrum() interprets REpath-patterns finds files using helper function findHumdrum(). sure humdrum files , pattern want use find , might start using findHumdrum(). findHumdrum() takes input readHumdrum(), doesn’t fully parse input humdrum\\(_{\\mathbb{R}}\\). Instead, returns data.table containing matching filenames () raw file content. use verbose = TRUE option either findHumdrum() readHumdrum(), complete list matches files printed. useful check reading files intend read.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/ReadWrite.html"],"id":"validation","dir":"Articles","previous_headings":"Reading humdrum data > Finding Files","what":"Validation","title":"Reading and writing humdrum data","text":"findHumdrum(), extension readHumdrum(), smart functions ignore non-humdrum files matched pattern. Non-text files (like .pdf .jpg) ignored. Whats , text files fail conform humdrum syntax read either. see message checks files “valid humdrum,” tell many () text files read. trying read file think valid humdrum readHumdrum() won’t read , use validateHumdrum() see detailed report problem. Humdrum\\(_{\\mathbb{R}}\\) won’t read files humdrum-syntax violations, even relatively minor ones. see problems validateHumdrum() finding data, ’ll need fix can use humdrum\\(_{\\mathbb{R}}\\) data. Check [validateHumdrum][reference/validateHumdrum.html] documentation learn humdrum\\(_{\\mathbb{R}}\\)’s data validation tools, can used identify errors humdrum data. Note validateHumdrum() automatically check humdrum data encoded correctly makes sense, just structurally sound, accordance humdrum syntax.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/ReadWrite.html"],"id":"reading-files","dir":"Articles","previous_headings":"Reading humdrum data","what":"Reading files","title":"Reading and writing humdrum data","text":", actually happens run readHumdrum()? now, ’ve seen readHumdrum() prints messages describing process. First, files match search patterns () identified, text read R. Next, files checked see valid humdrum files. files parsed—.e., translated humdrum\\(_{\\mathbb{R}}\\)’s data.table backend. step takes longest far, includes parsing humdrum files’ data tokens, interpretations, reference records, (worst ) spine paths. Indeed, reading humdrum data spine paths take significantly longer reading pathless data. save time, can potentially use tandems reference arguments (see “Parsing Metadata” ).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/ReadWrite.html"],"id":"parsing-metadata","dir":"Articles","previous_headings":"Reading humdrum data","what":"Parsing Metadata","title":"Reading and writing humdrum data","text":"default, humdrum\\(_{\\mathbb{R}}\\) parses metadata humdrum files reads. includes true global metadata files, encoded humdrum reference records, well local tandem interpretations.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/ReadWrite.html"],"id":"reference-records","dir":"Articles","previous_headings":"Reading humdrum data > Parsing Metadata","what":"Reference Records","title":"Reading and writing humdrum data","text":"default, humdrum\\(_{\\mathbb{R}}\\) parses reference records files reads, creating unique field reference key. (one instance given key, combined string separated semicolons.) lot unique reference keys dataset, can end taking lot memory humdrum table. cases, might find useful limit readHumdrum() parsing reference records actually going use. can accomplished quite easily reference argument. reference argument defaults \"\", means reference records parsed. However, reference can also character vector reference codes. Thus, parse COM reference record piece. can use rename reference fields like—case, COM reference records parsed saved field called Composer instead COM. don’t want parse reference records, specify reference = NULL.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/ReadWrite.html"],"id":"tandem-interpretations","dir":"Articles","previous_headings":"Reading humdrum data > Parsing Metadata","what":"Tandem Interpretations","title":"Reading and writing humdrum data","text":"Tandem interpretations used humdrum data represent “local,” real-time metainformation associated specific spines—review humdrum syntax vignette details. Humdrum\\(_{\\mathbb{R}}\\) can read arbitrary tandem interpretations humdrum data. However, non-standard interpretations used, humdrum\\(_{\\mathbb{R}}\\) way knowing parse . default, humdrum\\(_{\\mathbb{R}}\\) always reads tandem interpretations field called Tandem. field tabulates tandem interpretations far appeared spine order, concatenating single comma-delimited, recent distant. instance, Tandem field spine parsed , interpretations pile longer longer string piece progresses. Notice \"D:\" \"C:\" interpretations get piled separately, just like interpretation, even though tandem class, \"D:\" supersede \"C:\". ? Well, general way know arbitrary tandem interpretations class. create humdrum data new interpretations , humdrum\\(_{\\mathbb{R}}\\) doesn’t know parse , just pile like Tandem field. Fortunately, humdrum\\(_{\\mathbb{R}}\\) know parse many standard tandem interpretations. run command see currently ten classes tandem interpretations humdrumR recognizes, associated regular expression. Thus, really apply readHumdrum() file recognize tokens \"C:\" \"D:\" match known regular expression Key tandem interpretation, parse field called Key, look like: Likewise, ’d get TimeSignature BPM fields.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/ReadWrite.html"],"id":"custom-tandems","dir":"Articles","previous_headings":"Reading humdrum data > Parsing Metadata > Tandem Interpretations","what":"Custom Tandems","title":"Reading and writing humdrum data","text":"readHumdrum() tandems argument allows us take control tandem interpretation parsing process. tandems character vector, defaulting known, parses known interpretations fields (following knownInterpretations table). can use tandems two ways. 1.) can remove \"known\" vector specify Name specific tandem interpretations want parse. instance, write tandem = \"Clef\", Clef pattern knownInterpretations table parsed, (others). 2.) character string tandems \"known\" exact match Name knownInterpretations, instead treated regular expression match new tandem interpretation class. instance, tandems = \"[Aa]pple|[Bb]anana\" match “*Apple”, “*apple”, “*Banana”, “*banana,” parsing four patterns field (called [Aa]pple|[Bb]anana]). give field name writing tandems = c(Fruit = \"[Aa]pple|[Bb]anana\"). (fact, can rename known interpretations well, instance writing tandems = c(Meter = \"TimeSignature\".) tandems = NULL, tandem interpretations parsed —can used shorten parsing time.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/ReadWrite.html"],"id":"writing-humdrum-data","dir":"Articles","previous_headings":"","what":"Writing humdrum data","title":"Reading and writing humdrum data","text":"complement readHumdrum() , course, writeHumdrum(), takes humdrum\\(_{\\mathbb{R}}\\) data object writes new data files. content files exactly match shown “humdrum” view, print humdrum\\(_{\\mathbb{R}}\\), whatever fields selected written files. question, , files writes . writeHumdrum() takes original file names (directories) data read starting point determining output file names. default, simply take original file name adds prefix “humdrumR_” beginning file name. writeHumdrum() bunch arguments (prefix, affix, renamer, extension) can used modify output file names—see writeHumdrum details. directory argument can, course, used change output directory files written . Let’s say ’d like write chorales data, scale degree data . ’ll name files adding affix “_modified,” setting extension “.deg” instead “.kern.” results files (original directory) names chor001_modified.deg, chor002_modified.deg, etc.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/ReadWrite.html"],"id":"overwriting","dir":"Articles","previous_headings":"Writing humdrum data","what":"Overwriting","title":"Reading and writing humdrum data","text":"Generally, overwriting original humdrum data probably bad idea (make sure back data!), writeHumdrum() generates totally new files default. avoid accidental overwrites, writeHumdrum() never overwrite files long overwrite argument FALSE—default. Even specify overwrite = TRUE, writeHumdrum() ask confirm proceeding.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/ReadWrite.html"],"id":"emd","dir":"Articles","previous_headings":"Writing humdrum data","what":"!!!EMD","title":"Reading and writing humdrum data","text":"!!!EMD: humdrum reference code, meaning “Document modification description.” code used keep track modifications humdrum datasets. Humdrum\\(_{\\mathbb{R}}\\) , default, insert !!!EMD record files writes, saying: “Edited using humdrumR, version 0.7.0.5 (current data/time.”","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/Reshaping.html"],"id":"filtering-data","dir":"Articles","previous_headings":"","what":"Filtering Data","title":"Shaping humdrum data","text":"first step often simply remove data don’t need. article, ’ll show common, basic, ways might filter data. details humdrum\\(_{\\mathbb{R}}\\) filtering functionality, check data filtering article.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/Reshaping.html"],"id":"indexing","dir":"Articles","previous_headings":"Filtering Data","what":"Indexing","title":"Shaping humdrum data","text":"example, studying tonality, might simply want ignore lyric data. easiest way index spines don’t want, either using numeric indices (probably better) exclusive interpretation:","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/Reshaping.html"],"id":"parsing-token","dir":"Articles","previous_headings":"Filtering Data","what":"Parsing Token","title":"Shaping humdrum data","text":"file, **kern spines example file include rhythmic data (**recip) pitch data. “just” studying tonality, extract pitch information Token field, save new field. example, can use kern() function extract pitch information Token, put new field, ’ll call Pitch. now isolated pitch information, can analyze . (course, rhythm information still present, original Token field.)","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/Reshaping.html"],"id":"other-filtering","dir":"Articles","previous_headings":"Filtering Data","what":"Other filtering","title":"Shaping humdrum data","text":"course, many filtering options might want , depending research goals. Perhaps want study pieces/passages flat keys, works particular time period, etc. common example limiting rhythmic analyses music 4/4 time, perhaps ignoring pickup notes. TimeSignature field indicates time signature, Bar field can used indicator pickups beginning pieces, marked Bar == 0. example (using Bach chorale data):","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/Reshaping.html"],"id":"splittingseparating-data","dir":"Articles","previous_headings":"","what":"Splitting/Separating Data","title":"Shaping humdrum data","text":"Humdrum data often packs multiple pieces information compact, concise, readable tokens. classic example, course, **kern often includes rhythm, pitch, phrasing, beaming, pitch ornamentation information! tokens great reading/writing, analyzing, typically want separate information want.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/Reshaping.html"],"id":"isolating-pitch-and-rhythm","dir":"Articles","previous_headings":"Splitting/Separating Data","what":"Isolating Pitch and Rhythm","title":"Shaping humdrum data","text":"’ve seen, **kern spines example file include rhythmic data (**recip) pitch data. cases, might want access pieces information, separately. can separate applying different functions Token field, saving output new fields. example, Hey, printout kind looks …look bottom ’ll see now separte Pitch Rhythm fields. Since fields automatically selected mutate(), seeing . , example, select one field, run commands using . example, tabulate pitches wherever rhythmic duration quarter note: possible separated information originally “pasted” together **kern tokens.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/Reshaping.html"],"id":"rend","dir":"Articles","previous_headings":"Splitting/Separating Data","what":"Rend","title":"Shaping humdrum data","text":"actually want move rhythm pitch information separate spines—.e., rows humdrum table? Use rend():","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/Reshaping.html"],"id":"cleave-pastingaligning","dir":"Articles","previous_headings":"","what":"Cleave (Pasting/Aligning)","title":"Shaping humdrum data","text":"next step might align/combine information currently separated. many humdrum\\(_{\\mathbb{R}}\\) datasets, multiple pieces information spread across multiple spines, cases, across spine paths stops. , given research question, need think multiple pieces information describing single data point, ’ll need reshape data. example, example file **silbe (lyric) spines associate syllable exactly one note adjacent **kern spines. Currently, default, **kern token **silbe token , separate row humdrum table. want row. humdrum syntax view, means moving **silbe data location **kern tokens.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/Reshaping.html"],"id":"cleaving-spines","dir":"Articles","previous_headings":"Cleave (Pasting/Aligning)","what":"Cleaving Spines","title":"Shaping humdrum data","text":"take separate spines—like **kern **silbe—paste together, use cleave(); “cleave together.” Simply run cleave, tell spines cleave together. example file, 1st 3rd spines **kern 2nd 4th spines **silbe, can tell cleave cleave together 1:2 3:4: example, want align notes **kern spines syllables **silbe spine. can directly using cleave(): use fold argument indicate spine fold, onto argument indicate spine move onto. worked! 1st 3rd spines dissappeared, content now 1st 3rd spines. notice cleave put data new field, called Spine2|4. can improve name using newFields argument: , wait, **kern **sible data go exactly? Well, since **kern spines first spines indicated cleave(), data stays original Token field. spines—case **sible data—put new field(s). See: Notice fifth spine, wasn’t part cleave, also left untouched Token field. datasets, might different numbers **kern/**silbe spines different files within dataset. cases, much smarter pass cleave() names exclusive intepretations want cleave. get result got manually : want study note combinations formed two **kern spines? , hard tokens spine rows. However, cleave() together two kern spines! (’ll also isolate just **kern spines .)","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/Reshaping.html"],"id":"multi-cleaving","dir":"Articles","previous_headings":"Cleave (Pasting/Aligning) > Cleaving Spines","what":"Multi-cleaving","title":"Shaping humdrum data","text":"**harm spine data. Unlike **silbe spines, **harm spine “paired ” **kern spines. Rather, **harm actually describes happening entire record data. chords indicated spine associated pitches , either, **kern spines. Luckily, cleave() handle : Data **harm spine copied twice new field “top ” **kern spines!","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/Reshaping.html"],"id":"cleaving-stops-and-paths","dir":"Articles","previous_headings":"Cleave (Pasting/Aligning)","what":"Cleaving Stops and Paths","title":"Shaping humdrum data","text":"Though spines common structure humdrum data might need “cleave” together, can also cleave structures. course, depends questions trying ask data!","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/Reshaping.html"],"id":"multi-stops","dir":"Articles","previous_headings":"Cleave (Pasting/Aligning) > Cleaving Stops and Paths","what":"Multi-Stops","title":"Shaping humdrum data","text":"Consider example, multi-stop chords **kern spine: default, humdrum\\(_{\\mathbb{R}}\\) treats token (note) stop separate data observation, row humdrum table. studying harmony, might want align stops “top” , different fields. , can cleave stops together, putting field! first stop (Stop == 1) left Token field, get new Stop2 Stop3 fields holding stops!","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/Reshaping.html"],"id":"spine-paths","dir":"Articles","previous_headings":"Cleave (Pasting/Aligning) > Cleaving Stops and Paths","what":"Spine Paths","title":"Shaping humdrum data","text":"working spine paths, often less obvious interpret different paths terms data observations, want cleave , can. Don’t forget Path numbered starting 0.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/RhythmAndMeter.html"],"id":"durations","dir":"Articles","previous_headings":"","what":"Durations","title":"Time, rhythm, and meter in humdrumR","text":"fundamental unit rhythm “duration”—span time. Humdrum\\(_{\\mathbb{R}}\\) defines suite rhythm functions, notably recip() duration(). functions work essentially way: take input argument output rhythm (duration) information particular format. example, Notice functions recognize rhythm part input tokens, ignoring non-rhythm (pitch) information. want keep non-rhythm part tokens, use inPlace argument: cool thing functions can read function’s output. can things like: complete list basic rhythm (duration) functions : recip (reciprocal note values) notehead (traditional note-value symbols) duration (Whole notes) quarters (quarter notes/crotchets) dur (durations time) seconds ms (milliseconds)","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/RhythmAndMeter.html"],"id":"documentation","dir":"Articles","previous_headings":"Durations","what":"Documentation","title":"Time, rhythm, and meter in humdrumR","text":"global documentation rhythm functions can seen calling ?rhythmFunctions. can also call documentation individual function, like ?recip.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/RhythmAndMeter.html"],"id":"rhythm-arguments","dir":"Articles","previous_headings":"Durations","what":"Rhythm Arguments","title":"Time, rhythm, and meter in humdrumR","text":"rhythm functions previous section shared arguments understand: scale unit.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/RhythmAndMeter.html"],"id":"scale-and-unit","dir":"Articles","previous_headings":"Durations","what":"Scale and Unit","title":"Time, rhythm, and meter in humdrumR","text":"scale unit arguments conceptually different, can used achieve similar transformations, can easy confuse . scale argument easiest understand: simply (re)scales output duration function. like augment durations? Perhaps doubling length? Simply specify scale = 2. maybe ’d like diminish durations, cutting thirds? Unlike scale, controls output scale, unit controls input scale. useful numeric values. mean “controls input scale”? Imagine bunch duration values numbers, like c(1, 1.5, 2, 1, 0.5, 1). unit numbers counting? default, humdrum\\(_{\\mathbb{R}}\\) treats whole notes, 0.5 half note, right? However, might prefer think numbers units quarter notes—common approach. unit argument . argument rhythm parser/interpreter, must pass unit parseArgs argument, must named list values: can see, can achieve difference output using scale argument (scale = 1/4), unit argument little bit different way thinking .","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/RhythmAndMeter.html"],"id":"ioi","dir":"Articles","previous_headings":"Durations > Special Cases","what":"IOI","title":"Time, rhythm, and meter in humdrumR","text":"**kern data, durations correspond rests music, rather notes, indicated \"r\". many analyses, want ignore rests just consider durations (timespans) notes, ignoring presence rests. called inter-onset-intervals, IOIs. ioi() function can used convert duration data includes rests, IOIs. example: ? duration rest append duration previous non-rest (). first 8g becomes 4g 4d# becomes 4.d#. Rests replaced null tokens (\".\"). last note even NA, onsets create inter-onset-interval. last step makes conceptual sense, may want! Maybe ’d like interval last onset end data? , specify finalOnset = TRUE: used call () within(), ioi() automatically applied within Files/Spines/Paths.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/RhythmAndMeter.html"],"id":"ties","dir":"Articles","previous_headings":"Durations > Special Cases","what":"Ties","title":"Time, rhythm, and meter in humdrumR","text":"similar case inter-onset-intervals ties. **kern, [, _, ] tokens used indicate groups durations actually played single, longer duration. sumTies() function automatically sum durations tied notes: tie tokens removed, tied-notes replaced null tokens (\".\").","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/RhythmAndMeter.html"],"id":"timeline","dir":"Articles","previous_headings":"","what":"Timeline","title":"Time, rhythm, and meter in humdrumR","text":"Traditional musical scores, humdrum data, encode rhythmic information duration, like worked previous section. However, often want think musical events happening, relative fixed reference: usually, relative beginning piece. can compute timeline sequences duration values, using timeline() function. Let’s say melody like: Let’s look timeline melody: first note (4c) occurs zero (beginning) timeline; last note (2c) lands 3.5 whole-notes later; etc. combine call semits() (check [Pitch Tonality][PitchAndTonality.html] guide) can even make plot melody: timeline() function extra special functionality working actual humdrum datasets. automatically (unless told ) calculate timelines separately within File/Spine/Path dataset, ignoring multiple stops. example: get separate timeline spine piece. Note: timeline() ignores multi-stops. spine paths data, look expandPaths options.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/RhythmAndMeter.html"],"id":"controlling-the-start","dir":"Articles","previous_headings":"Timeline","what":"Controlling the Start","title":"Time, rhythm, and meter in humdrumR","text":"’ll notice timelines start zero, makes sense course. cases, might want timeline start different value. example, “Row Row Row Boat” round, ’d want second entrance round start second measure. can start argument timeline:","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/RhythmAndMeter.html"],"id":"pickups","dir":"Articles","previous_headings":"Timeline > Controlling the Start","what":"Pickups","title":"Time, rhythm, and meter in humdrumR","text":"pickup argument gives us another option control timeline starts. many datasets, first events music anacrusis “pick ”; ’d generally like timeline start pickup. make happen, pickup argument can passed logical vector length input (x): TRUE values beginning vector considered pickup; Thus, first FALSE value pickup vector chosen start th timeline. example, let’s say melody first two notes pickup. Since can see pickup duration .25 (quarter-note), use start argument : Now 0 downbeat, events start negative timeline! logical pickup argument, : might seem less intuitive! However, approach can useful working actual humdrumR datasets. many humdrum datasets, pickup measures indicated barlines labeled =0 =-. humdrum\\(_{\\mathbb{R}}\\) reads file, counts barlines creates field called Bar, numbers pickup measures zero (negative numbers, one). means pickups Bar < 1. , Bach chorales: Now 0 timelines corresponds first downbeat spine, file. key advantage work even different pieces corpus pickups different lengths, even pickup.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/RhythmAndMeter.html"],"id":"timestamp","dir":"Articles","previous_headings":"Timeline > Controlling the Start","what":"Timestamp","title":"Time, rhythm, and meter in humdrumR","text":"timestamp() function special variant timeline() outputs timeline clock-time, using dur() format. order timestamp() needs know tempo: default, humdrum\\(_{\\mathbb{R}}\\) pass BPM field humdrum data (one) timestamp(). BPM argument provided, default 60 beats-per-minute.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/RhythmAndMeter.html"],"id":"counting-beats","dir":"Articles","previous_headings":"","what":"Counting Beats","title":"Time, rhythm, and meter in humdrumR","text":"Ok, timeline() gives us timeline whole-note units, giving fractional (decimal) output. Often music, want know many beats elapsed given time, rather exact time position. , use timecount(), unit argument. default unit whole-note, timecount() count whole note : Let’s try quarter-notes instead: timecount() even work irregular beat patterns, must entered list. example, meter 7/8 often played three beats, last beat longer first two: pattern line 4 4 4.. timecount() can count irregular beats! handy counting subdivisions swing time!","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/RhythmAndMeter.html"],"id":"subposition","dir":"Articles","previous_headings":"Counting Beats","what":"Subposition","title":"Time, rhythm, and meter in humdrumR","text":"counterpart timecount() subpos(). count beats, notes don’t actually land beat, somewhere “inside” beat—words, beats. subpos() tell us far beat attack ; unit whole-notes, unless pass scale argument change scale. Let’s look last examples , using subpos():","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/RhythmAndMeter.html"],"id":"meter","dir":"Articles","previous_headings":"","what":"Meter","title":"Time, rhythm, and meter in humdrumR","text":"timecount() subpos() commands great want count single beat/measure unit. take things next level(s), need consider musical meter. point view humdrum\\(_{\\mathbb{R}}\\), “meter” set multiple “beat levels” occurring time (parallel), “lower” (faster/shorter) levels nested inside “higher” (slower/longer) levels. R Hm defines number useful tools applying metric analyses rhythmic data.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/RhythmAndMeter.html"],"id":"metric-levels","dir":"Articles","previous_headings":"Meter","what":"Metric levels","title":"Time, rhythm, and meter in humdrumR","text":"first thing might want , take sequence rhythm durations identify metric level onset lands . , use metlev(): default, metlev() assuming duple meter us—basically 4/4 time—eight eighth-notes make one measure 4/4. first onset lands downbeat, coinciding highest level meter (defined default)—highest level beat whole-note, output \"1\" (**recip notation whole-note). Every odd eighth-note falls eighth-note beat level, labeled \"8\". 4/4 beats 2 4 (back beats) fall quarter-note level, labeled \"4\". Finally, beat 3 half-note level (\"2\"). prefer levels simply numbered highest lowest, use metlev(..., value = FALSE): whole-note level 1 (case) eighth-note level 4.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/RhythmAndMeter.html"],"id":"metric-position","dir":"Articles","previous_headings":"Meter","what":"Metric position","title":"Time, rhythm, and meter in humdrumR","text":"Along metlev(), humdrum\\(_{\\mathbb{R}}\\) provides complementary functions called metcount(), metsubpos(). might guess, metric parallels timecount() subpos(). metcount() function counts beats particular beat level (level argument) within highest level meter. metsubpos() function calculates rhythm offset onset nearest beat meter.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/RhythmAndMeter.html"],"id":"controlling-meter","dir":"Articles","previous_headings":"Meter","what":"Controlling meter","title":"Time, rhythm, and meter in humdrumR","text":"can control meter used metlev() using meter argument. simplest thing pass meter humdrum time-signature interpretation:","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/Summary.html"],"id":"know-your-data","dir":"Articles","previous_headings":"","what":"Know your data","title":"Getting to know your humdrum data","text":"data analysis, know data. ’s data? much data ? formatted encoded? errors ambiguities? sampled? can’t answer questions, can’t make intelligent useful scholarly inferences using data. ’ve done background research read details data working , hopefully answering questions posed , one step really start analysis: inspect () data. fact humdrum syntax human readable one great strengths humdrum ecosystem! Open data files text-editor, perhaps drop Verovio Humdrum Viewer. course, can look much data “eye”—still, good practice inspect much data can, selecting files random skimming see look way think look.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/Summary.html"],"id":"data-summaries","dir":"Articles","previous_headings":"Know your data","what":"Data summaries","title":"Getting to know your humdrum data","text":"data read, next step use humdrum\\(_{\\mathbb{R}}\\) get high-level summaries content files data. Humdrum\\(_{\\mathbb{R}}\\) defines number tools quickly summarize structure content humdrum data set. One basic functions R summary(); Calling summary() humdrumR object print concise version output humdrum\\(_{\\mathbb{R}}\\)’s five summary functions, described detail . Let’s load built-Bach-chorale dataset, ’ll use throughout article, call summary(): lot information, huh? rest article walk output specific functions generate .","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/Summary.html"],"id":"summarizing-structure","dir":"Articles","previous_headings":"","what":"Summarizing Structure","title":"Getting to know your humdrum data","text":"basic information ’ll want humdrum dataset “big” —much data ? Printing humdrumR object command line always tell many files data: can also call length() get number. census() function, however, gives us much detail size data, telling us many records, tokens, characters : corpus contains, total, 9,486 2,610. (unique) column tells us many unique Tokens per file (overall, bottom). (per token) column indicates average number characters file, overall. Notice census() defaults counting records/tokens. want count data tokens, specify census(chorales, dataTypes = 'D').","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/Summary.html"],"id":"spines-and-interpretations","dir":"Articles","previous_headings":"Summarizing Structure","what":"Spines and Interpretations","title":"Getting to know your humdrum data","text":"work humdrum data, really need know many spines (spine paths) present data, interpretations present. spines() interpretations() functions give us just information! toy dataset 10 chorales, output spines() pretty boring: chorales four spines, spine paths. interpretations() output also boring, see 10 files four **kern exclusive interpretations; However, interpretations() also tells tandem interpretations recognizes—case, tempo, key, instrument, time signature information. chorales dataset structurally homogeneous, generally good thing—’s much easier analyze sort data! However, humdrum datasets heterogeneous, spines() interpretations() come handy. Let’s switch another one pre-packaged corpora, Beethoven/Mozart variations (see read/write): Now see something interesting. , files four spines, eleven files include spine paths (\"9 1 path\" \"2 2 paths\"). Let’s check output interpretations(): Ah, time see file **function **harm spine, well two **kern spines. fact, “Tallies” bottom tells us 20 files exclusive interpretations (order), humdrum\\(_{\\mathbb{R}}\\) labels {}: **function, **harm, **kern, **kern.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/Summary.html"],"id":"summarizing-metadata","dir":"Articles","previous_headings":"","what":"Summarizing Metadata","title":"Getting to know your humdrum data","text":"Another question ask dataset kind meta data encoded data’s reference records. function reference() answers question us: see ten chorale files , example COM CDT reference records, two OTL@@EN record. sure codes mean? can also call reference() character-string reference code: see actual reference records , can index result call reference() column row. example, see ODT@@DE records: see reference records third file:","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/Summary.html"],"id":"summarizing-data","dir":"Articles","previous_headings":"","what":"Summarizing Data","title":"Getting to know your humdrum data","text":"next thing , getting started humdrum\\(_{\\mathbb{R}}\\) data analysis, get sense data content . tokens data actually contain? R’s unique(), count(), sort() functions perfect . ’ll need use techniques Data Fields article, review don’t understand following! Let’s get unique values, sorted: Unlike unique(), count() count unique value, can sort see common tokens: Now get sense content dataset—case, lot different (unique) tokens!","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/articles/Summary.html"],"id":"digging-into-details","dir":"Articles","previous_headings":"Summarizing Data","what":"Digging into Details","title":"Getting to know your humdrum data","text":"point ’re starting get better picture content dataset. don’t get hasty—’s good idea dig little get confident really know data. call interpretations() told us expect **kern data, representing musical “notes” (pitch rhythm). probably expected see things like 4. (dotted quarter note) f# (F sharp middle-C). X 4dnX? Js Ls ;s? can look **kern definition, point , probably didn’t know took look! might think know ’s data…get unpleasantly surprised. especially true less mature (newer) datasets, DEFINITELY CONTAIN ERRORS. see lot ; tokens output. look , ’ll learn “pause signs”, used represent fermatas. many tokens fermatas? Let’s use %~% operator, allows us search matches (regular expression) pattern vector. case, want search \";\" Token. %~% returns logical value (TRUE FALSE), can sum() get count TRUEs: 256 ; tokens data. use within() (mutate()) instead (get rid sum()), can see fermatas appear: Ah, see fermatas tend happen time across four spines. Good know!","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/authors.html"],"dir":"","previous_headings":"","what":"Authors","title":"Authors and Citation","text":"Nathaniel Condit-Schultz. Author, maintainer. Claire Arthur. Author.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/authors.html"],"id":"citation","dir":"","previous_headings":"","what":"Citation","title":"Authors and Citation","text":"Condit-Schultz N, Arthur C (2019). “humdrumR: New Take Old Approach Computational Musicology.” Proceedings International Society Music Information Retrieval, 715–722. doi:10.5281/zenodo.3527910, https://github.com/Computational-Cognitive-Musicology-Lab/humdrumR.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/index.html"],"id":"humdrum_mathbbr","dir":"","previous_headings":"","what":"humdrumR","title":"humdrumR","text":"Welcome main website humdrumℝ!","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/index.html"],"id":"what-is-humdrum_mathbbr","dir":"","previous_headings":"","what":"What is humdrumℝ?","title":"humdrumR","text":"Humdrumℝ R package: “library” preexisting code R programming language. Humdrumℝ code provides tools visualization, manipulation, analysis data formatted humdrum syntax. Note: name package pronounced hum-drum-ARRRRR, last syllable emphasized pirate fashion. name always typeset hμmℝΔrμm. Failure pronounce typeset hμmℝΔrμm correctly void warranty.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/index.html"],"id":"what-is-humdrum","dir":"","previous_headings":"What is humdrumℝ?","what":"What is humdrum?","title":"humdrumR","text":"Humdrum system computational musicology developed David Huron. Humdrum “ecosystem” includes two main parts: data format called humdrum syntax musicological software system called humdrum toolkit. Another key component ecosystem Verovio Humdrum Viewer, great way get view edit humdrum data. Humdrumℝ complement original humdrum toolkit, leveraging power R give us unprecedented power manipulate analyze humdrum data using concise, expressive syntax. Humdrumℝ mainly used manipulate analyze data encoded humdrum syntax /humdrum interpretations like **kern. humdrum syntax incredibly flexible, powerful, scheme encoding musical data. Tens thousands musical scores (musical data) encoded humdrum syntax, many available online repositories KernScores. humdrum syntax vignette gives detailed introduction data format.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/index.html"],"id":"what-is-r","dir":"","previous_headings":"What is humdrumℝ?","what":"What is R?","title":"humdrumR","text":"R programming language, designed ground statistical computing data analysis. R many features make ideal data analysis, particularly research analysis background programming. R primer introduces core concepts R programming.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/index.html"],"id":"what-can-humdrum_mathbbr-do","dir":"","previous_headings":"","what":"What can humdrumℝ do?","title":"humdrumR","text":"Humdrumℝ provides number tools working humdrum data generally, musicological analysis. Humdrumℝ seven main things:","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/index.html"],"id":"represent-humdrum-data-in-r","dir":"","previous_headings":"What can humdrumℝ do?","what":"Represent humdrum data in R","title":"humdrumR","text":"represent humdrum data R, humdrumℝ defines special data type—humdrumR class—call “humdrumR objects” throughout documentation. important part humdrumR object “humdrum table” contains. can read humdrum-syntax data represented getting started humdrumR vignette. details, read humdrumR class humdrum table; humdrumℝ installed loaded, can read directly R session typing ?humdrumR-class ?humTable.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/index.html"],"id":"read-and-write-humdrum-data","dir":"","previous_headings":"What can humdrumℝ do?","what":"Read and write humdrum data","title":"humdrumR","text":"create humdrumR data objects, humdrumℝ includes humdrum data parser, finds humdrum data local machine, reads R, creates humdrumR object data. Reading writing data vignette best place realm works. can get details readHumdrum() writeHumdrum() documentation; humdrumℝ installed loaded, can read directly R session typing ?readHumdrum ?writeHumdrum.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/index.html"],"id":"reshape-humdrum-data","dir":"","previous_headings":"What can humdrumℝ do?","what":"“Reshape” humdrum data","title":"humdrumR","text":"’ve imported humdrum data R, next step often organize prepare data. ’ll often want pick specific subsets data, rearrange data representations easier work . Humdrumℝ gives us number powerful tools “shaping data”: Shaping humdrum data Filtering humdrum data vignettes best places learn processes. can find details sub-setting data subset.humdrumR() indexHumdrum documentation; humdrumℝ installed loaded, can read directly R session typing ?subset.humdrumR ?indexHumdrum.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/index.html"],"id":"analyze-humdrum-data","dir":"","previous_headings":"What can humdrumℝ do?","what":"Analyze humdrum data","title":"humdrumR","text":"Humdrumℝ makes easy manipulate, modify, analyze humdrum data. Working humdrum data vignette gives overview functionality. can find details withinHumdrum documentation; humdrumℝ installed loaded, can read directly R session typing ?withinHumdrum.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/index.html"],"id":"manipulate-musical-pitch-information","dir":"","previous_headings":"What can humdrumℝ do?","what":"Manipulate (musical) pitch information","title":"humdrumR","text":"Humdrumℝ defines tools manipulating numerous representations pitch tonality, including diatonic keys tertian harmonies. Pitch tonality vignette explains work pitch data humdrumℝ. can find details humdrumPitch documentation; humdrumℝ installed loaded, can read directly R session typing ?humdrumPitch.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/index.html"],"id":"manipulate-musical-rhythm-information","dir":"","previous_headings":"What can humdrumℝ do?","what":"Manipulate (musical) rhythm information","title":"humdrumR","text":"Humdrumℝ defines tools manipulating numerous representations rhythm, timing, meter. Rhythm meter vignette explains work rhythmic information humdrumℝ. can find details humdrumRhythm documentation; humdrumℝ installed loaded, can read directly R session typing ?humdrumRhythm.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/index.html"],"id":"develop-new-humdrum-tools","dir":"","previous_headings":"What can humdrumℝ do?","what":"Develop new humdrum tools","title":"humdrumR","text":"facilitate development new functions work humdrum tokens—simple character strings packed information—, Humdrumℝ provides several useful development tools, including struct data type useful API call regular-expression dispatch system, makes easy dispatch different methods based matches regular expressions.","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/index.html"],"id":"installing-r","dir":"","previous_headings":"Installing humdrumℝ","what":"Installing R","title":"humdrumR","text":"use humdrumℝ, ’ll first need install R, version 4.1 later. highly recommend install Integrated Development Environment RStudio well! link—Installing R RStudio—good starting place.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/index.html"],"id":"installing-humdrum_mathbbr-1","dir":"","previous_headings":"Installing humdrumℝ","what":"Installing humdrumℝ","title":"humdrumR","text":"Humdrumℝ yet available standard R package repository, CRAN, (now) can installed github repository. install latest version (master branch) humdrumℝ, ’ll first need install R package devtools—devtools used creating maintaining R packages. Luckily, devtools CRAN, open R session machine type: successfully installed devtools, now ready use install humdrumℝ straight github. R session, type:","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/index.html"],"id":"humdrum_mathbbr-source","dir":"","previous_headings":"Installing humdrumℝ > Installing humdrumℝ","what":"Humdrumℝ source","title":"humdrumR","text":"Another option—useful, want inspect, contribute , humdrumℝ source code—actually download humdrumℝ package source github install directly. ’ll first need install git. git installed computer, can download humdrumℝ repository clicking “Clone download” github page. Alternatively, can use git directly: navigate directory machine ’d like save package source type: ’ve done , can install source computer using devtools: Open R session use setwd move working directory inside repository just downloaded (.e., cloned). , type downloaded RStudio, can make humdrumℝ RStudio “Project” local computer, enables useful features. RStudio, click “New Project > Existing Directory” option select directory downloaded repository. project created, can install local copy humdrumℝ clicking “Install Restart” RStudio’s “Build” pane. ’ve completed installation humdrumℝ can used simply calling:","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/index.html"],"id":"updating-humdrum_mathbbr","dir":"","previous_headings":"Installing humdrumℝ","what":"Updating humdrumℝ","title":"humdrumR","text":"Humdrumℝ active development, new features added, documentation updated, bugs fixed weekly basis. recommend keep date newest version humdrumℝ. Luckily, can easily update latest version simply running devtools::install_github() command R session. However, already loaded humdrumRℝ library R session—using library(humdrumR)—’ll need “detach” old version new version work. can either 1) quitting R studio opening , 2) going RStudio’s package panel unchecking humdrumR, 3) running command detach(\"package:humdrumR\", unload = TRUE). installed humdrumℝ source using git clone command, can’t simply run clone . Instead, navigate package directory run git pull origin main. “pull” latest changes local machine. can rerun devtools::install().","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/index.html"],"id":"learning-humdrum_mathbbr","dir":"","previous_headings":"","what":"Learning humdrumℝ","title":"humdrumR","text":"learn use humdrumℝ “Articles” list top page best place start—particular, Getting started humdrumR article! Documentation specific functions general topics can found “Reference” section. humdrumℝ installed, can also access documentation directly R sessions. R command line, use ? operator name function topic see documentation:","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/LO5th.html"],"dir":"Reference","previous_headings":"","what":"Line of Fifths — LO5th","title":"Line of Fifths — LO5th","text":"function LO5th S3-generic function methods extract \"line--fifths\" value various pitch objects representations.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/LO5th.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Line of Fifths — LO5th","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/LO5th.html"],"id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Line of Fifths — LO5th","text":"Returns integer vector array, matching input.","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/LO5th.html"],"id":"the-line-of-fifths","dir":"Reference","previous_headings":"","what":"The Line of Fifths","title":"Line of Fifths — LO5th","text":"Every interval Western music associated integer line fifths: Bb = m7 = -2 F = P4 = -1 C = P1 = 0 G = P5 = 1 D = M2 = 2 = M6 = 3 E = M3 = 4 B = M7 = 5 F# = A4 = 6 etc. natural notes (C) major scale---also call generic intervals---fall range -1:5. fact, diatonic key block seven consecutive numbers line--fifths: example, Eb major -4:2. \"Sharps\" \"flats\" represent +7 -7 line--fifths respectively.","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/P.html"],"dir":"Reference","previous_headings":"","what":"Tabulate and cross proportions — %*%,probabilityDistribution,probabilityDistribution-method","title":"Tabulate and cross proportions — %*%,probabilityDistribution,probabilityDistribution-method","text":"Tabulate cross proportions","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/P.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Tabulate and cross proportions — %*%,probabilityDistribution,probabilityDistribution-method","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/REparser.html"],"dir":"Reference","previous_headings":"","what":"Parse String Using Regular expressions — REparser","title":"Parse String Using Regular expressions — REparser","text":"Takes input string parses sequence regular expressions.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/REparser.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Parse String Using Regular expressions — REparser","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/REparser.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Parse String Using Regular expressions — REparser","text":"exhaustive TRUE, string must exhaustively broken matching regular expressions. Superfluous (non-match) characters begginning, end, bettween matches, result NA returned. -------------------------------------------> NEEDS DOCUMENTATION <-------------------------------------------","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/RegexFind.html"],"dir":"Reference","previous_headings":"","what":"Match strings against regular expression — RegexFind","title":"Match strings against regular expression — RegexFind","text":"functions give concise way search regular expressions character vectors. \"infix\" functions, meaning write function two arguments: myvector %~% regex.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/RegexFind.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Match strings against regular expression — RegexFind","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/RegexFind.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Match strings against regular expression — RegexFind","text":"x character vector search . Must character. regex One regular expressions. Must character. one regex supplied, matches regexes returned. (See \"Multiple regexes\" section.)","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/RegexFind.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Match strings against regular expression — RegexFind","text":"version function returns different type information regex matches () input vector: %~l%: returns logical (TRUE/FALSE) indicating x matches. %~%: returns integer indicating indices matches x. %~n%: returns integer indicating number (count) matches string. %~m%: returns character string matched string . Returns NA match. basic function (%~%) %~l%. also negative versions l functions: giving strings match given regular expression. %!~%, %!~l%, %!~%. functions simply syntactic sugar existing R regular expression matching functions: %~l%: base::grepl() %~%: base::grep() %~n%: stringi::stri_count_regex() %~m%: stringi::stri_extract_first_regex()","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/RegexFind.html"],"id":"multiple-regexes","dir":"Reference","previous_headings":"","what":"Multiple regexes","title":"Match strings against regular expression — RegexFind","text":"one regex supplied, %~l% %~% return indices regexes match. case %~n%, matching regex counted separately, summed. case %~m%, matches () pasted together, including multiple matches string.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/accidental.html"],"dir":"Reference","previous_headings":"","what":"Extract accidental from pitch. — accidental","title":"Extract accidental from pitch. — accidental","text":"Use want extract accidentals pitch data, discarding octave step information. Set explicitNaturals = FALSE want explicit naturals.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/accidental.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Extract accidental from pitch. — accidental","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/accidental.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Extract accidental from pitch. — accidental","text":"x Input data parse pitch information. x argument can (atomic) vector, tonalInterval, NULL. ... Arguments passed pitch deparser. also two hidden (advanced) arguments can specify: memoize deparse (see details ). generic \"specific\" pitch information (accidentals qualites) discarded? Defaults FALSE. Must singleton logical value: /switch. simple \"compound\" pitch information (octave/contour) discarded? Defaults FALSE. Must singleton logical value: /switch. Key input Key used parser, deparser, transposer. Defaults NULL. Must diatonicSet something coercable diatonicSet; must either length 1 length(x) transposeArgs optional list arguments passed special transpose() call. Defaults empty list(). Must list named arguments transpose(). parseArgs optional list arguments passed pitch parser. Defaults empty list(). Must list named arguments pitch parser. inPlace non-pitch information retained output string. Defaults FALSE. Must singleton logical value: /switch. argument effect input (x argument) character strings, extra, non-pitch information input strings \"besides\" pitch information. , inPlace = TRUE, output placed output string beside original non-pitch information. inPlace = FALSE, pitch output information returned (details ).","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/accidental.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Extract accidental from pitch. — accidental","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/bhatk.html"],"dir":"Reference","previous_headings":"","what":"Swara representation — bhatk","title":"Swara representation — bhatk","text":"Swara syllabes used represent scale degrees hindustani music---like solfege. bhatk() applied humdrumR data class may use data's fields arguments. field names specified, first selectedField used x.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/bhatk.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Swara representation — bhatk","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/bhatk.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Swara representation — bhatk","text":"x Input data parse pitch information. x argument can (atomic) vector, tonalInterval, NULL. ... Arguments passed pitch deparser. also two hidden (advanced) arguments can specify: memoize deparse (see details ). generic \"specific\" pitch information (accidentals qualites) discarded? Defaults FALSE. Must singleton logical value: /switch. simple \"compound\" pitch information (octave/contour) discarded? Defaults FALSE. Must singleton logical value: /switch. Key input Key used parser, deparser, transposer. Defaults NULL. Must diatonicSet something coercable diatonicSet; must either length 1 length(x) transposeArgs optional list arguments passed special transpose() call. Defaults empty list(). Must list named arguments transpose(). parseArgs optional list arguments passed pitch parser. Defaults empty list(). Must list named arguments pitch parser. inPlace non-pitch information retained output string. Defaults FALSE. Must singleton logical value: /switch. argument effect input (x argument) character strings, extra, non-pitch information input strings \"besides\" pitch information. , inPlace = TRUE, output placed output string beside original non-pitch information. inPlace = FALSE, pitch output information returned (details ).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/bhatk.html"],"id":"basic-pitch-arguments","dir":"Reference","previous_headings":"","what":"Basic pitch arguments","title":"Swara representation — bhatk","text":"pitch function standard arguments control details output. important generic simple arguments, allow control type pitch information returned.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/bhatk.html"],"id":"generic-vs-specific","dir":"Reference","previous_headings":"","what":"Generic vs Specific","title":"Swara representation — bhatk","text":"generic = TRUE, specific pitch information (accidentals qualities) omitted output. alternative way controlling functionality, can use specific argument, specific == !generic. case atonal functions, \"generic\" version pitch output: example, semits('c#', generic = TRUE) return 0, \"generic\" version C# C, corresponds 0. However, note generic version pitch follows key, semits('c#', generic = TRUE, Key = ':') return 1!","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/bhatk.html"],"id":"simple-vs-compound","dir":"Reference","previous_headings":"","what":"Simple vs Compound","title":"Swara representation — bhatk","text":"simple = TRUE, compound pitch information (octave contour) omitted output. alternative way controlling functionality, can use compound argument ,compound == !simple. actually one way might want divide compound intervals simple octave parts. example, might like call output -M2 (descending major 2nd) +m7 (ascending minor 7th octave ). functionality can controlled octave.round argument: see pitch deparsing documentation.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/bhatk.html"],"id":"key","dir":"Reference","previous_headings":"","what":"Key","title":"Swara representation — bhatk","text":"Key argument must diatonicSet, something can parsed one. Key argument passed parser, deparser, transpose---unless alternate Key passed transposeArgs parseArgs. Various deparsing options use Key argument; example, use implicitSpecies (see advanced parsing section) dependent Key. use pitch function within special call withinHumdrum, humdrumR automatically pass Key field humdrum data function---means, cases, need explicitly anything Key argument! (want happen, need explicitly specify Key argument, Key = NULL.)","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/bhatk.html"],"id":"parse-arguments","dir":"Reference","previous_headings":"","what":"Parse arguments","title":"Swara representation — bhatk","text":"parseArgs argument must list() (named) arguments passed input parser. example, input representation uses \"X\" represent double sharps, specify kern('CX5', parseArgs = list(doublesharp = 'X')) get correct result (\"cc##\"). convenient shorthand, \"syntactic sugar,\" can specify parseArgs alternate way: Simply input parse(args...) unnamed argument pitch function. example, can get exact result typing kern('CX5', parse(doublesharp = 'X')).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/bhatk.html"],"id":"transpose-arguments","dir":"Reference","previous_headings":"","what":"Transpose arguments","title":"Swara representation — bhatk","text":"transposeArgs argument must list() (named) arguments passed internal call transpose(), allowing us easily transpose pitch information. example, type kern(c('C', 'D', 'E'), transposeArgs = list(= 'M9')) can get output c('d', 'e', 'f#'). possible transpose args : (tonalInterval, length == 1 | length == (x)) (diatonicSet, length == 1 | length == (x)) (diatonicSet, length == 1 | length == (x)) real (logical, length == 1) transposition real tonal? relative (logical, length == 1) key-wise transposition based relative parallel keys? convenient shorthand, \"syntactic sugar,\" can specify transposeArgs alternate way: Simply input transpose(args...) unnamed argument pitch function. example, can get exact result typing kern(c('C', 'D', 'E'), transpose(= 'M9')).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/bhatk.html"],"id":"transposing-by-interval","dir":"Reference","previous_headings":"","what":"Transposing by interval","title":"Swara representation — bhatk","text":"calling transpose() directly, argument can anything coercable tonalInterval, output transposed amount. real = FALSE, tonal transposition (within Key) performed. details transposition behavior, check transpose() docs.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/bhatk.html"],"id":"transposing-by-key","dir":"Reference","previous_headings":"","what":"Transposing by key","title":"Swara representation — bhatk","text":"Another way transposing specifying input (\"\") key output (\"\") key. default, Key argument passed transpose , nothing actually happens. Thus, specify either key key, transposition happen /key Key. course, specify transposition happen keys specify. use pitch function within special call withinHumdrum, humdrumR automatically pass Key field humdrum data function. specify key, Key field passed transpose key, result, pitches input transposed whatever keys target () key! real relative arguments give special control key-wise transposition works, check transpose() docs details!","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/bhatk.html"],"id":"in-place-parsing","dir":"Reference","previous_headings":"","what":"In-place parsing","title":"Swara representation — bhatk","text":"humdrum data, character strings often encoded multiple pieces musical information right besides : example, **kern data might include tokens like \"4.ee-[. humdrumR parser (tonalInterval) automatically \"pull \" pitch information within strings, can find using appropriate known regular expressions. example, pitch('4.ee-[') returns Eb5. However, pitch functions (like pitch() kern()) option keep \"extra\" information return result \"place\"---.e., embedded right found input string. controlled inPlace argument, FALSE default. , pitch('4.ee-[', inPlace = TRUE) return 4.Eb5[---keeping \"4.\" \"[\". (obviously works input string, numeric!) Note inPlace = TRUE force functions like semits, normally return numeric values, return character strings input character string.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/bhatk.html"],"id":"pitch-gamut-levels","dir":"Reference","previous_headings":"","what":"Pitch-Gamut Levels","title":"Swara representation — bhatk","text":"table() automatically generate factor levels pitch data using gamut() function. makes sure tabulated data sorted logical order, includes missing pitches. simple/complex generic/specific arguments automatically passed gamut(); additional arguments can passed gamut using gamutArgs = list(...), syntactic sugar gamut(...). (Read gamut() docs explanation gamut generation.) feature used control table layout pitch data, well assure consistent tables grouping data. inPlace = TRUE special tabulation occur.","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/bhatk.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Swara representation — bhatk","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/bpm2sec.html"],"dir":"Reference","previous_headings":"","what":"Translate between durations and tempos — bpm2sec","title":"Translate between durations and tempos — bpm2sec","text":"Functions translating durations (seconds) tempos---expressed BPM (beats-per-minute). \"beats\" beats-per-minute specified using unit argument; unit defaults .25 (quarter-note), conventional.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/bpm2sec.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Translate between durations and tempos — bpm2sec","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/bpm2sec.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Translate between durations and tempos — bpm2sec","text":"BPM tempo. Defaults 60. Must number character string format \"MM120\" (120 bpm). default, ().humdrumR passes BPM field, present. unit \"Beat\" BPM. Defaults quarter-note. Must value can interpreted rhythmic duration.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/bpm2sec.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Translate between durations and tempos — bpm2sec","text":"pairs functions involving ms (milliseconds) sec (seconds), identical except change scale seconds milliseconds.","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/census.html"],"dir":"Reference","previous_headings":"","what":"Tabulate records and tokens in a humdrumR corpus — census","title":"Tabulate records and tokens in a humdrumR corpus — census","text":"census tabulates raw \"size\" humdrumR corpus, including total number records tokens. census one humdrumR's basic corpus summary functions.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/census.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Tabulate records and tokens in a humdrumR corpus — census","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/census.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Tabulate records and tokens in a humdrumR corpus — census","text":"humdrumR HumdrumR data. Must humdrumR data object. dataTypes types humdrum records include census. Defaults \"GLIMDd\". Must character. Legal values 'G', 'L', '', 'M', 'D', 'd' combination (e.g., \"LIM\"). (see humdrum table documentation Fields section explanation.). arbitrary expression indicates group data. Defaults Piece (humdrumR data field). removeEmpty Whether include zero tokens. Defaults FALSE Must singleton logical value: /switch. set TRUE, groups zero tokens included humCensus table. drop Whether return normal data.table humCensus table. Defaults FALSE. Must singleton logical value: /switch. drop = TRUE, normal data.table returned instead humCensus table. Index rows. numeric, selects rows index. character, string matched regular expression \"-group\" names.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/census.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Tabulate records and tokens in a humdrumR corpus — census","text":"census returns special data.frame called humCensus table. humCensus table five columns information: Records total number records. Tokens total number tokens. (unique) number unique tokens Characters total number characters. (includes humdrum control characters like * !!.) (per token) simply Characters / Tokens, indicating mean length token. default, census tabulates data within pieces corpus, piece tabulated row humCensus table. Rows labeled file name. humCensus object printed, totals across pieces printed well---(unique) (per token) values calculated across pieces well, summed. argument can used tabulate data across divisions data (see next section).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/census.html"],"id":"tabulate-by-other-groups","dir":"Reference","previous_headings":"","what":"Tabulate \"by\" other groups","title":"Tabulate records and tokens in a humdrumR corpus — census","text":"argument census indicates groupings data tabulate within, grouping across pieces corpus default. can arbitrary expression evaluated inside humdrum table, like groupby argument /within call. expression must full length humdrum table.","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/census.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Tabulate records and tokens in a humdrumR corpus — census","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/cents.html"],"dir":"Reference","previous_headings":"","what":"Apply to humdrumR data — cents.humdrumR","title":"Apply to humdrumR data — cents.humdrumR","text":"cents() applied humdrumR data class may use data's fields arguments. field names specified, first selectedField used x.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/cents.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Apply to humdrumR data — cents.humdrumR","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/chord.html"],"dir":"Reference","previous_headings":"","what":"","title":"","text":"functions outputs jazz/pop-style chord symbols. universal standard notate chord symbols, particular plain text. chord() function outputs chord symbol representation roughly consistent \"standard practices.\"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/chord.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/chord.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"","text":"x atomic vector. x argument can (atomic) vectors Key diatonic key used parser, deparser, transposer. Defaults NULL, interpreted C major. Must diatonicSet something coercable diatonicSet; must either length 1 length(x). transposeArgs optional list arguments passed transpose() call. Defaults empty list(). Must list named arguments transpose(). parseArgs optional list arguments chord parser. Defaults empty list(). Must list named arguments chord parser. inPlace non-chord information retained output string. Defaults FALSE. Must singleton logical value: /switch.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/chord.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"","text":"rigorous, consistent work, recommend Harte notation, standard used MIREX, etc. harte() function output standard Harte symbols.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/chord.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/chordDeparsing.html"],"dir":"Reference","previous_headings":"","what":"Generating (","title":"Generating (","text":"humdrumR includes easy--use system generating variety tertian harmony (chord) representations, can flexibly modified users. \"hood\" humdrumR represents tonal chord information using underlying representation, typically extracted input data using chord parser. representation can \"deparsed\" variety predefined output formats (like **harm), new formats create!","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/chordDeparsing.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Generating (","text":"Deparsing second step chord function processing pipeline: Input representation |> Parsing |> Intermediate (tertianSet) representation |> Transformation |> Deparsing (DEPARSING ARGS GO ) |> Output representation Various pitch representations can generated using predefined chord functions like chord() tertian(), roman(). functions use common deparsing framework, specified using different combinations arguments deparser. modifying \"deparsing\" arguments, can exercise fine control want pitch information represented output.","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/chordFunctions.html"],"dir":"Reference","previous_headings":"","what":"Parsing and deparsing chord information — chordFunctions","title":"Parsing and deparsing chord information — chordFunctions","text":"functions can used extract \"translate,\" otherwise modify, data representing tertian harmony information. functions :","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/chordFunctions.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Parsing and deparsing chord information — chordFunctions","text":"x atomic vector. x argument can (atomic) vectors Key diatonic key used parser, deparser, transposer. Defaults NULL, interpreted C major. Must diatonicSet something coercable diatonicSet; must either length 1 length(x). parseArgs optional list arguments chord parser. Defaults empty list(). Must list named arguments chord parser. transposeArgs optional list arguments passed transpose() call. Defaults empty list(). Must list named arguments transpose(). inPlace non-chord information retained output string. Defaults FALSE. Must singleton logical value: /switch.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/chordFunctions.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Parsing and deparsing chord information — chordFunctions","text":"Jazz/Pop chord() harte() Classical figuredBass() tertian() Roman Numerals harm() roman()","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/chordParsing.html"],"dir":"Reference","previous_headings":"","what":"Parsing chord information — chordParsing","title":"Parsing chord information — chordParsing","text":"humdrumR includes easy--use powerful system parsing tertian harmony information: various basic chord representations (including numeric character-string representations) can \"parsed\"---read interpreted humdrumR. part, parsing automatically happens \"behind scenes\" whenever use humdrumR chord function, like harm() roman(), chord().","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/chordParsing.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Parsing chord information — chordParsing","text":"","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/cleave.html"],"dir":"Reference","previous_headings":"","what":"Align data from separate spines into new fields. — cleave","title":"Align data from separate spines into new fields. — cleave","text":"Cleave, \"cleave together,\" moves data separate spines (paths) new fields spine(s). hood, cleave() essentially runs specialized call make humdrum table \"wider,\" similar R functions like cast(), spread(), pivot_wider(). fact, humdrumR method pivot_wider() defined, equivalent cleave(). cleave() function essentially inverse rend().","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/cleave.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Align data from separate spines into new fields. — cleave","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/cleave.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Align data from separate spines into new fields. — cleave","text":"humdrumR HumdrumR data. Must humdrumR data object. ... cleave? Must natural numbers, character strings representing exclusive interpretations, lists either. field field cleave data . Defaults first selected field. Must character string partially matching name data field humdrumR input. example, \"Tok\" match Token field. newFields Names use new fields created cleave. default generates names structure/number (like Spine2) exclusive interpretation (like Silbe). Must non-empty character string.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/cleave.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Align data from separate spines into new fields. — cleave","text":"Many humdrum datasets encode data across multiple spines, spine-paths, stops. default, humdrumR parses separate spine, spine-path, stop individual data points, taking one row humdrum table. want treat data multiple spines/paths/stops different aspects data easiest reshape data information different humdrumR fields rather separate spines/paths/stops. humdrum syntax view, spines (path/stops) moved \"top\" , cleaving together. convenient cleaveSpines(), cleaveStops(), cleavePaths() functions automatically cleave stops/paths dataset onto first spine/stop/path, creating new fields named, e.g., Path1, Path2, etc.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/cleave.html"],"id":"syntax","dir":"Reference","previous_headings":"","what":"Syntax","title":"Align data from separate spines into new fields. — cleave","text":"cleave() function takes number ... arguments specifying groups spines/paths/stops cleave together. cleave(humData, Spine = 1:2) cleave first second spine. cleave(humData, Spine = 1:4) cleave first four spines. cleave(humData, Spine = 1:2, Spine = 3:4) cleave spine 1 spine 2, separately, spine 3 spine 4. default cleave spines, can actually omit Spine = part: e.g., cleave(humData, 1:2) cleave(humData, Spine = 1:2). want cleave spine paths, need explicitly call something like cleave(humData, Path = 0:1). first element group used original location spines/paths/stops cleaved . ordering remaining elements irrelevant.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/cleave.html"],"id":"piece-specific-cleaving","dir":"Reference","previous_headings":"","what":"Piece-specific cleaving","title":"Align data from separate spines into new fields. — cleave","text":"default, cleaving applied pieces (pieces target spines/paths/stops). However, can use alternate argument structure apply differerent cleaves different pieces. , provide groups cleave arguments list, element list representing cleave group one piece. listed groups unnamed, groups mapped pieces index. example, call cleave(humData, list(1:2, 2:3, 3:4, NULL, 1:3)) result following cleaves: piece 1, cleave spines 1 2. piece 2, cleave spines 2 3. piece 3, cleave spines 3 4. piece 4, cleave (changes). piece 5, cleave first three spines. remaining pieces (6 greater), cleaves. Alternatively, can name list elements integers corresponding pieces. example, cleave(humData, Path = list(\"1\" = 0:1, 5 = 0:2\")) cleave paths 0 1 piece 1, paths 0:2 piece 5.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/cleave.html"],"id":"exclusive-interpretations","dir":"Reference","previous_headings":"","what":"Exclusive interpretations","title":"Align data from separate spines into new fields. — cleave","text":"cleaving spines, can specify spines using character strings representing exclusive interpretations. can call cleave(humData, c('kern', 'silbe')), cause **kern **silbe spines piece cleaved. Note exclusive interpretations \"mentioned\" call remain original field. behavior exclusive cleaving depends relative number target exclusive interpretation piece. equal numbers interpretation, spines grouped parallel. example, piece spines **kern **silbe **kern **silbe, command cleave(humData, c('kern', 'silbe')) see two **kern/**silbe pairs, cleave just like cleave(humData, 1:2, 3:4). different numbers spines matching exclusive interpretation, cleave behavior depends field first field input argument---call \"target\" exclusive. Consider file spines **kern **kern **harm. specify cleave call cleave(humData, c('kern', 'harm')) means want **kern \"target\" exclusive. Since fewer **harm spines **kern spines, data **harm spine duplicated, can cleaved **kern spines parallel. instead call cleave(humData, c('harm', 'kern')), making **harm \"target\", two **kern spines \"piled\" atop single **harm spine, making two new **kern fields.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/cleave.html"],"id":"fields","dir":"Reference","previous_headings":"","what":"Fields","title":"Align data from separate spines into new fields. — cleave","text":"Cleaving can (now) applied one field data, defaults first selected field; can change target field field argument. Cleaving always introduce new fields data. first spine/path/stop cleave group left original (target) field. spine/path/stops put new fields. call humData |> select(Token) |> cleave(humData, 1:2), spine 1 remain Token field spine 2 data put new field. default, new field(s) automatically named appending type cleave (spine vs path vs stop) number. cleave(humData, 1:2) case, new field called Spine2. can control name newFields argument, must character vector. can provide many new field names new fields. provide field names, name(s) numbers appended necceasary cover new fields; provide many field names, extra names simply ignored. cleaving exclusive interpretation newFields can used exact way. However, default (newFields NULL), cleave() names fields exclusive interpretation. Note original target field (specified field) argument name changed. example, humData |> select(Token) |> cleave(humData, c('kern', 'silbe')) result spines Token Silbe. Kern field created, Kern data left Token field.","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/cleave.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Align data from separate spines into new fields. — cleave","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/cleaveGraceNotes.html"],"dir":"Reference","previous_headings":"","what":"","title":"","text":"\"Fold\" grace notes neighbos","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/cleaveGraceNotes.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"","text":"","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/collapseHumdrum.html"],"dir":"Reference","previous_headings":"","what":"","title":"","text":"collapseHumdrum allows collapse data field across across groups within data indicated argument. Data \"collapsed\" either pasting data string, putting list. collapseStops, collapsePaths, collapseRecords built-calls collapseHumtab, additional optimizations.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/collapseHumdrum.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/collapseHumdrum.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"","text":"humdrumR HumdrumR data. Must humdrumR data object. Fields collapse data within. Must character. Must character strings partially matching name(s) field(s) humdrumR input. Data fields collapsed within fields. fields target field(s) humdrumR data collapse. Defaults selectedFields(humdrumR). Must character strings partially matching name(s) data field(s) humdrumR input. dataTypes types humdrum record(s) collapse. Defaults \"GLIMDd\". Must character. Legal values 'G', 'L', '', 'M', 'D', 'd' combination (e.g., \"LIM\"). (See humdrum table documentation Fields section explanation.) collapseAtomic Whether collapse data character strings. Defaults TRUE. Must singleton logical value: /switch. TRUE, data collapsed single character string. FALSE, data conctanated list. sep separator collapsed strings. Defaults \" \" (space). Must single character string. effect collapseAtomic == TRUE.","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/combineFields.html"],"dir":"Reference","previous_headings":"","what":"Combine one or more fields into a new field — combineFields","title":"Combine one or more fields into a new field — combineFields","text":"Combine one fields new field","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/combineFields.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Combine one or more fields into a new field — combineFields","text":"","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/context.html"],"dir":"Reference","previous_headings":"","what":"Group vectors into contextual windows — context","title":"Group vectors into contextual windows — context","text":"context() command can used group input data (vectors fields) arbitrary contextual windows. Unlike grouping vectors, context() windows 1) always contiguous relative reference vector(s)/field(s) (can depend order); 2) can overlap; 3) necesarily exhaustively divide data. context() function generally called humdrumR data, can also called directly vectors. uncontext() function removes contextual windows humdrumR data object. contextual windows created, windows() function can used view data.table representing windows. Open Close columns indicate row indices humdrum table.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/context.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Group vectors into contextual windows — context","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/context.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Group vectors into contextual windows — context","text":"x Input data group windows. Must atomic vector. open \"open\" (start) windows. Can natural numbers, logical vectors (length x), single character string (interpreted regular expression). May also arbitrary expression returns natural numbers; expression can refer named elements reference, end (last index), close, prevclose (previous close). close \"close\" (end) windows. Can natural numbers, logical vectors (length x), single character string (interpreted regular expression). May also arbitrary expression returns natural numbers; expression can refer named elements reference, end (previous index), open, nextopen (next open). reference Vector(s) use identify window open/closes. Defaults x. Must either atomic vector length x, list()/data.frame vectors, named. context() applied humdrumR dataset, fields data's humdrum table used reference. overlap overlapping windows treated/created? Defaults 'paired'. Must single character, partially matching either \"paired\", \"nested\", \"edge\", \"none\". depth \"deep\" can windows overlap? Defaults NULL. Must NULL, vector non-zero whole numbers. rightward window alignment/overlap determined left right? Defaults TRUE. Must singleton logical value: /switch. duplicate_indices Can index open/close multiple windows? Defaults TRUE. Must singleton logical value: /switch. min_length, max_length minimum/maximum lengths output windows. Default two infinity (maximum) respectively. Must single, positive whole numbers. inPlace output padded length input? Defaults FALSE. Must singleton logical value: /switch. complement input \"outside\" windows, output? Defaults FALSE. Must singleton logical value: /switch. alignToOpen 'inPlace' output aligned open window? Defaults TRUE. Must singleton logical value: /switch. collapse output windows collapsed single character strings? Defaults TRUE. Must singleton logical value: /switch. sep Separator collapsed output. Defaults comma (\",\"). Must single character string. stripRegex regular expressions matched open/close arguments removed output? Defaults FALSE. Must singleton logical value: /switch. groupby Optional vectors group windows within. Defaults empty list(). Must list(), either empty contains vectors length x. calls /within.humdrumR, groupby passed list(Piece, Spine, Path) default. Windows cross group boundaries. humdrumR HumdrumR data. Must humdrumR data object.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/context.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Group vectors into contextual windows — context","text":"context() function determines contextual windows begin end based expressions open close arguments. open close expressions evaluated using reference vector, set vectors/fields() length. cases, apply context() humdrumR data object, windows defined evaluating open close arguments using fields() humdrum table reference. done, humdrumR object show many windows identified printed console. use /within/mutate/summarize/reframe data, methods evaluate argument expressions within every contextual window defined context(). means can basically anything want /contextual windows. can also apply context() directly single input vector x, providing vector list/data.frame equal-length vectors reference open close arguments. default, x reused reference, windows based input x . applied vector, context() simply group elements x windows defined, arguments control done: complement: \"complement\" refers elements input vector fall inside indicated windows: complement = FALSE (default), \"outside\" values dropped; complement = TRUE, retained. inPlace: inPlace = TRUE, windows output vector length input, padded NA needed---otherwise (default), windows returned collapse: collapse = TRUE, windows collapsed strings (separated sep), otherwise, list() windows returned. sep separator used collapse = TRUE. alignToOpen: padded output (inPlace = TRUE) aligned openning (left-side) window? stripRegex: regular expressions used identify windows (details ) stripped output? rest man page, apply context() simple vectors (like letters vector) illustrate windows defined. actual analyses, likely apply context() humdrumR data. Note , using context() inside , within, etc., alignToOpen argument effect. Instead, use alignLeft = FALSE argument ()/within(), argument context().","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/context.html"],"id":"groupby","dir":"Reference","previous_headings":"","what":"groupby","title":"Group vectors into contextual windows — context","text":"groupby argument optional list grouping vectors, length x/reference. Contextual windows cross boundaries indicated groupby. applying context() humdrumR data, groupby automatically passed list(Piece, Spine, Path), prevents windows crossing normal \"melodic\" boundaries data.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/context.html"],"id":"defining-windows","dir":"Reference","previous_headings":"","what":"Defining windows","title":"Group vectors into contextual windows — context","text":"system context() uses define/identify windows data quite sophisticated, can take time master! basic idea must indicate want windows start (\"open\") want end (\"close\"): indicate using open close arguments. introduce usage, first simple examples applying context() built-letters vector, (default) act reference vector target vector x contextualize. show techniques can used multiple vectors/fields(). open close arguments expressions , evaluated, must indicate indices reference vector(s)/field(s); example, want window open 4th 11th indices, close 15th 24th index, can write: quite trivial. However, open close expressions can number special tricks, including refering . example, either argument includes call hop(), hop() automatically applied along input vector. Consider example: example, hop() command generates open indices every odd number 1 25. close argument references open indices, adds 3 --- result pairs like 1:4, 2:5, 3:6, 4:7, etc. give hop() different arguments (like ), can modify process. fact, use default value hop() (1), can use approach create standard N-grams. can also indicate open/closes providing logical vectors (length x/reference). example:","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/context.html"],"id":"regular-expressions","dir":"Reference","previous_headings":"","what":"Regular Expressions","title":"Group vectors into contextual windows — context","text":"either open close provided character string, string treated regular expression matched reference vector. example, make windows alphabet starting ending vowel: stripRegex = TRUE (default), matching open close regular expressions removed output. can useful character/tokens used indicate windows longer needed windowing done.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/context.html"],"id":"special-variables","dir":"Reference","previous_headings":"","what":"Special variables","title":"Group vectors into contextual windows — context","text":"open close expressions understand special variable names: nextopen: represents index next open---can used close argument. prevclose: represents index previous close---can used open argument. end: represents last index reference vector(s). |: \"\"---specify alternative window open/close criteria. like windows close right next window opens? can making thecloseargument refer *next*open, referring nextopen` variable: Conversely, open can refer prevclose close: Notice called context(letters, open = '[aeiou]', close = nextopen - 1L), window opening \"u\" returned. \"nextopen\" open close . can instead provide context() alternative, using | (): saying, close window 1 index next open index 26. know exactly long input vector ? Refer end variable:","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/context.html"],"id":"separating-context-reference-from-application","dir":"Reference","previous_headings":"","what":"Separating context reference from application","title":"Group vectors into contextual windows — context","text":"previous examples illustrate basic concepts using open/close; grasp work, study examples play around . can also define open close expressions reference one vector(s)/field, necessarily thing want apply windowing . illustrate last point, take last command previous section make x argument different reference argument: Now, letters still used windowing reference, contextual windowing applied LETTERS. use context() humdrumR dataset, data's fields() can used reference, (), within(), mutate() can used manipulate fields.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/context.html"],"id":"multi-vector-field-reference","dir":"Reference","previous_headings":"","what":"Multi-vector/field reference","title":"Group vectors into contextual windows — context","text":"open close arguments can reference one reference vector. applying context() vector x, can provide named list() data.frame() reference argument---long vectors contain length x. can refer vectors name: created data.frame columns Threes Fours. referenced columns defining windows open close.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/context.html"],"id":"using-humdrumr-data","dir":"Reference","previous_headings":"","what":"Using humdrumR data","title":"Group vectors into contextual windows — context","text":"apply context() humdrumR data, can refer data's fields() open close. can also use open/close's special tricks (described ), like hop(), nextopen, prevclose, end. example, create 4-grams humdrum dataset: mentioned , apply context() humdrumR data, groupby automatically passed list(Piece, Spine, Path), prevents windows crossing normal \"melodic\" boundaries data. can overrriden providing explicit groupby argument. Grouping fields already defined data, also used.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/context.html"],"id":"filtering-windows","dir":"Reference","previous_headings":"","what":"Filtering windows","title":"Group vectors into contextual windows — context","text":"open close identified windows can start end, still options open close indices associate create window. example, mentioned , groupby argument can used make sure windows cross grouping boundaries---even one group extra open index next extra close index. minimum maximum length windows can also controlled using min_length max_length arguments. overlap, depth, rightward, duplicate_indices arguments provide number additional options, useful use cases (details ).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/context.html"],"id":"nested-windows","dir":"Reference","previous_headings":"","what":"Nested windows","title":"Group vectors into contextual windows — context","text":"common use-case context() analyzing phrases indicated music. **kern, phrases indicated opening (() close ()) parentheses, can capture regular expressions open close. example: Perfect. However, nested phrasing indicators? want! default, context() \"pairs\" open next close, often makes sense. case, want different behavior. can get want specifying overlap = 'nested': Now context aligns open corresponding close nesting level. interested highest (lowest) level nesting? Use depth argument, can non-zero integers: highest level 1, \"deeper\" levels incrementing . can also use negative depth specify deepest levels outward. example, case depth == -1 get us deepest level: depth NULL (default), depths returned.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/context.html"],"id":"controlling-overlap","dir":"Reference","previous_headings":"","what":"Controlling overlap","title":"Group vectors into contextual windows — context","text":"options controlling windows can, , overlap. Perhaps like look every melodic phrase moving (dominant) (tonic). output probably want. , context() (default) pairs opening next close already paired. case, means third getting pairs third , even though another ! might want try either \"edge\" \"none\" options overlap argument: \"edge\" option allows closing edge windows share close---case, second third (open) paired . hand, overlap = \"none\", overlapping windows simply allowed, third open simply get paired anything. like pair windows left (opening) edge? specify rightward = FALSE, overlap argument works backwards (right--left) input vector, starting close ending open. combining righward = FALSE various overlap options, can achieve lot windowing options might need.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/context.html"],"id":"repeated-indices","dir":"Reference","previous_headings":"","what":"Repeated indices","title":"Group vectors into contextual windows — context","text":"Note duplicates_indices = TRUE (default) open close arguments can incorporate repeated indices, including multiple matches regular expression index. useful , example, nested phrases: cases, might want turn duplicate_indices = FALSE.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/context.html"],"id":"complements-removing-context-","dir":"Reference","previous_headings":"","what":"Complements (removing context)","title":"Group vectors into contextual windows — context","text":"uncontext() command, like ungroup() command, needed remove contextual windows humdrumR data, calls within()/mutate()/etc. applied context. uncontext() command can also used access data outside contextual windows using complement argument, similar unfilter() function. complement must existing field data. uncontext() used given complement field, currently selected data field (unless Token selected) contents complement field inserted points outside contextual windows. can used keep","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/context.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Group vectors into contextual windows — context","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/counts.html"],"dir":"Reference","previous_headings":"","what":"Tabulate and/or cross-tabulate data — show,counts-method","title":"Tabulate and/or cross-tabulate data — show,counts-method","text":"count() function exactly like R's fundamental table() function, except 1) give special treatment humdrumR token() data 2) intuitive/simple argument names 3) makes easier combine/manipulate disparate output tables.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/counts.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Tabulate and/or cross-tabulate data — show,counts-method","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/counts.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Tabulate and/or cross-tabulate data — show,counts-method","text":"count() function essentially wrapper around base::table() function. However, token() class arguments treated like factors(), calling generating levels. assures , example, pitch data tabulated order pitch height, \"missing\" pitches counted zero. count() , default, count NA values present---want count NAs, specify na.rm = TRUE. can also tell count() exclude (count) arbitrary values provide vector exclude argument. count() always give names dimensions table creates. can specify names directly argument names, like count(Kern = kern(Token)); specify name, count() make name(s) based expression(s) tallying. (Note count() copy base::table()'s obtusely-named dnn deparse.level arguments.)","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/counts.html"],"id":"manipulating-humdrum-tables","dir":"Reference","previous_headings":"","what":"Manipulating humdrum tables","title":"Tabulate and/or cross-tabulate data — show,counts-method","text":"output count() special form R table, counts. Given two countss, apply basic R operators (e.g., arithmetic, comparisons) row/column binding (cbind/rbind) humdrumR align tables dimension-names operation. means, two tables pitch data, one table includes specific pitch , can still add together bind matrix. See examples!","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/counts.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Tabulate and/or cross-tabulate data — show,counts-method","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/crossEntropy.html"],"dir":"Reference","previous_headings":"","what":"Calculate cross entropy between two distributions — crossEntropy","title":"Calculate cross entropy between two distributions — crossEntropy","text":"TBA","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/crossEntropy.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Calculate cross entropy between two distributions — crossEntropy","text":"","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/degree.html"],"dir":"Reference","previous_headings":"","what":"Tonal scale degree representation (absolute) — degree","title":"Tonal scale degree representation (absolute) — degree","text":"humdrum **degree **deg interpretations represent Western \"scale degrees\" two slightly different formats. **degree representation, octave pitch represented \"absolutely,\" standard octave scheme scientific pitch. **deg representation, octave pitch indicated relative previous pitch--- \"^\" indicates pitch higher previous pitch \"v\" indicates pitch lower previous pitch. degree() applied humdrumR data class may use data's fields arguments. field names specified, first selectedField used x. deg() applied humdrumR data class may use data's fields arguments. field names specified, first selectedField used x.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/degree.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Tonal scale degree representation (absolute) — degree","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/degree.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Tonal scale degree representation (absolute) — degree","text":"x Input data parse pitch information. x argument can (atomic) vector, tonalInterval, NULL. ... Arguments passed pitch deparser. also two hidden (advanced) arguments can specify: memoize deparse (see details ). generic \"specific\" pitch information (accidentals qualites) discarded? Defaults FALSE. Must singleton logical value: /switch. simple \"compound\" pitch information (octave/contour) discarded? Defaults FALSE. Must singleton logical value: /switch. Key input Key used parser, deparser, transposer. Defaults NULL. Must diatonicSet something coercable diatonicSet; must either length 1 length(x) transposeArgs optional list arguments passed special transpose() call. Defaults empty list(). Must list named arguments transpose(). parseArgs optional list arguments passed pitch parser. Defaults empty list(). Must list named arguments pitch parser. inPlace non-pitch information retained output string. Defaults FALSE. Must singleton logical value: /switch. argument effect input (x argument) character strings, extra, non-pitch information input strings \"besides\" pitch information. , inPlace = TRUE, output placed output string beside original non-pitch information. inPlace = FALSE, pitch output information returned (details ).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/degree.html"],"id":"basic-pitch-arguments","dir":"Reference","previous_headings":"","what":"Basic pitch arguments","title":"Tonal scale degree representation (absolute) — degree","text":"pitch function standard arguments control details output. important generic simple arguments, allow control type pitch information returned.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/degree.html"],"id":"generic-vs-specific","dir":"Reference","previous_headings":"","what":"Generic vs Specific","title":"Tonal scale degree representation (absolute) — degree","text":"generic = TRUE, specific pitch information (accidentals qualities) omitted output. alternative way controlling functionality, can use specific argument, specific == !generic. case atonal functions, \"generic\" version pitch output: example, semits('c#', generic = TRUE) return 0, \"generic\" version C# C, corresponds 0. However, note generic version pitch follows key, semits('c#', generic = TRUE, Key = ':') return 1!","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/degree.html"],"id":"simple-vs-compound","dir":"Reference","previous_headings":"","what":"Simple vs Compound","title":"Tonal scale degree representation (absolute) — degree","text":"simple = TRUE, compound pitch information (octave contour) omitted output. alternative way controlling functionality, can use compound argument ,compound == !simple. actually one way might want divide compound intervals simple octave parts. example, might like call output -M2 (descending major 2nd) +m7 (ascending minor 7th octave ). functionality can controlled octave.round argument: see pitch deparsing documentation.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/degree.html"],"id":"key","dir":"Reference","previous_headings":"","what":"Key","title":"Tonal scale degree representation (absolute) — degree","text":"Key argument must diatonicSet, something can parsed one. Key argument passed parser, deparser, transpose---unless alternate Key passed transposeArgs parseArgs. Various deparsing options use Key argument; example, use implicitSpecies (see advanced parsing section) dependent Key. use pitch function within special call withinHumdrum, humdrumR automatically pass Key field humdrum data function---means, cases, need explicitly anything Key argument! (want happen, need explicitly specify Key argument, Key = NULL.)","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/degree.html"],"id":"parse-arguments","dir":"Reference","previous_headings":"","what":"Parse arguments","title":"Tonal scale degree representation (absolute) — degree","text":"parseArgs argument must list() (named) arguments passed input parser. example, input representation uses \"X\" represent double sharps, specify kern('CX5', parseArgs = list(doublesharp = 'X')) get correct result (\"cc##\"). convenient shorthand, \"syntactic sugar,\" can specify parseArgs alternate way: Simply input parse(args...) unnamed argument pitch function. example, can get exact result typing kern('CX5', parse(doublesharp = 'X')).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/degree.html"],"id":"transpose-arguments","dir":"Reference","previous_headings":"","what":"Transpose arguments","title":"Tonal scale degree representation (absolute) — degree","text":"transposeArgs argument must list() (named) arguments passed internal call transpose(), allowing us easily transpose pitch information. example, type kern(c('C', 'D', 'E'), transposeArgs = list(= 'M9')) can get output c('d', 'e', 'f#'). possible transpose args : (tonalInterval, length == 1 | length == (x)) (diatonicSet, length == 1 | length == (x)) (diatonicSet, length == 1 | length == (x)) real (logical, length == 1) transposition real tonal? relative (logical, length == 1) key-wise transposition based relative parallel keys? convenient shorthand, \"syntactic sugar,\" can specify transposeArgs alternate way: Simply input transpose(args...) unnamed argument pitch function. example, can get exact result typing kern(c('C', 'D', 'E'), transpose(= 'M9')).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/degree.html"],"id":"transposing-by-interval","dir":"Reference","previous_headings":"","what":"Transposing by interval","title":"Tonal scale degree representation (absolute) — degree","text":"calling transpose() directly, argument can anything coercable tonalInterval, output transposed amount. real = FALSE, tonal transposition (within Key) performed. details transposition behavior, check transpose() docs.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/degree.html"],"id":"transposing-by-key","dir":"Reference","previous_headings":"","what":"Transposing by key","title":"Tonal scale degree representation (absolute) — degree","text":"Another way transposing specifying input (\"\") key output (\"\") key. default, Key argument passed transpose , nothing actually happens. Thus, specify either key key, transposition happen /key Key. course, specify transposition happen keys specify. use pitch function within special call withinHumdrum, humdrumR automatically pass Key field humdrum data function. specify key, Key field passed transpose key, result, pitches input transposed whatever keys target () key! real relative arguments give special control key-wise transposition works, check transpose() docs details!","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/degree.html"],"id":"in-place-parsing","dir":"Reference","previous_headings":"","what":"In-place parsing","title":"Tonal scale degree representation (absolute) — degree","text":"humdrum data, character strings often encoded multiple pieces musical information right besides : example, **kern data might include tokens like \"4.ee-[. humdrumR parser (tonalInterval) automatically \"pull \" pitch information within strings, can find using appropriate known regular expressions. example, pitch('4.ee-[') returns Eb5. However, pitch functions (like pitch() kern()) option keep \"extra\" information return result \"place\"---.e., embedded right found input string. controlled inPlace argument, FALSE default. , pitch('4.ee-[', inPlace = TRUE) return 4.Eb5[---keeping \"4.\" \"[\". (obviously works input string, numeric!) Note inPlace = TRUE force functions like semits, normally return numeric values, return character strings input character string.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/degree.html"],"id":"pitch-gamut-levels","dir":"Reference","previous_headings":"","what":"Pitch-Gamut Levels","title":"Tonal scale degree representation (absolute) — degree","text":"table() automatically generate factor levels pitch data using gamut() function. makes sure tabulated data sorted logical order, includes missing pitches. simple/complex generic/specific arguments automatically passed gamut(); additional arguments can passed gamut using gamutArgs = list(...), syntactic sugar gamut(...). (Read gamut() docs explanation gamut generation.) feature used control table layout pitch data, well assure consistent tables grouping data. inPlace = TRUE special tabulation occur.","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/degree.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Tonal scale degree representation (absolute) — degree","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/delta.html"],"dir":"Reference","previous_headings":"","what":"Lagged differences — delta","title":"Lagged differences — delta","text":"Calculate sequential differences values numeric vectors.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/delta.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Lagged differences — delta","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/delta.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Lagged differences — delta","text":"x input vector. Must atomic numbers. NULL values returned NULL. lag lag use. Defaults 1. Must single natural number. Results look like: x[] - x[- lag]. skip function indicate values skip. Defaults .na. must function can applied x return logical vector length. TRUE values skipped calculations. default, skip function .na, NA values input (x argument) skipped. skipped values returned output vector. init Initial value fill beginning calculation. Defaults 0. class x; length must longer lag. NA values beginning (end right == TRUE) filled values summing. right init padding \"right\" (end vector)? Defaults FALSE. Must singleton logical value: /switch. default, right == FALSE init padding beginning output. groupby group data. Defaults list(). vector list vectors; must length length(x). Differences calculated across groups indicated groupby vector(s). orderby order calculating difference. Defaults list(). vector list vectors; must length length(x). Differences x calculated based order orderby vector(s), determined base::order().","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/delta.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Lagged differences — delta","text":"delta similar base-R diff(). However, delta favored humdrumR use : output always length input. achieved padding beginning end output with1 NA values (options). groupby argument, automatically used humdrumR () commands constrain differences within pieces/spines/paths humdrum data. groupby approach (details ) generally faster applying commands within groupby groups. (can) automatically skip NA () values. applied matrix, delta applied separately column, unless margin set 1 (rows) , higher-dimensional array, higher value.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/delta.html"],"id":"initial-padding-values","dir":"Reference","previous_headings":"","what":"Initial/padding values","title":"Lagged differences — delta","text":"lagged pair numbers vector summed/subtracted. leaves abs(lag) numbers end nothing pair . example, lag == 1, indices getting subtracted look like : \\(x_1 - x_?\\) \\(x_2 - x_1\\) \\(x_3 - x_2\\) \\(x_4 - x_3\\) \\(x_5 - x_4\\) lag == 3: \\(x_1 - x_?\\) \\(x_2 - x_?\\) \\(x_3 - x_?\\) \\(x_4 - x_1\\) \\(x_5 - x_2\\) init argument (\"initial\") value, values, pair first lag values. default, init NA, since n + NA n - NA , NA, output vector padded NA values. lag == 3 : \\(x_1 - NA\\) \\(x_2 - NA\\) \\(x_3 - NA\\) \\(x_4 - x_1\\) \\(x_5 - x_2\\) However, init argument can 1 abs(lag) numeric values. result, lag==3 : \\(x_1 - init_1\\) \\(x_2 - init_2\\) \\(x_3 - init_3\\) \\(x_4 - x_1\\) \\(x_5 - x_2\\) right == TRUE, init values placed end, like: \\(x_4 - x_1\\) \\(x_5 - x_2\\) \\(init[1] - x_3\\) \\(init[2] - x_4\\) \\(init[3] - x_5\\) init argument functions similarly init argument Reduce().","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/delta.html"],"id":"negative-lag","dir":"Reference","previous_headings":"","what":"Negative lag","title":"Lagged differences — delta","text":"lag negative, differences simply reversed, resulting numbers equivalent positive lag, * -1. \\(x_1 - NA\\) \\(x_2 - x_1\\) \\(x_3 - x_2\\) \\(x_4 - x_3\\) \\(x_5 - x_5\\) \\(NA - x_1\\) \\(x_1 - x_2\\) \\(x_2 - x_3\\) \\(x_3 - x_4\\) \\(x_4 - x_5\\)","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/delta.html"],"id":"grouping","dir":"Reference","previous_headings":"","what":"Grouping","title":"Lagged differences — delta","text":"many cases want perform lagged calculations vector, across certain boundaries. example, vector includes data multiple pieces, want calculate melodic intervals pieces, within pieces. groupby argument indicates one, , grouping vectors, break x (input) argument groups. groupby vectors given, change vector indicates boundary. Value pairs cross groups treated beginning. Basically, using groupby argument function similar identical using tapply(x, groupby, laggedFunction, ...) using groupby expession call ().humdrumR. However, using groupby argument directly usually much faster, specially optimized functions. common use case humdrum data, looking \"melodies\" within spines. , want groupby = list(Piece, Spine, Path). fact, humdrumR () calls automatically feed three fields groupby arguments certain functions: mint, delta, sigma, lag, ditto, ioi, sumTies, hop, wort, wort.character. use delta call (), automatically calculate delta \"melodic\" way, within spine path piece. However, wanted, instance, calculate differences across spines (like harmonic intervals) manually set groupby = list(Piece, Record).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/delta.html"],"id":"order","dir":"Reference","previous_headings":"","what":"Order","title":"Lagged differences — delta","text":"performing lagged calculations, typically assume order values input vector (x) order want \"lag\" across. E.g., first element \"\" second element, \"\" third element, etc. [Humdrum tables][humTable] always ordered Piece > Piece > Spine > Path > Record > Stop. Thus, lagged calculations across fields humtable , default, \"melodic\": next element next element spine path. example, consider data: default order tokens (Token field) b c d e f. wanted instead lag across tokens harmonically (across records) need specifiy different order example, say orderby = list(Pice, Record, Spine)---lagged function interpret Token field d b e c f. another example, note Stop comes last order. consider happens stops data:","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/delta.html"],"id":"invertability","dir":"Reference","previous_headings":"","what":"Invertability","title":"Lagged differences — delta","text":"sigma delta functions inverses , meaning right arguments set, sigma(delta(x)) == x delta(sigma(x)) == x. words, two functions \"reverse\" . key init argument needs set 0, arguments (lag, skip, groupby, etc.) need match. actually, sigma(delta(x, init = 0, ...)) == x delta(sigma(x), init = 0)) == x. take differences values (delta(x)), resulting differences tell us fully reconstruct original unless know \"start\" (constant offset). example, delta(c(5, 7, 5, 6)) == c(NA, 2, -2, 1) know input goes 2, back 2, 1, starting value (first 5) lost. call sigma , get: sigma(c(NA, 2, -2, 1)) == c(0, 2,0, 1) get right contour, offset constant 5. call delta(x, init = 0) necessary constant (first value) kept beginning vector delta(c(5, 7, 5, 6), init = 0) == c(5, 2, -2, 1) sigma gets want, full invertability: sigma(delta(c(5, 7, 5, 6), init = 0)) == c(5, 7, 5, 6) Alternatively, specify necessary constant init argument sigma: sigma(delta(c(5, 7, 5, 6)), init = 5) == c(5, 7, 5, 6) init arguments two functions complementary. Currently, right argument delta complement sigma, invertability holds true right = FALSE (default).","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/diatonicSetS4.html"],"dir":"Reference","previous_headings":"","what":"Tonal (diatonic) sets — diatonicSetS4","title":"Tonal (diatonic) sets — diatonicSetS4","text":"diatonicSet one humdrumR's types tonal data, representing Western diatonic keys. part, users need interact diatonicSets directly---rather, diatonicSets work behind scene numerous humdrumR pitch functions. See keyRepresentations keyTransformations documentation details usage functionality Tonality humdrumR vignette detailed explanation theory specifics diatonicSets.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/diatonicSetS4.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Tonal (diatonic) sets — diatonicSetS4","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/diatonicSetS4.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Tonal (diatonic) sets — diatonicSetS4","text":"diatonicSet S4 subclass humdrumR's virtual class struct, inherits lot useful \"vector-like\" behaviors/functionality. constructor function dset can used create diatonicSets directly. three arguments corespond three slots: root, mode, alteration. inputs coerced match length. root argument attempt coerce character strings tonalIntervals, use LO5th value root. default, .character method, thus (via struct) show method, diatonicSets call key(). Thus, return diatonicSet command line (call print one one), see key interpretation representation printed.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/diatonicSetS4.html"],"id":"slots","dir":"Reference","previous_headings":"","what":"Slots","title":"Tonal (diatonic) sets — diatonicSetS4","text":"Root integers representing root key line--fifths Signature integers representing signature (number accidentals) key. key represented two integers, Root Signature. Root simply tonic note key circle fifths. Signature value circle fifths, indicating diatonic mode. can think Signature value indicating number accidentals, negative numbers flats positive numbers sharps. can also think signature indicating much \"natural key\" (C major) slid line--fifths. traditional diatonic modes Western music occur wherever Signature - Tonic range -5:1: Signature - Tonic = +1 => Lydian Signature - Tonic = +0 => Major (Ionian) Signature - Tonic = -1 => Mixolydian Signature - Tonic = -2 => Dorian Signature - Tonic = -3 => Minor (Aeolian) Signature - Tonic = -5 => Locrian Signature - Tonic = -4 => Phyrgian Note can make diatonicSets Root outside Key. unusual, may result sets predict. Alteration integers representing alterations diatonic set (details ).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/diatonicSetS4.html"],"id":"alterations","dir":"Reference","previous_headings":"","what":"Alterations","title":"Tonal (diatonic) sets — diatonicSetS4","text":"Alteration slots (also integer) can used represent various \"altered\" scales. integer values interpreted seven-trit balanced ternary string. (\"trits\" ternary equivalent binary \"bits.\") Balanced ternary allows three digits, 0 (unaltered degree), 1 (sharpened degree), -1 (flattened degree). seven trits correspond seven scale degrees line--fifth indicated signature---.e., ordered lowest hightest line--fifths, relative root. (instance, Signature == 0, degrees c(-1, 0, 1, 2, 3, 4, 5).) ternary arrangement maps powers three scale degree, Alteration integer: ± 1: raise flatten 7th scale degree. ± 3: raise flatten 3rd scale degree. ± 9: raise flatten 6th scale degree. ± 27: raise flatten 2nd scale degree. ± 81: raise flatten 5th scale degree. ± 243: raise flatten 1st scale degree. ± 749: raise flatten 4th scale degree. example, consider Alteration == 26: balanced ternary representation, decimal integer 26 represented 1 0 0 1 0 -1 0. (words 1 \"27s place\" -1 \"ones place\"---.e., 27 - 1). represents raised 2nd (27) lowered 7th (-1). Alteration integer allows us concisely represent 2,187 possible combinations raised lowered diatonic scale degrees! However, combined Signature slot, redundancy scale representation. example, melodic minor scale can represented major scale (Signature - Root == 0) lowered third degree (Alteration == -3) minor scale (Signature - Root == -3) raised 6ths 7ths (Alteration == 10). However, though two representations result set line--fifths, might consider conceptually different contexts, consider redundancy acceptable. Another case encoding redundancy Alteration - 1 (flatten 7th) exactly equivalent Signature - 1. Similarly, Alteration + 749 (raise 4th) exactly equivalent Signature + 1. Double-flat double-sharp degrees encodable diatonicSet. However, combination Signature slot, sets double-flat/sharps (like doubly-diminished 7ths) can encoded.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/diatonicSetS4.html"],"id":"arithmetic","dir":"Reference","previous_headings":"","what":"Arithmetic","title":"Tonal (diatonic) sets — diatonicSetS4","text":"Arithmetic diatonicSets defined. However, number useful arithmetic operations diatonicSets data types defined: XXXX Elaborate XXXX Need implement special logic adding Alterations! (Taking account Signature addition.)","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/diatonicSetS4.html"],"id":"relational-operators","dir":"Reference","previous_headings":"","what":"Relational Operators","title":"Tonal (diatonic) sets — diatonicSetS4","text":"diatonicSets can compared using standard relational operations ==, !=. Two diatonicSets equal (according ==) slots (Root, Signature, Alteration) exactly identical. Ordinal comparisons (e.g., >, <=) diatonicSets Signature .","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/diatonicSetS4.html"],"id":"coercion","dir":"Reference","previous_headings":"","what":"Coercion","title":"Tonal (diatonic) sets — diatonicSetS4","text":"humdrumR knows coerce several base-R atomic types diatonicSets. can done using function---e.g., (3, \"diatonicSet\")---intuitively using function diatonicSet(). Coercision methods defined integer: interpreted root major key numeric: rounded nearest integer intepreted root major key character: interpreted using humdrumRs regular expression dispatch system, explained fully .","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/distributions.html"],"dir":"Reference","previous_headings":"","what":"Distributions — distributions","title":"Distributions — distributions","text":"HUmdrumR ways ... count() function exactly like R's fundamental table() function, except 1) give special treatment humdrumR token() data 2) intuitive/simple argument names 3) makes easier combine/manipulate disparate output tables.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/distributions.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Distributions — distributions","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/distributions.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Distributions — distributions","text":"count() function essentially wrapper around base::table() function. However, token() class arguments treated like factors(), calling generating levels. assures , example, pitch data tabulated order pitch height, \"missing\" pitches counted zero. count() , default, count NA values present---want count NAs, specify na.rm = TRUE. can also tell count() exclude (count) arbitrary values provide vector exclude argument. count() always give names dimensions table creates. can specify names directly argument names, like count(Kern = kern(Token)); specify name, count() make name(s) based expression(s) tallying. (Note count() copy base::table()'s obtusely-named dnn deparse.level arguments.)","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/distributions.html"],"id":"manipulating-humdrum-tables","dir":"Reference","previous_headings":"","what":"Manipulating humdrum tables","title":"Distributions — distributions","text":"output count() special form R table, humdrumR.table. Given two humdrumR.tables, apply basic R operators (e.g., arithmetic, comparisons) row/column binding (cbind/rbind) humdrumR align tables dimension-names operation. means, two tables pitch data, one table includes specific pitch , can still add together bind matrix. See examples!","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/distributions.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Distributions — distributions","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/ditto.html"],"dir":"Reference","previous_headings":"","what":"Propagate data points to ","title":"Propagate data points to ","text":"ditto function allow \"fill\" null values vector non-null values earlier/later vector. default, \"forward,\" behavior fills null value previous (lower index) non-null value, . reverse argument can used cause \"backward\" filling, next (higher index) non-null value used. input begins (ends reverse == TRUE) null value, initial argument filled instead; defaults NA.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/ditto.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Propagate data points to ","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/ditto.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Propagate data points to ","text":"x vector. list, atomic, matrix, data.frame. null Defines elements needs filled. Defaults function(x) .na(x) | x == \".\". either logical vector (length(x) == length(null)), numeric vector positive indices, function , applied x returns appropriate logical/numeric vector. initial Padder beginning (end, reverse == TRUE) output, needed. Defaults NA. class x; must length 1. reverse Whether excecution order reversed. Defaults FALSE. Must singleton logical value: /switch. reverse == TRUE, \"non-null\" values coped overwrite null values earlier (lower indices) vector. groupby group data. vector list vectors; must length length(x). segment x delineated groupby vector(s) treated separately. margin vector giving dimensions function applied . Defaults 2 (across columns) matrix inputs. Must natural number(s). E.g., matrix 1 indicates rows, 2 indicates columns. x named dimnames, can character vector selecting dimension names. Must single character string.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/ditto.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Propagate data points to ","text":"values considered \"null\" can controlled using null argument. null argument can either logical vector length input (x) argument, numeric vector positive indices, function , applied x returns appropriate logical/numeric vector. values x null == FALSE copied forward/backwards replace adjacent vales null == TRUE. default, null function \\(x) .na(x) | x == '.', means NA values string \".\" \"null\", overwritten adjacent values. ditto methods defined data.frames matrices. data.frame method simply applies ditto column data.frame separately. matrices, ditto can applied across columns (margin == 2), rows (margin == 1), dimensions. ditto method humdrumR object simply applies ditto , default, selected field; thus ditto(humData) equivalent within(humData, newField <- ditto(.), dataTypes = 'Dd'). field argument can used indicated different field apply . result dittoing saved new field---newField argument can used control name new field.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/ditto.html"],"id":"grouping","dir":"Reference","previous_headings":"","what":"Grouping","title":"Propagate data points to ","text":"many cases want perform lagged calculations vector, across certain boundaries. example, vector includes data multiple pieces, want calculate melodic intervals pieces, within pieces. groupby argument indicates one, , grouping vectors, break x (input) argument groups. groupby vectors given, change vector indicates boundary. Value pairs cross groups treated beginning. Basically, using groupby argument function similar identical using tapply(x, groupby, laggedFunction, ...) using groupby expession call ().humdrumR. However, using groupby argument directly usually much faster, specially optimized functions. common use case humdrum data, looking \"melodies\" within spines. , want groupby = list(Piece, Spine, Path). fact, humdrumR () calls automatically feed three fields groupby arguments certain functions: mint, delta, sigma, lag, ditto, ioi, sumTies, hop, wort, wort.character. use delta call (), automatically calculate delta \"melodic\" way, within spine path piece. However, wanted, instance, calculate differences across spines (like harmonic intervals) manually set groupby = list(Piece, Record).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/ditto.html"],"id":"order","dir":"Reference","previous_headings":"","what":"Order","title":"Propagate data points to ","text":"performing lagged calculations, typically assume order values input vector (x) order want \"lag\" across. E.g., first element \"\" second element, \"\" third element, etc. [Humdrum tables][humTable] always ordered Piece > Piece > Spine > Path > Record > Stop. Thus, lagged calculations across fields humtable , default, \"melodic\": next element next element spine path. example, consider data: default order tokens (Token field) b c d e f. wanted instead lag across tokens harmonically (across records) need specifiy different order example, say orderby = list(Pice, Record, Spine)---lagged function interpret Token field d b e c f. another example, note Stop comes last order. consider happens stops data:","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/draw.html"],"dir":"Reference","previous_headings":"","what":"Visualize data — draw","title":"Visualize data — draw","text":"draw() function humdrumR's goto plotting function. draw() can make variety graphs, depending type data give . part, draw() simply stylish, easy use wrapper around base-R graphics functions plot(), barplot(), hist().","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/draw.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Visualize data — draw","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/draw.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Visualize data — draw","text":"draw() generic function, different plots depending data pass x y arguments. x y numeric: scatter plot. x numeric : histogram. y numeric : quantile plot. x table: barplot. y numeric, x character factor: violin plot. standard arguments base-R plots can used customize plots. See par() full list.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/duple.html"],"dir":"Reference","previous_headings":"","what":"Generate duple meters — duple","title":"Generate duple meters — duple","text":"function generates meter() objects representing duple meters. desired number duple levels controlled nlevels argument. span meter (.e., highest level) indicated measure argument. Finally, tactus argument indicates level (indexe highest lowest) tactus. default arguments build 4/4 meter levels ranging whole-notes sixteenth-notes, quarter-note tactus.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/duple.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Generate duple meters — duple","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/duple.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Generate duple meters — duple","text":"nlevels number duple levels. Must singleton, positive natural number measure duration top level meter. Must singleton numeric character value. parsed duration rhythmInterval(); failure parse leads error. tactus level tactus? Must singleton, positive natural number; must less equal nlevels.","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/duration.html"],"dir":"Reference","previous_headings":"","what":"Numeric (double) representation of durations — duration","title":"Numeric (double) representation of durations — duration","text":"Output numeric (real number). duration() applied humdrumR data class may use data's fields arguments. field names specified, first selectedField used x. quarters() applied humdrumR data class may use data's fields arguments. field names specified, first selectedField used x.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/duration.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Numeric (double) representation of durations — duration","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/duration.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Numeric (double) representation of durations — duration","text":"x input vector. x argument can (atomic) vector, rational (rhythmInterval), NULL. Must parsable rhythm infromation. ... Arguments passed rhythm parser. also two hidden (advanced) arguments can specify: memoize deparse (see details ). scale numeric rational value used output unit measurement. Defaults rational(1, 1). Must numeric rational. inPlace non-rhythm information retained output string? Defaults FALSE. Must singleton logical value: /switch. Defaults FALSE. singleton logical value, NA. See \"Grace notes\" section .","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/duration.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Numeric (double) representation of durations — duration","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/entropy.html"],"dir":"Reference","previous_headings":"","what":"Calculate Entropy or Information Content of variables — entropy","title":"Calculate Entropy or Information Content of variables — entropy","text":"Information content entropy fundamental concepts information theory, quantify amount information (\"surprise\") random variable. concepts closely related probability density/mass events: improbable events higher information content. probability observation maps information content; average information content variable entropy. Information content/entropy can calculated discrete probabilities continuous probabilities, humdrumR defines methods calculating .","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/entropy.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Calculate Entropy or Information Content of variables — entropy","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/entropy.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Calculate Entropy or Information Content of variables — entropy","text":"calculate information content entropy, must assume (estimate) probability distribution. HumdrumR uses R's standard table() density() functions estimate discrte continuous probability distributions respectively. Entropy average information content variable. entropy() function can accept either table() object (discrete variables), density() object (continuous variables). entropy() passed atomic vector, values vector treated observations random variable: numeric vectors, stats::density() function used estimate probability distribution random (continuous) variable, entropy computed density. atomic vectors, table() called tabulate discrete probability mass observed level, entropy computed table. ic() function accepts atomic vectors main (x) argument, must also provided distribution argument. default, distribution argument estimated using density() (numeric input) table() (input).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/enum.html"],"dir":"Reference","previous_headings":"","what":"Enumerate vector — enum","title":"Enumerate vector — enum","text":"function enumerates values input vector x, counting along length vector 1 length(x).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/enum.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Enumerate vector — enum","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/enum.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Enumerate vector — enum","text":"x input vector enumrate. Must vector (either atomic, list()). inPlace numbers pasted onto original vector? Defaults TRUE. Must singleton logical value: /switch. sep Separator numbers vector. Defaults \":\". Can empty string (\"\"), separator desired.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/enum.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Enumerate vector — enum","text":"inPlace = TRUE (x atomic), original vector returned counts pasted front value, separated sep. inPlace = FALSE, new integer vector returned, identical calling seq_along(x).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/enum.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Enumerate vector — enum","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/evaluatingExpressions.html"],"dir":"Reference","previous_headings":"","what":"","title":"","text":"\"Evaluating\" \"Expressions\" \"Environments\"?","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/evaluatingExpressions.html"],"id":"expressions","dir":"Reference","previous_headings":"","what":"Expressions","title":"","text":"term \"expression\" just fancy way describing bit (valid) code can parsed evaluated (executed) R. example, following bits code valid R \"expressions\": 2 + 2 sqrt(2) x <- (1:10)^2 log(x, base = 10) |> mean(na.rm = TRUE) sum((x - mean(x))^2) Expressions frequently built expressions: 2 + 2 expression, sqrt(2 + 2) expression. { } operators used group valid expressions one bigger expression. can also use ; write two expressions line, like x <- 2; log(x^2)","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/evaluatingExpressions.html"],"id":"evaluation","dir":"Reference","previous_headings":"","what":"Evaluation","title":"","text":"expression like sum((x - mean(x))^2) just sequence characters something . call \"evaluating\" expression. exactly R \"interpreter\" \"run\" R code. R, evaluated expression always \"returns\" \"result\"---value, like number, character string, data. expressions might \"return\" NULL result, still result! multi-line expression, like {sqrt(2); 2 + 2} result overall expression simply result last expression---last two examples return result 4.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/evaluatingExpressions.html"],"id":"environment","dir":"Reference","previous_headings":"","what":"Environment","title":"","text":"evaluate expression, R must look variable names expression current \"environment\"; example, expression sum((x - mean(x))^2) includes variables sum, mean, x. variables sum mean base R functions, R find problem (unless remove ). However, x generally going \"defined\" unless defined . try evaluate sum((x - mean(x))^2), get error x defined. many different \"environments\" R, R search variables: run R, can save variables global environment; R-packages environments; every time call function, function environment inside ---function can \"see\" arguments, variable save inside function \"visible\" outside function. One greatest features R can often tell R evaluate expression using specific data.frame environment, can use column names data variables. humdrumR () (tidyverse equivalents) use functionality lot!","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/evaluatingExpressions.html"],"id":"incomplete-expressions","dir":"Reference","previous_headings":"","what":"Incomplete expressions","title":"","text":"One annoying things can happen R try running something kind just hangs, getting stuck nothing happening matter many times press enter. usually (accidentally) provided R incomplete expression. example, 2 + incomplete expression---+ needs number ! Failing properly paired parentheses often result incomplete expressions: example, mean(sqrt(log(x)) incomplete expression!","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/expand.html"],"dir":"Reference","previous_headings":"","what":"Expand numbers outwards from zero — expand","title":"Expand numbers outwards from zero — expand","text":"Expand complement base R rounding functions, particularly trunc.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/expand.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Expand numbers outwards from zero — expand","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/expand.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Expand numbers outwards from zero — expand","text":"four base R functions---round, ceiling, floor, trunc---follow different logic round real numbers ingegers: round: round nearest integer either direction. floor: round downward towards negative infinity. Negative numbers rounded \"negative\" numbers. ceiling: round upward towards infinity. Negative numbers rounded \"less negative\" numbers. trunc: round \"inward\" towards zero. Negative numbers rounded \"less negative\" numbers, positive numbers still rounded downwards \"less positive\" numbers. Just ceiling compliments floor, humdrumR function expand acts compliment trunc: expand rounds \"outward\" away zero. Negative numbers rounded \"negative\" numbers positive numbers rounded \"positive\" numbers. table explains better words:","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/expandPaths.html"],"dir":"Reference","previous_headings":"","what":"Expand paths into new spines — expandPaths","title":"Expand paths into new spines — expandPaths","text":"function takes humdrumR object \"expands\" content spine paths filling content parent path(s).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/expandPaths.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Expand paths into new spines — expandPaths","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/expandPaths.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Expand paths into new spines — expandPaths","text":"asSpines paths expanded new spines? Defaults TRUE. Must singleton logical value: /switch. TRUE, expanded paths copied new spines (shifting higher spines needed). humdrumR HumdrumR data. Must humdrumR data object.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/expandPaths.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Expand paths into new spines — expandPaths","text":"example, imagine humdrum representation eight-measure piano score, annotator included ossia passage seventh measure. want simply ignore ossia passage, can just specify subset() Path == 0. want study ossia passage, can grab subset() Path == 1. However, want study ossia performed, ossia measure swapped measure 7, still using measures 1-6 8 main path? expandPaths() help us just : expandPaths() copy contents measure 1-6 8 second path , asSpines = TRUE, copy path new spine. can treat new \"full\" path/spine just like path/spine.","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/figuredBass.html"],"dir":"Reference","previous_headings":"","what":"Figured bass representation of harmony — figuredBass","title":"Figured bass representation of harmony — figuredBass","text":"function outputs figured bass representation tertian harmony.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/figuredBass.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Figured bass representation of harmony — figuredBass","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/figuredBass.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Figured bass representation of harmony — figuredBass","text":"x atomic vector. x argument can (atomic) vectors Key diatonic key used parser, deparser, transposer. Defaults NULL, interpreted C major. Must diatonicSet something coercable diatonicSet; must either length 1 length(x). transposeArgs optional list arguments passed transpose() call. Defaults empty list(). Must list named arguments transpose(). parseArgs optional list arguments chord parser. Defaults empty list(). Must list named arguments chord parser. inPlace non-chord information retained output string. Defaults FALSE. Must singleton logical value: /switch.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/figuredBass.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Figured bass representation of harmony — figuredBass","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/freq.html"],"dir":"Reference","previous_headings":"","what":"Translate pitches to frequency (Hz) — freq","title":"Translate pitches to frequency (Hz) — freq","text":"freq() applied humdrumR data class may use data's fields arguments. field names specified, first selectedField used x.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/freq.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Translate pitches to frequency (Hz) — freq","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/freq.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Translate pitches to frequency (Hz) — freq","text":"x Input data parse pitch information. x argument can (atomic) vector, tonalInterval, NULL. ... Arguments passed pitch deparser. also two hidden (advanced) arguments can specify: memoize deparse (see details ). generic \"specific\" pitch information (accidentals qualites) discarded? Defaults FALSE. Must singleton logical value: /switch. simple \"compound\" pitch information (octave/contour) discarded? Defaults FALSE. Must singleton logical value: /switch. Key input Key used parser, deparser, transposer. Defaults NULL. Must diatonicSet something coercable diatonicSet; must either length 1 length(x) tonalHarmonic frequency \"tonal harmonic\" (perfect 12th). Defaults 2^(19/12), 12-tone-equal-temperament 12th. Must single number. Pythagorean tuning, set tonalHarmonic = 3. frequency.reference reference frequency. Defaults 440. Must single number. transposeArgs optional list arguments passed special transpose() call. Defaults empty list(). Must list named arguments transpose(). parseArgs optional list arguments passed pitch parser. Defaults empty list(). Must list named arguments pitch parser. inPlace non-pitch information retained output string. Defaults FALSE. Must singleton logical value: /switch. argument effect input (x argument) character strings, extra, non-pitch information input strings \"besides\" pitch information. , inPlace = TRUE, output placed output string beside original non-pitch information. inPlace = FALSE, pitch output information returned (details ). frequency.reference.note note reference.frequency tuned . Defaults \"\". Can parsable pitch representation; must length 1.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/freq.html"],"id":"basic-pitch-arguments","dir":"Reference","previous_headings":"","what":"Basic pitch arguments","title":"Translate pitches to frequency (Hz) — freq","text":"pitch function standard arguments control details output. important generic simple arguments, allow control type pitch information returned.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/freq.html"],"id":"generic-vs-specific","dir":"Reference","previous_headings":"","what":"Generic vs Specific","title":"Translate pitches to frequency (Hz) — freq","text":"generic = TRUE, specific pitch information (accidentals qualities) omitted output. alternative way controlling functionality, can use specific argument, specific == !generic. case atonal functions, \"generic\" version pitch output: example, semits('c#', generic = TRUE) return 0, \"generic\" version C# C, corresponds 0. However, note generic version pitch follows key, semits('c#', generic = TRUE, Key = ':') return 1!","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/freq.html"],"id":"simple-vs-compound","dir":"Reference","previous_headings":"","what":"Simple vs Compound","title":"Translate pitches to frequency (Hz) — freq","text":"simple = TRUE, compound pitch information (octave contour) omitted output. alternative way controlling functionality, can use compound argument ,compound == !simple. actually one way might want divide compound intervals simple octave parts. example, might like call output -M2 (descending major 2nd) +m7 (ascending minor 7th octave ). functionality can controlled octave.round argument: see pitch deparsing documentation.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/freq.html"],"id":"key","dir":"Reference","previous_headings":"","what":"Key","title":"Translate pitches to frequency (Hz) — freq","text":"Key argument must diatonicSet, something can parsed one. Key argument passed parser, deparser, transpose---unless alternate Key passed transposeArgs parseArgs. Various deparsing options use Key argument; example, use implicitSpecies (see advanced parsing section) dependent Key. use pitch function within special call withinHumdrum, humdrumR automatically pass Key field humdrum data function---means, cases, need explicitly anything Key argument! (want happen, need explicitly specify Key argument, Key = NULL.)","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/freq.html"],"id":"parse-arguments","dir":"Reference","previous_headings":"","what":"Parse arguments","title":"Translate pitches to frequency (Hz) — freq","text":"parseArgs argument must list() (named) arguments passed input parser. example, input representation uses \"X\" represent double sharps, specify kern('CX5', parseArgs = list(doublesharp = 'X')) get correct result (\"cc##\"). convenient shorthand, \"syntactic sugar,\" can specify parseArgs alternate way: Simply input parse(args...) unnamed argument pitch function. example, can get exact result typing kern('CX5', parse(doublesharp = 'X')).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/freq.html"],"id":"transpose-arguments","dir":"Reference","previous_headings":"","what":"Transpose arguments","title":"Translate pitches to frequency (Hz) — freq","text":"transposeArgs argument must list() (named) arguments passed internal call transpose(), allowing us easily transpose pitch information. example, type kern(c('C', 'D', 'E'), transposeArgs = list(= 'M9')) can get output c('d', 'e', 'f#'). possible transpose args : (tonalInterval, length == 1 | length == (x)) (diatonicSet, length == 1 | length == (x)) (diatonicSet, length == 1 | length == (x)) real (logical, length == 1) transposition real tonal? relative (logical, length == 1) key-wise transposition based relative parallel keys? convenient shorthand, \"syntactic sugar,\" can specify transposeArgs alternate way: Simply input transpose(args...) unnamed argument pitch function. example, can get exact result typing kern(c('C', 'D', 'E'), transpose(= 'M9')).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/freq.html"],"id":"transposing-by-interval","dir":"Reference","previous_headings":"","what":"Transposing by interval","title":"Translate pitches to frequency (Hz) — freq","text":"calling transpose() directly, argument can anything coercable tonalInterval, output transposed amount. real = FALSE, tonal transposition (within Key) performed. details transposition behavior, check transpose() docs.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/freq.html"],"id":"transposing-by-key","dir":"Reference","previous_headings":"","what":"Transposing by key","title":"Translate pitches to frequency (Hz) — freq","text":"Another way transposing specifying input (\"\") key output (\"\") key. default, Key argument passed transpose , nothing actually happens. Thus, specify either key key, transposition happen /key Key. course, specify transposition happen keys specify. use pitch function within special call withinHumdrum, humdrumR automatically pass Key field humdrum data function. specify key, Key field passed transpose key, result, pitches input transposed whatever keys target () key! real relative arguments give special control key-wise transposition works, check transpose() docs details!","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/freq.html"],"id":"in-place-parsing","dir":"Reference","previous_headings":"","what":"In-place parsing","title":"Translate pitches to frequency (Hz) — freq","text":"humdrum data, character strings often encoded multiple pieces musical information right besides : example, **kern data might include tokens like \"4.ee-[. humdrumR parser (tonalInterval) automatically \"pull \" pitch information within strings, can find using appropriate known regular expressions. example, pitch('4.ee-[') returns Eb5. However, pitch functions (like pitch() kern()) option keep \"extra\" information return result \"place\"---.e., embedded right found input string. controlled inPlace argument, FALSE default. , pitch('4.ee-[', inPlace = TRUE) return 4.Eb5[---keeping \"4.\" \"[\". (obviously works input string, numeric!) Note inPlace = TRUE force functions like semits, normally return numeric values, return character strings input character string.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/freq.html"],"id":"pitch-gamut-levels","dir":"Reference","previous_headings":"","what":"Pitch-Gamut Levels","title":"Translate pitches to frequency (Hz) — freq","text":"table() automatically generate factor levels pitch data using gamut() function. makes sure tabulated data sorted logical order, includes missing pitches. simple/complex generic/specific arguments automatically passed gamut(); additional arguments can passed gamut using gamutArgs = list(...), syntactic sugar gamut(...). (Read gamut() docs explanation gamut generation.) feature used control table layout pitch data, well assure consistent tables grouping data. inPlace = TRUE special tabulation occur.","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/freq.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Translate pitches to frequency (Hz) — freq","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/gamut.html"],"dir":"Reference","previous_headings":"","what":"Make a pitch gamut — gamut","title":"Make a pitch gamut — gamut","text":"function generates gamut: ordered range notes used music. used generate factor() levels pitch functions. output format gamut controlled deparser argument (function) deparseArgs passed , defaulting kern().","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/gamut.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Make a pitch gamut — gamut","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/gamut.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Make a pitch gamut — gamut","text":"generic ***gamut include generic intervals? Defaults FALSE. Must singleton logical value: /switch. simple gamut constrained one octave? Defaults FALSE. Must singleton logical value: /switch. reference optional reference vector base gamut . Defaults NULL. Must either NULL, tonalInterval(), integer, character vector. vector parsed pitch. parsed pitch, ignored. deparser pitch function format output. Defaults kern(). Must pitch function.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/gamut.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Make a pitch gamut — gamut","text":"gamut produced based two criteria: range line--fifths include, range octaves include? ranges can controlled directly min.octave, max.octave, min.lof, max.lof arguments, corresponding ranges min.octave:max.octave min.log:max.log respectively. arguments missing (default), ranges default values based simple/compound generic/specific arguments. default ranges : Line--fifths: generic = TRUE, -1:5 (F B) generic = FALSE, -4:7 (Ab C#) Octaves: simple = TRUE, 0:0 (one octave ). simple = FALSE, -1:1. tints argument provide (NULL), tints parsed pitch data line--fifth octave ranges data used set gamut ranges. assures values appear tint always make gamut. However, min.octave, max.octave, min.lof, max.lof present, override ranges tint; can used exclude values, even appear tint.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/grid.html"],"dir":"Reference","previous_headings":"","what":"Drum-machine grid representation of rhythmic durations. — grid","title":"Drum-machine grid representation of rhythmic durations. — grid","text":"functions read write sequencer-like representation rhythm. Rhythms represented either strings vectors \"\"/\"\" values, indicate rhythmic onsets occur regular time grid. example, \"X00X00X0\" c(1, 0, 0, 1, 0, 0, 1, 0). grid() applied humdrumR data class may use data's fields arguments. field names specified, first selectedField used x.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/grid.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Drum-machine grid representation of rhythmic durations. — grid","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/grid.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Drum-machine grid representation of rhythmic durations. — grid","text":"x input vector. x argument can (atomic) vector, rational (rhythmInterval), NULL. Must parsable rhythm infromation. ... Argments passed deparser. scale numeric rational value used output unit measurement. Defaults rational(1, 1). Must numeric rational. inPlace non-rhythm information retained output string? Defaults FALSE. Must singleton logical value: /switch. Defaults FALSE. singleton logical value, NA. See \"Grace notes\" section . tick unit grid? Defaults sixteenth-note (fromgrid()) tatum() x argument. Must parsed rhythm rhythmInterval(). , represents onsets (attacks) rests grid? Default \"X\" \"O\" respectively. Must singleton atomic values. collapse output collapsed single string per measure? Defaults TRUE. Must singleton logical value: /switch. sep Separator ticks collapsed output. Defaults empty string (separator). Must singleton character string. deparser output representation returned? Defaults recip(). Must function accepts rational() numbers.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/grid.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Drum-machine grid representation of rhythmic durations. — grid","text":"grid() function, fully vectorized rhythm function, translates individual durations grid-representation strings. example, 16th-note grid, dotted eighth-note represented \"XOO\". fromgrid() togrid() functions create/read fuller grid representations, representing whole rhythms : case, length input output .","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/grid.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Drum-machine grid representation of rhythmic durations. — grid","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/groupHumdrum.html"],"dir":"Reference","previous_headings":"","what":"Divide humdrumR data into groups — groupHumdrum","title":"Divide humdrumR data into groups — groupHumdrum","text":"group_by() method humdrumR objects used define grouping factors data fields. Note groups created grouping factors 1) necessarily contiguous 2) always exhaustively partition data. context() function can used, alternative, generate groups (\"windows\") always contiguous /exclude data. ungroup() function removes grouping humdrumR data object. groups created, groups() function can used tabulate number tokens group, find indices humdrum table.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/groupHumdrum.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Divide humdrumR data into groups — groupHumdrum","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/groupHumdrum.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Divide humdrumR data into groups — groupHumdrum","text":".data, x, humdrumR HumdrumR data. Must humdrumR data object. ... number expressions evaluate. expressions can reference fields() data name, well variables outside data. expressions named, names used name new fields. .add groups added existing groups? Defaults TRUE. Must single logical value: /switch. dataTypes types humdrum records include. Defaults \"D\". Must single character string. Legal values 'G', 'L', '', 'M', 'D', 'd' combination (e.g., \"LIM\"). (See humdrum table documentation Fields section explanation.)","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/groupHumdrum.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Divide humdrumR data into groups — groupHumdrum","text":"group_by() method humdrumR objects takes number expressions ... arguments. expressions may simply character strings symbols indicating existing fields() data--- example, group_by(Piece, Spine). However, expressions can also arbitrary \"expression arguments\" passed within() generate new fields grouping. example, group spines even odd groups group_by(Spine %% 2). group_by() function returns new humdrumR data object grouping fields activated. grouping fields, number groups, show humdrumR data printed. groups() can used gather information groups: group() returns data.table one row representing group, value grouping field indicated, one columns indicating number tokens type group (desired types indicated dataTypes argument). default, call group_by.humdrumR() adds groups groups already existing data. .add = FALSE, preexisting groups removed creating new groups. Groups can explicitly removed using ungroup(). .add = TRUE, call group_by() computes new fields using preexisting groups, just like normal call within(). means can, cases, create different groupings depending order create groups. example, imagine want divide piece data two groups: pitches higher average one group pitches lower average . Consider humData corpus numeric Semits field, run two different calls: first call, first group Piece, divide piece piece's average. second example, divide corpus two halves based overall (cross-piece) average, divide pieces.","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/groupHumdrum.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Divide humdrumR data into groups — groupHumdrum","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/groupingFactors.html"],"dir":"Reference","previous_headings":"","what":"What are ","title":"What are ","text":"\"grouping factors\"?","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/groupingFactors.html"],"id":"grouping-and-split-apply-combine-explained","dir":"Reference","previous_headings":"","what":"Grouping and \"split-apply-combine\" explained","title":"What are ","text":"concept \"grouping factors\" widely used R, allowing us quickly split datasets (vectors data.frames) subgroups, work subgroups independent (apply functions ), recombine needed. Various R functions specify \"grouping factors\" confusing variety subtly different ways, usually function arguments named things like INDEX, INDICES, f, , groupby. humdrumR, adopt tidyverse dplyr approach, using group_by() function (/.argument). atomic vector least two unique values, \"levels\", can used grouping factor---generally, grouping vectors coerced factors. unique level grouping vector/factor represents single group. vector, data.frame length/height grouping factor can broken groups, taking indices grouping factor equals group turn. Since generally try work data.frames, definition contain bunch vectors length, can use vector/column data.frame group vectors, rows whole data.frame. functions allow specifiy multiple grouping factors/vectors (long length). groups defined every unique combination elements vectors. , example, use vectors c('', '', '', 'B', 'B', 'B') c(1, 1, 2, 2, 3, 3) grouping factors, get four groups levels 1A, 2A, 2B, 3B. Note groups created grouping factors neccessarily contiguous. use vector like c(1, 1, 2, 2, 1, 1) grouping factor, get two groups: 1 2. 1 group include 1st, 2nd, 5th, 6th indices, even though separated grouping factor. want contiguous groups must make . humdrumR function segments() can used generate strictly contiguous grouping factors. example, segments(c(1, 1, 2, 2, 1, 1)) return c(1, 1, 2, 2, 3, 3).","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/harm.html"],"dir":"Reference","previous_headings":"","what":"Roman numeral representations of harmony — harm","title":"Roman numeral representations of harmony — harm","text":"functions output roman numeral representations tertian harmony. **harm representation widely used standard roman numeral notation humdrum data. Unlike traditional roman numerals, **harm indicate inversions figuration, using lowercase letters (, b, c, etc.) instead. roman function however output (relatively) traditional figures. output format roman() similar **harm. main difference inversions indicated using traditional figures , like 653, instead **harm's simpler system (using letters). , example, take input E7/B key major, get:","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/harm.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Roman numeral representations of harmony — harm","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/harm.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Roman numeral representations of harmony — harm","text":"x atomic vector. x argument can (atomic) vectors Key diatonic key used parser, deparser, transposer. Defaults NULL, interpreted C major. Must diatonicSet something coercable diatonicSet; must either length 1 length(x). transposeArgs optional list arguments passed transpose() call. Defaults empty list(). Must list named arguments transpose(). parseArgs optional list arguments chord parser. Defaults empty list(). Must list named arguments chord parser. inPlace non-chord information retained output string. Defaults FALSE. Must singleton logical value: /switch.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/harm.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Roman numeral representations of harmony — harm","text":"harm('E7/B', Key = ':') => \"V7c\" roman('E7/B', Key = ':') => \"V643\"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/harm.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Roman numeral representations of harmony — harm","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/helmholtz.html"],"dir":"Reference","previous_headings":"","what":"Helmholtz pitch representation — helmholtz","title":"Helmholtz pitch representation — helmholtz","text":"Helmholtz notation helmholtz() applied humdrumR data class may use data's fields arguments. field names specified, first selectedField used x.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/helmholtz.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Helmholtz pitch representation — helmholtz","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/helmholtz.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Helmholtz pitch representation — helmholtz","text":"x Input data parse pitch information. x argument can (atomic) vector, tonalInterval, NULL. ... Arguments passed pitch deparser. also two hidden (advanced) arguments can specify: memoize deparse (see details ). generic \"specific\" pitch information (accidentals qualites) discarded? Defaults FALSE. Must singleton logical value: /switch. simple \"compound\" pitch information (octave/contour) discarded? Defaults FALSE. Must singleton logical value: /switch. Key input Key used parser, deparser, transposer. Defaults NULL. Must diatonicSet something coercable diatonicSet; must either length 1 length(x) transposeArgs optional list arguments passed special transpose() call. Defaults empty list(). Must list named arguments transpose(). parseArgs optional list arguments passed pitch parser. Defaults empty list(). Must list named arguments pitch parser. inPlace non-pitch information retained output string. Defaults FALSE. Must singleton logical value: /switch. argument effect input (x argument) character strings, extra, non-pitch information input strings \"besides\" pitch information. , inPlace = TRUE, output placed output string beside original non-pitch information. inPlace = FALSE, pitch output information returned (details ).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/helmholtz.html"],"id":"basic-pitch-arguments","dir":"Reference","previous_headings":"","what":"Basic pitch arguments","title":"Helmholtz pitch representation — helmholtz","text":"pitch function standard arguments control details output. important generic simple arguments, allow control type pitch information returned.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/helmholtz.html"],"id":"generic-vs-specific","dir":"Reference","previous_headings":"","what":"Generic vs Specific","title":"Helmholtz pitch representation — helmholtz","text":"generic = TRUE, specific pitch information (accidentals qualities) omitted output. alternative way controlling functionality, can use specific argument, specific == !generic. case atonal functions, \"generic\" version pitch output: example, semits('c#', generic = TRUE) return 0, \"generic\" version C# C, corresponds 0. However, note generic version pitch follows key, semits('c#', generic = TRUE, Key = ':') return 1!","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/helmholtz.html"],"id":"simple-vs-compound","dir":"Reference","previous_headings":"","what":"Simple vs Compound","title":"Helmholtz pitch representation — helmholtz","text":"simple = TRUE, compound pitch information (octave contour) omitted output. alternative way controlling functionality, can use compound argument ,compound == !simple. actually one way might want divide compound intervals simple octave parts. example, might like call output -M2 (descending major 2nd) +m7 (ascending minor 7th octave ). functionality can controlled octave.round argument: see pitch deparsing documentation.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/helmholtz.html"],"id":"key","dir":"Reference","previous_headings":"","what":"Key","title":"Helmholtz pitch representation — helmholtz","text":"Key argument must diatonicSet, something can parsed one. Key argument passed parser, deparser, transpose---unless alternate Key passed transposeArgs parseArgs. Various deparsing options use Key argument; example, use implicitSpecies (see advanced parsing section) dependent Key. use pitch function within special call withinHumdrum, humdrumR automatically pass Key field humdrum data function---means, cases, need explicitly anything Key argument! (want happen, need explicitly specify Key argument, Key = NULL.)","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/helmholtz.html"],"id":"parse-arguments","dir":"Reference","previous_headings":"","what":"Parse arguments","title":"Helmholtz pitch representation — helmholtz","text":"parseArgs argument must list() (named) arguments passed input parser. example, input representation uses \"X\" represent double sharps, specify kern('CX5', parseArgs = list(doublesharp = 'X')) get correct result (\"cc##\"). convenient shorthand, \"syntactic sugar,\" can specify parseArgs alternate way: Simply input parse(args...) unnamed argument pitch function. example, can get exact result typing kern('CX5', parse(doublesharp = 'X')).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/helmholtz.html"],"id":"transpose-arguments","dir":"Reference","previous_headings":"","what":"Transpose arguments","title":"Helmholtz pitch representation — helmholtz","text":"transposeArgs argument must list() (named) arguments passed internal call transpose(), allowing us easily transpose pitch information. example, type kern(c('C', 'D', 'E'), transposeArgs = list(= 'M9')) can get output c('d', 'e', 'f#'). possible transpose args : (tonalInterval, length == 1 | length == (x)) (diatonicSet, length == 1 | length == (x)) (diatonicSet, length == 1 | length == (x)) real (logical, length == 1) transposition real tonal? relative (logical, length == 1) key-wise transposition based relative parallel keys? convenient shorthand, \"syntactic sugar,\" can specify transposeArgs alternate way: Simply input transpose(args...) unnamed argument pitch function. example, can get exact result typing kern(c('C', 'D', 'E'), transpose(= 'M9')).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/helmholtz.html"],"id":"transposing-by-interval","dir":"Reference","previous_headings":"","what":"Transposing by interval","title":"Helmholtz pitch representation — helmholtz","text":"calling transpose() directly, argument can anything coercable tonalInterval, output transposed amount. real = FALSE, tonal transposition (within Key) performed. details transposition behavior, check transpose() docs.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/helmholtz.html"],"id":"transposing-by-key","dir":"Reference","previous_headings":"","what":"Transposing by key","title":"Helmholtz pitch representation — helmholtz","text":"Another way transposing specifying input (\"\") key output (\"\") key. default, Key argument passed transpose , nothing actually happens. Thus, specify either key key, transposition happen /key Key. course, specify transposition happen keys specify. use pitch function within special call withinHumdrum, humdrumR automatically pass Key field humdrum data function. specify key, Key field passed transpose key, result, pitches input transposed whatever keys target () key! real relative arguments give special control key-wise transposition works, check transpose() docs details!","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/helmholtz.html"],"id":"in-place-parsing","dir":"Reference","previous_headings":"","what":"In-place parsing","title":"Helmholtz pitch representation — helmholtz","text":"humdrum data, character strings often encoded multiple pieces musical information right besides : example, **kern data might include tokens like \"4.ee-[. humdrumR parser (tonalInterval) automatically \"pull \" pitch information within strings, can find using appropriate known regular expressions. example, pitch('4.ee-[') returns Eb5. However, pitch functions (like pitch() kern()) option keep \"extra\" information return result \"place\"---.e., embedded right found input string. controlled inPlace argument, FALSE default. , pitch('4.ee-[', inPlace = TRUE) return 4.Eb5[---keeping \"4.\" \"[\". (obviously works input string, numeric!) Note inPlace = TRUE force functions like semits, normally return numeric values, return character strings input character string.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/helmholtz.html"],"id":"pitch-gamut-levels","dir":"Reference","previous_headings":"","what":"Pitch-Gamut Levels","title":"Helmholtz pitch representation — helmholtz","text":"table() automatically generate factor levels pitch data using gamut() function. makes sure tabulated data sorted logical order, includes missing pitches. simple/complex generic/specific arguments automatically passed gamut(); additional arguments can passed gamut using gamutArgs = list(...), syntactic sugar gamut(...). (Read gamut() docs explanation gamut generation.) feature used control table layout pitch data, well assure consistent tables grouping data. inPlace = TRUE special tabulation occur.","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/helmholtz.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Helmholtz pitch representation — helmholtz","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/hop.html"],"dir":"Reference","previous_headings":"","what":"Generate regular sequence ","title":"Generate regular sequence ","text":"hop() similar base R's seq(), additional features, including special sugar used humdrumR's context() command. hop() used create customizable sequences indices vector; example, want index every third value vector. useful , used context(), defining start points \"rolling-window\" analyses along vector; \"hop size\" gap start window, defined hop()'s argument.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/hop.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Generate regular sequence ","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/hop.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Generate regular sequence ","text":"along.vector want indices \"hop\" along. Must vector (either atomic, list()). pattern \"hops\" use. Defaults 1: returning indices :. Must one whole numbers. sum() must non-zero. start sequence. Defaults 1: starting first index. Must either single natural number, single character string, logical vector length along.. character-string input treated regular expression, matched along.using grepl() generate logical vector. index first TRUE used. end sequence. Defaults NULL. Must either NULL, single natural number, single character string, logical vector length along.. NULL, set last index along.(group groupby). character-string input treated regular expression, matched along.using grepl() generate logical vector. index last TRUE used. value indices returned logical TRUEs? Defaults FALSE. Must singleton logical value; /switch. groupby Optional vectors group hop sequences within. Defaults empty list(). Must list(), either empty contains vectors length along.. calls /within.humdrumR, groupby passed list(Piece, Spine, Path) default.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/hop.html"],"id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Generate regular sequence ","text":"default, hop() returns integer vector, appropriates indices along.vector. However, two options: logical = TRUE, indices returned logical vector, length along., TRUE values indicating indices. Note ordering output (due mix positive negative values argument) lost. value = TRUE, actual indixed elements along.vector returned: Thus, hop(myvector, ..., value = TRUE) simply myvector[hop(myvector, ...)]. value = TRUE, logical argument ignored.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/hop.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Generate regular sequence ","text":"hop() similar arguments base::seq(), focused along.argument, vector like generate indices . simply call hop(myvector), output 1:length(myvector). argument can used specify different \"hop\" pattern: = 2 get every index, 1, 3, 5, 7, etc. Unlike base::seq(), hop()'s argument can vector numbers, allowing specify pattern hops. example, = c(2, 3) first hop 2, hop 3, repeat---output 1, 3, 6, 8, 11, 13, etc. pattern can comprised negative numbers, mix negative positive numbers. mixes negative positive numbers, pattern can hop , climbs. example, go two, one, repeat using = c(2,-1). pattern overall (sums) negative, argument must greater argument (see next section); pattern sums zero, error occurs pattern never end! pattern changes directions, possible pattern hop outside bounds vector; happens, outside indices return NA.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/hop.html"],"id":"starting-and-ending","dir":"Reference","previous_headings":"","what":"Starting and Ending","title":"Generate regular sequence ","text":"default, hop() builds indices 1 end along.vector. arguments can used control . Either argument can simply natural number, indicating start end output sequences. (NULL, set length(along.).) alternate approach provide either argument single character string, treated regular expression matched along., logical vector length along.. first match/TRUE used index last match/TRUE index. means can say things like = Record == 33 within() call. argument overall (sums) positive, must less . argument overall (sums) negative, must greater . pattern ever actually actual index---perhaps jumping --- output stops pass .","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/hop.html"],"id":"grouping","dir":"Reference","previous_headings":"","what":"Grouping","title":"Generate regular sequence ","text":"many cases want along vectors, across certain boundaries. example, want even numbered indices, can set = 2 = 2. However, vector includes data multiple pieces, pieces odd number data points, \"even\" sequence end hitting odd numbers pieces. get around , groupby argument indicates one, , grouping vectors, break x (input) argument groups. groupby vectors given, change vector indicates boundary. grouped segement along.treated just like separate call hop(); example, = 2, hop sequence start second index group. However, output indices still represent original along.indices. Since hop() usually used context() create rolling windows within musical parts, want typically want apply hop() using groupby = list(Piece, Spine, Path). fact, humdrumR () calls automatically feed three fields groupby arguments hop(). use hop() call (), automatically generate hop sequence \"melodic\" way, within spine path piece.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/hop.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Generate regular sequence ","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/humCoercion.html"],"dir":"Reference","previous_headings":"","what":"humdrumR coercion — humCoercion","title":"humdrumR coercion — humCoercion","text":"Many users may wish work humdrum data, without rely humdrumR's ().humdrumR functionality. Rather, like just get \"normal\" R objects humdrum data. humdrumR defines number functions/methods \"coercing\" humdrum data basic R data types.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/humCoercion.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"humdrumR coercion — humCoercion","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/humCoercion.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"humdrumR coercion — humCoercion","text":"mode desired output class. Defaults \"\". Must single character string naming atomic vector type coerce output (.e., logical numeric). set \"\", output type simply whatever type selected field . humdrumR HumdrumR data. Must humdrumR data object. dataTypes types humdrum record(s) include. Defaults \"GLIMDd\" .lines() .matrix(); \"Dd\" .data.frame(); \"LIMDd\" .matrices() .data.frames(). Must single character string. Legal values 'G', 'L', '', 'M', 'D', 'd' combination (e.g., \"LIM\"). (See humdrum table documentation explanation.) padPaths Determines spine-paths aligned output. Defaults \"dont\" .lines(); \"corpus\" .matrix() .data.frame(); \"piece\" .matrices() .data.frames() Must single character string, \"corpus\", \"piece\", \"dont\". See details explanation. padder Used fill differences number columns files /spine paths. Defaults NA. Must single atomic value. sep Separator place columns collapsed lines. Defaults \"\\t\" (tab). Must single character string.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/humCoercion.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"humdrumR coercion — humCoercion","text":"Generally, coercion works evaluating humdrumR object's selected fields forcing result atomic vector. multiple field selected, pasted together, separated \", \". field atomic (like list, lm object), concise representation list object class printed. .vector(humdrumR) additional option coercing resulting vector particular type using mode argument. .matrix(humdrumR) method take things step putting evaluated fields two-dimensional matrix, rows representing records columns indicating spine paths (see Padding section ). .data.frame(humdrumR) first calls .matrix converts matrix data.frame. Note .matrix(humdrumR) places entire corpus object one matrix, even multiple pieces. contrast, plural .matrices .data.frames call respective singular versions separately individual file humdrumR corpus return list. row names matrix/data.frame(s) consist two integer values, separated ., representing: Piece.Record. .lines function converts humdrumR object character vector text lines, columns separated sep argument (defaults \"\\t\"), just see humdrum-syntax file. line single row .matrix.humdrumR, padded values right side removed. matrix's Piece.Record row names preserved lines' names. Note multiple-stop token (Stop > 1L) incorporated two dimensional matrix/data.frame. Thus, .matrix(humdrumR) calls collapseStops(collapseAtomic = TRUE, sep = \" \") humdrumR object creating matrix.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/humCoercion.html"],"id":"padding","dir":"Reference","previous_headings":"","what":"Padding","title":"humdrumR coercion — humCoercion","text":"Different pieces single humdrumR object often differ number spines /spine paths contain. squish two dimensional object (matrix data.frame) must necessarily padded number columns. (Global comments---actually NA spines---also padded, placing record column 1.) pad argument single atomic value used pad matrix. Another consideration behavior spine paths. humdrum syntax, spine path leftward spine \"bumps\" data higher spines new columns, example: beginning end file, second column holds data second spine. However, middle file, second column holds data second spine path first spine. make spine structure clearer, .matrix(humdrumR) option pad spine paths. example, using \"_\" pad argument: aspect matrix padding behavior can controlled padPaths argument, three possible values/behaviors: \"corpus\": Paths padded spine-paths across pieces corpus align columns. even one file spine path, files padded spines stay aligned. default behavior .matrix(humdrumR). \"piece\": Paths padded, within piece. spines/paths different pieces may align. \"dont\": Paths padded .","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/humMerge.html"],"dir":"Reference","previous_headings":"","what":"Merge two (or more) humdrumR datasets — humMerge","title":"Merge two (or more) humdrumR datasets — humMerge","text":"-------------------------------------------> NEEDS DOCUMENTATION <-------------------------------------------","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/humMerge.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Merge two (or more) humdrumR datasets — humMerge","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/humMeter.html"],"dir":"Reference","previous_headings":"","what":"Tools for analyzing rhythm and meter. — humMeter","title":"Tools for analyzing rhythm and meter. — humMeter","text":"humdrumR includes number useful functions working rhythms meter.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/humSize.html"],"dir":"Reference","previous_headings":"","what":"humdrumR data size and shape — humSize","title":"humdrumR data size and shape — humSize","text":"functions can used quickly get basic information size \"shape\" humdrumR corpus objects. details, use census() spines() functions instead. HumdrumR objects can divided \"subcorpora.\" anySubcorpora namesSubcorpora functions tell us subcorpora , , called.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/humSize.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"humdrumR data size and shape — humSize","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/humSize.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"humdrumR data size and shape — humSize","text":"humdrumR HumdrumR data. Must humdrumR data object. dataTypes types humdrum record(s) include census. Defaults \"GLIMDd\". Must single character string. Legal values 'G', 'L', '', 'M', 'D', 'd' combination (e.g., \"LIM\"). (See humdrum table documentation Fields section explanation.)","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/humSize.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"humdrumR data size and shape — humSize","text":"following functions defined. nfile : number input files corpus. length(humdrumR) synonym. npiece: number pieces corpus. (may multiple pieces per file.) nrecord: number records corpus. nrow(humdrumR) synonym. ntoken: number tokens corpus. ncol(humdrumR): Returns maximum number \"columns\" need represent data 2d matrix. Matches default output .matrix(humdrumR). dim(humdrumR): c(nrow(humdrumR), ncol(humdrumR)).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/humSize.html"],"id":"is-any","dir":"Reference","previous_headings":"","what":"Is/Any","title":"humdrumR data size and shape — humSize","text":"additional functions return quick TRUE/FALSE answers regarding humdrumR corpus: .empty: Returns TRUE corpus contains non-null data tokens (D tokens). anyPaths: Returns TRUE spine paths (Path > 0) pieces corpus. anyStops: Returns TRUE multi-stops (Stop > 1) pieces corpus. anySubcorpora: Returns TRUE corpus read different regex patterns matching \"subcorpora\" labels. namesSubcorpora returns names subcorpora labels (Label field). anyMultiPieceFiles: Returns TRUE files contain one piece (Piece != File).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/humSummary.html"],"dir":"Reference","previous_headings":"","what":"Summarize humdrumR corpora — humSummary","title":"Summarize humdrumR corpora — humSummary","text":"Summarizes content humdrumR corpus, calling five different corpus summary functions printing results.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/humSummary.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Summarize humdrumR corpora — humSummary","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/humSummary.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Summarize humdrumR corpora — humSummary","text":"humdrumR includes number separate functions summarizing different aspects humdrumR data objects: census() Tabulates raw size humdrumR corpus. reference() Tabulates reference records (metadata) piece. spines() Tabulates number spines spine paths pieces corpus. interpretations() Tabulates types exclusive tandem interpretations corpus. sections() Tabulates formal data (*>) corpus, including barlines. function takes humdrumR object returns data.table. summary method humdrumR objects simply calls functions prints condensed version .","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/humSummary.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Summarize humdrumR corpora — humSummary","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/humTable.html"],"dir":"Reference","previous_headings":"","what":"Humdrum tables (and their ","title":"Humdrum tables (and their ","text":"humdrumR package, fundamental data structure called humdrum table. humdrum table encodes information collection one humdrum-syntax files single data.table (data.table \"enhanced\" version R's standard data.frame). Humdrum tables stored \"inside\" every humdrumRclass object work , various humdrumR functions allow study manipulate . want directly access humdrum table within humdrumRclass object, use getHumtab() function. getHumtab() function extracts humdrum table humdrumR object. Use fields() function list current fields humdrumRclass object.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/humTable.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Humdrum tables (and their ","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/humTable.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Humdrum tables (and their ","text":"humdrumR HumdrumR data. Must humdrumR data object. dataTypes types humdrum record(s) include output. Defaults \"GLIMDd\". Must character string, specifies types data tokens/records extract. Legal values : \"G\" (global comments), \"L\" (local comments), \"\" (interpretations), \"M\" (barlines), \"D\" (non-null data), \"d\" (null data). Multiple types can specified single string: e.g., \"GLIMD\". Note \"\" also grabs \"E\" (exclusive) \"S\" (spine-control) tokens. fieldTypes types fields list. Shows fields default. Must character vector. Legal options \"Data\", \"Structure\", \"Interpretation\", \"Formal\", \"Reference\", \"Grouping\". can also pass \"selected\" extract selected fields. Types can partially matched---example, \"S\" \"Structure\".","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/humTable.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Humdrum tables (and their ","text":"humdrum table, default, humdrum data organized maximally \"long\" (\"tall\") format, every single \"token\" original data represented single row table. Even multiple-stops---tokens separated spaces---broken onto rows. Meanwhile, column humdrum table represents single piece information associated token, call field. Throughout documentation, keep mind \"token\" refers row humdrum table \"field\" refers column: Token = row Field = column","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/humTable.html"],"id":"fields-","dir":"Reference","previous_headings":"","what":"Fields:","title":"Humdrum tables (and their ","text":"six types fields humdrum table: Data fields Structure fields Interpretation fields Formal fields Reference fields Grouping fields first created call readHumdrum(), every humdrum table least nineteen fields: one data field (Token), two interpretation fields (Tandem Exclusive), three formal fields, thirteen structure fields. Additional formal, interpretation, reference fields may present depending content humdrum file(s), can create additional data fields using within.humdrumR(), mutate.humdrumR(), functions.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/humTable.html"],"id":"data-fields-","dir":"Reference","previous_headings":"","what":"Data fields:","title":"Humdrum tables (and their ","text":"Data fields used describe individual data points humdrum data (opposed groups points). Every humdrum table starts data field called Token, contains character strings representing original strings read humdrum files. Users can create many additional data fields like. Every call withinHumdrum() generates new data fields.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/humTable.html"],"id":"structure-fields-","dir":"Reference","previous_headings":"","what":"Structure fields:","title":"Humdrum tables (and their ","text":"Every humdrum table thirteen Structure fields, describe data token \"located\" original humdrum data: file, spine, record, etc. See vignette humdrum syntax fully understand terms . File info: Filename :: character unique name humdrum file. may include appended path one file name read different directories (see readHumdrum() docs). Filepath :: character full file name (always includes full path). Label :: character label specified call readHumdrum(), associated particular readHumdrum \"REpath-pattern.\" label specified, patterns just labeled \"_n\", \"n\" number pattern. File :: integer unique number associated file (ordered alphabetically, starting 1). Piece :: integer number specifying number piece corpus. identical File field except one piece read file. Location info: Spine :: integer spine, numbered (left--right) starting 1. field NA wherever Global == TRUE. Path :: integer \"spine path.\" time *^ spine path split occurs humdrum data, right side split becomes new \"path.\" original path numbered 0 additional paths numbered integers right. (spine path splits, Path field 0s.) field always NA Global == TRUE. ParentPath :: integer spine paths (.e., Path > 0), path parent path split? Path == 0, parent path also 0. Record :: integer record (.e., line) number original file. DataRecord :: integer data record enumeration file, starting 1. Stop :: integer token multi-stop token, numbered starting 1. files multi-stops, Stop field 1s. field always NA Global == TRUE. Global :: logical token come global record (opposed local record)? Global == TRUE, Spine, Path, Stop fields always NA. Token info: Type :: character type record ? \"G\" = global comment. \"L\" = local comment \"\" = interpretation \"M\" = measure/barline \"D\" = non-null data \"d\" = null data \"E\" = exclusive interpretation \"S\" = spine-control tokens (*^, *v, *-)","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/humTable.html"],"id":"interpretation-fields-","dir":"Reference","previous_headings":"","what":"Interpretation fields:","title":"Humdrum tables (and their ","text":"Interpretation fields describe interpretation metadata humdrum file(s). Humdrum interpretations tokens \"carry forward\" data points , unless cancelled subsequent interpretation. (See humdrum syntax vignette detailed explanation.) humdrum data must exclusive interpretation humdrum tables always Exclusive (:: character) field indicating exclusive interpretation associated token/row Token field. Humdrum data may, may , include additional tandem interpretations. universal rule parsing tandem interpretations impossible, ) tandem interpretations can \"overwrite\" B) users can create tandem interpretations. best can cases identify tandem interpretations appeared previously spine (counting recent first). previous interpretations encoded single character string Tandem field (see tandem() docs details). working non-standard interpretations, users can parse Tandem field using tandem() function. tandem interpretations occur file, Tandem field full empty strings (\"\"). Fortunately, many tandem interpretations widely used standardized, interpretations known humdrumR. Recognized interpretations (*clefG4 *k[b-]) automatically parsed fields call readHumdrum(). See readHumdrum() documentation details.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/humTable.html"],"id":"formal-fields-","dir":"Reference","previous_headings":"","what":"Formal fields:","title":"Humdrum tables (and their ","text":"Formal fields indicate musical sections, time windows within piece, including formal designations (\"verse\", \"chorus\", etc.) measures/bars. Humdrum data may may include formal metadata fields, indicated token \"*>\". Classified formal marks put fields matching name. Unclassified formal marks placed field called Formal default. Nested formal categories appended underscore number level descent: Formal_1, Formal_2, ..., Formal_N. part section given name lower hierarchical level, field simply empty (\"\") point. Humdrum data may, may , also include barlines (tokens beginning \"=\"). However, humdrum tables always include three formal fields related barlines: Bar :: integer many barline records (single double) passed token? \"=\" tokens occur file, Bar zeros. Note field independent whether barlines labeled numbers humdrum file! DoubleBar :: integer many double-barline records passed token? \"==\" tokens occur file, DoubleBar zeros. BarLabel :: character characters occur barline-token initial \"=\" \"==\". include \"-\" common \"implied barline\" token \"=-\", repeat tokens (like \"=:||\"), also explicit bar numbers. Note Bar field always enumerate every bar record, measure-number labels humdrum data (appear BarLabel field) may weird things like skipping numbers, repeating numbers, suffixes (e.g., \"19a\"). barline tokens appear file, BarLabel empty strings (\"\"). barline tokens present file, Bar DoubleBar nothing 0s, BarLabel NA.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/humTable.html"],"id":"reference-fields-","dir":"Reference","previous_headings":"","what":"Reference fields:","title":"Humdrum tables (and their ","text":"Reference fields describe Reference Records humdrum data. Every reference record (records beginning \"!!!\") humdrum file corpus read readHumdrum parsed field named reference code: \"XXX\" \"!!!XXX\". Reference tokens identical throughout humdrum piece. reference code appears one file another, field NA file code. reference records appear files read readHumdrum(), reference fields created. Examples common reference records \"!!!COM:\" (composer) \"!!!OTL:\" (original title). humdrum data records end COM OTL fields humdrum table.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/humTable.html"],"id":"grouping-fields-","dir":"Reference","previous_headings":"","what":"Grouping fields:","title":"Humdrum tables (and their ","text":"Grouping fields special fields may created calls group_by(). fields deleted calls ungroup(). fields generally hidden/inaccessible users.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/humTable.html"],"id":"null-data","dir":"Reference","previous_headings":"","what":"Null data","title":"Humdrum tables (and their ","text":"humdrum syntax, requirement every spine-path contains data every record. Rather, spines often padded null tokens. cases, entire records may padded null tokens. type humdrum record uses different null token: Intepretation: * Comment: ! Barline: = Data: . Many humdrumR functions automatically ignore null data, unless specifically tell (usually, using dataTypes argument). Whenever different fields() created selected, humdrumR reevaluates data locations considers null. Note humdrumR considers data locations \"null\" selected fields character data token one c(\".\", \"!\", \"!!\", \"=\", \"*\", \"**\"); selected fields NA (including NA_character_). humdrumR reevaluates null data, Type field updated, setting data records Type == \"d\" null data Type == \"D\" non-null data. main mechanism humdrumR functions use ignore null data: functions look data Type == \"D\". Whenever print export [humdrumR objecthumdrumRclass, null data selected fields prints \".\"---thus NA values print .. Thus, working numeric data NA values, NA values print \".\".","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/humTable.html"],"id":"reshaping","dir":"Reference","previous_headings":"","what":"Reshaping","title":"Humdrum tables (and their ","text":"Breaking complex syntax humdrum data \"flat\" structure humdrum table, every single token one line data.table, makes humdrum data easier analyze. course, thanks structure fields, can easily regroup reform original humdrum data use structure data (like spines) analyses. However, cases, might want work humdrum data different structure \"shape.\" humdrumR several options \"collapsing\" tokens within humdrum tables, \"cleaving\" different parts data new fields, otherwise reshaping humdrum data basic R data structures might prefer.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/humTable.html"],"id":"querying-fields","dir":"Reference","previous_headings":"","what":"Querying Fields","title":"Humdrum tables (and their ","text":"fields() function takes humdrumR object returns data.table(), row describing available field humdrum table. output table five columns: Name field name. Class class() data field. Type type field (described ). Can \"Data\", \"Structure\", \"Interpretation\", \"Formal\", \"Reference\", \"Grouping\". Selected, logical indicating fields selected. GroupedBy logical indicating , , fields currently grouping data. Using names() function humdrumR object get just field names, fields(humData)$Name.","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/humTable.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Humdrum tables (and their ","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/humdrumDispatch.html"],"dir":"Reference","previous_headings":"","what":"Regular expression method dispatch and function application — humdrumDispatch","title":"Regular expression method dispatch and function application — humdrumDispatch","text":"humdrumR regular-expression method dispatch system simple system making new functions can smartly applied variety character strings. Humdrum dispatch works like normal R method dispatch, instead dispatching specific methods based class (integer, character, etc.) dispatches based regular expressions. addition, exclusive interpretations can used guide dispatch.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/humdrumDispatch.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Regular expression method dispatch and function application — humdrumDispatch","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/humdrumDispatch.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Regular expression method dispatch and function application — humdrumDispatch","text":"dispatchDF data.frame describes function called regex input. (See details). Must data.frame. Exclusive Exclusive interpretations dispatch. Defaults NULL. NULL, regexes used dispatch. multiDispatch Whether use multiple dispatch function interpretation. Defaults FALSE. Must singleton logical value: /switch. FALSE \"best\" regex/exclusive match dispatched Exclusive segment. TRUE, differenet functions can dispatched within input vector. ... Arguments pass dispatch functions. outputClass default output class function return. Defaults \"character\". Must single character string. Generally, make sense, dispatched functions return type, explicitly indicate outputClass argument. Dispatch functions also vectorized. str input strings, dispatch called. Must character.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/humdrumDispatch.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Regular expression method dispatch and function application — humdrumDispatch","text":"Many humdrumR functions fact, humdrum-dispatch functions: example, tonalInterval.character(). call tonalInterval('ee-'), function recognize input string token **kern representation, call appropriate parser. instead call tonalInterval(''), function recognize input string token **solfa representation, call appropriate parser .","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/humdrumDispatch.html"],"id":"dispatchdf","dir":"Reference","previous_headings":"","what":"dispatchDF","title":"Regular expression method dispatch and function application — humdrumDispatch","text":"dispatchDF must data.table::data.table() created using makeDispatchDF function. makeDispatchDF takes one arguments, list three components (ordered, nameed): character vector exclusive interpretations. (Specify \"\" want exclusive dispatch). regular expression (character string) function can generate regular expression, accepts ... arguments time dispatch. function dispatch.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/humdrumDispatch.html"],"id":"makehumdrumdispatcher","dir":"Reference","previous_headings":"","what":"makeHumdrumDispatcher","title":"Regular expression method dispatch and function application — humdrumDispatch","text":"makeHumdrumDispatcher function creates new function automatically performs humdrum-dispatch. number important humdrumR functions created makeHumdrumDispatcher: tonalInterval.character diatonicSet.character tertianSet.character rhythmInterval.character","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/humdrumDispatch.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Regular expression method dispatch and function application — humdrumDispatch","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/humdrumPitch.html"],"dir":"Reference","previous_headings":"","what":"humdrumR and pitch — humdrumPitch","title":"humdrumR and pitch — humdrumPitch","text":"humdrumR includes number intertwined data structures, associated functions, representing manipulating musical pitch information.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/humdrumPitch.html"],"id":"tonality","dir":"Reference","previous_headings":"","what":"Tonality","title":"humdrumR and pitch — humdrumPitch","text":"four data types extensively used humdrumR encode/process tonal musical information: integers --- used encode \"line--fifths\" tonal information tonalInterval --- embeds line--fifth tonal integers alongside octave cent information encode tonal pitch representations (solfege, intervals, letternames, etc.) diatonicSet --- combines line--fifth tonal integer representations represent diatonic tonality, including alterations basic diatonic scale(s). tertianSet --- extension diatonicSet used encode tertian diatonic harmonies. Users rarely need engage data types. Rather, users work humdrum data pitch information encoded strings, wish manipulate analyze data. widely used humdrumR tools pitch conversion/manipulation functions, including kern(), functions like invert() transpose(). functions make use sophisticated, flexible pitch parsing deparsing functions, bridge \"core\" pitch representations listed real-world humdrum data.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/humdrumPitch.html"],"id":"atonality","dir":"Reference","previous_headings":"","what":"Atonality","title":"humdrumR and pitch — humdrumPitch","text":"SECTION INCOMPLETE addition, xxx data types used encode non-tonal (atonal) pitch information. integers --- used encode semitones (well MIDI numbers). xxx --- sets? xxx --- 12-tone rows?","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/humdrumR.html"],"dir":"Reference","previous_headings":"","what":"humdrumR — humdrumR","title":"humdrumR — humdrumR","text":"humdrumR toolkit analysis data encoded humdrum syntax. humdrum syntax incredibly flexible, powerful, scheme encoding musical data. Tens thousands musical scores (musical data) encoded humdrum syntax, many available online repositories KernScores. humdrumR package intended modernized replacement original humdrum toolkit, leveraging power R give us unprecedented power manipulate analyze humdrum data using concise, expressive syntax. humdrumRroot path humdrumR package install machine. installed humdrumR basic humdrum files stored well, subdirectories examples HumdrumData. humdrumR() function used set global package options within R session, mostly regarding viewing humdrumR datasets.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/humdrumR.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"humdrumR — humdrumR","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/humdrumR.html"],"id":"format","dir":"Reference","previous_headings":"","what":"Format","title":"humdrumR — humdrumR","text":"object class character length 1.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/humdrumR.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"humdrumR — humdrumR","text":"view humdrumR data printed? three options: \"humdrum\", \"score\", \"table\" (aliases \"data.frame\" \"tibble\"). options partially matched. Use select() determine fields show. dataTypes types humdrum record(s) view. Defaults \"GLIMDd\" .lines() .matrix(); \"Dd\" .data.frame(); \"LIMDd\" .matrices() .data.frames(). Must single character string. Legal values 'G', 'L', '', 'M', 'D', 'd' combination (e.g., \"LIM\"). (See humdrum table documentation explanation.) maxRecordsPerFile many records shown file, one file present? Defaults 40. Can positive whole number. maxTokenLength Length longer tokens censored ... Defaults 16. Can positive whole number. nullPrint null data points print? Default \"NA2dot\". Must single character string, partially matching \"NA2dot\", \"dot2NA\", 'charNA2dot\", \"asis\". \"NA2dot\" means NA values converted \".\"; \"dot2NA means \".\" converted NA; charNA2dot means NA values character vectors converted NA, atomic types; \"asis\" means either NA \".\" values may print, depending field. syntaxHighlight syntax highlighting (coloring) used printout? Defaults TRUE. Must singleton logical value; /switch. censorEmptyRecords consecutive records \"censored\" (compressed) printout? Defaults 30. Can positive whole number, Inf. Inf, censoring occur.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/humdrumR.html"],"id":"package-design","dir":"Reference","previous_headings":"","what":"Package design","title":"humdrumR — humdrumR","text":"package humdrumR seven main components: represent humdrum data R, humdrumR S4 class, core component humdrum table. create humdrumR data, sophisticated humdrum data parser: readHumdrum. humdrumR data can also written back humdrum-syntax text files using writeHumdrum. filter humdrumR data, subset()/filter() functions, well methhods R's standard indexing operators ([] [[]]). manipulate modify humdrumR data, within methods humdrumR objects, tidyverse aliases mutate(), summarise(), reframe(). facilitate development functions work humdrum tokens---simple character strings packed information---, useful API call regular-expression dispatch system. Several modules representing manipulating musical pitch information, including core tonalInterval class represent tonal pitch. module representing manipulating musical rhythm information, core rhythmInterval class represent rhythms.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/humdrumR.html"],"id":"package-options","dir":"Reference","previous_headings":"","what":"Package options","title":"humdrumR — humdrumR","text":"humdrumR() function sets general options package, mostly related humdrumR data objects viewed. argument function manipulates print/package option: argument used, option remains current setting (.e., unchanged). package options enumerated explained Arguments section .","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/humdrumR.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"humdrumR — humdrumR","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/humdrumRclass.html"],"dir":"Reference","previous_headings":"","what":"humdrumR class — humdrumRclass","title":"humdrumR class — humdrumRclass","text":"S4 class basic unit humdrumR package. humdrumR object represents data read one humdrum files. documentation, refer objects interchangeably \"humdrumR corpora\", \"humdrumR objects,\" humdrumR data(sets). coding examples name \"humData.\" Test object/variable humdrumR dataset using .humdrumR().","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/humdrumRclass.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"humdrumR class — humdrumRclass","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/humdrumRclass.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"humdrumR class — humdrumRclass","text":"humdrumR HumdrumR data. Must humdrumR data object. view humdrumR data printed? three options: \"humdrum\", \"score\", \"table\" (aliases \"data.frame\" \"tibble\"). options partially matched. Use select() determine fields show. dataTypes types humdrum record(s) view. Defaults \"GLIMDd\" .lines() .matrix(); \"Dd\" .data.frame(); \"LIMDd\" .matrices() .data.frames(). Must single character string. Legal values 'G', 'L', '', 'M', 'D', 'd' combination (e.g., \"LIM\"). (See humdrum table documentation explanation.) syntaxHighlight syntax highlighting (coloring) used printout? Defaults TRUE. Must singleton logical value; /switch. maxRecordsPerFile many records shown file, one file present? Defaults 40. Can positive whole number. maxTokenLength Length longer tokens censored ... Defaults 16. Can positive whole number. censorEmptyRecords consecutive records \"censored\" (compressed) printout? Defaults 30. Can positive whole number, Inf. Inf, censoring occur.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/humdrumRclass.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"humdrumR class — humdrumRclass","text":"important part humdrumR object humdrum table holds within ; essence, humdrumR object simply wrapper around humdrum table, helps users visualize, filter, summarize, manipulate table variety ways. Basic information size shape humdrumR objects can obtained calls nrecord, npiece, length, ncol, etc.. detailed summary information can obtained humdrumR corpus summary functions. humdrumR data can also coerced basic R data types using .matrix, .data.frame, etc.. number helpful functions also defined \"reshape\" reorganize data (e.g., cleave(), rend(), collapseHumdrum()). powerful features humdrumR tools gives ... Print readable view data shorthand/curtailed humdrum syntax. Filter humdrumR data, using subset.humdrumR() standard R indexing operators: [] [[]]. Apply arbitrary commands humtable fields using ()Humdrum routines, related tidyverse commands (mutate(), summarize(), etc.).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/humdrumRclass.html"],"id":"slots","dir":"Reference","previous_headings":"","what":"Slots","title":"humdrumR class — humdrumRclass","text":"Humtable humdrum tables---.e, data.table::data.table() particular fields. Files list two elements. first, \"Search\", contains single character representing pattern used call readHumdrum() created humdrumR object. second, \"Names,\" vector strings representing files matched pattern read humdrumR object, names() corresponding \"subcorpora\" labels (Label). Fields data.table indicating existing fields humdrumR object's humdrum table. fields divided five categories: \"Data\", \"Structure\", \"Interpretation\", \"Formal\", \"Reference.\" LoadTime POSIXct value, indicating time readHumdrum() called create humdrumR object. Context data.table two columns: Open Close. row represents contextual window apply data.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/humdrumRclass.html"],"id":"viewing-your-data","dir":"Reference","previous_headings":"","what":"Viewing your Data","title":"humdrumR class — humdrumRclass","text":"type name object R command line, R \"print\" object console. can also done explicitly using humdrumR method print() function. humdrumR print method contains number arguments, can manipulated directly calls print(). However, humdrumR print argument draws defaults global humdrumR options can also controlled humdrumR() function. Generaly, changing print options humdrumR() best option, change , automatic printing follow new settings---means can avoid explicitly calling print(). printing, selected fields data shown.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/humdrumRclass.html"],"id":"view-types","dir":"Reference","previous_headings":"","what":"View types","title":"humdrumR class — humdrumRclass","text":"three options view humdrumR data, can toggled using view argument print() humdrumR(). Since view first argument humdrumR() function, can switch views simply calling humdrumR('humdrum') humdrumR('score') humdrumR('table'). options : \"humdrum\" (default): prints humdrum-syntax score representation, record numbers enumerated left side. Token field selected, applied filters, view show original data files read. one field selected, pasted together printed output. \"table\": prints view underlying humdrum table. addition selected fields, Piece, Spine, Record fields always print output table, well Path Stop paths/stops present. \"score\": (attempt ) show rendered score (first piece) data. view likely work correctly using Rstudio connected internet. Score rendering accomplished using Craig Sapp's Humdrum Notation Plugin. table humdrum views, one pieces object, beginning first piece printed, followed end last piece; much first/last piece printed controlled maxRecordsPerFile print argument. views also highlight output different colors representing different types data tokens: can disabled using syntaxHighlight = FALSE. score view, first piece shown.","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/humdrumRclass.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"humdrumR class — humdrumRclass","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/indexHumdrum.html"],"dir":"Reference","previous_headings":"","what":"Indexing humdrumR objects — indexHumdrum","title":"Indexing humdrumR objects — indexHumdrum","text":"R's built-indexing operators, [] (single brakcets) [[]] (double brackets) can used filter humdrumR data, removing specific pieces, spines, records humdrum table. Unlike flexible/powerful subset()/filter() methods, indexing operators generally destructive (default), meaning filtered data can longer accessed indexing. functions index() index2() synonyms single double brackets respectively, can used pipes.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/indexHumdrum.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Indexing humdrumR objects — indexHumdrum","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/indexHumdrum.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Indexing humdrumR objects — indexHumdrum","text":"x HumdrumR data index. Must humdrumR data object. Index vectors matrix/data.frame rows. numeric vector character string treated regular expression. drop empty records/spines/pieces removed? Defaults TRUE. Must singleton logical value: /switch. j Index matrix/data.frame columns. numeric vector character string treated regular expression.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/indexHumdrum.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Indexing humdrumR objects — indexHumdrum","text":"R, fundamental indexing operators, [] [[]], used select subsets data. many data types (instance, base R lists) [single brackets] used \"shallower\" extraction [[double brackets]] used \"deeper\" extraction. rough analogy \"shallow vs deep\" dichotomy, HumdrumR corpus indexing brackets used two ways: [single brackets] used select pieces data. [[double brackets]] used select records spines within pieces data. (Accidentally writing [] need [[]] common error, watch !) Whether, indexing piece within, humdrumR objects can use two types indexing arguments: numeric (ordinal integers) character string (interpreted regular expressions).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/indexHumdrum.html"],"id":"numeric-indexing-","dir":"Reference","previous_headings":"","what":"Numeric indexing:","title":"Indexing humdrumR objects — indexHumdrum","text":"Indexing humdrumR corpora [single brackets] accept one numeric argument---whole numbers accepted. argument used pick pieces within humdrumR object ordinally. Thus, humData[1:10] select first ten pieces data humData[42] select 42nd piece. Indexing humdrumR objects [[double brackets]] accept one two numeric arguments, j, either can used isolation combination. (j used isolation, must named placed comma, humData[[ , j ]].) used index records (.e., based humtable Record field). Thus, humData[[1:20]] indexes first twenty records piece corpus, humData[[42]] extracts 42nd record piece. avoid breaking humdrum syntax, exclusive interpretations spine-path interpretations removed. j used index spines (.e., based Spine field). Thus, humData[[ , 3:4]] returns third fourth spines piece corpus. Pieces/spines/records renumbered indexing (see Renumbering section subset()/filter() docs explantion). result, humdrumR indexing entirely ordinal. example, return 12th piece original humData object. first call [] returns 11th 20th pieces, renumbered 1:10 second index call returns new 2nd index, 12th originally. Similarly, return third spine original data.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/indexHumdrum.html"],"id":"negative-numbers","dir":"Reference","previous_headings":"","what":"Negative numbers","title":"Indexing humdrumR objects — indexHumdrum","text":"normal R indexing, negative numbers can used, causing corresponding elements removed instead retained. Thus, humData[-3:-5] remove third, fourth, fifth pieces data humData[[ , -3:-5]] remove third, fourth, fifth spines piece. Positive negative indices mixed single argument.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/indexHumdrum.html"],"id":"out-of-bounds-indices","dir":"Reference","previous_headings":"","what":"Out of bounds indices","title":"Indexing humdrumR objects — indexHumdrum","text":"cases, indices outside bounds (value 0) ignored. E.g., corpus twenty pieces call corpus[21], 21st piece, 21 \"bounds\". input indices 0 error result. input indices bounds empty humdrumR object returned. instance, humData[[401:500, ]] return empty humdrumR object pieces 400 data records.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/indexHumdrum.html"],"id":"character-indexing-","dir":"Reference","previous_headings":"","what":"Character indexing:","title":"Indexing humdrumR objects — indexHumdrum","text":"index humdrumR object character strings, strings treated regular expressions (regexes), matched non-null data tokens (\"D\") object's first selected field. match regular expressions considered match. Indexing [single brackets] accepts one vector character regular expressions. piece contains even single match retained. matches occur pieces, empty humdrumR object returned. Indexing humdrumR objects [[double brackets]] accepts one two vectors character strings, j, either can used isolation combination. (j used isolation, must placed comma, humData[[ , j]].) data record contains least one match regex(es) retained. Similarly, spine contains least one match j regex(es) retained. j used together, matching spines (j) indexed first, tokens matching regular expression(s) must found matching spines.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/indexHumdrum.html"],"id":"exclusive-indexing-","dir":"Reference","previous_headings":"","what":"Exclusive indexing:","title":"Indexing humdrumR objects — indexHumdrum","text":"Spines can also indexed ordinally exclusive interpretation. , provide double-bracket index named numeric (whole number) argument, name(s) corresponding exclusive interpretations data. example, want index 3rd **kern spine piece, use humData[[kern = 3]]. Note exclusive interpretations piece unaffected---example, kern spines () indexed!","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/indexHumdrum.html"],"id":"removeempty","dir":"Reference","previous_headings":"","what":"removeEmpty","title":"Indexing humdrumR objects — indexHumdrum","text":"removeEmpty argument humdrumR indexing controls whether filtered data completely removed data, simply set null means filtered data can recovered using unfilter() (see subset()/filter() docs explanation). default, piece-indexing spine-indexing removeEmpty = TRUE, record-indexing defaults removeEmpty = FALSE.","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/indexHumdrum.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Indexing humdrumR objects — indexHumdrum","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/int.html"],"dir":"Reference","previous_headings":"","what":"Calculate intervals between pitches — int","title":"Calculate intervals between pitches — int","text":"functions allow us calculate intervals pitches. int() basic form, calculating interval(s) two input vectors. mint() hint() special forms calculating intervals \"melodically\" \"harmonically,\" respectively. mint() applied humdrumR data class may use data's fields arguments. field names specified, first selectedField used x. hint() applied humdrumR data class may use data's fields arguments. field names specified, first selectedField used x.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/int.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Calculate intervals between pitches — int","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/int.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Calculate intervals between pitches — int","text":"x Input pitch information. Can (atomic) vector, tonalInterval, NULL. Must parsable pitch information. Pitches calculate intervals . Defaults middle C / unison. Can (atomic) vector, tonalInterval, NULL. Must parsable pitch information. deparser output representation want? Defaults interval. Must pitch function, like kern(). incomplete pad incomplete intervals (e.g., start/end input). Defaults NULL int(), kern mint() hint(). Must NULL, pitch function, atomic value length(incomplete) == abs(lag). bracket Whether print brackets around incomplete output. Defaults TRUE incomplete function, FALSE otherwise. Must singleton logical value: /switch. TRUE, square brackets (\"[]\") printed around incomplete observations. classify intervals classified step/skip/leaps? Defaults FALSE. Must singleton logical value: /switch. TRUE, deparser ignored output classified Unison, Step, Skip, Leap. parseArgs optional list arguments passed pitch parser. Defaults empty list(). Must list named arguments pitch parser. lag lag() calculate harmonic/melodic intervals . Defaults 1, means intervals immediate successors x. Must either single number, logical length(x) (see \"Logical lags\" section manual). groupby list vectors group x. Defaults list(). Must list; every element list must length length(x). orderby list vectors group x. Defaults list(). Must list; every element list must length length(x). Used interpret order elements x. Lagged computations done indicated order, output returned original order.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/int.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Calculate intervals between pitches — int","text":"Input vectors x () parsed pitches (tonal interval objects), possible. (Parsing arguments can passed via parseArgs list, parse(...) sugar. Key Exclusive arguments also passed parser.) inputs fail parse show NA output. parsed, intervals pitches calculated x - . resulting intervals \"deparsed\" standard representation; default, intervals() representation used, can set deparser argument pitch function. However, alternative deparser commonly used (besides intervals()) semits(). deparser NULL, raw tonalIntervals returned.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/int.html"],"id":"melodic-and-harmonic-intervals","dir":"Reference","previous_headings":"","what":"Melodic and Harmonic intervals","title":"Calculate intervals between pitches — int","text":"mint hint calculate \"melodic\" \"harmonic\" intervals respectively. context, \"melodies\" sequences notes within spine path, \"harmonies\" intervals notes occurring record (time). Outside () call, mint hint exactly ; used call () see different behaviors, () automatically apply across spine paths (mint()) records (hint()). achieved modifying groupby orderby arguments lag()---can manually achieve default behaviors, behaviors, setting arguments . used () expression, mint() (default) calculate melodic interval approaching note previous note: example, mint('C4', 'D4', 'Eb4') fill return c('[c]', '+M2', '+m2'), D4 approached ascending whole step C4, Eb4 approached ascending half step D4. Similarly, default () behavior hint() calculate successive intervals record (across spine paths), left right. record C3 G4 C5 return values [CC] +P12 +P4, G4 perfect 12th C3, C5 perfect fourth G4. mint() hint() work passing lagged /dittoed versions x argument int(). Basically, mint() equivalent int(x, lag(x, lag = lag, groupby = list(Piece, Spine, Path)), ...) hint() equivalent int(x, lag(x, lag = lag, groupby = list(Piece, Record), orderby = list(Piece, Record, Spine, Path)), ...). either case, parsed pitch vector copied lagged using lag(), pairs crossing outside groupby groups ignored. lag argument controls far apart melody intervals calculated. instance, lag 2 calculate intervals every note vector. Positive lags (default) calculate approaching intervals: token represents interval current note previous note. Negative lags calculate departing intervals: token represents interval current note next note. Note , passing directed = FALSE deparser, undirected (absolute value) melodic intervals can returned.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/int.html"],"id":"incomplete-value-padding","dir":"Reference","previous_headings":"","what":"Incomplete value padding","title":"Calculate intervals between pitches — int","text":"default, int return NA anywhere x NA. However, NA x NA, can ask different output \"incomplete\" pairs. using incomplete argument. incomplete atomic value, incomplete outputs indices willed value. incomplete argument pitch function (like deparser argument), function used (re)parse values x missing. bracket == TRUE, incomplete output values surrounded [], easier distinguish actual intervals. main use incomplete argument mint() hint(). lagged arguments used mint()/hint() (see previous section) necessarily padded abs(lag) NA values beginning (positive lag) end (negative lag). thus \"incomplete\" pairs passed int(), can controlled using incomplete argument. default, mint() hint() set incomplete = kern(), bracket = TRUE cause notes show bracketed kern, like [ee-] [C#]. incomplete NULL, incomplete values simply padded NA.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/int.html"],"id":"interval-classification","dir":"Reference","previous_headings":"","what":"Interval classification","title":"Calculate intervals between pitches — int","text":"classify argument set TRUE, intervals classified either \"Unison\", \"Step\", \"Skip\", \"Leap\". Alternatively, skips can interpreted leaps setting skips = FALSE. (classify = TRUE overrides deparser argument.) default, intervals categorized tonally, meaning interval tonal steps used basis classification. example, augmented 2nd step, diminished 3rd skip/leap. means augmented diminished unisons marked \"Unison\" well! However, directed = TRUE, augmented/diminished unisons marked + - indicate direction, whereas perfect unisons never marked +/-. Alternatively, may choose categorize intervals atonally setting atonal = TRUE. , intervals categorized based semitone (enharmonic) intervals: D# Eb classified .","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/int.html"],"id":"logical-ditto-lags","dir":"Reference","previous_headings":"","what":"Logical (ditto) lags","title":"Calculate intervals between pitches — int","text":"calls hint() mint() default behavior numeric lag argument passed lag(). alternate option specify lag argument logical vector length input (x argument). Rather calculating interval pitch another pitch separated regular lag, logical lag argument \"lags\" pitch back previous value lag == TRUE. means one interval can calculated TRUE indices. canonic use \"logical lag\" feature calculate harmonic intervals relative voice, like bass voice. example, consider file: read file applied hint() Token field (default arguments) result : record, see intervals lagged (lag == 1) left right: see intervals bass tenoir, tenor alto, alto soprano. wanted see intervals bass? Well, can use logical lag argument, specify Spine == 1: (humData, hint(Token, lag = Spine == 1). means values \"lagged\" back previous value Spine == 1. result : Now see intervals relative bass. logical lag takes place within groupby groups. However, note values first index lag == TRUE calculated relative first value.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/int.html"],"id":"grouping","dir":"Reference","previous_headings":"","what":"Grouping","title":"Calculate intervals between pitches — int","text":"many cases want perform lagged calculations vector, across certain boundaries. example, vector includes data multiple pieces, want calculate melodic intervals pieces, within pieces. groupby argument indicates one, , grouping vectors, break x (input) argument groups. groupby vectors given, change vector indicates boundary. Value pairs cross groups treated beginning. Basically, using groupby argument function similar identical using tapply(x, groupby, laggedFunction, ...) using groupby expession call ().humdrumR. However, using groupby argument directly usually much faster, specially optimized functions. common use case humdrum data, looking \"melodies\" within spines. , want groupby = list(Piece, Spine, Path). fact, humdrumR () calls automatically feed three fields groupby arguments certain functions: mint, delta, sigma, lag, ditto, ioi, sumTies, hop, wort, wort.character. use delta call (), automatically calculate delta \"melodic\" way, within spine path piece. However, wanted, instance, calculate differences across spines (like harmonic intervals) manually set groupby = list(Piece, Record).","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/int.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Calculate intervals between pitches — int","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/interpretations.html"],"dir":"Reference","previous_headings":"","what":"Summarize humdrum corpus interpretations. — interpretations","title":"Summarize humdrum corpus interpretations. — interpretations","text":"interpretations used summarize interpretations pieces humdrumR corpus, including exclusive (**) tandem (*) interpretations. interpretations one humdrumR's basic corpus summary functions.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/interpretations.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Summarize humdrum corpus interpretations. — interpretations","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/interpretations.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Summarize humdrum corpus interpretations. — interpretations","text":"humdrumR HumdrumR data summarize. Must humdrumR data object. Index rows. numeric, selects rows index. character, string matched regular expression filenames corpus.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/interpretations.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Summarize humdrum corpus interpretations. — interpretations","text":"interpretations returns special data.frame called humInterpretations table. row table represents single piece corpus. first column ({X}) variable indicating unique \"exclusive pattern\" associated piece---exclusive patterns tallied bottom printout. remaining columns indicate many interpretation (indicated column name) appear piece. tandem interpretations, counts returned format Total.Unique.Spines: Total: total instances interpretation, across spines. Unique: number unique versions interpretation. Spines: number spines interpretation appears . example, consider following piece: piece, several tandem key interpretations, humdrumR call Key. tabulation interpretations return Key column value 6.3.2 piece: 6 six key interpretations total. 3 three unique keys: *C:, *e: *G:. 2 key interpretations occur two spines.","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/interpretations.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Summarize humdrum corpus interpretations. — interpretations","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/interval.html"],"dir":"Reference","previous_headings":"","what":"Tonal (pitch) interval representation — interval","title":"Tonal (pitch) interval representation — interval","text":"returns standard representations intervals Western music. interval() applied humdrumR data class may use data's fields arguments. field names specified, first selectedField used x.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/interval.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Tonal (pitch) interval representation — interval","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/interval.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Tonal (pitch) interval representation — interval","text":"x Input data parse pitch information. x argument can (atomic) vector, tonalInterval, NULL. ... Arguments passed pitch deparser. also two hidden (advanced) arguments can specify: memoize deparse (see details ). generic \"specific\" pitch information (accidentals qualites) discarded? Defaults FALSE. Must singleton logical value: /switch. simple \"compound\" pitch information (octave/contour) discarded? Defaults FALSE. Must singleton logical value: /switch. Key input Key used parser, deparser, transposer. Defaults NULL. Must diatonicSet something coercable diatonicSet; must either length 1 length(x) transposeArgs optional list arguments passed special transpose() call. Defaults empty list(). Must list named arguments transpose(). parseArgs optional list arguments passed pitch parser. Defaults empty list(). Must list named arguments pitch parser. inPlace non-pitch information retained output string. Defaults FALSE. Must singleton logical value: /switch. argument effect input (x argument) character strings, extra, non-pitch information input strings \"besides\" pitch information. , inPlace = TRUE, output placed output string beside original non-pitch information. inPlace = FALSE, pitch output information returned (details ).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/interval.html"],"id":"basic-pitch-arguments","dir":"Reference","previous_headings":"","what":"Basic pitch arguments","title":"Tonal (pitch) interval representation — interval","text":"pitch function standard arguments control details output. important generic simple arguments, allow control type pitch information returned.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/interval.html"],"id":"generic-vs-specific","dir":"Reference","previous_headings":"","what":"Generic vs Specific","title":"Tonal (pitch) interval representation — interval","text":"generic = TRUE, specific pitch information (accidentals qualities) omitted output. alternative way controlling functionality, can use specific argument, specific == !generic. case atonal functions, \"generic\" version pitch output: example, semits('c#', generic = TRUE) return 0, \"generic\" version C# C, corresponds 0. However, note generic version pitch follows key, semits('c#', generic = TRUE, Key = ':') return 1!","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/interval.html"],"id":"simple-vs-compound","dir":"Reference","previous_headings":"","what":"Simple vs Compound","title":"Tonal (pitch) interval representation — interval","text":"simple = TRUE, compound pitch information (octave contour) omitted output. alternative way controlling functionality, can use compound argument ,compound == !simple. actually one way might want divide compound intervals simple octave parts. example, might like call output -M2 (descending major 2nd) +m7 (ascending minor 7th octave ). functionality can controlled octave.round argument: see pitch deparsing documentation.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/interval.html"],"id":"key","dir":"Reference","previous_headings":"","what":"Key","title":"Tonal (pitch) interval representation — interval","text":"Key argument must diatonicSet, something can parsed one. Key argument passed parser, deparser, transpose---unless alternate Key passed transposeArgs parseArgs. Various deparsing options use Key argument; example, use implicitSpecies (see advanced parsing section) dependent Key. use pitch function within special call withinHumdrum, humdrumR automatically pass Key field humdrum data function---means, cases, need explicitly anything Key argument! (want happen, need explicitly specify Key argument, Key = NULL.)","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/interval.html"],"id":"parse-arguments","dir":"Reference","previous_headings":"","what":"Parse arguments","title":"Tonal (pitch) interval representation — interval","text":"parseArgs argument must list() (named) arguments passed input parser. example, input representation uses \"X\" represent double sharps, specify kern('CX5', parseArgs = list(doublesharp = 'X')) get correct result (\"cc##\"). convenient shorthand, \"syntactic sugar,\" can specify parseArgs alternate way: Simply input parse(args...) unnamed argument pitch function. example, can get exact result typing kern('CX5', parse(doublesharp = 'X')).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/interval.html"],"id":"transpose-arguments","dir":"Reference","previous_headings":"","what":"Transpose arguments","title":"Tonal (pitch) interval representation — interval","text":"transposeArgs argument must list() (named) arguments passed internal call transpose(), allowing us easily transpose pitch information. example, type kern(c('C', 'D', 'E'), transposeArgs = list(= 'M9')) can get output c('d', 'e', 'f#'). possible transpose args : (tonalInterval, length == 1 | length == (x)) (diatonicSet, length == 1 | length == (x)) (diatonicSet, length == 1 | length == (x)) real (logical, length == 1) transposition real tonal? relative (logical, length == 1) key-wise transposition based relative parallel keys? convenient shorthand, \"syntactic sugar,\" can specify transposeArgs alternate way: Simply input transpose(args...) unnamed argument pitch function. example, can get exact result typing kern(c('C', 'D', 'E'), transpose(= 'M9')).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/interval.html"],"id":"transposing-by-interval","dir":"Reference","previous_headings":"","what":"Transposing by interval","title":"Tonal (pitch) interval representation — interval","text":"calling transpose() directly, argument can anything coercable tonalInterval, output transposed amount. real = FALSE, tonal transposition (within Key) performed. details transposition behavior, check transpose() docs.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/interval.html"],"id":"transposing-by-key","dir":"Reference","previous_headings":"","what":"Transposing by key","title":"Tonal (pitch) interval representation — interval","text":"Another way transposing specifying input (\"\") key output (\"\") key. default, Key argument passed transpose , nothing actually happens. Thus, specify either key key, transposition happen /key Key. course, specify transposition happen keys specify. use pitch function within special call withinHumdrum, humdrumR automatically pass Key field humdrum data function. specify key, Key field passed transpose key, result, pitches input transposed whatever keys target () key! real relative arguments give special control key-wise transposition works, check transpose() docs details!","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/interval.html"],"id":"in-place-parsing","dir":"Reference","previous_headings":"","what":"In-place parsing","title":"Tonal (pitch) interval representation — interval","text":"humdrum data, character strings often encoded multiple pieces musical information right besides : example, **kern data might include tokens like \"4.ee-[. humdrumR parser (tonalInterval) automatically \"pull \" pitch information within strings, can find using appropriate known regular expressions. example, pitch('4.ee-[') returns Eb5. However, pitch functions (like pitch() kern()) option keep \"extra\" information return result \"place\"---.e., embedded right found input string. controlled inPlace argument, FALSE default. , pitch('4.ee-[', inPlace = TRUE) return 4.Eb5[---keeping \"4.\" \"[\". (obviously works input string, numeric!) Note inPlace = TRUE force functions like semits, normally return numeric values, return character strings input character string.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/interval.html"],"id":"pitch-gamut-levels","dir":"Reference","previous_headings":"","what":"Pitch-Gamut Levels","title":"Tonal (pitch) interval representation — interval","text":"table() automatically generate factor levels pitch data using gamut() function. makes sure tabulated data sorted logical order, includes missing pitches. simple/complex generic/specific arguments automatically passed gamut(); additional arguments can passed gamut using gamutArgs = list(...), syntactic sugar gamut(...). (Read gamut() docs explanation gamut generation.) feature used control table layout pitch data, well assure consistent tables grouping data. inPlace = TRUE special tabulation occur.","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/interval.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Tonal (pitch) interval representation — interval","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/invert.html"],"dir":"Reference","previous_headings":"","what":"Invert or transpose pitches. — invert","title":"Invert or transpose pitches. — invert","text":"Invert transpose pitches.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/invert.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Invert or transpose pitches. — invert","text":"","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/ioi.html"],"dir":"Reference","previous_headings":"","what":"Sum ","title":"Sum ","text":"functions used sum (melodically) adjacent rhythmic duration values associated new onsets/attacks. ioi() adds duration rests previous non-rest (onset) duration, create interonset intervals (IOIs). sumTies() sums tied durations. ioi() applied humdrumR data class may use data's fields arguments. field names specified, first selectedField used x. sumTies() applied humdrumR data class may use data's fields arguments. field names specified, first selectedField used x.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/ioi.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Sum ","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/ioi.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Sum ","text":"x Input rhythm information. x argument can (atomic) vector, NULL. Must parsable rhythm information. onsets logical vector denotes onsets. Defaults logical vector TRUE wherever rests, indicated presence \"r\" character, input x. Must logical; must length length(x). durations x onsets == FALSE added previous value onsets == TRUE. finalOnset Whether count last onset. Defaults FALSE. Must singleton logical value: /switch. TRUE, last IOI computed last onset end input vector. Otherwise, last IOI undefined (NA). groupby list vectors group x. Defaults list(). Must list; every element list must length length(x). parseArgs optional list arguments passed rhythm parser. Defaults empty list(). Must list named arguments rhythm parser. inPlace non-rhythm information retained output string? Defaults TRUE. Must singleton logical value: /switch. open beginnings ties indicated x? Defaults [. Must single character string, interpreted regular expression. close ends ties indicated x? Defaults ]. Must single character string, interpreted regular expression.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/ioi.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Sum ","text":"functions return \"collapsed\" durations null data tokens. example, sumTies(c('[4a', '4a]', '2g')) returns c('2a', '.', '2g'), second (tied) duration null (\".\"). interonset intervals, last duration string durations undefined---final onset, next onset, really \"interonset\" interval. Thus, default, ioi() return NA location final duration. However, finalOnset argument set TRUE, function act like one additional onset end sequence: last \"IOI\" calculated last onset fictional \"final onset.\" example, run ioi(c('4.','8r', '4.','8r','2a', '2r')) result c(\"2a\", \".\", \"2a\", \".\", NA, \".\"), last onset (2a) returning NA. However, run ioi(c('4.','8r', '4.','8r','2a', '2r'), finalOnset = TRUE) result c(\"2a\", \".\", \"2a\", \".\", \"1a\", \".\")---last onset's whole duration end returned! Non-onsets (rests) occur first onset returned null.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/ioi.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Sum ","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/is.major.html"],"dir":"Reference","previous_headings":"","what":"Test the major/minor modality of a set — is.major","title":"Test the major/minor modality of a set — is.major","text":"functions test majorness/minorness tertian diatonic set, logical TRUE/FALSE. functions testing whether chord strictly major minor chord, rather \"broad\" major/minorness: gnerally, presence minor third degree makes set \"minor\"; thus, diminished chord \"minor\" lydian key \"major.\"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/is.major.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Test the major/minor modality of a set — is.major","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/is.major.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Test the major/minor modality of a set — is.major","text":"x Input data, interpreted diatonic keys chords. Must diatonicSet tertianSet something can parsed one. ... Parameters passed parsers (tertianSet() diatonicSet()).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/is.major.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Test the major/minor modality of a set — is.major","text":"Either function can called directly tertian diatonic sets. called anything else, functions first call tertianSet() parser. values fail parse (returning NA), diatonicSet() parser called .","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/is.simple.html"],"dir":"Reference","previous_headings":"","what":"Test the properties of tonal information — is.simple","title":"Test the properties of tonal information — is.simple","text":"functions test basic properties pitch information. .simple returns TRUE pitch information constrained one octave. .generic returns TRUE pitch information \"natural\" key (Key) argument.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/is.simple.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Test the properties of tonal information — is.simple","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/is.simple.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Test the properties of tonal information — is.simple","text":"x Pitch information. Must something can parsed pitch information. ... Parameters passed tonalInterval(). octave.round rounding function. Must rouding function. Controls simple intervals interpreted relative C. Key diatonic key used defined generic pitches. Defaults NULL. Must something can parsed diatonic key; must either length 1 length(x).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/is.simple.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Test the properties of tonal information — is.simple","text":"functions can called directly tonalIntervals; called anything else, functions first calls tonalInterval() parser. values fail parse NA returned. \"Simple\" intervals fall particular octave relative middle-C/unison. octave.floor argument can used change works: default option, floor, interprets (**kern) pitches c, d, e, f, g, , b \"simple.\" common alternative, round, identifies G, , B, c, d, e, f \"simple.\" See pitch deparsing docs detailed explanation. \"Generic\" intervals belong key.","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/kern.html"],"dir":"Reference","previous_headings":"","what":"Kern pitch representation — kern","title":"Kern pitch representation — kern","text":"Kern (**kern) common humdrum interpretation representing \"notes\" style traditional Western scores. However! humdrumR, kern function outputs pitch part **kern interpretation. **kern rhythms instead created using recip() function. kern() applied humdrumR data class may use data's fields arguments. field names specified, first selectedField used x.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/kern.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Kern pitch representation — kern","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/kern.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Kern pitch representation — kern","text":"x Input data parse pitch information. x argument can (atomic) vector, tonalInterval, NULL. ... Arguments passed pitch deparser. also two hidden (advanced) arguments can specify: memoize deparse (see details ). generic \"specific\" pitch information (accidentals qualites) discarded? Defaults FALSE. Must singleton logical value: /switch. simple \"compound\" pitch information (octave/contour) discarded? Defaults FALSE. Must singleton logical value: /switch. Key input Key used parser, deparser, transposer. Defaults NULL. Must diatonicSet something coercable diatonicSet; must either length 1 length(x) transposeArgs optional list arguments passed special transpose() call. Defaults empty list(). Must list named arguments transpose(). parseArgs optional list arguments passed pitch parser. Defaults empty list(). Must list named arguments pitch parser. inPlace non-pitch information retained output string. Defaults FALSE. Must singleton logical value: /switch. argument effect input (x argument) character strings, extra, non-pitch information input strings \"besides\" pitch information. , inPlace = TRUE, output placed output string beside original non-pitch information. inPlace = FALSE, pitch output information returned (details ).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/kern.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Kern pitch representation — kern","text":"pitch part **kern tokens breakdown tonal pitch information : Steps 1: \"C\" \"c\" 2: \"D\" \"d\" 3: \"E\" \"e\" 4: \"F\" \"f\" 5: \"G\" \"g\" 6: \"\" \"\" 7: \"B\" \"b\" Accidentals Flat: \"-\" Sharp: \"#\" Octave Octave indicated case step characters, well repetition step character. Uppercase letters used octaves ; lowercase letters middle-C octave higher. octave, octave get one character , higher lower octaves repeating character. example, using C# step value, relative octave: -3: \"CCC#\" -2: \"CC#\" -1: \"C#\" 0: \"c#\" +1: \"cc#\" +2: \"ccc#\" +3: \"cccc#\" Tokens ordered Step/Octave + Accidentals, separator. Like humdrumR pitch functions, ways kern parses deparses tokens can modified accomodate variations standard **kern pitch representation.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/kern.html"],"id":"basic-pitch-arguments","dir":"Reference","previous_headings":"","what":"Basic pitch arguments","title":"Kern pitch representation — kern","text":"pitch function standard arguments control details output. important generic simple arguments, allow control type pitch information returned.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/kern.html"],"id":"generic-vs-specific","dir":"Reference","previous_headings":"","what":"Generic vs Specific","title":"Kern pitch representation — kern","text":"generic = TRUE, specific pitch information (accidentals qualities) omitted output. alternative way controlling functionality, can use specific argument, specific == !generic. case atonal functions, \"generic\" version pitch output: example, semits('c#', generic = TRUE) return 0, \"generic\" version C# C, corresponds 0. However, note generic version pitch follows key, semits('c#', generic = TRUE, Key = ':') return 1!","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/kern.html"],"id":"simple-vs-compound","dir":"Reference","previous_headings":"","what":"Simple vs Compound","title":"Kern pitch representation — kern","text":"simple = TRUE, compound pitch information (octave contour) omitted output. alternative way controlling functionality, can use compound argument ,compound == !simple. actually one way might want divide compound intervals simple octave parts. example, might like call output -M2 (descending major 2nd) +m7 (ascending minor 7th octave ). functionality can controlled octave.round argument: see pitch deparsing documentation.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/kern.html"],"id":"key","dir":"Reference","previous_headings":"","what":"Key","title":"Kern pitch representation — kern","text":"Key argument must diatonicSet, something can parsed one. Key argument passed parser, deparser, transpose---unless alternate Key passed transposeArgs parseArgs. Various deparsing options use Key argument; example, use implicitSpecies (see advanced parsing section) dependent Key. use pitch function within special call withinHumdrum, humdrumR automatically pass Key field humdrum data function---means, cases, need explicitly anything Key argument! (want happen, need explicitly specify Key argument, Key = NULL.)","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/kern.html"],"id":"parse-arguments","dir":"Reference","previous_headings":"","what":"Parse arguments","title":"Kern pitch representation — kern","text":"parseArgs argument must list() (named) arguments passed input parser. example, input representation uses \"X\" represent double sharps, specify kern('CX5', parseArgs = list(doublesharp = 'X')) get correct result (\"cc##\"). convenient shorthand, \"syntactic sugar,\" can specify parseArgs alternate way: Simply input parse(args...) unnamed argument pitch function. example, can get exact result typing kern('CX5', parse(doublesharp = 'X')).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/kern.html"],"id":"transpose-arguments","dir":"Reference","previous_headings":"","what":"Transpose arguments","title":"Kern pitch representation — kern","text":"transposeArgs argument must list() (named) arguments passed internal call transpose(), allowing us easily transpose pitch information. example, type kern(c('C', 'D', 'E'), transposeArgs = list(= 'M9')) can get output c('d', 'e', 'f#'). possible transpose args : (tonalInterval, length == 1 | length == (x)) (diatonicSet, length == 1 | length == (x)) (diatonicSet, length == 1 | length == (x)) real (logical, length == 1) transposition real tonal? relative (logical, length == 1) key-wise transposition based relative parallel keys? convenient shorthand, \"syntactic sugar,\" can specify transposeArgs alternate way: Simply input transpose(args...) unnamed argument pitch function. example, can get exact result typing kern(c('C', 'D', 'E'), transpose(= 'M9')).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/kern.html"],"id":"transposing-by-interval","dir":"Reference","previous_headings":"","what":"Transposing by interval","title":"Kern pitch representation — kern","text":"calling transpose() directly, argument can anything coercable tonalInterval, output transposed amount. real = FALSE, tonal transposition (within Key) performed. details transposition behavior, check transpose() docs.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/kern.html"],"id":"transposing-by-key","dir":"Reference","previous_headings":"","what":"Transposing by key","title":"Kern pitch representation — kern","text":"Another way transposing specifying input (\"\") key output (\"\") key. default, Key argument passed transpose , nothing actually happens. Thus, specify either key key, transposition happen /key Key. course, specify transposition happen keys specify. use pitch function within special call withinHumdrum, humdrumR automatically pass Key field humdrum data function. specify key, Key field passed transpose key, result, pitches input transposed whatever keys target () key! real relative arguments give special control key-wise transposition works, check transpose() docs details!","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/kern.html"],"id":"in-place-parsing","dir":"Reference","previous_headings":"","what":"In-place parsing","title":"Kern pitch representation — kern","text":"humdrum data, character strings often encoded multiple pieces musical information right besides : example, **kern data might include tokens like \"4.ee-[. humdrumR parser (tonalInterval) automatically \"pull \" pitch information within strings, can find using appropriate known regular expressions. example, pitch('4.ee-[') returns Eb5. However, pitch functions (like pitch() kern()) option keep \"extra\" information return result \"place\"---.e., embedded right found input string. controlled inPlace argument, FALSE default. , pitch('4.ee-[', inPlace = TRUE) return 4.Eb5[---keeping \"4.\" \"[\". (obviously works input string, numeric!) Note inPlace = TRUE force functions like semits, normally return numeric values, return character strings input character string.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/kern.html"],"id":"pitch-gamut-levels","dir":"Reference","previous_headings":"","what":"Pitch-Gamut Levels","title":"Kern pitch representation — kern","text":"table() automatically generate factor levels pitch data using gamut() function. makes sure tabulated data sorted logical order, includes missing pitches. simple/complex generic/specific arguments automatically passed gamut(); additional arguments can passed gamut using gamutArgs = list(...), syntactic sugar gamut(...). (Read gamut() docs explanation gamut generation.) feature used control table layout pitch data, well assure consistent tables grouping data. inPlace = TRUE special tabulation occur.","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/kern.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Kern pitch representation — kern","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/key.html"],"dir":"Reference","previous_headings":"","what":"Humdrum key interpretation — key","title":"Humdrum key interpretation — key","text":"Humdrum key interpretation","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/key.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Humdrum key interpretation — key","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/key.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Humdrum key interpretation — key","text":"x Input data, interpreted diatonic keys. Must atomic vector. Key key used parser, deparser, transposer. Defaults NULL. Must diatonicSet something coercable diatonicSet; must either length 1 length(x) parseArgs optional list arguments passed key parser. Defaults empty list(). Must list named arguments key parser.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/key.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Humdrum key interpretation — key","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/keyDeparsing.html"],"dir":"Reference","previous_headings":"","what":"Generating (","title":"Generating (","text":"humdrumR includes easy--use system generating variety diatonic key representations, can flexibly modified users. \"hood\" humdrumR represents tonal chord information using underlying representation, typically extracted input data using key parser. representation can \"deparsed\" variety predefined output formats, new formats create!","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/keyDeparsing.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Generating (","text":"Deparsing second step key function processing pipeline: Input representation |> Parsing |> Intermediate (diatonicSet) representation |> Transformation |> Deparsing (DEPARSING ARGS GO ) |> Output representation Various pitch representations can generated using predefined key functions like key() signature(), romanKey(). functions use common deparsing framework, specified using different combinations arguments deparser. modifying \"deparsing\" arguments, can exercise fine control want pitch information represented output.","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/keyFunctions.html"],"dir":"Reference","previous_headings":"","what":"Parsing and deparsing key information — keyFunctions","title":"Parsing and deparsing key information — keyFunctions","text":"functions can used extract \"translate,\" otherwise modify, data representing diatonic key information. functions :","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/keyFunctions.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Parsing and deparsing key information — keyFunctions","text":"x Input data, interpreted diatonic keys. Must atomic vector. Key key used parser, deparser, transposer. Defaults NULL. Must diatonicSet something coercable diatonicSet; must either length 1 length(x) parseArgs optional list arguments passed key parser. Defaults empty list(). Must list named arguments key parser.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/keyFunctions.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Parsing and deparsing key information — keyFunctions","text":"key() romanKey() signature()","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/keyParsing.html"],"dir":"Reference","previous_headings":"","what":"Parsing key information — keyParsing","title":"Parsing key information — keyParsing","text":"humdrumR includes easy--use powerful system parsing diatonic key information: various basic key representations (including numeric character-string representations) can \"parsed\"---read interpreted humdrumR. part, parsing automatically happens \"behind scenes\" whenever use humdrumR key function, like key() signature().","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/keyParsing.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Parsing key information — keyParsing","text":"","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/lag.html"],"dir":"Reference","previous_headings":"","what":"Shift data within a vector/matrix/data.frame — lag","title":"Shift data within a vector/matrix/data.frame — lag","text":"lag lead functions take input vectors, matrices, data.frames shifts data n indices. similar data.table::shift() function, additional options.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/lag.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Shift data within a vector/matrix/data.frame — lag","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/lag.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Shift data within a vector/matrix/data.frame — lag","text":"x input argument. list, atomic, matrix, data.frame. n amount lag/lead data. Defaults 0. Must natural number. n == 0, x returned unchanged. fill Tokens used pad outputs. Defaults NA. class x. wrap = FALSE parts output padded fill argument. wrap Whether wrap data. Defaults FALSE. Must logical. Must length 1. wrap = TRUE, data end (head tail) copied end output, \"wrapping\" data within data structure. groupby group data. vector list vectors; must length length(x). segment x delineated groupby vector(s) treated separately. margin dimension shift. Must numeric. Arrays data.frames can lagged lead multiple dimensions using margin argument: margin == 1 shifts across rows margin == 2 shifts across columns.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/lag.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Shift data within a vector/matrix/data.frame — lag","text":"lagged vector values original vector, except offset n indices. lag moves value high index (n > 0); lead opposite, moving value lower index (n > 0). n can positive negative---negative lags equivalent leads, vice versa. Values near end/beginning either \"wrapped\" opposite end vector, replaced/padded value fill argument. vector , b, c, d, e, f, g can lagged n==1 NA, , b, c, d, e, f. set wrap == TRUE, \"g\" moved beginning output: g, , b, c, d, e, f.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/lag.html"],"id":"grouping","dir":"Reference","previous_headings":"","what":"Grouping","title":"Shift data within a vector/matrix/data.frame — lag","text":"many cases want perform lagged calculations vector, across certain boundaries. example, vector includes data multiple pieces, want calculate melodic intervals pieces, within pieces. groupby argument indicates one, , grouping vectors, break x (input) argument groups. groupby vectors given, change vector indicates boundary. Value pairs cross groups treated beginning. Basically, using groupby argument function similar identical using tapply(x, groupby, laggedFunction, ...) using groupby expession call ().humdrumR. However, using groupby argument directly usually much faster, specially optimized functions. common use case humdrum data, looking \"melodies\" within spines. , want groupby = list(Piece, Spine, Path). fact, humdrumR () calls automatically feed three fields groupby arguments certain functions: mint, delta, sigma, lag, ditto, ioi, sumTies, hop, wort, wort.character. use delta call (), automatically calculate delta \"melodic\" way, within spine path piece. However, wanted, instance, calculate differences across spines (like harmonic intervals) manually set groupby = list(Piece, Record).","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/lilypond.html"],"dir":"Reference","previous_headings":"","what":"Lilypond pitch representation — lilypond","title":"Lilypond pitch representation — lilypond","text":"representation used represent (Western tonal) pitches Lilypond notation format. humdrumR, lilypond function relates pitch part Lilypond notation: Lilypond-like rhythms can creating using recip function. lilypond() applied humdrumR data class may use data's fields arguments. field names specified, first selectedField used x.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/lilypond.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Lilypond pitch representation — lilypond","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/lilypond.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Lilypond pitch representation — lilypond","text":"x Input data parse pitch information. x argument can (atomic) vector, tonalInterval, NULL. ... Arguments passed pitch deparser. also two hidden (advanced) arguments can specify: memoize deparse (see details ). generic \"specific\" pitch information (accidentals qualites) discarded? Defaults FALSE. Must singleton logical value: /switch. simple \"compound\" pitch information (octave/contour) discarded? Defaults FALSE. Must singleton logical value: /switch. Key input Key used parser, deparser, transposer. Defaults NULL. Must diatonicSet something coercable diatonicSet; must either length 1 length(x) transposeArgs optional list arguments passed special transpose() call. Defaults empty list(). Must list named arguments transpose(). parseArgs optional list arguments passed pitch parser. Defaults empty list(). Must list named arguments pitch parser. inPlace non-pitch information retained output string. Defaults FALSE. Must singleton logical value: /switch. argument effect input (x argument) character strings, extra, non-pitch information input strings \"besides\" pitch information. , inPlace = TRUE, output placed output string beside original non-pitch information. inPlace = FALSE, pitch output information returned (details ).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/lilypond.html"],"id":"basic-pitch-arguments","dir":"Reference","previous_headings":"","what":"Basic pitch arguments","title":"Lilypond pitch representation — lilypond","text":"pitch function standard arguments control details output. important generic simple arguments, allow control type pitch information returned.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/lilypond.html"],"id":"generic-vs-specific","dir":"Reference","previous_headings":"","what":"Generic vs Specific","title":"Lilypond pitch representation — lilypond","text":"generic = TRUE, specific pitch information (accidentals qualities) omitted output. alternative way controlling functionality, can use specific argument, specific == !generic. case atonal functions, \"generic\" version pitch output: example, semits('c#', generic = TRUE) return 0, \"generic\" version C# C, corresponds 0. However, note generic version pitch follows key, semits('c#', generic = TRUE, Key = ':') return 1!","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/lilypond.html"],"id":"simple-vs-compound","dir":"Reference","previous_headings":"","what":"Simple vs Compound","title":"Lilypond pitch representation — lilypond","text":"simple = TRUE, compound pitch information (octave contour) omitted output. alternative way controlling functionality, can use compound argument ,compound == !simple. actually one way might want divide compound intervals simple octave parts. example, might like call output -M2 (descending major 2nd) +m7 (ascending minor 7th octave ). functionality can controlled octave.round argument: see pitch deparsing documentation.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/lilypond.html"],"id":"key","dir":"Reference","previous_headings":"","what":"Key","title":"Lilypond pitch representation — lilypond","text":"Key argument must diatonicSet, something can parsed one. Key argument passed parser, deparser, transpose---unless alternate Key passed transposeArgs parseArgs. Various deparsing options use Key argument; example, use implicitSpecies (see advanced parsing section) dependent Key. use pitch function within special call withinHumdrum, humdrumR automatically pass Key field humdrum data function---means, cases, need explicitly anything Key argument! (want happen, need explicitly specify Key argument, Key = NULL.)","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/lilypond.html"],"id":"parse-arguments","dir":"Reference","previous_headings":"","what":"Parse arguments","title":"Lilypond pitch representation — lilypond","text":"parseArgs argument must list() (named) arguments passed input parser. example, input representation uses \"X\" represent double sharps, specify kern('CX5', parseArgs = list(doublesharp = 'X')) get correct result (\"cc##\"). convenient shorthand, \"syntactic sugar,\" can specify parseArgs alternate way: Simply input parse(args...) unnamed argument pitch function. example, can get exact result typing kern('CX5', parse(doublesharp = 'X')).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/lilypond.html"],"id":"transpose-arguments","dir":"Reference","previous_headings":"","what":"Transpose arguments","title":"Lilypond pitch representation — lilypond","text":"transposeArgs argument must list() (named) arguments passed internal call transpose(), allowing us easily transpose pitch information. example, type kern(c('C', 'D', 'E'), transposeArgs = list(= 'M9')) can get output c('d', 'e', 'f#'). possible transpose args : (tonalInterval, length == 1 | length == (x)) (diatonicSet, length == 1 | length == (x)) (diatonicSet, length == 1 | length == (x)) real (logical, length == 1) transposition real tonal? relative (logical, length == 1) key-wise transposition based relative parallel keys? convenient shorthand, \"syntactic sugar,\" can specify transposeArgs alternate way: Simply input transpose(args...) unnamed argument pitch function. example, can get exact result typing kern(c('C', 'D', 'E'), transpose(= 'M9')).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/lilypond.html"],"id":"transposing-by-interval","dir":"Reference","previous_headings":"","what":"Transposing by interval","title":"Lilypond pitch representation — lilypond","text":"calling transpose() directly, argument can anything coercable tonalInterval, output transposed amount. real = FALSE, tonal transposition (within Key) performed. details transposition behavior, check transpose() docs.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/lilypond.html"],"id":"transposing-by-key","dir":"Reference","previous_headings":"","what":"Transposing by key","title":"Lilypond pitch representation — lilypond","text":"Another way transposing specifying input (\"\") key output (\"\") key. default, Key argument passed transpose , nothing actually happens. Thus, specify either key key, transposition happen /key Key. course, specify transposition happen keys specify. use pitch function within special call withinHumdrum, humdrumR automatically pass Key field humdrum data function. specify key, Key field passed transpose key, result, pitches input transposed whatever keys target () key! real relative arguments give special control key-wise transposition works, check transpose() docs details!","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/lilypond.html"],"id":"in-place-parsing","dir":"Reference","previous_headings":"","what":"In-place parsing","title":"Lilypond pitch representation — lilypond","text":"humdrum data, character strings often encoded multiple pieces musical information right besides : example, **kern data might include tokens like \"4.ee-[. humdrumR parser (tonalInterval) automatically \"pull \" pitch information within strings, can find using appropriate known regular expressions. example, pitch('4.ee-[') returns Eb5. However, pitch functions (like pitch() kern()) option keep \"extra\" information return result \"place\"---.e., embedded right found input string. controlled inPlace argument, FALSE default. , pitch('4.ee-[', inPlace = TRUE) return 4.Eb5[---keeping \"4.\" \"[\". (obviously works input string, numeric!) Note inPlace = TRUE force functions like semits, normally return numeric values, return character strings input character string.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/lilypond.html"],"id":"pitch-gamut-levels","dir":"Reference","previous_headings":"","what":"Pitch-Gamut Levels","title":"Lilypond pitch representation — lilypond","text":"table() automatically generate factor levels pitch data using gamut() function. makes sure tabulated data sorted logical order, includes missing pitches. simple/complex generic/specific arguments automatically passed gamut(); additional arguments can passed gamut using gamutArgs = list(...), syntactic sugar gamut(...). (Read gamut() docs explanation gamut generation.) feature used control table layout pitch data, well assure consistent tables grouping data. inPlace = TRUE special tabulation occur.","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/lilypond.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Lilypond pitch representation — lilypond","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/meter.html"],"dir":"Reference","previous_headings":"","what":"Musical Meter in humdrumR — meter","title":"Musical Meter in humdrumR — meter","text":"HumdrumR represents musical meter, internally, using S4-class meter. meter simply collection regular irregular beat \"levels,\" level represented musical durations. example, meter 4/4 represented recip() beat-levels c(\"1\", \"2\", \"4\", \"8\", \"16\")---, whole-note, half-note, quater-note, eighth-note, sixteenth note. addition, meter tactus---\"main\" beat level.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/meter.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Musical Meter in humdrumR — meter","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/meter.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Musical Meter in humdrumR — meter","text":"x time signature list beats used construct meter. Must character string list either numeric character values. character input parsed time signature, used extract tactus measure levels. contents list parsed durations using rhythmInterval(): durations become levels meter. Failures parse input result error. measure, tick, tactus Durations use longest (measure), shortest (tick), tactus levels. Must singleton character numeric value, list containing single vector values. parsed durations using rhythmInterval(); parse failures lead errors. fill.levels \"gaps\" specified levels added meter? Must singleton logical character value; character values must '', '', '', 'neither'. TRUE shorthand ''; FALSE shorthand 'neither'. subdiv Subdivisions (fractions) tactus add meter. Must positive natural numbers. hyper Multiples measure duration add meter. Must positive natural numbers. tatum least common denominator levels added meter? Must singleton logical value: /switch.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/meter.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Musical Meter in humdrumR — meter","text":"Generating meters humdrumR can done easily meter() function. pass character string humdrum time signature, get meter object: example, meter(\"M4/4\") meter(\"M12/8\"). Additive time signatures, like meter(M2+3/8) also parseable.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/meter.html"],"id":"adding-or-removing-levels","dir":"Reference","previous_headings":"","what":"Adding or removing levels","title":"Musical Meter in humdrumR — meter","text":"Time signatures leave lot room interpretation. Even \"standard\" 4/4 time, number questions need consider analyzing meter: fastest level want count? 16ths? 32nds? 64ths? want count half-note level, \"\" full measure (whole-note) tactus quarter-note? want treat triplets tuplets? piece uses lot triplet eighth-notes? want consider hypermeter, measure level? Fortunately, humdrumR meter() function give options precisely specify metric levels. transparent way simply pass meter() list duration values, like meter(list(\"1\", \"4\", \"8\")). However, meter() includes number helpful arguments can used quickly streamline process defining meter. understand arguments, lets first clarify metric definitions used humdrumR: Measure: duration \"measure\" meter. .e., highest metric level, least common multiple levels. Hypermeter: Metric levels measure indicated time signature. Tactus: \"main,\" usually central, level. Subdivision: level directly tactus. Tick: smallest/fastest metric level. (\"ticks\" grid.) Tatum: smallest common denominator set beats/duration. Note fully specified metric grid tick tatum identical. However, require tick tatum.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/meter.html"],"id":"meter-construction-arguments","dir":"Reference","previous_headings":"","what":"Meter construction arguments","title":"Musical Meter in humdrumR — meter","text":"measure (largest) tick (smallest) levels capture full range meter. tactus typically somewhere middle two, required. fill.levels argument can used 'fill ' levels measure, tactus, tick. means room \"fit\" (geometrically) duple triple subdivisions higher lower level, subdivisions added meter. fill.levels argument must single character string, partially matching either '', '', '', 'neither'. \"\" means fill gap tactus measure; \"\" means fill gap tactus tick. shortcut, logical TRUE FALSE can used alternative way specifiying '' 'neither', respectively. example, start levels measure-tactus-tick combination c(\"1\", \"4\", \"16\"), fill.levels = TRUE, fill levels \"2\" \"8\". tick argument can used directly specify tick meter. especially useful parsing datasets multiple meters, want force use tick value. example, meter(TimeSignature, tick = '32'). tick argument must single value can parsed rhythmic duration. subdiv argument can used explicitly control tactus subdivided. subdiv natural number (greater 1), divide tactus . Similarly, hyper argument natural number explicitly multiply measure . Thus, hyper = 2 adds two-measure hyper meter. tatum argument, TRUE, causes tatum metric levels added meter (already present). useful, example, specify meter mix duple triple levels want make sure tick meter tatum levels. example, levels c(\"4\", \"6\", \"8\"), tatum = TRUE add level \"24\" meter.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/meter.html"],"id":"constructing-meters-from-time-signatures","dir":"Reference","previous_headings":"","what":"Constructing meters from time signatures","title":"Musical Meter in humdrumR — meter","text":"\"meter construction arguments\" can also used reading time signatures. allows use time signatures datasets, maintaining precise control metric levels used. example, command meter(\"M4/4\", fill.levels = FALSE) generates meter levels c(\"1\", \"4\", \"16\"). add eighth-note level adding subdiv = 2, triple-eighth-notes subdiv = 3. add triplet-eighth-notes (subdiv = 3), might want add tatum = TRUE, automatically calculate common tatum levels---case, adding forty-eighth notes meter. opposite end, hyper = 4 add four-measure hyper meter top 4/4 bar. Finally, tactus argument used choose another tactus, like tactus = \"2\". additional, unnamed arguments meter() parsed durations, added levels meter.","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/metlev.html"],"dir":"Reference","previous_headings":"","what":"Count or measure metric position — metlev","title":"Count or measure metric position — metlev","text":"functions take vectors rhythmic duration values compute metric position rhythmic onset. metlev() identifies metric level onset; metcount() counts beats within measure; metsubpos() measures distance onset nearest metric beat. metcount() metsubpos() parallel general timecount() subpos() functions.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/metlev.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Count or measure metric position — metlev","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/metlev.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Count or measure metric position — metlev","text":"dur input vector rhythmic durations. Must character numeric vector. parsed using rhythmInterval(); Wherever input parsed duration, element treated duration zero. meter meter(s) compute levels . Defaults standard, five-level duple (4/4) meter. Must meter() object character vector. character input, string parsed using meter(); failure parse result error. pickup pickup (anacrusis)? Defaults NULL Must logical length(x), NULL. See \"Pickups\" section . value output levels represented rhythmic duration values? Defaults TRUE. Must singleton logical value: /switch. offBeats -beat onsets numbered output, NA? Defaults TRUE. Must single logical value: /switch. remainderSubdivides -beat onsets associated beat levels evenly subdivide? Defaults FALSE. singleton logical value: /switch. groupby list vectors group x. Defaults list(). Must list; every element list must length length(x). function -record timeline, groupby list music include named Piece Record fields. Luckily, automatically passed ().humdrumR, need worry ! parseArgs optional list arguments passed rhythm parser. Defaults empty list(). Must list named arguments rhythm parser. level metric level counted? Defaults tactus meter. single character value positive natural number. character string input must recip() value, matching beat level meter. numeric input directly indicates level meter, starting highest level (1).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/metlev.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Count or measure metric position — metlev","text":"Watch ! met...() functions require meter information output highly dependent interpret meter scores. full discussion meter can represented, parsed, created humdrumR, see meter() manual. Effective use meter() function essential use metlev(), metcount(), metsubpos().","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/metlev.html"],"id":"metric-levels","dir":"Reference","previous_headings":"","what":"Metric levels","title":"Count or measure metric position — metlev","text":"metlev() identifies \"highest\" (longest) metric level onset lands /: example, 4/4 time: onset downbeat highest level , whole-note level; onset beat three 4/4 measure half-note level; Onsets backbeats (beats two two) fall quarter-note level; next level eighth-note level, quarter-note beat; etc. metlev() output expresses beat levels duration level, recip() format default. whole-note level \"1\" quarter-note level (backbeats) \"4\". can specify different deparsing function (like duration()) using deparser argument. (deparser NULL, rational() numbers returned.) Another option express metric levels simply natural numbers, can achieve argument value = FALSE. case, top level meter 1, next lower-level incrementing : .e., quarter-note level (4/4) 3, sixteenth-note level 5.","code":""},{"path":[],"code":""},{"path":[],"code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/metlev.html"],"id":"metric-counts","dir":"Reference","previous_headings":"","what":"Metric counts","title":"Count or measure metric position — metlev","text":"metcount() function counts one beat level metric hierarchy, within next highest level. full duple meter, counts always simply 1, 2, 1, 2, etc. Meters triple level get 1, 2, 3, etc. level want count controlled level argument, can either character string recip() format natural number (1 top level, 2 next lowest level, etc.).","code":""},{"path":[],"code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/metlev.html"],"id":"-meter-counts--1","dir":"Reference","previous_headings":"","what":"6/8 meter counts:","title":"Count or measure metric position — metlev","text":"case 4/4, want count 1, 2, 3, 4, need make meter() object include half-note level.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/metlev.html"],"id":"-meter-with-no-half-note-level-","dir":"Reference","previous_headings":"","what":"4/4 meter with no half-note level:","title":"Count or measure metric position — metlev","text":"can meter('M4/4', fill.levels = '').","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/metlev.html"],"id":"metric-subpositions","dir":"Reference","previous_headings":"","what":"Metric subpositions","title":"Count or measure metric position — metlev","text":"cases, onsets may occur land beat specified meter. fast beat levels (e.g., 32nd notes), triplets, tuplets. cases, might consider adding levels meter(); example, want 32nd-note level 4/4, use meter('M4/4', tick = '32'). metlev() metcount(), offBeats argument can set FALSE cause offbeat onsets return NA. Another option use metsubpos(), measures far onset nearest associated beat meter. default, -beat onsets always associated closets previous position level meter. remainderSubdivides argument TRUE, -beat onsets associated previous metric level subposition makes even subdivision .","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/metlev.html"],"id":"pickups","dir":"Reference","previous_headings":"","what":"Pickups","title":"Count or measure metric position — metlev","text":"Another option pass pickup argument logical vector length input x. Within piece/group, block TRUE values beginning pickup vector indicate pickup. first index pickup logical FALSE used starting point timeline/timecount; earlier (pickup == TRUE) points negative numbers, measured backwards start index. humdrumR, datapoints first barline record (=) labeled Bar == 0 Bar field. Thus, common use pickup argument within(humData, timeline(Token, pickup = Bar < 1), makes downbeat first complete bar 1 starting point timeline---notes pickup bars negative timeline.","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/metlev.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Count or measure metric position — metlev","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/mutualInfo.html"],"dir":"Reference","previous_headings":"","what":"Calculate Mutual Information of variables — mutualInfo","title":"Calculate Mutual Information of variables — mutualInfo","text":"Calculate Mutual Information variables","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/mutualInfo.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Calculate Mutual Information of variables — mutualInfo","text":"","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/nbeats.html"],"dir":"Reference","previous_headings":"","what":"Counting beats — nbeats","title":"Counting beats — nbeats","text":"Counting beats","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/nbeats.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Counting beats — nbeats","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/notehead.html"],"dir":"Reference","previous_headings":"","what":"Note value representation of duration — notehead","title":"Note value representation of duration — notehead","text":"function outputs duration information traditional note value. symbols, Western notation. notehead() applied humdrumR data class may use data's fields arguments. field names specified, first selectedField used x.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/notehead.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Note value representation of duration — notehead","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/notehead.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Note value representation of duration — notehead","text":"x input vector. x argument can (atomic) vector, rational (rhythmInterval), NULL. Must parsable rhythm infromation. ... Arguments passed rhythm parser. also two hidden (advanced) arguments can specify: memoize deparse (see details ). scale numeric rational value used output unit measurement. Defaults rational(1, 1). Must numeric rational. inPlace non-rhythm information retained output string? Defaults FALSE. Must singleton logical value: /switch. Defaults FALSE. singleton logical value, NA. See \"Grace notes\" section .","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/notehead.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Note value representation of duration — notehead","text":"Note-value symbols simply encoded character vectors, since unicode character table includes musical symbols. course, depends system unicode font installed working: symbols might show properly machine! fact, symbols always print bit strangely (alignment) can hard manipulate like \"normal\" character strings. note-value symbols useful making labels plots. example, tabulate note values use barplot(), get nice bar labels:","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/notehead.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Note value representation of duration — notehead","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/octave.html"],"dir":"Reference","previous_headings":"","what":"Extract octave. — octave","title":"Extract octave. — octave","text":"Returns octave pitch falls . default, middle-C bottom zeroth-octave, can changed octave.offset argument. octave labels (like lilypond()-style marks) can used set octave.integer = FALSE.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/octave.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Extract octave. — octave","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/octave.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Extract octave. — octave","text":"x Input data parse pitch information. x argument can (atomic) vector, tonalInterval, NULL. ... Arguments passed pitch deparser. also two hidden (advanced) arguments can specify: memoize deparse (see details ). generic \"specific\" pitch information (accidentals qualites) discarded? Defaults FALSE. Must singleton logical value: /switch. simple \"compound\" pitch information (octave/contour) discarded? Defaults FALSE. Must singleton logical value: /switch. Key input Key used parser, deparser, transposer. Defaults NULL. Must diatonicSet something coercable diatonicSet; must either length 1 length(x) transposeArgs optional list arguments passed special transpose() call. Defaults empty list(). Must list named arguments transpose(). parseArgs optional list arguments passed pitch parser. Defaults empty list(). Must list named arguments pitch parser. inPlace non-pitch information retained output string. Defaults FALSE. Must singleton logical value: /switch. argument effect input (x argument) character strings, extra, non-pitch information input strings \"besides\" pitch information. , inPlace = TRUE, output placed output string beside original non-pitch information. inPlace = FALSE, pitch output information returned (details ).","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/octave.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Extract octave. — octave","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/p.html"],"dir":"Reference","previous_headings":"","what":"Tabulate and cross proportions — %*%,probabilityDistribution,probabilityDistribution-method","title":"Tabulate and cross proportions — %*%,probabilityDistribution,probabilityDistribution-method","text":"Tabulate cross proportions","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/p.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Tabulate and cross proportions — %*%,probabilityDistribution,probabilityDistribution-method","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/partialMatching.html"],"dir":"Reference","previous_headings":"","what":"What is ","title":"What is ","text":"\"partial matching\"?","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/partialMatching.html"],"id":"partial-matching-explained","dir":"Reference","previous_headings":"","what":"Partial matching explained","title":"What is ","text":"R useful functionality called \"partial matching,\" can match incomplete character string variable name list options. achieved using base-R function pmatch(), many R functions make use , many humdrumR functions. example, say data.frame (call df) three columns: \"Number\", \"Letter\", \"Date\": want access Number column, programming languages require write least df$Number. However, R give correct field even write df$Numb, df$Num, even df$N. partial matching! matching happens left--right, long get beginning variable right, work. course, partial matching works point string matches unambiguously. example, added Dare column df, df$D df$Da return NULL ambiguous. need write least Dar Dat get Dare Date columns respectively.","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pc.html"],"dir":"Reference","previous_headings":"","what":"Representation of atonal pitch classes — pc","title":"Representation of atonal pitch classes — pc","text":"encoded humdrum **pc interpretation. pc() applied humdrumR data class may use data's fields arguments. field names specified, first selectedField used x.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pc.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Representation of atonal pitch classes — pc","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pc.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Representation of atonal pitch classes — pc","text":"x Input data parse pitch information. x argument can (atomic) vector, tonalInterval, NULL. ... Arguments passed pitch deparser. also two hidden (advanced) arguments can specify: memoize deparse (see details ). generic \"specific\" pitch information (accidentals qualites) discarded? Defaults FALSE. Must singleton logical value: /switch. simple \"compound\" pitch information (octave/contour) discarded? Defaults FALSE. Must singleton logical value: /switch. Key input Key used parser, deparser, transposer. Defaults NULL. Must diatonicSet something coercable diatonicSet; must either length 1 length(x) transposeArgs optional list arguments passed special transpose() call. Defaults empty list(). Must list named arguments transpose(). parseArgs optional list arguments passed pitch parser. Defaults empty list(). Must list named arguments pitch parser. inPlace non-pitch information retained output string. Defaults FALSE. Must singleton logical value: /switch. argument effect input (x argument) character strings, extra, non-pitch information input strings \"besides\" pitch information. , inPlace = TRUE, output placed output string beside original non-pitch information. inPlace = FALSE, pitch output information returned (details ). ten shorthand-symbol use 10. Defaults \"\". Must single character string. NULL, \"10\" used shorthand. eleven shorthand-symbol use 11. Defaults \"B\". Must single character string. NULL, \"11\" used shorthand.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pc.html"],"id":"basic-pitch-arguments","dir":"Reference","previous_headings":"","what":"Basic pitch arguments","title":"Representation of atonal pitch classes — pc","text":"pitch function standard arguments control details output. important generic simple arguments, allow control type pitch information returned.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pc.html"],"id":"generic-vs-specific","dir":"Reference","previous_headings":"","what":"Generic vs Specific","title":"Representation of atonal pitch classes — pc","text":"generic = TRUE, specific pitch information (accidentals qualities) omitted output. alternative way controlling functionality, can use specific argument, specific == !generic. case atonal functions, \"generic\" version pitch output: example, semits('c#', generic = TRUE) return 0, \"generic\" version C# C, corresponds 0. However, note generic version pitch follows key, semits('c#', generic = TRUE, Key = ':') return 1!","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pc.html"],"id":"simple-vs-compound","dir":"Reference","previous_headings":"","what":"Simple vs Compound","title":"Representation of atonal pitch classes — pc","text":"simple = TRUE, compound pitch information (octave contour) omitted output. alternative way controlling functionality, can use compound argument ,compound == !simple. actually one way might want divide compound intervals simple octave parts. example, might like call output -M2 (descending major 2nd) +m7 (ascending minor 7th octave ). functionality can controlled octave.round argument: see pitch deparsing documentation.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pc.html"],"id":"key","dir":"Reference","previous_headings":"","what":"Key","title":"Representation of atonal pitch classes — pc","text":"Key argument must diatonicSet, something can parsed one. Key argument passed parser, deparser, transpose---unless alternate Key passed transposeArgs parseArgs. Various deparsing options use Key argument; example, use implicitSpecies (see advanced parsing section) dependent Key. use pitch function within special call withinHumdrum, humdrumR automatically pass Key field humdrum data function---means, cases, need explicitly anything Key argument! (want happen, need explicitly specify Key argument, Key = NULL.)","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pc.html"],"id":"parse-arguments","dir":"Reference","previous_headings":"","what":"Parse arguments","title":"Representation of atonal pitch classes — pc","text":"parseArgs argument must list() (named) arguments passed input parser. example, input representation uses \"X\" represent double sharps, specify kern('CX5', parseArgs = list(doublesharp = 'X')) get correct result (\"cc##\"). convenient shorthand, \"syntactic sugar,\" can specify parseArgs alternate way: Simply input parse(args...) unnamed argument pitch function. example, can get exact result typing kern('CX5', parse(doublesharp = 'X')).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pc.html"],"id":"transpose-arguments","dir":"Reference","previous_headings":"","what":"Transpose arguments","title":"Representation of atonal pitch classes — pc","text":"transposeArgs argument must list() (named) arguments passed internal call transpose(), allowing us easily transpose pitch information. example, type kern(c('C', 'D', 'E'), transposeArgs = list(= 'M9')) can get output c('d', 'e', 'f#'). possible transpose args : (tonalInterval, length == 1 | length == (x)) (diatonicSet, length == 1 | length == (x)) (diatonicSet, length == 1 | length == (x)) real (logical, length == 1) transposition real tonal? relative (logical, length == 1) key-wise transposition based relative parallel keys? convenient shorthand, \"syntactic sugar,\" can specify transposeArgs alternate way: Simply input transpose(args...) unnamed argument pitch function. example, can get exact result typing kern(c('C', 'D', 'E'), transpose(= 'M9')).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pc.html"],"id":"transposing-by-interval","dir":"Reference","previous_headings":"","what":"Transposing by interval","title":"Representation of atonal pitch classes — pc","text":"calling transpose() directly, argument can anything coercable tonalInterval, output transposed amount. real = FALSE, tonal transposition (within Key) performed. details transposition behavior, check transpose() docs.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pc.html"],"id":"transposing-by-key","dir":"Reference","previous_headings":"","what":"Transposing by key","title":"Representation of atonal pitch classes — pc","text":"Another way transposing specifying input (\"\") key output (\"\") key. default, Key argument passed transpose , nothing actually happens. Thus, specify either key key, transposition happen /key Key. course, specify transposition happen keys specify. use pitch function within special call withinHumdrum, humdrumR automatically pass Key field humdrum data function. specify key, Key field passed transpose key, result, pitches input transposed whatever keys target () key! real relative arguments give special control key-wise transposition works, check transpose() docs details!","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pc.html"],"id":"in-place-parsing","dir":"Reference","previous_headings":"","what":"In-place parsing","title":"Representation of atonal pitch classes — pc","text":"humdrum data, character strings often encoded multiple pieces musical information right besides : example, **kern data might include tokens like \"4.ee-[. humdrumR parser (tonalInterval) automatically \"pull \" pitch information within strings, can find using appropriate known regular expressions. example, pitch('4.ee-[') returns Eb5. However, pitch functions (like pitch() kern()) option keep \"extra\" information return result \"place\"---.e., embedded right found input string. controlled inPlace argument, FALSE default. , pitch('4.ee-[', inPlace = TRUE) return 4.Eb5[---keeping \"4.\" \"[\". (obviously works input string, numeric!) Note inPlace = TRUE force functions like semits, normally return numeric values, return character strings input character string.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pc.html"],"id":"pitch-gamut-levels","dir":"Reference","previous_headings":"","what":"Pitch-Gamut Levels","title":"Representation of atonal pitch classes — pc","text":"table() automatically generate factor levels pitch data using gamut() function. makes sure tabulated data sorted logical order, includes missing pitches. simple/complex generic/specific arguments automatically passed gamut(); additional arguments can passed gamut using gamutArgs = list(...), syntactic sugar gamut(...). (Read gamut() docs explanation gamut generation.) feature used control table layout pitch data, well assure consistent tables grouping data. inPlace = TRUE special tabulation occur.","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pc.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Representation of atonal pitch classes — pc","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pdist.html"],"dir":"Reference","previous_headings":"","what":"Tabulate and cross proportions — pdist","title":"Tabulate and cross proportions — pdist","text":"Tabulate cross proportions","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pdist.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Tabulate and cross proportions — pdist","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitch.html"],"dir":"Reference","previous_headings":"","what":"Scientific pitch representation — pitch","title":"Scientific pitch representation — pitch","text":"Scientific pitch standard approach representing pitch traditional Western music. pitch() applied humdrumR data class may use data's fields arguments. field names specified, first selectedField used x.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitch.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Scientific pitch representation — pitch","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitch.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Scientific pitch representation — pitch","text":"x Input data parse pitch information. x argument can (atomic) vector, tonalInterval, NULL. ... Arguments passed pitch deparser. also two hidden (advanced) arguments can specify: memoize deparse (see details ). generic \"specific\" pitch information (accidentals qualites) discarded? Defaults FALSE. Must singleton logical value: /switch. simple \"compound\" pitch information (octave/contour) discarded? Defaults FALSE. Must singleton logical value: /switch. Key input Key used parser, deparser, transposer. Defaults NULL. Must diatonicSet something coercable diatonicSet; must either length 1 length(x) transposeArgs optional list arguments passed special transpose() call. Defaults empty list(). Must list named arguments transpose(). parseArgs optional list arguments passed pitch parser. Defaults empty list(). Must list named arguments pitch parser. inPlace non-pitch information retained output string. Defaults FALSE. Must singleton logical value: /switch. argument effect input (x argument) character strings, extra, non-pitch information input strings \"besides\" pitch information. , inPlace = TRUE, output placed output string beside original non-pitch information. inPlace = FALSE, pitch output information returned (details ).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitch.html"],"id":"basic-pitch-arguments","dir":"Reference","previous_headings":"","what":"Basic pitch arguments","title":"Scientific pitch representation — pitch","text":"pitch function standard arguments control details output. important generic simple arguments, allow control type pitch information returned.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitch.html"],"id":"generic-vs-specific","dir":"Reference","previous_headings":"","what":"Generic vs Specific","title":"Scientific pitch representation — pitch","text":"generic = TRUE, specific pitch information (accidentals qualities) omitted output. alternative way controlling functionality, can use specific argument, specific == !generic. case atonal functions, \"generic\" version pitch output: example, semits('c#', generic = TRUE) return 0, \"generic\" version C# C, corresponds 0. However, note generic version pitch follows key, semits('c#', generic = TRUE, Key = ':') return 1!","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitch.html"],"id":"simple-vs-compound","dir":"Reference","previous_headings":"","what":"Simple vs Compound","title":"Scientific pitch representation — pitch","text":"simple = TRUE, compound pitch information (octave contour) omitted output. alternative way controlling functionality, can use compound argument ,compound == !simple. actually one way might want divide compound intervals simple octave parts. example, might like call output -M2 (descending major 2nd) +m7 (ascending minor 7th octave ). functionality can controlled octave.round argument: see pitch deparsing documentation.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitch.html"],"id":"key","dir":"Reference","previous_headings":"","what":"Key","title":"Scientific pitch representation — pitch","text":"Key argument must diatonicSet, something can parsed one. Key argument passed parser, deparser, transpose---unless alternate Key passed transposeArgs parseArgs. Various deparsing options use Key argument; example, use implicitSpecies (see advanced parsing section) dependent Key. use pitch function within special call withinHumdrum, humdrumR automatically pass Key field humdrum data function---means, cases, need explicitly anything Key argument! (want happen, need explicitly specify Key argument, Key = NULL.)","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitch.html"],"id":"parse-arguments","dir":"Reference","previous_headings":"","what":"Parse arguments","title":"Scientific pitch representation — pitch","text":"parseArgs argument must list() (named) arguments passed input parser. example, input representation uses \"X\" represent double sharps, specify kern('CX5', parseArgs = list(doublesharp = 'X')) get correct result (\"cc##\"). convenient shorthand, \"syntactic sugar,\" can specify parseArgs alternate way: Simply input parse(args...) unnamed argument pitch function. example, can get exact result typing kern('CX5', parse(doublesharp = 'X')).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitch.html"],"id":"transpose-arguments","dir":"Reference","previous_headings":"","what":"Transpose arguments","title":"Scientific pitch representation — pitch","text":"transposeArgs argument must list() (named) arguments passed internal call transpose(), allowing us easily transpose pitch information. example, type kern(c('C', 'D', 'E'), transposeArgs = list(= 'M9')) can get output c('d', 'e', 'f#'). possible transpose args : (tonalInterval, length == 1 | length == (x)) (diatonicSet, length == 1 | length == (x)) (diatonicSet, length == 1 | length == (x)) real (logical, length == 1) transposition real tonal? relative (logical, length == 1) key-wise transposition based relative parallel keys? convenient shorthand, \"syntactic sugar,\" can specify transposeArgs alternate way: Simply input transpose(args...) unnamed argument pitch function. example, can get exact result typing kern(c('C', 'D', 'E'), transpose(= 'M9')).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitch.html"],"id":"transposing-by-interval","dir":"Reference","previous_headings":"","what":"Transposing by interval","title":"Scientific pitch representation — pitch","text":"calling transpose() directly, argument can anything coercable tonalInterval, output transposed amount. real = FALSE, tonal transposition (within Key) performed. details transposition behavior, check transpose() docs.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitch.html"],"id":"transposing-by-key","dir":"Reference","previous_headings":"","what":"Transposing by key","title":"Scientific pitch representation — pitch","text":"Another way transposing specifying input (\"\") key output (\"\") key. default, Key argument passed transpose , nothing actually happens. Thus, specify either key key, transposition happen /key Key. course, specify transposition happen keys specify. use pitch function within special call withinHumdrum, humdrumR automatically pass Key field humdrum data function. specify key, Key field passed transpose key, result, pitches input transposed whatever keys target () key! real relative arguments give special control key-wise transposition works, check transpose() docs details!","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitch.html"],"id":"in-place-parsing","dir":"Reference","previous_headings":"","what":"In-place parsing","title":"Scientific pitch representation — pitch","text":"humdrum data, character strings often encoded multiple pieces musical information right besides : example, **kern data might include tokens like \"4.ee-[. humdrumR parser (tonalInterval) automatically \"pull \" pitch information within strings, can find using appropriate known regular expressions. example, pitch('4.ee-[') returns Eb5. However, pitch functions (like pitch() kern()) option keep \"extra\" information return result \"place\"---.e., embedded right found input string. controlled inPlace argument, FALSE default. , pitch('4.ee-[', inPlace = TRUE) return 4.Eb5[---keeping \"4.\" \"[\". (obviously works input string, numeric!) Note inPlace = TRUE force functions like semits, normally return numeric values, return character strings input character string.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitch.html"],"id":"pitch-gamut-levels","dir":"Reference","previous_headings":"","what":"Pitch-Gamut Levels","title":"Scientific pitch representation — pitch","text":"table() automatically generate factor levels pitch data using gamut() function. makes sure tabulated data sorted logical order, includes missing pitches. simple/complex generic/specific arguments automatically passed gamut(); additional arguments can passed gamut using gamutArgs = list(...), syntactic sugar gamut(...). (Read gamut() docs explanation gamut generation.) feature used control table layout pitch data, well assure consistent tables grouping data. inPlace = TRUE special tabulation occur.","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitch.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Scientific pitch representation — pitch","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchDeparsing.html"],"dir":"Reference","previous_headings":"","what":"Generating (","title":"Generating (","text":"humdrumR includes easy--use system generating variety tonal (atonal) pitch representations, can flexibly modified users. \"hood\" humdrumR represents tonal pitch information using underlying representation, typically extracted input data using pitch parser. representation can \"deparsed\" variety predefined output formats (like **kern), new formats create!","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchDeparsing.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Generating (","text":"Deparsing second step pitch function processing pipeline: Input representation |> Parsing |> Intermediate (tonalInterval) representation |> Transformation |> Deparsing (DEPARSING ARGS GO ) |> Output representation Various pitch representations like **kern, **solfa, **semits can generated using predefined pitch functions like kern() semits(), solfa() respectively. functions use common deparsing framework, specified using different combinations arguments deparser.modifying \"deparsing\" arguments, can exercise fine control want pitch information represented output. documentation talks deparsing step. overview parsing process, look .","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchDeparsing.html"],"id":"basic-pitch-arguments","dir":"Reference","previous_headings":"","what":"Basic pitch arguments","title":"Generating (","text":"pitch function standard arguments control details output. important generic simple arguments, allow control type pitch information returned.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchDeparsing.html"],"id":"generic-vs-specific","dir":"Reference","previous_headings":"","what":"Generic vs Specific","title":"Generating (","text":"generic = TRUE, specific pitch information (accidentals qualities) omitted output. alternative way controlling functionality, can use specific argument, specific == !generic. case atonal functions, \"generic\" version pitch output: example, semits('c#', generic = TRUE) return 0, \"generic\" version C# C, corresponds 0. However, note generic version pitch follows key, semits('c#', generic = TRUE, Key = ':') return 1!","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchDeparsing.html"],"id":"simple-vs-compound","dir":"Reference","previous_headings":"","what":"Simple vs Compound","title":"Generating (","text":"simple = TRUE, compound pitch information (octave contour) omitted output. alternative way controlling functionality, can use compound argument ,compound == !simple. actually one way might want divide compound intervals simple octave parts. example, might like call output -M2 (descending major 2nd) +m7 (ascending minor 7th octave ). functionality can controlled octave.round argument: see pitch deparsing documentation.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchDeparsing.html"],"id":"key","dir":"Reference","previous_headings":"","what":"Key","title":"Generating (","text":"Key argument must diatonicSet, something can parsed one. Key argument passed parser, deparser, transpose---unless alternate Key passed transposeArgs parseArgs. Various deparsing options use Key argument; example, use implicitSpecies (see advanced parsing section) dependent Key. use pitch function within special call withinHumdrum, humdrumR automatically pass Key field humdrum data function---means, cases, need explicitly anything Key argument! (want happen, need explicitly specify Key argument, Key = NULL.)","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchDeparsing.html"],"id":"parse-arguments","dir":"Reference","previous_headings":"","what":"Parse arguments","title":"Generating (","text":"parseArgs argument must list() (named) arguments passed input parser. example, input representation uses \"X\" represent double sharps, specify kern('CX5', parseArgs = list(doublesharp = 'X')) get correct result (\"cc##\"). convenient shorthand, \"syntactic sugar,\" can specify parseArgs alternate way: Simply input parse(args...) unnamed argument pitch function. example, can get exact result typing kern('CX5', parse(doublesharp = 'X')).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchDeparsing.html"],"id":"transpose-arguments","dir":"Reference","previous_headings":"","what":"Transpose arguments","title":"Generating (","text":"transposeArgs argument must list() (named) arguments passed internal call transpose(), allowing us easily transpose pitch information. example, type kern(c('C', 'D', 'E'), transposeArgs = list(= 'M9')) can get output c('d', 'e', 'f#'). possible transpose args : (tonalInterval, length == 1 | length == (x)) (diatonicSet, length == 1 | length == (x)) (diatonicSet, length == 1 | length == (x)) real (logical, length == 1) transposition real tonal? relative (logical, length == 1) key-wise transposition based relative parallel keys? convenient shorthand, \"syntactic sugar,\" can specify transposeArgs alternate way: Simply input transpose(args...) unnamed argument pitch function. example, can get exact result typing kern(c('C', 'D', 'E'), transpose(= 'M9')).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchDeparsing.html"],"id":"transposing-by-interval","dir":"Reference","previous_headings":"","what":"Transposing by interval","title":"Generating (","text":"calling transpose() directly, argument can anything coercable tonalInterval, output transposed amount. real = FALSE, tonal transposition (within Key) performed. details transposition behavior, check transpose() docs.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchDeparsing.html"],"id":"transposing-by-key","dir":"Reference","previous_headings":"","what":"Transposing by key","title":"Generating (","text":"Another way transposing specifying input (\"\") key output (\"\") key. default, Key argument passed transpose , nothing actually happens. Thus, specify either key key, transposition happen /key Key. course, specify transposition happen keys specify. use pitch function within special call withinHumdrum, humdrumR automatically pass Key field humdrum data function. specify key, Key field passed transpose key, result, pitches input transposed whatever keys target () key! real relative arguments give special control key-wise transposition works, check transpose() docs details!","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchDeparsing.html"],"id":"in-place-parsing","dir":"Reference","previous_headings":"","what":"In-place parsing","title":"Generating (","text":"humdrum data, character strings often encoded multiple pieces musical information right besides : example, **kern data might include tokens like \"4.ee-[. humdrumR parser (tonalInterval) automatically \"pull \" pitch information within strings, can find using appropriate known regular expressions. example, pitch('4.ee-[') returns Eb5. However, pitch functions (like pitch() kern()) option keep \"extra\" information return result \"place\"---.e., embedded right found input string. controlled inPlace argument, FALSE default. , pitch('4.ee-[', inPlace = TRUE) return 4.Eb5[---keeping \"4.\" \"[\". (obviously works input string, numeric!) Note inPlace = TRUE force functions like semits, normally return numeric values, return character strings input character string.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchDeparsing.html"],"id":"deparsing-arguments","dir":"Reference","previous_headings":"","what":"Deparsing arguments","title":"Generating (","text":"following \"advanced\" deparsing arguments available (read details ): Steps step.labels step.signed Species (accidentals qualities) qualities specifier.maximum Accidentals natural, flat, sharp, doubleflat, doublesharp Qualities perfect, major, minor, augment, diminish Implicit vs Explicit Species implicitSpecies absoluteSpecies explicitNaturals cautionary memory, memoryWindows Octave octave.integer , , octave.offset octave.round octave.relative, octave.absolute String parsing parts sep Note deparsing arguments similar (sometimes identical) parallel parsing arguments. \"advanced\" arguments can used directly pitch function: example, kern(x, qualities = TRUE). humdrumR pitch functions associated default deparsing arguments. example, use kern(), flat set (default) \"-\". However, wanted print **kern-like pitch data, except different flat symbol, like \"_\", modify deparser: kern('Eb5', flat = \"_\"). overrides default value **kern, output \"ee_\" instead \"ee-\".","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchDeparsing.html"],"id":"steps","dir":"Reference","previous_headings":"","what":"Steps","title":"Generating (","text":"representations \"tonal\" pitch information include representation diatonic steps. can control deparser writes diatonic steps using step.labels argument. step.labels argument must atomic vector unique values, length positive multiple seven. Examples step.labels arguments currently used humdrumR pitch functions include: step.labels = c('', 'B', 'C', 'D', 'E', 'F', 'G') step.labels = c('', 'II', 'III', 'IV', 'V', 'VI', 'VII') step.labels = c('d', 'r', 'm', 'f', 's', 'l', 't') step.labels NULL, steps assumed printed integers, including negative integers representing downward steps. also step.signed (logical, length == 1) argument: step.signed = TRUE, lowercase versions step.labels interpreted negative (downward) steps uppercase versions step.labels interpreted positive (upwards) steps. option used, example, default kern() helmholtz() parsers.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchDeparsing.html"],"id":"species","dir":"Reference","previous_headings":"","what":"Species","title":"Generating (","text":"tonal pitch representations, \"specific\" versions tonal pitches---tonal \"species\"---indicated \"specifiers\": either accidentals qualities. qualities (logical, length == 1) argument indicates whether accidentals used (qualities = FALSE) qualities (qualities = TRUE). specifiers can repeated number times, like \"triple sharps\" \"doubly augmented\"; specifier.maximum (integer, length == 1) argument sets maximum limit number specifiers write. example, force triple sharps (\"###\") double sharps (\"##\") deparse just \"#\", specifying specifier.maximum = 1L.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchDeparsing.html"],"id":"accidentals","dir":"Reference","previous_headings":"","what":"Accidentals","title":"Generating (","text":"qualities = FALSE deparser print accidentals three types: naturals, flats, sharps. natural, flat, /sharp (character, length == 1) arguments can used indicate accidentals printed output. example, set kern('Eb5', flat = 'flat') get output \"eeflat\". Examples accidental argument combinations currently used humdrumR pitch functions include: (flat = \"b\", sharp = \"#\") -> pitch() (flat = \"-\", sharp = \"#\") -> kern() (flat = \"es\", sharp = \"\") -> lilypond() (flat = \"-\", sharp = \"+\") -> degree() doubleflat, doublesharp (character, length == 1) arguments NULL default, can set special symbol wanted represent two sharps flats. example, modify pitch() use special double sharp symbol: pitch(\"f##\", doublesharp = \"x\") output \"Fx4\". printing naturals controlled natural argument. However, default, humdrumR deparsers printing naturals. can force naturals print setting explicitNaturals (logical, length == 1) argument TRUE. exact behavior explicitNaturals depends implicitSpecies, absoluteSpecies, Key argument (details ).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchDeparsing.html"],"id":"qualities","dir":"Reference","previous_headings":"","what":"Qualities","title":"Generating (","text":"qualities = TRUE deparser print qualities, five types: perfect, minor, major, augmented, diminished. perfect, major, minor, diminish, /augment (character, length == 1) arguments can used indicate qualities printed output. (Note: talking interval/degree qualities , chord qualities!) example, can write interval(c(\"g-\", \"f#\"), augment = 'aug', diminish = 'dim') output c(\"+dim5\", \"+aug4\"). Examples quality argument combinations currently used humdrumR pitch functions include: parse(major = \"M\", minor = \"m\", perfect = \"P\", diminish = \"d\", augment = \"\") parse(diminish = \"o\", augment = \"+\")","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchDeparsing.html"],"id":"implicit-vs-explicit-species","dir":"Reference","previous_headings":"","what":"Implicit vs Explicit Species","title":"Generating (","text":"musical data, specifiers (e.g., accidentals qualities) explicitly indicated; instead, must infer species pitch context---like key signature!.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchDeparsing.html"],"id":"from-the-key","dir":"Reference","previous_headings":"","what":"From the Key","title":"Generating (","text":"important argument implicitSpecies (logical, length == 1): implicitSpecies = TRUE, species input without explicit species indicated interpreted using Key. example, kern('C', Key = ':', parse(implicitSpecies = TRUE)) parsed \"C#\" C sharp major. kern('C', Key = ':', parse(implicitSpecies = TRUE)) parsed \"C\" C natural minor. kern('C', Key = '-:', parse(implicitSpecies = TRUE)) parsed \"C-\" C flat -flat minor. default, input already specifiers, interpreted absolutely---overriding \"implicit\" Key---, even implicitSpecies = TRUE. Thus, major: kern(\"C#\", Key = ':', parse(implicitSpecies = TRUE)) parsed \"C#\". \"#\" unnecessary. kern(\"Cn\", Key = ':', parse(implicitSpecies = TRUE)) parsed \"C\". \"n\" overrides Key. kern(\"C#\", Key = ':', parse(implicitSpecies = TRUE)) parsed \"C#\". \"#\" overrides Key. However! can also change behavior setting absoluteSpecies (logical, length == 1) argument FALSE. , specifiers input interpreted \"top \" key accidental: kern(\"C#\", Key = ':', parse(implicitSpecies = TRUE, absoluteSpecies = FALSE)) parsed \"C##\". \"#\" input added \"#\" Key, resulting double sharp! unusual behavior, absolute pitch representations like **kern. However, use scale chord degrees, absoluteSpecies = FALSE might appropriate. example, reading figured bass key E minor, \"b7\" figure E bass interpreted double flat (diminished) 7th (Db E)! data encoded, use absoluteSpecies = FALSE.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchDeparsing.html"],"id":"memory","dir":"Reference","previous_headings":"","what":"Memory","title":"Generating (","text":"musical data, assume accidental note \"stays effect\" scale step next bar, different accidental replaces . Fortunately, humdrumR parser (tonalInterval()) also knows parse data encoded \"memory\" way. memory = TRUE, accidental (quality) input note \"remembered\" previous appearances scale step. example, kern(c(\"D#\", \"E\", \"D\", \"E\", \"Dn\", \"C\", \"D\"), parse(memory = TRUE)) parsed c(\"D#\", \"E\", \"D#\", \"E\", \"D\", \"C\", \"D\") want \"memory\" last specific time windows (like bars), can also specify memoryWindows argument. memoryWindows must atomic vector length input (x argument). unique value within memoryWindows vector treated \"window\" within memory operates. common use case pass Bar field humdrumR dataset memoryWindows! memory memoryWindows argument work whatever values implicitSpecies absoluteSpecies specified! Though examples use accidentals, arguments effect parsing qualities (qualities = TRUE).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchDeparsing.html"],"id":"octave","dir":"Reference","previous_headings":"","what":"Octave","title":"Generating (","text":"final piece information encoded () pitch representations indication \"compound pitch\"--- incorporating octave information. humdrumR octaves always defined terms scale steps: two notes scale degree/letter name always octave. mainly comes regards Cb B#: Cb4 semitone ; B#3 enharmonically middle-C.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchDeparsing.html"],"id":"integer-octaves","dir":"Reference","previous_headings":"","what":"Integer Octaves","title":"Generating (","text":"simplest way octave information can encoded integer value, Scientific Pitch. need parse integer-encoded octaves, set octave.integer (logical, length == 1) argument TRUE. default, humdrumR considers \"central\" octave (octave == 0) octave , equivalently, unison. However, different octave used central octave, can specify octave.offset (integer, length == 1) argument. illustrate, default Scientific Pitch parser used arguments: kern('C5', parse(octave.integer = TRUE, octave.offset = 4) Returns \"cc\" (octave middle C).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchDeparsing.html"],"id":"non-integer-octave-markers","dir":"Reference","previous_headings":"","what":"Non-integer Octave Markers","title":"Generating (","text":"octave.integer = FALSE, humdrumR parser instead looks three possible symbols indicate octave information. symbols controlled using , , (character, length == 1) arguments. symbol, symbol, interpreted \"central\" octave; repeating strings symbols indicate increasing positive () negative () octaves. example, lilypond notation, , represents lower octaves, ' (single apostrophe) represents upper octaves. default lilypond() parser uses arguments: pitch(c(\"c\", \"c\", \"c'\"), parse(octave.integer = FALSE, = \"'\", = \",\", octave.offset = 1)) Returns c(\"C2\", \"C3\", \"C4\"). (Note lilypond makes octave central octave, using octave.offset = 1.)","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchDeparsing.html"],"id":"octave-rounding-","dir":"Reference","previous_headings":"","what":"Octave \"Rounding\"","title":"Generating (","text":"situations, pitch data might interpret \"groupby\" octaves little differently. absolute pitch representations (e.g., kern(), pitch()), \"boundary\" one octave next B (degree 7) C (degree 1). However, example, working data representing intervals, might think \"octave\" spanning range -P4 (G) +P4 (f). case, \"octave boundary\" centered around unison (), rather starting middle-C/unison. data represented way, use octave.round argument; octave.round must rounding function, either round, floor, ceiling, trunc, expand. functions indicate interpret simple pitches \"rounding\" nearest C/unison. default behavior pitch representations octave.round = floor: scale step rounded downwards nearest C. B associated C 7 steps . , hand, octave.round = round, scale-steps \"rounded\" closest C, B associated closer C . Indeed, octave.round = round gets us -P4 <-> +P4 behavior mentioned earlier! working parsing intervals, octave.round option allows control \"simple part\" (less octave) compound interval represented. example, might think ascending major 12th ascending octave plus ascending perfect 5th: ** +P8 + P5**. encode interval two ascending octaves minus perfect fourth: + P15 - P4. following table illustrates different octave.round arguments \"partition\" compound intervals simple parts octaves: Notice , octave.floor used, simple intervals represented ascending. parsing \"absolute\" pitch representations, octave.round option allows control octave notes associated . following table illustrates:","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchDeparsing.html"],"id":"absolute-or-relative-contour-octave","dir":"Reference","previous_headings":"","what":"Absolute or Relative (contour) Octave","title":"Generating (","text":"notation encoding schemes, \"octave\" note interpreted relative previous note, rather absolute reference. prominent system Lilypond's relative octave entry style. style often used combination scale degree representations---RS200 corpus. example, data set might say Re Mi vSo La Ti , \"v\" indicating jump . activate relative-octave parsing, set octave.relative = TRUE---alternatively, can use octave.absolute = FALSE, equivalent. relative-octave data, assume octave indications indicate shift relative previous note. usually used combination octave markers like \"^\" () \"v\" (). Different combinations octave.round allow us parse different behaviors: octave.round = round, marker (marker) indicates note pitch closest previous pitch. Octave markers indicate alterations assumption. always, based scale steps, semitones! fourth \"closer\" fifth, regardless quality: C F# ascending C Gb descending! ascending diminished 5th written C ^Gb---= ^. octave.round = floor, marker (marker) indicates note octave previous pitch. Octave markers indicate alterations assumption. setting, going C B always requires mark.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchDeparsing.html"],"id":"string-parsing","dir":"Reference","previous_headings":"","what":"String Parsing","title":"Generating (","text":"addition three types musical parsing considerations reviewed (steps, species, octaves), also general string-parsing issues can consider/control.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchDeparsing.html"],"id":"parts-and-order","dir":"Reference","previous_headings":"","what":"Parts and Order","title":"Generating (","text":"far () discussed various ways tonal pitch information (step, species, octave) can encoded, humdrumR parser can modified handle different options. However, two general parsing issues/options consider: information encoded, order? parts argument can specifyied indicate . parts argument must character vector length 1--3. characters must partial match either \"step\", \"species\", \"octave\". presense strings parts vector indicate information parsed. order strings indicates order pieces pitch information encoded input strings. illustrate, imagine input data identical standard interval representation---e.g., M2 P5---except quality appears step---e.g., 2M 5P. call interval(c(\"2M\", \"5P\"), parse(parts = c(\"step\", \"species\"))) sure enough get correct parse! One final string-parsing argument sep, indicates character string separating pitch information components: common case comma space. example, use parse command like : kern(\"E flat 5\", parse(flat = \"flat\", sep = \" \")).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchDeparsing.html"],"id":"pitch-gamut-levels","dir":"Reference","previous_headings":"","what":"Pitch-Gamut Levels","title":"Generating (","text":"table() automatically generate factor levels pitch data using gamut() function. makes sure tabulated data sorted logical order, includes missing pitches. simple/complex generic/specific arguments automatically passed gamut(); additional arguments can passed gamut using gamutArgs = list(...), syntactic sugar gamut(...). (Read gamut() docs explanation gamut generation.) feature used control table layout pitch data, well assure consistent tables grouping data. inPlace = TRUE special tabulation occur.","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchFunctions.html"],"dir":"Reference","previous_headings":"","what":"Translate between pitch representations. — pitchFunctions","title":"Translate between pitch representations. — pitchFunctions","text":"functions used extract translate different representations pitch information. functions can also things like transposing simplifying pitches.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchFunctions.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Translate between pitch representations. — pitchFunctions","text":"x Input data parse pitch information. x argument can (atomic) vector, tonalInterval, NULL. ... Arguments passed pitch deparser. also two hidden (advanced) arguments can specify: memoize deparse (see details ). generic \"specific\" pitch information (accidentals qualites) discarded? Defaults FALSE. Must singleton logical value: /switch. simple \"compound\" pitch information (octave/contour) discarded? Defaults FALSE. Must singleton logical value: /switch. Key input Key used parser, deparser, transposer. Defaults NULL. Must diatonicSet something coercable diatonicSet; must either length 1 length(x) parseArgs optional list arguments passed pitch parser. Defaults empty list(). Must list named arguments pitch parser. transposeArgs optional list arguments passed special transpose() call. Defaults empty list(). Must list named arguments transpose(). inPlace non-pitch information retained output string. Defaults FALSE. Must singleton logical value: /switch. argument effect input (x argument) character strings, extra, non-pitch information input strings \"besides\" pitch information. , inPlace = TRUE, output placed output string beside original non-pitch information. inPlace = FALSE, pitch output information returned (details ).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchFunctions.html"],"id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Translate between pitch representations. — pitchFunctions","text":"NULL inputs (x argument) return NULL output. Otherwise, returns vector/matrix length/dimension x. NA values input x propagated output.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchFunctions.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Translate between pitch representations. — pitchFunctions","text":"full list pitch functions : Tonal pitch representations Absolute pitch representations kern() pitch() lilypond() helmholtz() tonh() (German-style notation) Relative pitch representations interval() solfa() (relative-solfege) solfg() (French-style fixed-solfege) degree() (absolute scale degrees) deg() (melodic scale degrees) bhatk() (hindustani swara) Partial pitch representations step() accidental() quality() octave() Atonal pitch representations Musical pitch representations semits() midi() cents() pc() (pitch classes) Physical pitch representations freq() pitch functions work similar ways, similar arguments functionality. function takes input pitch representation (can anything) outputs pitch representation. example, kern() takes input representation outputs **kern (pitch) data. Underneath hood, full processing function looks like : Input representation (e.g., **pitch **semits) |> Parsing (done tonalInterval()) |> Intermediate (tonalInterval) representation |> Transformation (e.g., transpose()) |> Deparsing |> Output representation (e.g. **kern **solfa) read details parsing step, read . read details \"deparsing\" step, read . read details specific function, click links list , type ?func R command line: example, ?kern. \"partial\" pitch functions octave(), step(), accidental(), quality() -called return one part/aspect pitch information, part. example, accidental() returns accidentals () pitches.","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchParsing.html"],"dir":"Reference","previous_headings":"","what":"Parsing pitch information — pitchParsing","title":"Parsing pitch information — pitchParsing","text":"humdrumR includes easy--use powerful system parsing pitch information: various basic pitch representations (including numeric character-string representations) can \"parsed\"---read interpreted humdrumR. part, parsing automatically happens \"behind scenes\" whenever use humdrumR pitch function, like kern() semit(), solfa().","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchParsing.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Parsing pitch information — pitchParsing","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchParsing.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Parsing pitch information — pitchParsing","text":"Exclusive exclusive interpretation guide parsing input. Must NULL, character vector either length 1 length(x). str input vector. Must either character numeric. Key diatonic key used interpret pitch information. Defaults NULL. Must diatonicSet something coercable diatonicSet; must either length 1 length(x) example, use implicitSpecies (see advanced parsing section) dependent Key. output tonalInterval output within key: thus, tonalInterval('C#', Key = \":\") returns tint representing Major 3rd, C# major third major.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchParsing.html"],"id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Parsing pitch information — pitchParsing","text":"tonalInterval() returns tonalInterval object length dimensions x. NULL inputs (x argument) return NULL output. NA values input x propagated output.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchParsing.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Parsing pitch information — pitchParsing","text":"underlying parser used humdrumR pitch functions can called explicitly using function tonalInterval(). tonalInterval parser attempt parse input information tonalInterval object---back-end pitch representation probably need care ! use one main pitch functions, like kern() semits(), input parsed tonalInterval object, immediately deparsed representation asked (e.g., **kern **semits). Thus, underlying pipeline humdrumR pitch functions looks something like: Input representation (e.g., **pitch **semits) |> Parsing (done tonalInterval()) |> Intermediate (tonalInterval) representation |> Deparsing |> Output representation (e.g. **kern **solfa) documentation talks parsing step. overview \"deparsing\" process, look . learn \"deparsing\" specific representations, start go straight docs specific functions--- example, call ?kern learn kern().","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchParsing.html"],"id":"dispatch","dir":"Reference","previous_headings":"","what":"Dispatch","title":"Parsing pitch information — pitchParsing","text":"pitch parser (tonalInterval()) generic function, meaning accepts variety inputs automatically \"dispatches\" appropriate method parsing ehe input. R's standard S3 system used dispatch either numeric character-string input: Generally, numeric (integer) inputs interpreted various atonal pitch representations character strings interpreted various tonal pitch representations. Given either character string number, humdrumR uses either regular-expression matching humdrum exclusive interpretation matching dispatch specific parsing methods.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchParsing.html"],"id":"tonal-parsing-character-string-inputs-","dir":"Reference","previous_headings":"","what":"Tonal Parsing (character-string inputs)","title":"Parsing pitch information — pitchParsing","text":"Since humdrum data inherently string-based, powerful part humdrumR pitch-parser system parsing pitch (mostly tonal) information character strings. (includes character tokens pitch information embedded alongside information; Details .) pitch parser (tonalInterval()) uses combination regular-expressions exclusive interpretations decide parse input string. twelve regular-expression patterns pitch tonalInterval() knows parse automatically:","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchParsing.html"],"id":"exclusive-dispatch","dir":"Reference","previous_headings":"","what":"Exclusive Dispatch","title":"Parsing pitch information — pitchParsing","text":"call tonalInterval() (pitch function) character-string vector, non-NULL Exclusive argument, Exclusive argument used choose input interpretation want, based \"Exclusive\" column table . example, kern(x, Exclusive = 'solfa') force parser interpret x **solfa data. Similarly, solfa(x, Exclusive = 'kern') force parser interpret x **kern data. use pitch function within special call withinHumdrum, humdrumR automatically pass Exclusive field humdrum data function---means, cases, need explicitly anything Exclusive argument! (want happen, need explicitly specify Exclusive argument, Exclusive = NULL.)","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchParsing.html"],"id":"regex-dispatch","dir":"Reference","previous_headings":"","what":"Regex Dispatch","title":"Parsing pitch information — pitchParsing","text":"call tonalInterval() (pitch function) character-string vector, Exclusive argument missing NULL, humdrumR instead use regular-expression patterns select known interpretation. example, pitch('') automatically recognize '' solfege, interpret data accordingly (output G4). one matches, humdrumR use longest match, tie, pick based order table (topmost first). match, tonalInterval (pitch function) return NA values. Remember, Exclusive specified, overrides regex-based dispatch, means pitch('', Exclusive = 'kern') return NA, '' interpreted **kern value.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchParsing.html"],"id":"-in-place-parsing","dir":"Reference","previous_headings":"","what":"\"In place\" parsing","title":"Parsing pitch information — pitchParsing","text":"lots humdrum data, character strings encoded multiple pieces musical information right besides : example, **kern data might include tokens like \"4.ee-[. humdrumR pitch parser (tonalInterval()) automatically \"pull \" pitch information within strings, can find , using appropriate known regular expressions. Various pitch parsing functions option keep original \"extra\" data, using inPlace argument.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchParsing.html"],"id":"advanced-tonal-parsing-options","dir":"Reference","previous_headings":"","what":"Advanced Tonal Parsing Options","title":"Parsing pitch information — pitchParsing","text":"eleven tonal representations listed parsed common intesrface. using \"advanced\" parsing arguments, can tweak parsing done, accommodate even input representations! means controlling behavior tonalInterval(), second step pipeline: Input representation |> Parsing (done tonalInterval(PARSE ARGS GO !)) |> Intermediate (tonalInterval) representation |> Deparsing |> Output representation Note arguments similar identical parallel \"advanced\" deparsing arguments used various pitch functions. following \"advanced\" parsing arguments available (read details ): Steps step.labels step.signed Species (accidentals qualities) qualities specifier.maximum Accidentals natural, flat, sharp, doubleflat, doublesharp Qualities perfect, major, minor, augment, diminish Implicit vs Explicit Species implicitSpecies absoluteSpecies memory, memoryWindows Octave octave.integer , , octave.offset octave.round octave.relative, octave.absolute String parsing parts sep \"advanced\" arguments can used directly pitch function, call tonalInterval . use tonalInterval just specify directly arguments: example, tonalInterval(x, qualities = TRUE). use pitch functions, can either... Put parseArgs argument: kern(x, parseArgs = list(qualities = TRUE)) use \"syntactic sugar\" short-hand form: kern(x, parse(qualities = TRUE)) known Exclusive/Regex-dispatch combo (see table ) associated default parsing arguments. example, set Exclusive = 'kern' just use data look like **kern, flat argument set \"-\", However, , example, input data looked like **kern except used different flat symbol, like \"_\", modify parser: kern(\"EE_\", parse(flat = \"_\")) overrides default value **kern---notice, also updates **kern regular expression accordingly, works exactly standard kern() function.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchParsing.html"],"id":"steps","dir":"Reference","previous_headings":"","what":"Steps","title":"Parsing pitch information — pitchParsing","text":"representation \"tonal\" pitch information include representation diatonic steps. can control parser reads diatonic steps pitch representation using step.labels argument. step.labels argument must atomic vector unique values, length positive multiple seven. Examples step.labels arguments currently used preset humdrumR pitch parsers include: parse(step.labels = c('', 'B', 'C', 'D', 'E', 'F', 'G')) --- (**Tonh) parse(step.labels = c('d', 'r', 'm', 'f', 's', 'l', 't')) --- (**solfa) parse(step.labels = c('', 'II', 'III', 'IV', 'V', 'VI', 'VII')) --- (roman numerals) step.labels NULL, steps assumed represented integers, including negative integers representing downward steps. also step.signed (logical, length == 1) argument: step.signed = TRUE, lowercase versions step.labels interpreted negative (downward) steps uppercase versions step.labels interpreted positive (upwards) steps. option used, example, default kern() helmholtz() parsers.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchParsing.html"],"id":"species","dir":"Reference","previous_headings":"","what":"Species","title":"Parsing pitch information — pitchParsing","text":"tonal pitch representations, \"specific\" versions tonal pitches---tonal \"species\"---indicated \"specifiers\": either accidentals qualities. qualities (logical, length == 1) argument indicates whether accidentals used (qualities = FALSE) qualities (qualities = TRUE). specifiers can repeated number times, like \"triple sharps\" \"doubly augmented\"; specifier.maximum (integer, length == 1) argument sets maximum limit number specifiers read. example, force triple sharps (\"###\") double sharps (\"##\") parse just \"#\", specifying specifier.maximum = 1L.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchParsing.html"],"id":"accidentals","dir":"Reference","previous_headings":"","what":"Accidentals","title":"Parsing pitch information — pitchParsing","text":"qualities = FALSE parser look accidentals input, recognizing three types: naturals, flats, sharps. natural, flat, /sharp (character, length == 1) arguments can used indicate accidentals represented input. example, input strings look like c(\"Eflat\", \"C\"), set argument flat = \"flat\". Examples accidental argument combinations currently used preset humdrumR pitch parsers include: parse(flat = \"b\", sharp = \"#\") -> **pitch parse(flat = \"-\", sharp = \"#\") -> **kern parse(flat = \"-\", sharp = \"+\") -> **degree doubleflat, doublesharp (character, length == 1) arguments NULL default, can set special symbol used represent two sharps flats. example, might input represents double sharps \"x\". call kern(\"Fx\", parse(doublesharp = \"x\")) output \"F##\".","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchParsing.html"],"id":"qualities","dir":"Reference","previous_headings":"","what":"Qualities","title":"Parsing pitch information — pitchParsing","text":"qualities = TRUE parser look qualities input, recognizing five types: perfect, minor, major, augmented, diminished. perfect, major, minor, diminish, /augment (character, length == 1) arguments can used indicate qualities represented input. (Note: talking interval/degree qualities , chord qualities!) example, input strings look like c(\"maj3\", \"p4\"), set arguments major = \"maj\" perfect = \"p\". Examples quality argument combinations currently used humdrumR pitch functions include: parse(major = \"M\", minor = \"m\", perfect = \"P\", diminish = \"d\", augment = \"\") parse(diminish = \"o\", augment = \"+\")","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchParsing.html"],"id":"implicit-vs-explicit-species","dir":"Reference","previous_headings":"","what":"Implicit vs Explicit Species","title":"Parsing pitch information — pitchParsing","text":"musical data, specifiers (e.g., accidentals qualities) explicitly indicated; instead, must infer species pitch context---like key signature!.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchParsing.html"],"id":"from-the-key","dir":"Reference","previous_headings":"","what":"From the Key","title":"Parsing pitch information — pitchParsing","text":"important argument implicitSpecies (logical, length == 1): implicitSpecies = TRUE, species input without explicit species indicated interpreted using Key. example, kern('C', Key = ':', parse(implicitSpecies = TRUE)) parsed \"C#\" C sharp major. kern('C', Key = ':', parse(implicitSpecies = TRUE)) parsed \"C\" C natural minor. kern('C', Key = '-:', parse(implicitSpecies = TRUE)) parsed \"C-\" C flat -flat minor. default, input already specifiers, interpreted absolutely---overriding \"implicit\" Key---, even implicitSpecies = TRUE. Thus, major: kern(\"C#\", Key = ':', parse(implicitSpecies = TRUE)) parsed \"C#\". \"#\" unnecessary. kern(\"Cn\", Key = ':', parse(implicitSpecies = TRUE)) parsed \"C\". \"n\" overrides Key. kern(\"C#\", Key = ':', parse(implicitSpecies = TRUE)) parsed \"C#\". \"#\" overrides Key. However! can also change behavior setting absoluteSpecies (logical, length == 1) argument FALSE. , specifiers input interpreted \"top \" key accidental: kern(\"C#\", Key = ':', parse(implicitSpecies = TRUE, absoluteSpecies = FALSE)) parsed \"C##\". \"#\" input added \"#\" Key, resulting double sharp! unusual behavior, absolute pitch representations like **kern. However, use scale chord degrees, absoluteSpecies = FALSE might appropriate. example, reading figured bass key E minor, \"b7\" figure E bass interpreted double flat (diminished) 7th (Db E)! data encoded, use absoluteSpecies = FALSE.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchParsing.html"],"id":"memory","dir":"Reference","previous_headings":"","what":"Memory","title":"Parsing pitch information — pitchParsing","text":"musical data, assume accidental note \"stays effect\" scale step next bar, different accidental replaces . Fortunately, humdrumR parser (tonalInterval()) also knows parse data encoded \"memory\" way. memory = TRUE, accidental (quality) input note \"remembered\" previous appearances scale step. example, kern(c(\"D#\", \"E\", \"D\", \"E\", \"Dn\", \"C\", \"D\"), parse(memory = TRUE)) parsed c(\"D#\", \"E\", \"D#\", \"E\", \"D\", \"C\", \"D\") want \"memory\" last specific time windows (like bars), can also specify memoryWindows argument. memoryWindows must atomic vector length input (x argument). unique value within memoryWindows vector treated \"window\" within memory operates. common use case pass Bar field humdrumR dataset memoryWindows! memory memoryWindows argument work whatever values implicitSpecies absoluteSpecies specified! Though examples use accidentals, arguments effect parsing qualities (qualities = TRUE).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchParsing.html"],"id":"octave","dir":"Reference","previous_headings":"","what":"Octave","title":"Parsing pitch information — pitchParsing","text":"final piece information encoded () pitch representations indication \"compound pitch\"--- incorporating octave information. humdrumR octaves always defined terms scale steps: two notes scale degree/letter name always octave. mainly comes regards Cb B#: Cb4 semitone ; B#3 enharmonically middle-C.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchParsing.html"],"id":"integer-octaves","dir":"Reference","previous_headings":"","what":"Integer Octaves","title":"Parsing pitch information — pitchParsing","text":"simplest way octave information can encoded integer value, Scientific Pitch. need parse integer-encoded octaves, set octave.integer (logical, length == 1) argument TRUE. default, humdrumR considers \"central\" octave (octave == 0) octave , equivalently, unison. However, different octave used central octave, can specify octave.offset (integer, length == 1) argument. illustrate, default Scientific Pitch parser used arguments: kern('C5', parse(octave.integer = TRUE, octave.offset = 4) Returns \"cc\" (octave middle C).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchParsing.html"],"id":"non-integer-octave-markers","dir":"Reference","previous_headings":"","what":"Non-integer Octave Markers","title":"Parsing pitch information — pitchParsing","text":"octave.integer = FALSE, humdrumR parser instead looks three possible symbols indicate octave information. symbols controlled using , , (character, length == 1) arguments. symbol, symbol, interpreted \"central\" octave; repeating strings symbols indicate increasing positive () negative () octaves. example, lilypond notation, , represents lower octaves, ' (single apostrophe) represents upper octaves. default lilypond() parser uses arguments: pitch(c(\"c\", \"c\", \"c'\"), parse(octave.integer = FALSE, = \"'\", = \",\", octave.offset = 1)) Returns c(\"C2\", \"C3\", \"C4\"). (Note lilypond makes octave central octave, using octave.offset = 1.)","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchParsing.html"],"id":"octave-rounding-","dir":"Reference","previous_headings":"","what":"Octave \"Rounding\"","title":"Parsing pitch information — pitchParsing","text":"situations, pitch data might interpret \"boundaries\" octaves little differently. absolute pitch representations (e.g., kern(), pitch()), \"boundary\" one octave next B (degree 7) C (degree 1). However, example, working data representing intervals, might think \"octave\" spanning range -P4 (G) +P4 (f). case, \"octave boundary\" centered around unison (), rather starting middle-C/unison. data represented way, use octave.round argument; octave.round must rounding function, either round, floor, ceiling, trunc, expand. functions indicate interpret simple pitches \"rounding\" nearest C/unison. default behavior pitch representations octave.round = floor: scale step rounded downwards nearest C. B associated C 7 steps . , hand, octave.round = round, scale-steps \"rounded\" closest C, B associated closer C . Indeed, octave.round = round gets us -P4 <-> +P4 behavior mentioned earlier! working parsing intervals, octave.round option allows control \"simple part\" (less octave) compound interval represented. example, might think ascending major 12th ascending octave plus ascending perfect 5th: ** +P8 + P5**. encode interval two ascending octaves minus perfect fourth: + P15 - P4. following table illustrates different octave.round arguments \"partition\" compound intervals simple parts octaves: Notice , octave.floor used, simple intervals represented ascending. parsing \"absolute\" pitch representations, octave.round option allows control octave notes associated . following table illustrates:","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchParsing.html"],"id":"absolute-or-relative-contour-octave","dir":"Reference","previous_headings":"","what":"Absolute or Relative (contour) Octave","title":"Parsing pitch information — pitchParsing","text":"notation encoding schemes, \"octave\" note interpreted relative previous note, rather absolute reference. prominent system Lilypond's relative octave entry style. style often used combination scale degree representations---RS200 corpus. example, data set might say Re Mi vSo La Ti , \"v\" indicating jump . activate relative-octave parsing, set octave.relative = TRUE---alternatively, can use octave.absolute = FALSE, equivalent. relative-octave data, assume octave indications indicate shift relative previous note. usually used combination octave markers like \"^\" () \"v\" (). Different combinations octave.round allow us parse different behaviors: octave.round = round, marker (marker) indicates note pitch closest previous pitch. Octave markers indicate alterations assumption. always, based scale steps, semitones! fourth \"closer\" fifth, regardless quality: C F# ascending C Gb descending! ascending diminished 5th written C ^Gb---= ^. octave.round = floor, marker (marker) indicates note octave previous pitch. Octave markers indicate alterations assumption. setting, going C B always requires mark.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchParsing.html"],"id":"string-parsing","dir":"Reference","previous_headings":"","what":"String Parsing","title":"Parsing pitch information — pitchParsing","text":"addition three types musical parsing considerations reviewed (steps, species, octaves), also general string-parsing issues can consider/control.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchParsing.html"],"id":"parts-and-order","dir":"Reference","previous_headings":"","what":"Parts and Order","title":"Parsing pitch information — pitchParsing","text":"far () discussed various ways tonal pitch information (step, species, octave) can encoded, humdrumR parser can modified handle different options. However, two general parsing issues/options consider: information encoded, order? parts argument can specifyied indicate . parts argument must character vector length 1--3. characters must partial match either \"step\", \"species\", \"octave\". presense strings parts vector indicate information parsed. order strings indicates order pieces pitch information encoded input strings. illustrate, imagine input data identical standard interval representation---e.g., M2 P5---except quality appears step---e.g., 2M 5P. call interval(c(\"2M\", \"5P\"), parse(parts = c(\"step\", \"species\"))) sure enough get correct parse! One final string-parsing argument sep, indicates character string separating pitch information components: common case comma space. example, use parse command like : kern(\"E flat 5\", parse(flat = \"flat\", sep = \" \")).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchParsing.html"],"id":"atonal-parsing-numeric-inputs-","dir":"Reference","previous_headings":"","what":"Atonal Parsing (numeric inputs)","title":"Parsing pitch information — pitchParsing","text":"humdrumR pitch parser (tonalInterval()) interpret numeric inputs atonal pitch information. default, numbers interpreted semitones. However, parses midi(), cents(), frequencies also defined. Dispatch different parsers controlled Exclusive argument.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchParsing.html"],"id":"enharmonic-interpretation","dir":"Reference","previous_headings":"","what":"Enharmonic Interpretation","title":"Parsing pitch information — pitchParsing","text":"converting atonal representation tonal one, must decide interpret tonality input---specifically, enharmonic spelling notes use. humdrumR numeric parser interprets atonal pitches \"enharmonic window\" 12 steps line--fifths. position window set enharmonic.center (integer, length == 1) argument. default, enharmonic.center = 0, creates window -5 (b2) +6) (#4). prefer #1 instead b2, set enharmonic.center = 1. flats, set enharmonic.center = -1. sharps, set enharmonic.center = 4. enharmonic.center argument work translating pitch representation, like kern(). However, present table terms scale degrees atonal -> enharmonic calculation centered key. , Key argument specified, \"enharmonic window\" centered around key. translating kern Key = F#:, output range Gn B#. want , set Key = NULL.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchParsing.html"],"id":"melodic-interpretation-of-chromatic-notes","dir":"Reference","previous_headings":"","what":"Melodic Interpretation of Chromatic Notes","title":"Parsing pitch information — pitchParsing","text":"common chromatic notes melodic passages labeled based melodic contour: .e., ascending chromatic notes labeled sharp descending chromatic notes labeled flat. behavior can engaged setting accidental.melodic (logical, length == 1) argument. accidental.melodic = TRUE, input first centered enharmonic window (), places chromatic alteration proceeds upwards non-chromatic note altered (necessary) sharp, vice verse descending notes flats. example, kern(0:2) returns c(\"c\", \"d-\", \"d\"), kern(0:2, parse(accidental.melodic = TRUE)) returns c(\"c\", \"c#\", \"d\").","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pitchParsing.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Parsing pitch information — pitchParsing","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pullHumdrum.html"],"dir":"Reference","previous_headings":"","what":"Extract field(s) from humdrumR data — pullHumdrum","title":"Extract field(s) from humdrumR data — pullHumdrum","text":"Individual fields humdrum table can extracted using pull(). Multiple fields can extracted using pull_data.frame(), pull_data.table, pull_tibble() ---resulting data.frames column-subset humdrum table. can also use $ operator extract single field, just like pull().","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pullHumdrum.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Extract field(s) from humdrumR data — pullHumdrum","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pullHumdrum.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Extract field(s) from humdrumR data — pullHumdrum","text":"humdrumR, .data, x HumdrumR data. Must humdrumR data object. ... fields output. arguments provided, object's selected fields pulled. arguments can combination character strings, numbers, symbols used match fields humdrumR input using tidyverse semantics. Unlike tidyverse select(), field names can partially matched. can also include character strings partially matching \"Data\", \"Structure\", \"Interpretation\", \"Formal\", \"Reference\" \"Grouping\", select fields types (see fields() explanation). dataTypes types humdrum record(s) include. non-null data tokens (\"D\") returned default. Must single character string. Legal values 'G', 'L', '', 'M', 'D', 'd' combination (e.g., \"LIM\"). (See humdrum table documentation explanation.) null null data points output? Default \"charNA2dot\". Must single character string, partially matching \"NA2dot\", \"dot2NA\", 'charNA2dot\", \"asis\". var field output. Defaults selectedFields(humdrumR)[1]. Must either single character string symbol partially matches field name, single whole-number, selects field row index fields() output. negative number provided, nth--last index used---example, -1 grab last field.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pullHumdrum.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Extract field(s) from humdrumR data — pullHumdrum","text":"functions pull(), pull.data.xxx(), pull.tibble(), $ \"escape hatch\" pull data humdrumR data world \"normal\" R. Use pull() function $ access actual vector content single field. functions always return data.frame/data.table/tibble, even one column. Choose field(s) return using ..., var, name arguments. var ... options use tidyverse style select semantics (see select()). fields indicated, data's selected fields pulled; case pull() $, first selected field pulled. dataTypes argument controls types data pulled---default, non-null data (Type == \"D\") pulled. $ operator can grab non-null data. null argument controls null data returned, four options: \"NA2dot\" means NA values converted \".\"; note cause output coerced character. \"dot2NA\" means \".\" converted NA. \"charNA2dot\" means NA values character vectors converted NA, atomic types. \"asis\" means either NA \".\" values may print, depending field. Note pull_tibble() work independently load tibble (tidyverse) package--- .e., call library(tibble).","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/pullHumdrum.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Extract field(s) from humdrumR data — pullHumdrum","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/quality.html"],"dir":"Reference","previous_headings":"","what":"Extract quality from pitch — quality","title":"Extract quality from pitch — quality","text":"Use want extract tonal qualities pitch data, discarding octave step information.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/quality.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Extract quality from pitch — quality","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/quality.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Extract quality from pitch — quality","text":"x Input data parse pitch information. x argument can (atomic) vector, tonalInterval, NULL. ... Arguments passed pitch deparser. also two hidden (advanced) arguments can specify: memoize deparse (see details ). generic \"specific\" pitch information (accidentals qualites) discarded? Defaults FALSE. Must singleton logical value: /switch. simple \"compound\" pitch information (octave/contour) discarded? Defaults FALSE. Must singleton logical value: /switch. Key input Key used parser, deparser, transposer. Defaults NULL. Must diatonicSet something coercable diatonicSet; must either length 1 length(x) transposeArgs optional list arguments passed special transpose() call. Defaults empty list(). Must list named arguments transpose(). parseArgs optional list arguments passed pitch parser. Defaults empty list(). Must list named arguments pitch parser. inPlace non-pitch information retained output string. Defaults FALSE. Must singleton logical value: /switch. argument effect input (x argument) character strings, extra, non-pitch information input strings \"besides\" pitch information. , inPlace = TRUE, output placed output string beside original non-pitch information. inPlace = FALSE, pitch output information returned (details ).","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/quality.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Extract quality from pitch — quality","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/rational.html"],"dir":"Reference","previous_headings":"","what":"Rational numbers — rational","title":"Rational numbers — rational","text":"R built rational number representation; humdrumR defines one.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/rational.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Rational numbers — rational","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/rational.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Rational numbers — rational","text":"Using rational numbers, can represent numbers like 1/3 without numeric inaccuracies. words, \\(1/3 * 3 = 3\\), never \\(.999999999\\). hand, rational numbers start numerators demoninators large, can run integer overflow problems. Since rational numbers using context music analysis relatively simple, can safely use numbers without numeric inaccuracy. fraction class (associated constructor) represents rational numbers character strings. Unlike rational, fraction class numeric thus arithmetic. However, fraction can converted /rational.","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/readHumdrum.html"],"dir":"Reference","previous_headings":"","what":"Find and read humdrum files into R — knownInterpretations","title":"Find and read humdrum files into R — knownInterpretations","text":"functions find valid humdrum files local machine read humdrumR.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/readHumdrum.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Find and read humdrum files into R — knownInterpretations","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/readHumdrum.html"],"id":"format","dir":"Reference","previous_headings":"","what":"Format","title":"Find and read humdrum files into R — knownInterpretations","text":"object class data.table (inherits data.frame) 24 rows 5 columns.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/readHumdrum.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Find and read humdrum files into R — knownInterpretations","text":"... One patterns used identify files read. Must character strings. details: see \"REpath-patterns\" section . contains REGEX filtering files. Defaults NULL. Must character. !.null(contains), contains argument treated regular expressions: files contain matches regular expressions read. Thus, readHumdrum('.*krn$', contains = \"EEE\") read kern files contain matches \"EE\"---kern E two octaves middle C (lower). recursive files found recursively sub directories? Defaults FALSE. Must singleton logical value: /switch. TRUE, final part search pattern (.e., file search) searched recursively sub directories. allowDuplicates Indicating happen multiple search patterns match files. Defaults FALSE. Must singleton logical value: /switch. allowDuplicates = TRUE, files read multiple times, grouped respective corpora Label field. allowDuplicates = FALSE, redundant files read corpus first pattern match. verbose Whether print filename reading . Defaults FALSE. Must singleton logical value: /switch. TRUE, names matching files printed parsing begins. useful check make sure reading wrong files! tandems Controls , , tandem interpretations parsed fields. Defaults \"known\". Must character. reference reference records parsed fields. Defaults \"\". Must character.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/readHumdrum.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Find and read humdrum files into R — knownInterpretations","text":"findHumdrum work finding reading text files R. readHumdrum utilizes findHumdrum read files, parses create humdrum table build humdrumR data object around table.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/readHumdrum.html"],"id":"repath-patterns","dir":"Reference","previous_headings":"","what":"REpath-patterns","title":"Find and read humdrum files into R — knownInterpretations","text":"\"REpath-patterns\" specified using ... arguments. combination, ... arguments used search file paths. part search path specify (\"dirpart/dirpart/filepart\", etc) matched regular expressions directories/files disc. Thus, can say things like findHumdrum(\"../^.*/.*krn$\"), match kern files directory beginning capital \"\" directory current working directory. conveniance, can break path across multiple arguments instead using delimited strings: example, code findHumdrum(\"..\", \"^.*\", \".*krn$\") give identical result previous example (findHumdrum(\"../^.*/,*krn$\")). useful searching one pattern (see next paragraph) directory. want search one pattern, can input character vector: instance, readHumdrum(c(\"mozart\", \"beethoven\")---command search filenames containing \"mozart\" \"beethoven.\" works directories : readHumdrum(c(\"Mozart\", \"Beethoven\"), \".*krn$\") look kern files directories containing \"Mozart\" \"Beethoven.\" patterns named, names show identifying patterns [humdrumR][humdrumR] object's Label field. Unnamed patterns simply labeled numbers. refer files matched regex patterns \"subcorpora\" total corpus. Normal (system appropriate) conventions (.e., directories separated \"/\", '~' beginning indicate home, \"..\" indicate directory working directory, etc.) followed. pattern contains solo dot followed file sep---e.g., \"./\", \"x/./y\"---treated current directory, regular expression. pattern contains two dots---e.g., \"../\"---treated directory , regular expression. want create regular expression match directory, use \".*/\". regex pattern \"\" matches file (changed \".*\"). specifiy ... argument, findHumdrum (readHumdrum) default \".*\" well. Thus, readHumdrum() read humdrum files working directory. (two files different directories share name, unique name created file appending names directories occupy, recursively names unique.) single humdrum file multiple pieces ---meaning spine paths close *-, open **---parsed separately. distinguished Piece field. multi-piece files, Piece File identical.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/readHumdrum.html"],"id":"validity","dir":"Reference","previous_headings":"","what":"Validity","title":"Find and read humdrum files into R — knownInterpretations","text":"findHumdrum readHumdrum automatically ignore non-text files. , files contain humdrum syntax errors (checked validateHumdrum()) automatically skipped. want see specifically errors occurred, call validateHumdrum() directly use errorReport.path argument.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/readHumdrum.html"],"id":"tandem-interpretations","dir":"Reference","previous_headings":"","what":"Tandem Interpretations","title":"Find and read humdrum files into R — knownInterpretations","text":"tandem interpretations humdrum dataset summarized humdrum table's Tandem field, described detail . addition, certain \"known\" tandem interpretations parsed fields automatically. example, *clefG4 \"*clefF2 parsed Clef data, *k[b-] parsed KeySignature. \"known\" tandem interpretations humdrumR recognizes encoded built-table called knownInterpretations. interpretation humdrumR name (\"Clef\", \"TimeSignature\", etc.) well regular expression associated . tandems argument readHumdrum controls tandem interpretations parsed fields. can helpful either save processing time memory parsing interpretations need, parse interpretations humdrumR recognize. default value tandems argument \"known\". tandems argument contains \"known\" tandem interpretations built-knownInterpretations table parsed. Users may specify different interpretations parse two ways: character strings matching one name values Name column knownInterpretations. instance, specify tandems = c('Clef', 'TimeSignature'), clef (e.g., \"*clefG2\"), time signature (e.g., \"*M3/4\") intepretations parsed. character string(s) tandem exactly match one names knownInterpretations$Name, treated regular expressions used match tandem interpretations data. allows users parse non-standard tandem interpretations humdrumR already know . values tandems named, names used resulting fields. matches given interpretation found, field created interpretation. tandems = NULL, tandem interpretations parsed.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/readHumdrum.html"],"id":"reference-records","dir":"Reference","previous_headings":"","what":"Reference Records","title":"Find and read humdrum files into R — knownInterpretations","text":"default (reference = \"\"), humdrumR reads reference records data. reference code record (e.g, \"OTL\", \"!!!OTL: xxx\") used name associated field. (reference record reference code (.e., lacks colon), field called \"Unkeyed.\") large datasets many reference records, reference data can actually make large portion humdrum table, eat lot memory. cases, might want read () reference records---can instead read reference records planning use analyses (). reference = NULL, reference records parsed. Otherwise, character values reference treated reference codes matching reference records parsed. instance, readHumdrum(_, reference = \"OTL\") parse OTL reference records. values reference named, names used name associated fields. Thus, specifing reference = c(Title = 'OTL'), can use \"OTL\" reference records populate field called \"Title\". one reference records reference code, either explicitely numbered (e.g., \"!!!COM1:\", \"!!!COM2:\") read rather making two fields, single field created (\"COM\" ) multiple values separated \";\". humdrum data includes files containing multiple pieces, special consideration needed determine (guess) reference records (global comments) \"go \" piece. Obviously, reference records beginning end file grouped first last pieces respectively. However, reference records pieces multi-piece file require guess work. readHumdrum() look reference codes attempt group -reference records pieces logical way avoiding duplicated reference codes.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/readHumdrum.html"],"id":"spines-and-paths","dir":"Reference","previous_headings":"","what":"Spines and Paths","title":"Find and read humdrum files into R — knownInterpretations","text":"humdrum syntax, data placed \"spines,\" \"columns\" spreadsheet. \"column\" refers tab-delineated group values. \"Spines\" can single column, may (time) split multiple columns, can turn split , using \"*^\" interpretation token. reverse can happen well, two columns merging single column, using \"v\" token. means , humdrum data first glance looks like simple two-dimensional table, actually flexible tree structure. spines split merge, total number columns can change piece, creating \"ragged\" edge. Another similar issue corpus humdrum files may varying numbers spines/columns, pieces. (\"Global\" comment/reference records also special case, always single value, even interspersed multi-column local records.) readHumdrum assumes slightly strict version humdrum syntax: spines appear beginning file (headed exclusive interpretations like \"**kern\") can never merge . Thus, humdrum file read humdrumR must end fewer columns starts. Spine merges (\"*v\") can happen within spine paths originally split spine. extra-strict specification spine paths humdrum syntax , fortunately, something informally followed humdrum datasets. strict spine-path definition makes everything work fairly simply: Within piece, spines appear beginning piece \"true\" spines throughout piece, numbered left right, starting 1L. local token, value Spine field integer indicating \"true\" spines belongs ---global tokens NA value Spine field, belong spine. spine path splits (\"*^\") main spines form spine paths. Every spine's paths numbered Path field, right left, starting 0L. spine splits 0Ls Path field.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/readHumdrum.html"],"id":"result","dir":"Reference","previous_headings":"","what":"Result","title":"Find and read humdrum files into R — knownInterpretations","text":"findHumdrum returns \"fileFrame\" (data.table), listing file names, patterns match, directories found , raw text content files. readHumdrum returns fully parsed humdrumR object.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/readHumdrum.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Find and read humdrum files into R — knownInterpretations","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/recip.html"],"dir":"Reference","previous_headings":"","what":"Reciprocal representation of duration — recip","title":"Reciprocal representation of duration — recip","text":"standard approach representing conventional note values humdrum \"reciprocal\" **recip. Representation. **recip rhythmic values often used part **kern representation, also includes pitch information notation details. recip() applied humdrumR data class may use data's fields arguments. field names specified, first selectedField used x.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/recip.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Reciprocal representation of duration — recip","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/recip.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Reciprocal representation of duration — recip","text":"x input vector. x argument can (atomic) vector, rational (rhythmInterval), NULL. Must parsable rhythm infromation. ... Arguments passed rhythm parser. also two hidden (advanced) arguments can specify: memoize deparse (see details ). sep separator printed numerator denominator. single character string. Must single character string. scale numeric rational value used output unit measurement. Defaults rational(1, 1). Must numeric rational. inPlace non-rhythm information retained output string? Defaults FALSE. Must singleton logical value: /switch. Defaults FALSE. singleton logical value, NA. See \"Grace notes\" section .","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/recip.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Reciprocal representation of duration — recip","text":"**recip values literally reciprocal duration value. Since note values conventional music notation simple fractions reciprocal approach highly concise similar conventional western notation terminology. \"quarter note\" represented reciprocal 1/4: simply \"4\". Full reciprocal fractions can specified: \"2%3\" indicate 3/2. % separator can changed using sep argument. conventional note values, \"dots\" can added value increase duration ratio (2 - (2^{-n})), n number dots. (One dot 3/2; two dots 7/4; etc.).","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/recip.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Reciprocal representation of duration — recip","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/recordDuration.html"],"dir":"Reference","previous_headings":"","what":"Calculate duration of each record in a corpus — recordDuration","title":"Calculate duration of each record in a corpus — recordDuration","text":"Calculate duration record corpus","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/recordDuration.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Calculate duration of each record in a corpus — recordDuration","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/recordDuration.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Calculate duration of each record in a corpus — recordDuration","text":"humdrumR HumdrumR data.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/recycling.html"],"dir":"Reference","previous_headings":"","what":"What are ","title":"What are ","text":"\"recycling\" \"padding\"?","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/recycling.html"],"id":"recycling-and-padding-results","dir":"Reference","previous_headings":"","what":"Recycling and Padding results","title":"What are ","text":"Many R functions \"recycle\" results; functions \"pad\" results. mean? two options refer different strategies R code often provides maintain vectorization. key idea vectorization want length/size function inputs outputs . give 100-long vector function input, want 100-long vector output.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/recycling.html"],"id":"result-is-too-short-pad-or-recycle-","dir":"Reference","previous_headings":"","what":"Result is too short (pad or recycle)","title":"What are ","text":"happens outputs result shorter input, need length? Well, one option \"pad\" output NA values. example, call mean(1:9), 9-long input results scalar (1-long) output (5). force output 9-long (match input), pad NA like c(5, NA, NA, NA, NA, NA, NA, NA, NA). many cases, padding result like mean(1:9) useful---useful information (mean, case) stuck one index! Instead, useful \"recycle\" result. take result duplicate (\"recycle\") matches length input. recycle result mean(1:9) c(5, 5, 5, 5, 5, 5, 5, 5, 5). often (always) useful! common (best) case recycling , like example , result recycle \"scalar\" (single) value. one value simply copied length(input) times. can also recycle results non-scalar. example, imagine function summ() calculates minimum, median, maximum vector: call summ(1:9) return c(1, 5, 9). result recycled get c(1, 5, 9, 1, 5, 9, 1, 5, 9). sort recycling less likely useful, can confusing sometimes---example, probably meaningful reason median line original input values c(2, 5, 8). However, R (generally) happily ! good practice rely scalar recycling, avoid non-scalar recycling unless really sure want. One final note: result recycling length evenly divides input, see warning message saying longer object length multiple shorter object length. give example, image used range() function, returns minimum maximum median, input: result range(1:9) c(1, 9), recycle c(1, 9, 1, 9, 1, 9, 1, 9, 1). last repetition result cut short, two evenly divide nine. Since non-scalar recycling results often useful meaningful general, R takes particularly bad sign result evenly divide input, get warning.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/recycling.html"],"id":"result-is-too-long-index-","dir":"Reference","previous_headings":"","what":"Result is too long (index)","title":"What are ","text":"happens function outputs result longer input, need length? Well, obvious thing cut excess---something like head(output, n = length(input). course, may may make sense depending function !","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/reference.html"],"dir":"Reference","previous_headings":"","what":"Summarize reference records in a humdrumR corpus — reference","title":"Summarize reference records in a humdrumR corpus — reference","text":"reference used tabulate reference records present humdrumR corpus. reference one humdrumR's basic corpus summary functions.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/reference.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Summarize reference records in a humdrumR corpus — reference","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/reference.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Summarize reference records in a humdrumR corpus — reference","text":"x Input extracting reference information. Must character string (look reference code) humdrumR. drop Whether return normal data.table humCensus table. Defaults FALSE. Must singleton logical value: /switch. drop = TRUE, normal data.table returned instead humCensus table. Index rows. numeric, selects rows index. character, string matched regular expression filenames corpus. j Index columns. numeric, selects columns index. character, partially matched column names (reference codes).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/reference.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Summarize reference records in a humdrumR corpus — reference","text":"reference can used look information common reference codes: supply reference code character string reference check known reference codes print information matching codes (one). instance, reference('OTL') returns description standard humdrum !!!OTL reference record (original title metadata). applied humdrumR corpus reference returns special data.frame called humReference table. humReference table one column reference code appears corpus. Since reference records can long print one screen, humdrum files can multiple type reference code, humReference table normally prints number type reference record appear piece. However, one type reference code present humReference table, complete reference records code printed piece. Likewise, one piece present table, piece's complete reference records printed. Thus, want see actual reference records, try indexing humReference table one column row (see ). humReference table one row piece corpus. Rows labeled file name piece number index. addition, humReference object printed, three different summary totals printed reference code: indicates many pieces corpus contain least one example code. Sum indicates total number reference code appear corpus, including multiple appearances one piece (like multiple \"!!!COM\" records). Unique tabulates number unique token corpus, code. corpus two unique composers (encoded \"!!!COM\"), Unique total 2. assumes tokens exactly identical, including white space; \"!!!COM: J.S. Bach\" \"!!!COM: JS Bach\" counted two unique reference records.","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/reference.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Summarize reference records in a humdrumR corpus — reference","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/regexConstruction.html"],"dir":"Reference","previous_headings":"","what":"Making Regular Expressions — regexConstruction","title":"Making Regular Expressions — regexConstruction","text":"humdrumR includes helpful functions creating new regular expressions work stringr package.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/regexConstruction.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Making Regular Expressions — regexConstruction","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/regexConstruction.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Making Regular Expressions — regexConstruction","text":"captureRE take character vector collapse \"capture group.\" n argument can used append number tag, instance '*' (zero ) group. .e., captureRE(c(\"\", \"b\", \"c\"), '*') output \"[abc]*\". captureUniq make similar capture group captureRE, expression makes sure 1 character repeats. instance, captureUniq(c('', 'b','c')) return \"([abc])\\\\1*\"---expression match \"aaa\" \"bb\" \"aabb\".","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/rend.html"],"dir":"Reference","previous_headings":"","what":"Separate data fields into new spines. — rend","title":"Separate data fields into new spines. — rend","text":"Rend, \"rend apart,\" splits data separate fields separate spines paths. hood, rend() essentially runs specialized call make humdrum table \"longer\"/\"taller,\" similar R functions like melt(), gather(), pivot_longer(). fact, humdrumR method pivot_longer() defined, equivalent rend(). rend() function essentially inverse cleave().","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/rend.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Separate data fields into new spines. — rend","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/rend.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Separate data fields into new spines. — rend","text":"humdrumR HumdrumR data. Must humdrumR data object. ... fields rend? arguments can combination character strings, numbers, symbols used match fields humdrumR input using tidyverse semantics. See select() docs details. fieldName name newly rended field. Defaults pasting names selected fields (...) together, separated .. Must either NULL, single non-empty character string. removeRended rended fields removed output? Defaults TRUE. Must singleton logical value: /switch. rendEmpty Empty spines rended? Defaults TRUE. Must singleton logical value: /switch.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/rend.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Separate data fields into new spines. — rend","text":"rend() function takes number ... arguments select fields humdrumR data. identified fields split new spines. fields provided, data's selected fields rended. New spines generated existing spines; start spines 1, 2, 3, rend two fields... original spine 1 rended new spines 1 2; original spine 2 rended new spines 3 4; original spine 3 rended new spines 5 6. However, default, spines rended contain non-null data points target fields. example, original spine 2 non-null data one rended fields, rended two spines. However, rendEmpty set TRUE, spines rended even empty (null data). Note , since differnt fields may different data types, rend() generally coerce result character.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/rend.html"],"id":"fields","dir":"Reference","previous_headings":"","what":"Fields","title":"Separate data fields into new spines. — rend","text":"rend fields, new field generated. name new field specified newField---default, newField NULL names rended fields simply pasted together. removeRended = TRUE (default), original fields removed data. However, certain fields, like Token structural fields removed data. Therefore, rend fields, deleted, even removeRended = TRUE. provide one field name rend, automatically take Token. Thus, rend(humData, 'Solfa') equivalent rend(humData, 'Token', 'Solfa').","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/rend.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Separate data fields into new spines. — rend","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/rhythmDeparsing.html"],"dir":"Reference","previous_headings":"","what":"Generating (","title":"Generating (","text":"humdrumR includes easy--use system generating variety rhythm (time duration) representations, can flexibly modified users. \"hood\" humdrumR represents rhythmic duration information rational numbers, typically extracted input data using rhythm parser. rational representation can \"deparsed\" variety predefined output formats (like **recip), new formats create!","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/rhythmDeparsing.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Generating (","text":"Deparsing second step rhythm function processing pipeline: Input representation |> Parsing |> Intermediate (rational) representation |> Deparsing (DEPARSING ARGS GO ) |> Output representation Various rhythm representations like **recip, **dur, **duration can generated using predefined rhythm functions like recip() dur(), duration() respectively. functions use common deparsing framework. documentation talks deparsing step. overview parsing process, look .","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/rhythmDeparsing.html"],"id":"basic-rhythm-arguments","dir":"Reference","previous_headings":"","what":"Basic rhythm arguments","title":"Generating (","text":"Different rhythms share standard arguments control details output. important scale argument.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/rhythmDeparsing.html"],"id":"scalar-unit","dir":"Reference","previous_headings":"","what":"Scalar unit","title":"Generating (","text":"scale argument numeric rational value indicates reference unit used duration values: \"1\" duration? default, unit \"whole note\" duration. changing unit, can rescale output. example, recip value represents fraction unit: e.g., \"2\" equals 1/2 unit. call recip('2', scale = 1/16) telling us get half sixteenth: case '32'.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/rhythmDeparsing.html"],"id":"in-place-parsing","dir":"Reference","previous_headings":"","what":"In-place parsing","title":"Generating (","text":"humdrum data, character strings often encoded multiple pieces musical information right besides : example, **recip data might include tokens like \"4.ee-[. humdrumR parser (rhythmInterval) automatically \"pull \" rhythm information within strings, can find using appropriate known regular expressions. example, duration('4.ee-[') returns 0.375. However, pitch functions (like recip() dur()) option keep \"extra\" information return result \"place\"---.e., embedded right found input string. controlled inPlace argument, FALSE default. , duration('4.ee-[', inPlace = TRUE) return 0.375ee-[---keeping \"ee-[\". Note inPlace = TRUE force functions like duration, normally return numeric values, return character strings input character string.","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/rhythmFunctions.html"],"dir":"Reference","previous_headings":"","what":"Translate between rhythm representations. — rhythmFunctions","title":"Translate between rhythm representations. — rhythmFunctions","text":"functions used extract translate different representations rhythmic (time duration) information.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/rhythmFunctions.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Translate between rhythm representations. — rhythmFunctions","text":"x input vector. x argument can (atomic) vector, rational (rhythmInterval), NULL. Must parsable rhythm infromation. ... Arguments passed rhythm parser. also two hidden (advanced) arguments can specify: memoize deparse (see details ). scale numeric rational value used output unit measurement. Defaults rational(1, 1). Must numeric rational. Exclusive, parseArgs vector exclusive interpretations /optional list arguments passed rhythm parser. Default NULL empty list() respectively. Exclusive must NULL, character vector either length 1 length(x); parseArgs must list named arguments rhythm parser. inPlace non-rhythm information retained output string? Defaults FALSE. Must singleton logical value: /switch. Defaults FALSE. singleton logical value, NA. See \"Grace notes\" section .","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/rhythmFunctions.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Translate between rhythm representations. — rhythmFunctions","text":"full list rhythm functions : Metric rhythm representations Symbolic rhythm representations recip() (reciprocal note values) notehead() (traditional note-value symbols) Numeric rhythm representations duration() (Whole notes) quarters() (quarter notes/crotchets) Ametric rhythm representations Symbolic rhythm representations dur() (durations time) Numeric rhythm representations seconds() ms() (milliseconds) rhythm functions work similar ways, similar arguments functionality. function takes input rhythm (time duration) representation (can anything) outputs rhythm representation. example, recip() takes input representation outputs **recip (reciprocal durations) data. Underneath hood, full processing function looks like : Input representation (e.g., **recip **dur) |> Parsing (done rhythmInterval()) |> Intermediate (rational) representation |> Deparsing |> Output representation (e.g. **recip **duration) read details parsing step, read . read details \"deparsing\" step, read . read details specific function, click links list , type ?func R command line: example, ?notehead.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/rhythmFunctions.html"],"id":"grace-notes","dir":"Reference","previous_headings":"","what":"Grace notes","title":"Translate between rhythm representations. — rhythmFunctions","text":"**recip **kern data sometime include tokens indicating grace notes---special category duration, usually used indicate \"freely\" -metric notes otherwise metric context. humdrum data, grace notes marked \"q\" \"Q\"; q reserved tokens () duration information, Q marked along duration information: example, aa-q 16aa-Q. practice, distinction always made, rarely important. default, **recip parser treats input marked grace notes duration zero. However, pass grace argument rhythm parser, can control behavior. parse(grace = TRUE), grace-note durations (like 16 \"16aa-Q\") parsed like duration. grace = NA, grace-notes return NA. grace = FALSE, duration returns zero (default behavior).","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/rhythmParsing.html"],"dir":"Reference","previous_headings":"","what":"Parsing rhythm information — rhythmParsing","title":"Parsing rhythm information — rhythmParsing","text":"humdrumR includes easy--use powerful system parsing rhythm (time duration) information: various basic rhythm representations (including numeric character-string representations) can \"parsed\"---read interpreted humdrumR. part, parsing automatically happens \"behind scenes\" whenever use humdrumR rhythm function, like recip(), dur(), duration().","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/rhythmParsing.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Parsing rhythm information — rhythmParsing","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/rhythmParsing.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Parsing rhythm information — rhythmParsing","text":"underlying parser used humdrumR rhythm functions can called explicitly using function rhythmInterval(). rhythmInterval parser attempt parse input information ratioanl number object. use one main rhythm functions, like recip() dur(), input parsed rational object, immediately deparsed representation asked (e.g., **recip **dur). Thus, underlying pipeline humdrumR rhythm functions looks something like: Input representation (e.g., **recip **dur) |> Parsing (done rhythmInterval()) |> Intermediate (rational) representation |> Deparsing |> Output representation (e.g. **recip **duration) documentation talks parsing step. overview \"deparsing\" process, look . learn \"deparsing\" specific representations, start go straight docs specific functions--- example, call ?recip learn recip().","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/rhythmParsing.html"],"id":"dispatch","dir":"Reference","previous_headings":"","what":"Dispatch","title":"Parsing rhythm information — rhythmParsing","text":"rhythm parser (rhythmInterval()) generic function, meaning accepts variety inputs automatically \"dispatches\" appropriate method input. R's standard S3 system used dispatch either numeric character-string input: Though rhythmic representations essentially numbers, several standard representations included mix numeric non-numeric symbols. Given either character string number, humdrumR uses either regular-expression matching humdrum exclusive interpretation matching dispatch specific parsing methods.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/rhythmParsing.html"],"id":"symbolic-parsing","dir":"Reference","previous_headings":"","what":"Symbolic Parsing","title":"Parsing rhythm information — rhythmParsing","text":"Since humdrum data inherently string-based, input data ultimately starts character strings. (includes character tokens rhythm information embedded alongside information; Details .) rhythm parser (rhythmInterval()) uses combination regular-expressions exclusive interpretations decide parse input string. three regular-expression patterns rhythm rhythmInterval() knows parse automatically:","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/rhythmParsing.html"],"id":"exclusive-dispatch","dir":"Reference","previous_headings":"","what":"Exclusive Dispatch","title":"Parsing rhythm information — rhythmParsing","text":"call rhythmInterval() (rhythm function) character-string vector, non-NULL Exclusive argument, Exclusive argument used choose input interpretation want, based \"Exclusive\" column table . example, seconds(x, Exclusive = 'recip') force parser interpret x **recip data. Similarly, recip(x, Exclusive = 'dur') force parser interpret x **dur data. use rhythm function within special call withinHumdrum, humdrumR automatically pass Exclusive field humdrum data function---means, cases, need explicitly anything Exclusive argument! (want happen, need explicitly specify Exclusive argument, Exclusive = NULL.)","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/rhythmParsing.html"],"id":"regex-dispatch","dir":"Reference","previous_headings":"","what":"Regex Dispatch","title":"Parsing rhythm information — rhythmParsing","text":"call rhythmInterval() (rhythm function) character-string vector, Exclusive argument missing NULL, humdrumR instead use regular-expression patterns select known interpretation. example, seconds('4.') automatically recognize '4.' **recip token, interpret data accordingly (output 1.5). one matches, humdrumR use longest match, tie, pick based order table (topmost first). match, rhythmInterval() (rhythm function) return NA values. Remember, Exclusive specified, overrides regex-based dispatch, means pitch('4.', Exclusive = 'notevalue') return NA, '4.' interpreted **notevalue.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/rhythmParsing.html"],"id":"-in-place-parsing","dir":"Reference","previous_headings":"","what":"\"In place\" parsing","title":"Parsing rhythm information — rhythmParsing","text":"lots humdrum data, character strings encoded multiple pieces musical information right besides : example, **kern data might include tokens like \"4.ee-[. humdrumR rhythm parser (rhythmInterval()) automatically \"pull \" rhythm information within strings, can find , using appropriate known regular expressions. Various rhythm parsing functions option keep original \"extra\" data, using inPlace argument.","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/romanKey.html"],"dir":"Reference","previous_headings":"","what":"Roman numeral key areas — romanKey","title":"Roman numeral key areas — romanKey","text":"Roman numeral key areas","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/romanKey.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Roman numeral key areas — romanKey","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/romanKey.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Roman numeral key areas — romanKey","text":"x Input data, interpreted diatonic keys. Must atomic vector. Key key used parser, deparser, transposer. Defaults NULL. Must diatonicSet something coercable diatonicSet; must either length 1 length(x) parseArgs optional list arguments passed key parser. Defaults empty list(). Must list named arguments key parser.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/romanKey.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Roman numeral key areas — romanKey","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/romanNumerals.html"],"dir":"Reference","previous_headings":"","what":"Roman Numeral — romanNumerals","title":"Roman Numeral — romanNumerals","text":"Roman numerals can calculated diatonicSets (keys) tertian sets (chords). later case standard meaning \"roman numeral.\" However, former case used well, instance represent modulation schemes analyses classical music. instance, modulate -V, vi/V. importantly, many \"roman numerals\" harmonic analyses implicitely combine tertian diatonic roman numerals: \"applied\" roman numerals. Given roman numeral like \"V65/V\", \"V65\" represents chord \"/V\" represents key.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/segments.html"],"dir":"Reference","previous_headings":"","what":"Identify contiguous segments of data in a vector — segments","title":"Identify contiguous segments of data in a vector — segments","text":"segments() changes() extremely useful functions finding contiguous \"segments\" indicated vector. can particularly useful use segments() create grouping factors.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/segments.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Identify contiguous segments of data in a vector — segments","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/segments.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Identify contiguous segments of data in a vector — segments","text":"... list atomic vectors. vectors differ length, recycled match length longest vector. first first index (last index reverse == TRUE) marked \"change.\" Defaults TRUE. Must singleton logical value: /switch. Whether mark changes input vectors. Defaults TRUE. Must singleton logical value: /switch. TRUE, change input vector marked change. FALSE, changes must occur input vectors marked change. reverse Whether excecution order reversed. Defaults FALSE. Must singleton logical value: /switch. TRUE function excecuted backwards input vector(s). value Whether return changed value matrix. Defaults FALSE. Must singleton logical value: /switch. TRUE, input values changes occur returned matrix, row matching change column containing value associated input vector.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/segments.html"],"id":"changes","dir":"Reference","previous_headings":"","what":"Changes","title":"Identify contiguous segments of data in a vector — segments","text":"changes takes input vector finds indices value x[] != x[-1]---.e., value one index \"changed\" since last index. default, changes returns logical vector length input, TRUE indices change occured. first argument indicates whether first index (== 1) marked TRUE. changes can accept one input vector. argument set TRUE (default), change input marked change (TRUE) output. == FALSE, changes must happen vectors marked output. Finally, reverse argument reverses behavior changes, checkig instead x[] != x[+ 1].","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/segments.html"],"id":"values","dir":"Reference","previous_headings":"","what":"Values","title":"Identify contiguous segments of data in a vector — segments","text":"default, values input vector(s) change occurs placed matrix put values attribute logical output. However, value argument set TRUE, values returned.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/segments.html"],"id":"segments","dir":"Reference","previous_headings":"","what":"Segments","title":"Identify contiguous segments of data in a vector — segments","text":"segments builds changes function. segments function takes logical input cummulatively tallies TRUE value vector, left right (right left, reverse == TRUE). Thus, input c(TRUE, FALSE, TRUE, FALSE, FALSE, TRUE, TRUE, FALSE) return c(1, 1, 2, 2, 2, 3, 4, 4). creates contiguous blocks values can used groupby argument call within.humdrumR(), similar functions like base::tapply(). input vector(s) segments logical, first fed changes create logical input.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/segments.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Identify contiguous segments of data in a vector — segments","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/selectedFields.html"],"dir":"Reference","previous_headings":"","what":"The ","title":"The ","text":"Every humdrumR object , given time, one fields \"selected.\" selected fields fields shown humdrumR object prints console. (bottom printout, selected fields also marked *.) selected fields can also queried directly using selectedFields() function, inspecting output fields(). selected fields also play important roles humdrumR (see details).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/selectedFields.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"The ","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/selectedFields.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"The ","text":"humdrumR, .data HumdrumR data. Must humdrumR data object. ... fields output. arguments provided, Token field selected. arguments can combination character strings, numbers, symbols used match fields humdrumR input using tidyverse semantics. Unlike tidyverse select(), field names can partially matched. can also include character strings partially matching \"Data\", \"Structure\", \"Interpretation\", \"Formal\", \"Reference\" \"Grouping\", select fields types (see fields() explanation). fieldTypes field types available numeric selecting? Defaults \"\", fields counted numeric selection. Must character vector. Legal options \"Data\", \"Structure\", \"Interpretation\", \"Formal\", \"Reference\", \"Grouping\", \"\", corresponding Type column output fields(). Types can partially matched---example, \"S\" \"Structure\".","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/selectedFields.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"The ","text":"\"selected\" fields play important role humdrumR. addition controlling fields() \"see\" console printout, select fields fields many humdrumR functions automatically apply . example, call ditto(), timecount(), kern() humdrumR data object, functions applied selected field(s). (However, functions applied first selected field, one; see manuals details.) first selected field also passed hidden . variable calls ()/within()/, mutate()/summarize()/reframe()---remember fields selected can just put .! selected fields also role identifying \"null\" data. Whenever new fields selected, data tokens checked NA values null tokens (\".\"). Anywhere selected fields null, Type field updated \"d\"; wherever field null, Type field updated \"D\". Many functions ignore d (null data) tokens default, selecting fields can way controlling data want analyze .","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/selectedFields.html"],"id":"selecting-fields","dir":"Reference","previous_headings":"","what":"Selecting fields","title":"The ","text":"Fields can selected using tidyverse select() function, can use select()'s special select features. call select() argument, original Token field selected default. use select() numeric selections , like select(1:3), fields numbered (row) order shown call fields(). Fields always sorted first Type (Data first), name. provide fieldTypes argument, numeric selection reduced fields choose, matching row-numbers see call fields(humData, fieldTypes = ...). , example, select(humData, 1:3, fieldTypes = 'Structure') select first three structural fields. can also simply provide keywords \"Data\", \"Structure\", \"Interpretation\", \"Reference\", \"Formal\" select fields field type. Note call select() humdrumR data, selected field(s) change place, meaning selection changes even (re)assign output!","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/selectedFields.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"The ","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/semits.html"],"dir":"Reference","previous_headings":"","what":"Atonal pitch representations — semits","title":"Atonal pitch representations — semits","text":"function translates pitch information basic atonal pitch values: midi semits map pitches standard 12-tone-equal-temperament semitone (integer) values. semits 0 (zero) middle-C (unison). contrast, MIDI pitch values output midi place middle-C/unison 60. cents returns cents, one hundredth semitone. semits() applied humdrumR data class may use data's fields arguments. field names specified, first selectedField used x. midi() applied humdrumR data class may use data's fields arguments. field names specified, first selectedField used x.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/semits.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Atonal pitch representations — semits","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/semits.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Atonal pitch representations — semits","text":"x Input data parse pitch information. x argument can (atomic) vector, tonalInterval, NULL. ... Arguments passed pitch deparser. also two hidden (advanced) arguments can specify: memoize deparse (see details ). generic \"specific\" pitch information (accidentals qualites) discarded? Defaults FALSE. Must singleton logical value: /switch. simple \"compound\" pitch information (octave/contour) discarded? Defaults FALSE. Must singleton logical value: /switch. Key input Key used parser, deparser, transposer. Defaults NULL. Must diatonicSet something coercable diatonicSet; must either length 1 length(x) transposeArgs optional list arguments passed special transpose() call. Defaults empty list(). Must list named arguments transpose(). parseArgs optional list arguments passed pitch parser. Defaults empty list(). Must list named arguments pitch parser. inPlace non-pitch information retained output string. Defaults FALSE. Must singleton logical value: /switch. argument effect input (x argument) character strings, extra, non-pitch information input strings \"besides\" pitch information. , inPlace = TRUE, output placed output string beside original non-pitch information. inPlace = FALSE, pitch output information returned (details ). tonalHarmonic frequency \"tonal harmonic\" (perfect 12th). Defaults 2^(19/12), 12-tone-equal-temperament 12th. Must single number. Pythagorean tuning, set tonalHarmonic = 3.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/semits.html"],"id":"cents","dir":"Reference","previous_headings":"","what":"Cents","title":"Atonal pitch representations — semits","text":"default, output cents simply semits(x) * 100. However, tonalHarmonic value can modified cents produce cent-values alternate tunings. example, cents('g', tonalHarmonic = 3) returns 701.9550009, \"pure\" third harmonic (3) 1.955 sharper equal-temperment. Thus, whereas midi semits return integers, cents always returns real-number (double) values. TonalIntervals parsed frequencies might also arbitrary cent deviations. example, cents(440 * 10/9, Exclusive = 'freq') returns 1082.404---correspond \"minor tone\" =440.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/semits.html"],"id":"basic-pitch-arguments","dir":"Reference","previous_headings":"","what":"Basic pitch arguments","title":"Atonal pitch representations — semits","text":"pitch function standard arguments control details output. important generic simple arguments, allow control type pitch information returned.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/semits.html"],"id":"generic-vs-specific","dir":"Reference","previous_headings":"","what":"Generic vs Specific","title":"Atonal pitch representations — semits","text":"generic = TRUE, specific pitch information (accidentals qualities) omitted output. alternative way controlling functionality, can use specific argument, specific == !generic. case atonal functions, \"generic\" version pitch output: example, semits('c#', generic = TRUE) return 0, \"generic\" version C# C, corresponds 0. However, note generic version pitch follows key, semits('c#', generic = TRUE, Key = ':') return 1!","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/semits.html"],"id":"simple-vs-compound","dir":"Reference","previous_headings":"","what":"Simple vs Compound","title":"Atonal pitch representations — semits","text":"simple = TRUE, compound pitch information (octave contour) omitted output. alternative way controlling functionality, can use compound argument ,compound == !simple. actually one way might want divide compound intervals simple octave parts. example, might like call output -M2 (descending major 2nd) +m7 (ascending minor 7th octave ). functionality can controlled octave.round argument: see pitch deparsing documentation.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/semits.html"],"id":"key","dir":"Reference","previous_headings":"","what":"Key","title":"Atonal pitch representations — semits","text":"Key argument must diatonicSet, something can parsed one. Key argument passed parser, deparser, transpose---unless alternate Key passed transposeArgs parseArgs. Various deparsing options use Key argument; example, use implicitSpecies (see advanced parsing section) dependent Key. use pitch function within special call withinHumdrum, humdrumR automatically pass Key field humdrum data function---means, cases, need explicitly anything Key argument! (want happen, need explicitly specify Key argument, Key = NULL.)","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/semits.html"],"id":"parse-arguments","dir":"Reference","previous_headings":"","what":"Parse arguments","title":"Atonal pitch representations — semits","text":"parseArgs argument must list() (named) arguments passed input parser. example, input representation uses \"X\" represent double sharps, specify kern('CX5', parseArgs = list(doublesharp = 'X')) get correct result (\"cc##\"). convenient shorthand, \"syntactic sugar,\" can specify parseArgs alternate way: Simply input parse(args...) unnamed argument pitch function. example, can get exact result typing kern('CX5', parse(doublesharp = 'X')).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/semits.html"],"id":"transpose-arguments","dir":"Reference","previous_headings":"","what":"Transpose arguments","title":"Atonal pitch representations — semits","text":"transposeArgs argument must list() (named) arguments passed internal call transpose(), allowing us easily transpose pitch information. example, type kern(c('C', 'D', 'E'), transposeArgs = list(= 'M9')) can get output c('d', 'e', 'f#'). possible transpose args : (tonalInterval, length == 1 | length == (x)) (diatonicSet, length == 1 | length == (x)) (diatonicSet, length == 1 | length == (x)) real (logical, length == 1) transposition real tonal? relative (logical, length == 1) key-wise transposition based relative parallel keys? convenient shorthand, \"syntactic sugar,\" can specify transposeArgs alternate way: Simply input transpose(args...) unnamed argument pitch function. example, can get exact result typing kern(c('C', 'D', 'E'), transpose(= 'M9')).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/semits.html"],"id":"transposing-by-interval","dir":"Reference","previous_headings":"","what":"Transposing by interval","title":"Atonal pitch representations — semits","text":"calling transpose() directly, argument can anything coercable tonalInterval, output transposed amount. real = FALSE, tonal transposition (within Key) performed. details transposition behavior, check transpose() docs.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/semits.html"],"id":"transposing-by-key","dir":"Reference","previous_headings":"","what":"Transposing by key","title":"Atonal pitch representations — semits","text":"Another way transposing specifying input (\"\") key output (\"\") key. default, Key argument passed transpose , nothing actually happens. Thus, specify either key key, transposition happen /key Key. course, specify transposition happen keys specify. use pitch function within special call withinHumdrum, humdrumR automatically pass Key field humdrum data function. specify key, Key field passed transpose key, result, pitches input transposed whatever keys target () key! real relative arguments give special control key-wise transposition works, check transpose() docs details!","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/semits.html"],"id":"in-place-parsing","dir":"Reference","previous_headings":"","what":"In-place parsing","title":"Atonal pitch representations — semits","text":"humdrum data, character strings often encoded multiple pieces musical information right besides : example, **kern data might include tokens like \"4.ee-[. humdrumR parser (tonalInterval) automatically \"pull \" pitch information within strings, can find using appropriate known regular expressions. example, pitch('4.ee-[') returns Eb5. However, pitch functions (like pitch() kern()) option keep \"extra\" information return result \"place\"---.e., embedded right found input string. controlled inPlace argument, FALSE default. , pitch('4.ee-[', inPlace = TRUE) return 4.Eb5[---keeping \"4.\" \"[\". (obviously works input string, numeric!) Note inPlace = TRUE force functions like semits, normally return numeric values, return character strings input character string.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/semits.html"],"id":"pitch-gamut-levels","dir":"Reference","previous_headings":"","what":"Pitch-Gamut Levels","title":"Atonal pitch representations — semits","text":"table() automatically generate factor levels pitch data using gamut() function. makes sure tabulated data sorted logical order, includes missing pitches. simple/complex generic/specific arguments automatically passed gamut(); additional arguments can passed gamut using gamutArgs = list(...), syntactic sugar gamut(...). (Read gamut() docs explanation gamut generation.) feature used control table layout pitch data, well assure consistent tables grouping data. inPlace = TRUE special tabulation occur.","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/semits.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Atonal pitch representations — semits","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/sigma.html"],"dir":"Reference","previous_headings":"","what":"Cumulative sum of numeric vector — sigma","title":"Cumulative sum of numeric vector — sigma","text":"Calculate sequential cummulative sum values numeric vectors.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/sigma.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Cumulative sum of numeric vector — sigma","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/sigma.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Cumulative sum of numeric vector — sigma","text":"x input vector. Must atomic numbers. NULL values returned NULL. lag lag use. Defaults 1. Must natural number. (See Greater lags section, .) skip function indicate values skip. Defaults .na. must function can applied x return logical vector length. TRUE values skipped calculations. default, skip function .na, NA values input (x argument) skipped. skipped values returned output vector. init Initial value fill beginning calculation. Defaults 0. class x; length must longer lag. NA values beginning (end right == TRUE) filled values summing. groupby group data. Defaults list(). vector list vectors; must length length(x). Differences calculated across groups indicated groupby vector(s). orderby order calculating difference. Defaults list(). vector list vectors; must length length(x). Differences x calculated based order orderby vector(s), determined base::order(). right init padding \"right\" (end vector)? Defaults FALSE. Must singleton logical value: /switch. default, right == FALSE init padding beginning output.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/sigma.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Cumulative sum of numeric vector — sigma","text":"sigma similar base-R cumsum(). However, sigma favored humdrumR use : groupby argument, automatically used humdrumR () commands constrain differences within pieces/spines/paths humdrum data. Using groupby argument function (details ) generally faster using groupby argument withinHumdrum(). (can) automatically skip NA () values. sigma also init argument can used ensure full invertability delta(). See \"Invertability\" section . applied matrix, sigma applied separately column, unless margin set 1 (rows) , higher-dimensional array, higher value.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/sigma.html"],"id":"invertability","dir":"Reference","previous_headings":"","what":"Invertability","title":"Cumulative sum of numeric vector — sigma","text":"sigma delta functions inverses , meaning right arguments set, sigma(delta(x)) == x delta(sigma(x)) == x. words, two functions \"reverse\" . key init argument needs set 0, arguments (lag, skip, groupby, etc.) need match. actually, sigma(delta(x, init = 0, ...)) == x delta(sigma(x), init = 0)) == x. take differences values (delta(x)), resulting differences tell us fully reconstruct original unless know \"start\" (constant offset). example, delta(c(5, 7, 5, 6)) == c(NA, 2, -2, 1) know input goes 2, back 2, 1, starting value (first 5) lost. call sigma , get: sigma(c(NA, 2, -2, 1)) == c(0, 2,0, 1) get right contour, offset constant 5. call delta(x, init = 0) necessary constant (first value) kept beginning vector delta(c(5, 7, 5, 6), init = 0) == c(5, 2, -2, 1) sigma gets want, full invertability: sigma(delta(c(5, 7, 5, 6), init = 0)) == c(5, 7, 5, 6) Alternatively, specify necessary constant init argument sigma: sigma(delta(c(5, 7, 5, 6)), init = 5) == c(5, 7, 5, 6) init arguments two functions complementary. Currently, right argument delta complement sigma, invertability holds true right = FALSE (default).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/sigma.html"],"id":"greater-lags","dir":"Reference","previous_headings":"","what":"Greater lags","title":"Cumulative sum of numeric vector — sigma","text":"behavior sigma abs(lag) > 1 easiest understand inverse behavior delta(abs(lag) > 1), intuitive. (sigma inverse delta(), see Invertability section ). Generally, abs(lag) > 1, x grouped indices modulo lag, cumulative sum calculated separately set modulo indices. example, consider lag == 2 following input: cumulative sum 1 0 modulo-index groups : Index 1: cumsum(c(1,2,5)) == c(1, 3, 8). Index 0: cumsum(c(3,2)) == c(3, 5) Interleaved back order, result c(1,3,3,5,8). may clear, sure enough delta(c(1, 3, 3, 5, 8), lag = 2, init = 0) returns original c(1,3,2,2,5) vector! , understanding delta(..., lag = n) easier sigma(..., lag = n) (see Invtertability section .)","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/sigma.html"],"id":"negative-lag","dir":"Reference","previous_headings":"","what":"Negative lag","title":"Cumulative sum of numeric vector — sigma","text":"lag negative, output equivalent positive lag, except sign reversed (output * -1). behavior easiest understand inverse behavior delta(lag < 0), intuitive. (sigma inverse delta(), see Invertability section ).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/sigma.html"],"id":"grouping","dir":"Reference","previous_headings":"","what":"Grouping","title":"Cumulative sum of numeric vector — sigma","text":"many cases want perform lagged calculations vector, across certain boundaries. example, vector includes data multiple pieces, want calculate melodic intervals pieces, within pieces. groupby argument indicates one, , grouping vectors, break x (input) argument groups. groupby vectors given, change vector indicates boundary. Value pairs cross groups treated beginning. Basically, using groupby argument function similar identical using tapply(x, groupby, laggedFunction, ...) using groupby expession call ().humdrumR. However, using groupby argument directly usually much faster, specially optimized functions. common use case humdrum data, looking \"melodies\" within spines. , want groupby = list(Piece, Spine, Path). fact, humdrumR () calls automatically feed three fields groupby arguments certain functions: mint, delta, sigma, lag, ditto, ioi, sumTies, hop, wort, wort.character. use delta call (), automatically calculate delta \"melodic\" way, within spine path piece. However, wanted, instance, calculate differences across spines (like harmonic intervals) manually set groupby = list(Piece, Record).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/sigma.html"],"id":"order","dir":"Reference","previous_headings":"","what":"Order","title":"Cumulative sum of numeric vector — sigma","text":"performing lagged calculations, typically assume order values input vector (x) order want \"lag\" across. E.g., first element \"\" second element, \"\" third element, etc. [Humdrum tables][humTable] always ordered Piece > Piece > Spine > Path > Record > Stop. Thus, lagged calculations across fields humtable , default, \"melodic\": next element next element spine path. example, consider data: default order tokens (Token field) b c d e f. wanted instead lag across tokens harmonically (across records) need specifiy different order example, say orderby = list(Pice, Record, Spine)---lagged function interpret Token field d b e c f. another example, note Stop comes last order. consider happens stops data:","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/signature.html"],"dir":"Reference","previous_headings":"","what":"Humdrum key signature — signature","title":"Humdrum key signature — signature","text":"Humdrum key signature","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/signature.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Humdrum key signature — signature","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/signature.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Humdrum key signature — signature","text":"x Input data, interpreted diatonic keys. Must atomic vector. Key key used parser, deparser, transposer. Defaults NULL. Must diatonicSet something coercable diatonicSet; must either length 1 length(x) parseArgs optional list arguments passed key parser. Defaults empty list(). Must list named arguments key parser.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/signature.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Humdrum key signature — signature","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/silbeFormat.html"],"dir":"Reference","previous_headings":"","what":"silbeFormat — silbeFormat","title":"silbeFormat — silbeFormat","text":"Check formatting lyrics correct, -'s right places (.e., denote start end syllable)","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/silbeFormat.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"silbeFormat — silbeFormat","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/silbeFormat.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"silbeFormat — silbeFormat","text":"cVector data checked improper formatting. Must data.frame. now, please read spine dataframe 1 column.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/silbeFormat.html"],"id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"silbeFormat — silbeFormat","text":"\"Formatted properly.\" lyrics formatted properly, else print error message corrections.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/silbeFormat.html"],"id":"note","dir":"Reference","previous_headings":"","what":"Note","title":"silbeFormat — silbeFormat","text":"function might detect multiple inconsistencies/errors given value particular index, help user determine exact issue(s) transcription.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/solfa.html"],"dir":"Reference","previous_headings":"","what":"Relative-do Solfege representation — solfa","title":"Relative-do Solfege representation — solfa","text":"solfa() applied humdrumR data class may use data's fields arguments. field names specified, first selectedField used x.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/solfa.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Relative-do Solfege representation — solfa","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/solfa.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Relative-do Solfege representation — solfa","text":"x Input data parse pitch information. x argument can (atomic) vector, tonalInterval, NULL. ... Arguments passed pitch deparser. also two hidden (advanced) arguments can specify: memoize deparse (see details ). generic \"specific\" pitch information (accidentals qualites) discarded? Defaults FALSE. Must singleton logical value: /switch. simple \"compound\" pitch information (octave/contour) discarded? Defaults FALSE. Must singleton logical value: /switch. Key input Key used parser, deparser, transposer. Defaults NULL. Must diatonicSet something coercable diatonicSet; must either length 1 length(x) transposeArgs optional list arguments passed special transpose() call. Defaults empty list(). Must list named arguments transpose(). parseArgs optional list arguments passed pitch parser. Defaults empty list(). Must list named arguments pitch parser. inPlace non-pitch information retained output string. Defaults FALSE. Must singleton logical value: /switch. argument effect input (x argument) character strings, extra, non-pitch information input strings \"besides\" pitch information. , inPlace = TRUE, output placed output string beside original non-pitch information. inPlace = FALSE, pitch output information returned (details ).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/solfa.html"],"id":"basic-pitch-arguments","dir":"Reference","previous_headings":"","what":"Basic pitch arguments","title":"Relative-do Solfege representation — solfa","text":"pitch function standard arguments control details output. important generic simple arguments, allow control type pitch information returned.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/solfa.html"],"id":"generic-vs-specific","dir":"Reference","previous_headings":"","what":"Generic vs Specific","title":"Relative-do Solfege representation — solfa","text":"generic = TRUE, specific pitch information (accidentals qualities) omitted output. alternative way controlling functionality, can use specific argument, specific == !generic. case atonal functions, \"generic\" version pitch output: example, semits('c#', generic = TRUE) return 0, \"generic\" version C# C, corresponds 0. However, note generic version pitch follows key, semits('c#', generic = TRUE, Key = ':') return 1!","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/solfa.html"],"id":"simple-vs-compound","dir":"Reference","previous_headings":"","what":"Simple vs Compound","title":"Relative-do Solfege representation — solfa","text":"simple = TRUE, compound pitch information (octave contour) omitted output. alternative way controlling functionality, can use compound argument ,compound == !simple. actually one way might want divide compound intervals simple octave parts. example, might like call output -M2 (descending major 2nd) +m7 (ascending minor 7th octave ). functionality can controlled octave.round argument: see pitch deparsing documentation.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/solfa.html"],"id":"key","dir":"Reference","previous_headings":"","what":"Key","title":"Relative-do Solfege representation — solfa","text":"Key argument must diatonicSet, something can parsed one. Key argument passed parser, deparser, transpose---unless alternate Key passed transposeArgs parseArgs. Various deparsing options use Key argument; example, use implicitSpecies (see advanced parsing section) dependent Key. use pitch function within special call withinHumdrum, humdrumR automatically pass Key field humdrum data function---means, cases, need explicitly anything Key argument! (want happen, need explicitly specify Key argument, Key = NULL.)","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/solfa.html"],"id":"parse-arguments","dir":"Reference","previous_headings":"","what":"Parse arguments","title":"Relative-do Solfege representation — solfa","text":"parseArgs argument must list() (named) arguments passed input parser. example, input representation uses \"X\" represent double sharps, specify kern('CX5', parseArgs = list(doublesharp = 'X')) get correct result (\"cc##\"). convenient shorthand, \"syntactic sugar,\" can specify parseArgs alternate way: Simply input parse(args...) unnamed argument pitch function. example, can get exact result typing kern('CX5', parse(doublesharp = 'X')).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/solfa.html"],"id":"transpose-arguments","dir":"Reference","previous_headings":"","what":"Transpose arguments","title":"Relative-do Solfege representation — solfa","text":"transposeArgs argument must list() (named) arguments passed internal call transpose(), allowing us easily transpose pitch information. example, type kern(c('C', 'D', 'E'), transposeArgs = list(= 'M9')) can get output c('d', 'e', 'f#'). possible transpose args : (tonalInterval, length == 1 | length == (x)) (diatonicSet, length == 1 | length == (x)) (diatonicSet, length == 1 | length == (x)) real (logical, length == 1) transposition real tonal? relative (logical, length == 1) key-wise transposition based relative parallel keys? convenient shorthand, \"syntactic sugar,\" can specify transposeArgs alternate way: Simply input transpose(args...) unnamed argument pitch function. example, can get exact result typing kern(c('C', 'D', 'E'), transpose(= 'M9')).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/solfa.html"],"id":"transposing-by-interval","dir":"Reference","previous_headings":"","what":"Transposing by interval","title":"Relative-do Solfege representation — solfa","text":"calling transpose() directly, argument can anything coercable tonalInterval, output transposed amount. real = FALSE, tonal transposition (within Key) performed. details transposition behavior, check transpose() docs.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/solfa.html"],"id":"transposing-by-key","dir":"Reference","previous_headings":"","what":"Transposing by key","title":"Relative-do Solfege representation — solfa","text":"Another way transposing specifying input (\"\") key output (\"\") key. default, Key argument passed transpose , nothing actually happens. Thus, specify either key key, transposition happen /key Key. course, specify transposition happen keys specify. use pitch function within special call withinHumdrum, humdrumR automatically pass Key field humdrum data function. specify key, Key field passed transpose key, result, pitches input transposed whatever keys target () key! real relative arguments give special control key-wise transposition works, check transpose() docs details!","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/solfa.html"],"id":"in-place-parsing","dir":"Reference","previous_headings":"","what":"In-place parsing","title":"Relative-do Solfege representation — solfa","text":"humdrum data, character strings often encoded multiple pieces musical information right besides : example, **kern data might include tokens like \"4.ee-[. humdrumR parser (tonalInterval) automatically \"pull \" pitch information within strings, can find using appropriate known regular expressions. example, pitch('4.ee-[') returns Eb5. However, pitch functions (like pitch() kern()) option keep \"extra\" information return result \"place\"---.e., embedded right found input string. controlled inPlace argument, FALSE default. , pitch('4.ee-[', inPlace = TRUE) return 4.Eb5[---keeping \"4.\" \"[\". (obviously works input string, numeric!) Note inPlace = TRUE force functions like semits, normally return numeric values, return character strings input character string.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/solfa.html"],"id":"pitch-gamut-levels","dir":"Reference","previous_headings":"","what":"Pitch-Gamut Levels","title":"Relative-do Solfege representation — solfa","text":"table() automatically generate factor levels pitch data using gamut() function. makes sure tabulated data sorted logical order, includes missing pitches. simple/complex generic/specific arguments automatically passed gamut(); additional arguments can passed gamut using gamutArgs = list(...), syntactic sugar gamut(...). (Read gamut() docs explanation gamut generation.) feature used control table layout pitch data, well assure consistent tables grouping data. inPlace = TRUE special tabulation occur.","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/solfa.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Relative-do Solfege representation — solfa","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/solfg.html"],"dir":"Reference","previous_headings":"","what":"Fixed-do Solfege representation — solfg","title":"Fixed-do Solfege representation — solfg","text":"Based common French system notating pitches, encoded humdrum **solfg interpretation. solfg() applied humdrumR data class may use data's fields arguments. field names specified, first selectedField used x.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/solfg.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Fixed-do Solfege representation — solfg","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/solfg.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Fixed-do Solfege representation — solfg","text":"x Input data parse pitch information. x argument can (atomic) vector, tonalInterval, NULL. ... Arguments passed pitch deparser. also two hidden (advanced) arguments can specify: memoize deparse (see details ). generic \"specific\" pitch information (accidentals qualites) discarded? Defaults FALSE. Must singleton logical value: /switch. simple \"compound\" pitch information (octave/contour) discarded? Defaults FALSE. Must singleton logical value: /switch. Key input Key used parser, deparser, transposer. Defaults NULL. Must diatonicSet something coercable diatonicSet; must either length 1 length(x) transposeArgs optional list arguments passed special transpose() call. Defaults empty list(). Must list named arguments transpose(). parseArgs optional list arguments passed pitch parser. Defaults empty list(). Must list named arguments pitch parser. inPlace non-pitch information retained output string. Defaults FALSE. Must singleton logical value: /switch. argument effect input (x argument) character strings, extra, non-pitch information input strings \"besides\" pitch information. , inPlace = TRUE, output placed output string beside original non-pitch information. inPlace = FALSE, pitch output information returned (details ).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/solfg.html"],"id":"basic-pitch-arguments","dir":"Reference","previous_headings":"","what":"Basic pitch arguments","title":"Fixed-do Solfege representation — solfg","text":"pitch function standard arguments control details output. important generic simple arguments, allow control type pitch information returned.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/solfg.html"],"id":"generic-vs-specific","dir":"Reference","previous_headings":"","what":"Generic vs Specific","title":"Fixed-do Solfege representation — solfg","text":"generic = TRUE, specific pitch information (accidentals qualities) omitted output. alternative way controlling functionality, can use specific argument, specific == !generic. case atonal functions, \"generic\" version pitch output: example, semits('c#', generic = TRUE) return 0, \"generic\" version C# C, corresponds 0. However, note generic version pitch follows key, semits('c#', generic = TRUE, Key = ':') return 1!","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/solfg.html"],"id":"simple-vs-compound","dir":"Reference","previous_headings":"","what":"Simple vs Compound","title":"Fixed-do Solfege representation — solfg","text":"simple = TRUE, compound pitch information (octave contour) omitted output. alternative way controlling functionality, can use compound argument ,compound == !simple. actually one way might want divide compound intervals simple octave parts. example, might like call output -M2 (descending major 2nd) +m7 (ascending minor 7th octave ). functionality can controlled octave.round argument: see pitch deparsing documentation.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/solfg.html"],"id":"key","dir":"Reference","previous_headings":"","what":"Key","title":"Fixed-do Solfege representation — solfg","text":"Key argument must diatonicSet, something can parsed one. Key argument passed parser, deparser, transpose---unless alternate Key passed transposeArgs parseArgs. Various deparsing options use Key argument; example, use implicitSpecies (see advanced parsing section) dependent Key. use pitch function within special call withinHumdrum, humdrumR automatically pass Key field humdrum data function---means, cases, need explicitly anything Key argument! (want happen, need explicitly specify Key argument, Key = NULL.)","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/solfg.html"],"id":"parse-arguments","dir":"Reference","previous_headings":"","what":"Parse arguments","title":"Fixed-do Solfege representation — solfg","text":"parseArgs argument must list() (named) arguments passed input parser. example, input representation uses \"X\" represent double sharps, specify kern('CX5', parseArgs = list(doublesharp = 'X')) get correct result (\"cc##\"). convenient shorthand, \"syntactic sugar,\" can specify parseArgs alternate way: Simply input parse(args...) unnamed argument pitch function. example, can get exact result typing kern('CX5', parse(doublesharp = 'X')).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/solfg.html"],"id":"transpose-arguments","dir":"Reference","previous_headings":"","what":"Transpose arguments","title":"Fixed-do Solfege representation — solfg","text":"transposeArgs argument must list() (named) arguments passed internal call transpose(), allowing us easily transpose pitch information. example, type kern(c('C', 'D', 'E'), transposeArgs = list(= 'M9')) can get output c('d', 'e', 'f#'). possible transpose args : (tonalInterval, length == 1 | length == (x)) (diatonicSet, length == 1 | length == (x)) (diatonicSet, length == 1 | length == (x)) real (logical, length == 1) transposition real tonal? relative (logical, length == 1) key-wise transposition based relative parallel keys? convenient shorthand, \"syntactic sugar,\" can specify transposeArgs alternate way: Simply input transpose(args...) unnamed argument pitch function. example, can get exact result typing kern(c('C', 'D', 'E'), transpose(= 'M9')).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/solfg.html"],"id":"transposing-by-interval","dir":"Reference","previous_headings":"","what":"Transposing by interval","title":"Fixed-do Solfege representation — solfg","text":"calling transpose() directly, argument can anything coercable tonalInterval, output transposed amount. real = FALSE, tonal transposition (within Key) performed. details transposition behavior, check transpose() docs.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/solfg.html"],"id":"transposing-by-key","dir":"Reference","previous_headings":"","what":"Transposing by key","title":"Fixed-do Solfege representation — solfg","text":"Another way transposing specifying input (\"\") key output (\"\") key. default, Key argument passed transpose , nothing actually happens. Thus, specify either key key, transposition happen /key Key. course, specify transposition happen keys specify. use pitch function within special call withinHumdrum, humdrumR automatically pass Key field humdrum data function. specify key, Key field passed transpose key, result, pitches input transposed whatever keys target () key! real relative arguments give special control key-wise transposition works, check transpose() docs details!","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/solfg.html"],"id":"in-place-parsing","dir":"Reference","previous_headings":"","what":"In-place parsing","title":"Fixed-do Solfege representation — solfg","text":"humdrum data, character strings often encoded multiple pieces musical information right besides : example, **kern data might include tokens like \"4.ee-[. humdrumR parser (tonalInterval) automatically \"pull \" pitch information within strings, can find using appropriate known regular expressions. example, pitch('4.ee-[') returns Eb5. However, pitch functions (like pitch() kern()) option keep \"extra\" information return result \"place\"---.e., embedded right found input string. controlled inPlace argument, FALSE default. , pitch('4.ee-[', inPlace = TRUE) return 4.Eb5[---keeping \"4.\" \"[\". (obviously works input string, numeric!) Note inPlace = TRUE force functions like semits, normally return numeric values, return character strings input character string.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/solfg.html"],"id":"pitch-gamut-levels","dir":"Reference","previous_headings":"","what":"Pitch-Gamut Levels","title":"Fixed-do Solfege representation — solfg","text":"table() automatically generate factor levels pitch data using gamut() function. makes sure tabulated data sorted logical order, includes missing pitches. simple/complex generic/specific arguments automatically passed gamut(); additional arguments can passed gamut using gamutArgs = list(...), syntactic sugar gamut(...). (Read gamut() docs explanation gamut generation.) feature used control table layout pitch data, well assure consistent tables grouping data. inPlace = TRUE special tabulation occur.","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/solfg.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Fixed-do Solfege representation — solfg","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/sonority.html"],"dir":"Reference","previous_headings":"","what":"Interpret tertian sonorities from set(s) of notes. — sonority","title":"Interpret tertian sonorities from set(s) of notes. — sonority","text":"sonority() function accepts vectors notes, usually grouped multiple chords groupby argument, interprets notes tertian sonority. Chords output using representation indicated deparser argument. default, /within.humdrumR automatically pass sonority groupby argument groupby = list(Piece, Record), chords estimated record dataset.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/sonority.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Interpret tertian sonorities from set(s) of notes. — sonority","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/sonority.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Interpret tertian sonorities from set(s) of notes. — sonority","text":"x Input data, interpreted pitches. vector interpreted pitch information using tonalInterval(). deparser output representation want? Defaults chord(). Must chord function, like roman(), harm() chord(). Key input key used deparser. Defaults NULL, indicating c major. However, /within.humdrum automatically pass Key field data sonority, one. Must diatonicSet something coercable diatonicSet; must either length 1 length(x) chord parsers use Key, irrelevant, want use Key roman numerals. inversions interpret note sets inversions? Defaults TRUE. Must singleton logical value: /switch. incomplete return incomplete chords? Defaults TRUE. Must singleton logical value: /switch. enharmonic pitches interpreted enharmonically? Defaults FALSE. Must singleton logical value: /switch. inPlace output always match input? Defaults FALSE groupby list; TRUE . Must singleton logical value: /switch. fill output duplicate chord every note input? Defaults TRUE. Must singleton logical value: /switch. argument effect inPlace = TRUE.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/sonority.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Interpret tertian sonorities from set(s) of notes. — sonority","text":"inPlace = TRUE, sonority()returns vectorized output, output matching length input vector. default,fill = FALSE, output chord repeated align notes chord. fill = FALSE, chord returned , padded null tokens match length input. Finally, inPlace = FALSEonly one chord returned group ingroupby`. inversions = TRUE, notes interpreted chordal inversion compact (triad like) circle thirds. inversions = FALSE, lowest note always interpreted root. incomplete = TRUE, incomplete chords returns , might see things like \"C7no5\" (seventh chord fifth). incomplete = FALSE, sonority() (attempt) fill missing \"implied\" triad notes, note like missing 5ths. default, sonority() interpret spelling notes strictly, \"mispelled\" triad, like B, E♭, F♯ interpreted something weird---case augmented Eb chord third sharp 9! Note case cross relations---example, B♭ B♮ chord---sonority() simply ignore later species appears. However, enharmonic = TRUE, sonority() reinterpret input notes collapsing single diatonic set circle--fifths. means set B, Eb, F♯ interpreted B, D♯, F♯ set B♭, D, F, B♮ interpreted B♭, D, F, C♭.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/sonority.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Interpret tertian sonorities from set(s) of notes. — sonority","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/spines.html"],"dir":"Reference","previous_headings":"","what":"Summarize spines in humdrum dataset. — spines","title":"Summarize spines in humdrum dataset. — spines","text":"spines tabulates spines spine paths within files humdrumR corpus. spines one humdrumR's basic corpus summary functions.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/spines.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Summarize spines in humdrum dataset. — spines","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/spines.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Summarize spines in humdrum dataset. — spines","text":"humdrumR HumdrumR data summarize. Must humdrumR data object. drop Whether return normal data.table humCensus table. Defaults FALSE. Must singleton logical value: /switch. drop = TRUE, normal data.table returned instead humCensus table. Index rows. numeric, selects rows index. character, string matched regular expression filenames corpus.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/spines.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Summarize spines in humdrum dataset. — spines","text":"spines returns special data.frame called humSpines table. humSpines table five columns information piece: Spines number spines. Paths total number spine paths. number spines contain spine paths. *^ total number spine splits (\"*^\"). *v total number spine joins (\"*v\"). humSpine table prints command line, \"tallies\" unique combinations spines paths files also printed.","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/spines.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Summarize spines in humdrum dataset. — spines","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/step.html"],"dir":"Reference","previous_headings":"","what":"Extract scale step. — step","title":"Extract scale step. — step","text":"equivalent using pitch function arguments generic = TRUE, simple = TRUE, step.labels = NULL. default, step() returns steps relative key---set Key = NULL want .","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/step.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Extract scale step. — step","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/step.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Extract scale step. — step","text":"x Input data parse pitch information. x argument can (atomic) vector, tonalInterval, NULL. ... Arguments passed pitch deparser. also two hidden (advanced) arguments can specify: memoize deparse (see details ). generic \"specific\" pitch information (accidentals qualites) discarded? Defaults FALSE. Must singleton logical value: /switch. simple \"compound\" pitch information (octave/contour) discarded? Defaults FALSE. Must singleton logical value: /switch. Key input Key used parser, deparser, transposer. Defaults NULL. Must diatonicSet something coercable diatonicSet; must either length 1 length(x) transposeArgs optional list arguments passed special transpose() call. Defaults empty list(). Must list named arguments transpose(). parseArgs optional list arguments passed pitch parser. Defaults empty list(). Must list named arguments pitch parser. inPlace non-pitch information retained output string. Defaults FALSE. Must singleton logical value: /switch. argument effect input (x argument) character strings, extra, non-pitch information input strings \"besides\" pitch information. , inPlace = TRUE, output placed output string beside original non-pitch information. inPlace = FALSE, pitch output information returned (details ).","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/step.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Extract scale step. — step","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/struct.html"],"dir":"Reference","previous_headings":"","what":"struct — struct","title":"struct — struct","text":"Virtual class help create atomic-vector-like composite data objects.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/struct.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"struct — struct","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/struct.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"struct — struct","text":"humdrumR defines number S4 classes , underneath surface, composite data types made collections base-R atomic vectors, stuck together. \"vectorized\" nature R's atomic types one R's key strengths, humdrumR try ) mostly use standard atomic types B) make new types define act much like atomic vectors possible. struct virtual S4 class serves purpose: creating composite atomic vectors act (mostly) like base-R atomic vectors. \"virtual class\" structs really exist independent objects, struct class defines (abstractly) necessarry methods treat collection atomic vectors single vector/matrix-like object---simply make new subclass inherit struct taken care . (, specify contains = \"struct\" call setClass.) Important humdrumR classes inherit struct include: tonal intervals diatonicSet tertianSet rational() warned, R's S4 object-system limited regard: really define S4 classes act fully like R atomics, many features hard-coded R replicated. important limitation struct may encounter , though struct classes work (ok) data.frames, data.tables tibbles either work give strange behaviors put structs .","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/struct.html"],"id":"slots","dir":"Reference","previous_headings":"","what":"Slots","title":"struct — struct","text":"dim Either NULL non-negative integer-vector length == 2L, representing number rows columns respectively. Dimensions can zero. rownames Either NULL integer/character-vector length either ) dim == NULL, length struct B) dim != NULL, number rows struct. colnames Either NULL (must NULL dim == NULL) integer/character-vector length equal number columns struct.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/struct.html"],"id":"behavior","dir":"Reference","previous_headings":"","what":"Behavior","title":"struct — struct","text":"struct subclasses (.e., classes inherit struct) behave similarly normal R atomic vectors/matrices. However, differ respects, mostly ways intended avoid quirky behaviors R matrices: general, distinction dimensionless vectors dimensioned vectors (matrices) slightly weaker structs normal R atomic vectors/matrices. importantly, dimensioned structs drop dimensions various common operations (c, [], etc.), way base-R matrices . general, easier interact multi-column (matrix-)struct way dimensionless (vector-)struct. example, struct dimensions length(struct) == nrow(struct), instead length(matrix) == nrow(matrix) * ncol(matrix)---.e., \"height\" struct (number rows) length. Another big difference behaviors c: c always cause structs lose dimensions c can used concatinated multi-column structs, even mixes dimensionless dimensioned structs: struct arguments c dimensions, structs concatinated via call rbind, dimensionless vectors coerced 1-column matrices. course, (resulting) number columns must error occur! differences: structs can either dimensions (dim(struct) == NULL) two dimensions. Higher dimensional structs supported (yet). rowSums colSums coerce dimensionless struct column matrix. structs always throw error try index index value greater length/nrow struct. different atomic vectors, pad vector length index give---sometimes useful quirky behavior. structs two dimensions cartesian indexing argument. cartesian = TRUE, j arguments treated cartesian coordinates. (behavior can achieved base R matrices (structs) inputing matrix two columns.)","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/struct.html"],"id":"requirements","dir":"Reference","previous_headings":"","what":"Requirements","title":"struct — struct","text":"work, struct makes assumptions class. class must one slots vectors, length. struct's indexing method cause vectors indexed one. define new subclass struct, inherit validObject method assures elements dimension. Thus, writing validObject method (using setValidity) just worry specifically validity information slots, slots length.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/struct.html"],"id":"initialize","dir":"Reference","previous_headings":"","what":"Initialize","title":"struct — struct","text":"initialize method automatically makes slots length predefined structs. want make specialized initialize method, can still take advantage inherited method using callNextMethod beginning method.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/struct.html"],"id":"predefined-methods","dir":"Reference","previous_headings":"","what":"Predefined methods","title":"struct — struct","text":"main purpose struct virtual class defines many basic methods need manipulate subclass objects. importantly, indexing methods fully defined (mimic base-R atomic vector/matrix indexing), well basic \"structural\" methods like (col/row)names, dim, length, ncol, nrow, etc. addition: define > >=, < <= automatically defined. define .character subclass, show format methods automatically defined. , default arithmetic methods addition, subtraction, (scalar-integer) multiplication, negation (-x) defined. default addition behavior numeric (base::integer base::numeric) slot subclasses added together. Thus, struct1 + struct2 extract numeric/integer slot struct, add together create new struct result. -struct negate numeric fields, subtraction simply defined adding negation. Since scalar multiplication defined, two structs multiplied, struct can multiplied integer (numeric fields multiplied integer(s)). definitions work subclass, need create , specific, method!","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/struct.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"struct — struct","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/subset.humdrumR.html"],"dir":"Reference","previous_headings":"","what":"Filter humdrum data — subset.humdrumR","title":"Filter humdrum data — subset.humdrumR","text":"HumdrumR defines subset() (base R) filter() (tidyverse) methods humdrumR data---two .humdrumR methods synonymous, working exactly . used \"filter\" contents underlying humdrum table. R's standard indexing operators ([] [[]]) can also used filter data--- can read indexing options ---however, subset()/filter() can accomplish much sophisticated filtering commands indexing methods. Filtering subset()/filter() (default) destructive, allowing recover filtered data using removeSubset() unfilter() (also synonyms).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/subset.humdrumR.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Filter humdrum data — subset.humdrumR","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/subset.humdrumR.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Filter humdrum data — subset.humdrumR","text":"x, .data, humdrumR HumdrumR data. Must humdrumR data object. ... Arbitrary expressions passed (). \"within\" expression(s) must evaluate either scalar full-length logical values. dataTypes types humdrum records include. Defaults \"D\". Must single character string. Legal values 'G', 'L', '', 'M', 'D', 'd' combination (e.g., \"LIM\"). (See humdrum table documentation Fields section explanation.) .Optional grouping fields; alternative using group_by(). Defaults NULL. Must NULL, character strings partially match one fields() data. NULL, fields used group data. grouping fields already set call group_by(), .argument overrides . removeEmptyPieces empty pieces removed? Defaults TRUE. Must singleton logical value: /switch. fields fields unfilter complement? Defaults data fields humdrumR data. Must character strings, partially matching data field input data. complement field use subset complement restore? default NULL, means data field's original complement used. Must single character string, partially matching field input data.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/subset.humdrumR.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Filter humdrum data — subset.humdrumR","text":"subset() filter() passed one expressions using fields humdrum table using call within. evaluation can thus include within.humdrumR()'s functionality (arguments) including group-apply. requirement expressions/functions fed subset()/filter() must return logical (TRUE/FALSE) vector (NA values treated FALSE). returned vector must either scalar (length 1), length input data (number rows humdrum table). logical result scalar, recycled match input length: useful combination group_by(); example, can split data groups, return single TRUE FALSE group, causing whole group filtered . Note subset()/filter() incompatible contextual windows; data contextual windows defined, removed (warning message) filtering.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/subset.humdrumR.html"],"id":"nullifying-data","dir":"Reference","previous_headings":"","what":"Nullifying data","title":"Filter humdrum data — subset.humdrumR","text":"using subset()/filter(), humdrumR actually delete data filter . Instead, functions set filtered data fields NA (null) values, changing data type \"d\". ensures humdrum-syntax data broken filtering! Thus, print filtered humdrumR object see filtered data points turned null data (.). Since, humdrumR functions ignore null data (d) default, data effectively filtered practical purposes. However, need use null ('d') data points (like, ditto()), can accessed setting dataTypes = 'Dd' many functions. See ditto() documentation examples.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/subset.humdrumR.html"],"id":"truly-removing-data","dir":"Reference","previous_headings":"","what":"Truly removing data","title":"Filter humdrum data — subset.humdrumR","text":"many cases, filtering large parts data leaves bunch empty null data points (\".\") printout...maybe difficult read. want actually remove filtered data points, can call removeEmptyFiles(), removeEmptyPieces(), removeEmptySpines(), removeEmptyPaths(), removeEmptyRecords(), removeEmptyStops(). functions safely remove null data without breaking humdrum syntax; going piece/spine/path/record checking data region null; , , data null, portion data removed. default, subset.humdrumR() automatically calls removeEmptyPieces() returning. However, can stop specifying removeEmptyPieces = FALSE.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/subset.humdrumR.html"],"id":"renumbering","dir":"Reference","previous_headings":"","what":"Renumbering","title":"Filter humdrum data — subset.humdrumR","text":"filtered pieces, files, spines removed corpus (using removeEmptyPieces() removeEmptySpines()) File, Piece, Record /Spine fields renumbered represented remaining regions, starting 1. example, corpus 10 pieces remove first piece (Piece == 1), remaining pieces renumbered 2:10 1:9. Spine/record renumbering works , except done independently within piece.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/subset.humdrumR.html"],"id":"complements-unfiltering-","dir":"Reference","previous_headings":"","what":"Complements (unfiltering)","title":"Filter humdrum data — subset.humdrumR","text":"subset() applied, humdrumR stores complement subset data field retained (unless explicit removeEmpty...() function called). removeSubset() unfilter() functions can used restore original data, combining subset complement. fields argument can used control data fields unfiltered---default, data fields unfiltered. Normally, data field restored complement data. However, complement argument can used specify field use complement. allows , instance, different parts separate fields single field. complement() function directly swap data-field subsets complements.","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/subset.humdrumR.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Filter humdrum data — subset.humdrumR","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/syncopation.html"],"dir":"Reference","previous_headings":"","what":"Identify syncopated rhythms — syncopation","title":"Identify syncopated rhythms — syncopation","text":"syncopation() function takes vector rhythmic duration values meter identifies durations syncopated, return TRUE synocopations FALSE otherwise. output syncopation depends lot meter specified/interpreted check meter() documentation looking control output.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/syncopation.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Identify syncopated rhythms — syncopation","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/syncopation.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Identify syncopated rhythms — syncopation","text":"dur input vector rhythmic durations. Must character numeric vector. parsed using rhythmInterval(); Wherever input parsed duration, element treated duration zero. meter meter(s) compute levels . Defaults standard, five-level duple (4/4) meter. Must meter() object character vector. character input, string parsed using meter(); failure parse result error. levels metrics levels identify syncopations? Defaults \"\". Must non-empty character numeric vector. levels simply singleton string \"\", syncopations metric level identified. Otherwise, levels parsed rhythmInterval(); fail parse may lead error. parsed levels must levels given meter(). groupby list vectors group x. Defaults list(). Must list; every element list must length length(x). function -record timeline, groupby list music include named Piece Record fields. Luckily, automatically passed ().humdrumR, need worry !","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/syncopation.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Identify syncopated rhythms — syncopation","text":"syncopation occurs whenever rhythmic duration longer highest metric level lands . cases, might want restrict attention syncopations occur specific metric level: example, \"eighth-note syncpations.\" can proved set metric levels levels argument, restriction. levels must parsable durations match levels meter().","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/tabulation.html"],"dir":"Reference","previous_headings":"","what":"Tabulate and/or cross-tabulate data — tabulation","title":"Tabulate and/or cross-tabulate data — tabulation","text":"count() function exactly like R's fundamental table() function, except 1) give special treatment humdrumR token() data 2) intuitive/simple argument names 3) makes easier combine/manipulate disparate output tables.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/tabulation.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Tabulate and/or cross-tabulate data — tabulation","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/tabulation.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Tabulate and/or cross-tabulate data — tabulation","text":"count() function essentially wrapper around base::table() function. However, token() class arguments treated like factors(), calling generating levels. assures , example, pitch data tabulated order pitch height, \"missing\" pitches counted zero. count() , default, count NA values present---want count NAs, specify na.rm = TRUE. can also tell count() exclude (count) arbitrary values provide vector exclude argument. count() always give names dimensions table creates. can specify names directly argument names, like count(Kern = kern(Token)); specify name, count() make name(s) based expression(s) tallying. (Note count() copy base::table()'s obtusely-named dnn deparse.level arguments.)","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/tabulation.html"],"id":"manipulating-humdrum-tables","dir":"Reference","previous_headings":"","what":"Manipulating humdrum tables","title":"Tabulate and/or cross-tabulate data — tabulation","text":"output count() special form R table, humdrum.table. Given two humdrum.tables, apply basic R operators (e.g., arithmetic, comparisons) row/column binding (cbind/rbind) humdrumR align tables dimension-names operation. means, two tables pitch data, one table includes specific pitch , can still add together bind matrix. See examples!","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/tabulation.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Tabulate and/or cross-tabulate data — tabulation","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/tactus.html"],"dir":"Reference","previous_headings":"","what":"Extract levels from meters — tactus","title":"Extract levels from meters — tactus","text":"functions take meter() objects---values parseable meters---return specific levels meter. tactus() extracts tactus meter; measure() extracts length full measure meter. nbeats() counts number tactus beats meter. functions particularly useful arguments timecount subpos functions.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/tactus.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Extract levels from meters — tactus","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/tactus.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Extract levels from meters — tactus","text":"x input compute desired duration . Must meter() object character vector. character input parsed using meter(); failures parse result errors. deparser output format desired? default recip(). Must rhythm function NULL. sep Seperator irregular beat patterns. Defaults \"+\". singleton character value. tactus pattern irregular beats, pasted together using separator.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/tactus.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Extract levels from meters — tactus","text":"default, tactus() measure() deparse output recip(); alternative deparser (output format) can chosen using deparser argument.","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/tactus.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Extract levels from meters — tactus","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/tandem.html"],"dir":"Reference","previous_headings":"","what":"Get tandem interpretation information from humdrum data — tandem","title":"Get tandem interpretation information from humdrum data — tandem","text":"extractTandem extracts tandem interpretations raw Tandem spine humdrumR object.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/tandem.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Get tandem interpretation information from humdrum data — tandem","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/tandem.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Get tandem interpretation information from humdrum data — tandem","text":"regex regular expression match tandem interpretations. Must single character string. include * beginning---* marker tandem interpretations already removed Tandem field. Tandem Parsed tandem interpretation data. Must atomic. always Tandem field humdrumR object.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/tandem.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Get tandem interpretation information from humdrum data — tandem","text":"Every humdrumR object field called Tandem, vector strings accumulates tandem interpretations Spine. record, previous tandems occured spine listed (comma separated), recent appearing first. example, consider file: Tandem field two spines look like : Notice \"C:\" erased appearance \"G:\"---naive parser \"know\" \"C:\" \"G:\" related. earlier tandem (\"C:\") just pushed back onto stack. worry, humdrumR data parser recognize many common tandem interpretations (like *C: *G:) automatically parse present---case, put Key field automatically. However, Tandem field retained case data contains novel tandem intepretations humdrumR recognize.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/tandem.html"],"id":"extracttandem","dir":"Reference","previous_headings":"","what":"extractTandem","title":"Get tandem interpretation information from humdrum data — tandem","text":"data contain novel/unknown tandem interpretations, can use extractTandem function pull Tandem field. first argument extractTandem must Tandem field humdrumR object. second argument (regex) regular expression matched tandem interpretations. token Tandem, recent match () retained. example, wanted manually extract key information Tandem field (humdrumR automatically ), call extractTandem(Tandem, \"[-Ga-g][#-]*:\").","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/tatum.html"],"dir":"Reference","previous_headings":"","what":"Find common denominator of beats — tatum","title":"Find common denominator of beats — tatum","text":"humdrumR, define tatum greatest common denominator set durations. words, given set durations, largest duration divides given beats tatum---common unit can measure durations","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/tatum.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Find common denominator of beats — tatum","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/tatum.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Find common denominator of beats — tatum","text":"x input compute tatum . Must meter() object, singleton character value, vector either character, numeric, rational() values. character input, valuest match regular expression \"^\\*?M\" parsed time signature using meter(), strings parsed durations using rhythmInterval(). numeric input also parsed using rhythmInterval(); parse failures result errors. deparser output format desired? character meter input, default recip(); numeric input, default duration(). Must rhythm function NULL.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/tatum.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Find common denominator of beats — tatum","text":"tatum() generic function; can read input can parsed rhythm parser. can also take meter() object character string form \"MX/Y\". tatum meter() tatum meters metric levels. meters durations provided---like tatum(c('M4/4', '6')---, tatum meters' levels durations computed. deparser argument rhythm function controls output format. deparser NULL, tatum returned rational() value.","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/tatum.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Find common denominator of beats — tatum","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/tertian.html"],"dir":"Reference","previous_headings":"","what":"Tertian quality chord representation — tertian","title":"Tertian quality chord representation — tertian","text":"functions generic form tertian harmony representation, commonly used music theory. representation, root chord indicated **kern, followed one quality indicators, like \"CMM\" (C major seventh).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/tertian.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Tertian quality chord representation — tertian","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/tertian.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Tertian quality chord representation — tertian","text":"x atomic vector. x argument can (atomic) vectors Key diatonic key used parser, deparser, transposer. Defaults NULL, interpreted C major. Must diatonicSet something coercable diatonicSet; must either length 1 length(x). transposeArgs optional list arguments passed transpose() call. Defaults empty list(). Must list named arguments transpose(). parseArgs optional list arguments chord parser. Defaults empty list(). Must list named arguments chord parser. inPlace non-chord information retained output string. Defaults FALSE. Must singleton logical value: /switch.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/tertian.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Tertian quality chord representation — tertian","text":"first quality root indicates quality triad. Subsequent qualities, present, indicate quality 7th, 9th, 11th, 13th respectively. examples: M: major triad Mm: dominant-seventh chord MM: major-seventh chord Mmm: dominant-seventh--flat-9 chord. oo: fully-diminished-seventh chord. Missing extensions can indicated position using .. example, E-Mm.P indicates E-flat dominant-11th chord 9th. Missing members triad can indicated specifying either 5 3 immediately root, quality indicators. example, C5M indicates C major chord 3rd, G3mm indicates G-minor-seventh chord missing 5th. default quality indicators P (perfect), M (major), m (minor), o (diminished), + (augmented), can overridden calls respective arguments: example, tertian('Cdim', diminish = 'd').","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/tertian.html"],"id":"inversions","dir":"Reference","previous_headings":"","what":"Inversions","title":"Tertian quality chord representation — tertian","text":"Inversions indicated slash notation, scale degree right slash. example, first-inversion major chord /3.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/tertian.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Tertian quality chord representation — tertian","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/tertianSetS4.html"],"dir":"Reference","previous_headings":"","what":"Tertian set — tertianSetS4","title":"Tertian set — tertianSetS4","text":"tertianSet one humdrumR's types tonal data, representing Western tertian harmonies. tertianSet subclass diatonicSet (thence, struct).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/tertianSetS4.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Tertian set — tertianSetS4","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/tertianSetS4.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Tertian set — tertianSetS4","text":"structural addition, compared diatonicSet, Extensions slot. slot indicates tertian chord members active chord. seven possible chord members: root, third, fifth, seventh, ninth, eleventh, thirteenth. Every possible combination seven degrees represented single integer, corresponding 7-bit representation /offs seven degrees reverse order (13, 11, 9, 7, 5, 3, 1). example, integer 15 corresponds seventh chord: binary, 15 0001111. initial three zeros indicate 13th, 11th, 9th part harmony, four ones indicate root, third, fifth, seventh part harmony. Ultimately, adding removing chord degree harmony can achieved adding power two associated degree: Root: \\(\\pm 1\\) Third: \\(\\pm 2\\) Fifth: \\(\\pm 4\\) Seventh: \\(\\pm 8\\) Ninth: \\(\\pm 16\\) Eleventh: \\(\\pm 32\\) Thirteenth: \\(\\pm 64\\) tertianSet many specific methods defined reading/writing harmonic information.","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/time.html"],"dir":"Reference","previous_headings":"","what":"Clock-time representations of duration — time","title":"Clock-time representations of duration — time","text":"functions convert duration values clock-time representations. seconds() ms() output numeric values. dur() outputs character string encoding humdrum **dur representation time. seconds() applied humdrumR data class may use data's fields arguments. field names specified, first selectedField used x. ms() applied humdrumR data class may use data's fields arguments. field names specified, first selectedField used x. dur() applied humdrumR data class may use data's fields arguments. field names specified, first selectedField used x.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/time.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Clock-time representations of duration — time","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/time.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Clock-time representations of duration — time","text":"x input vector. x argument can (atomic) vector, rational (rhythmInterval), NULL. Must parsable rhythm infromation. ... Arguments passed rhythm parser. also two hidden (advanced) arguments can specify: memoize deparse (see details ). scale numeric rational value used output unit measurement. Defaults rational(1, 1). Must numeric rational. inPlace non-rhythm information retained output string? Defaults FALSE. Must singleton logical value: /switch. Defaults FALSE. singleton logical value, NA. See \"Grace notes\" section . minutes (logical, T/F) dur output include minutes? hours (logical, T/F) dur output include hours? days (logical, T/F) dur output include days? months (logical, T/F) dur output include months? years (logical, T/F) dur output include years?","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/time.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Clock-time representations of duration — time","text":"functions require BPM (beats-per-minute) argument specified. default, value 60 bpm.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/time.html"],"id":"dur","dir":"Reference","previous_headings":"","what":"dur","title":"Clock-time representations of duration — time","text":"**dur output can modified include different clock-time units: minutes, hours, days, months, years arguments true/false logical arguments, indicating whether use unit output (default FALSE). example, minutes = FALSE, input 90 seconds return \":90\" (90 seconds!), minutes = TRUE, output :1:30 (one minute thirty seconds).","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/time.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Clock-time representations of duration — time","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/timebase.html"],"dir":"Reference","previous_headings":"","what":"Represent time on a regular grid — timebase","title":"Represent time on a regular grid — timebase","text":"timebase() function takes humdrumR dataset converts rhythmic information data step-sequencer like representation, humdrum data record representing one step. duration step \"timebase\", can controlled tb argument. timebase() function currently beta-draft, may work well.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/timebase.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Represent time on a regular grid — timebase","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/timebase.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Represent time on a regular grid — timebase","text":"humdrumR HumdrumR data. data must least one spine rhythmic (duration) encoded. timebase duration step output sequence. Defaults sixteenth-note. Must single atomic value, can parsed duration.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/timecount.html"],"dir":"Reference","previous_headings":"","what":"Count beats or measures — timecount","title":"Count beats or measures — timecount","text":"timecount() function takes vector rhythmic duration values counts (musical sense) number beats (measures) occurred since starting point, associating rhythmic onsets beat. subpos() function paired timecount(), computing far (rhythmic time) onset associated beat; subpos() returns 0, means onset beat. Finally, onbeat() simply convenient shorthand subpos() == 0, returning logical vector indicating onsets fall beat.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/timecount.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Count beats or measures — timecount","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/timecount.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Count beats or measures — timecount","text":"dur input vector rhythmic durations. Must character numeric vector. parsed using rhythmInterval(); Wherever input parsed duration, element treated duration zero. unit size \"beat\" (measure) count. Defaults whole-note (one measure 4/4 time). Must character numeric vector, list vectors; must singleton length dur. parsed duration using rhythmInterval(); input parsed duration, output NA. start number start counting . Must single whole-number value (either numeric integer). phase phase offset onsets beats. Defaults 0. Must character numeric vector; must length 1 length dur; duration phase must smaller smallest duration value unit. parsed duration using rhythmInterval(); input parsed duration, error occurs. pickup Indicates leading values input pickups, . Defaults NULL. Must NULL, logical vector length dur. offBeats -beat onsets numbered output, NA? Defaults TRUE. Must single logical value: /switch. groupby Optional vectors group count within. Defaults empty list(). Must list(), either empty contains vectors length dur. function -record timeline, groupby list must include named Piece Record vectors. Luckily, automatically passed ().humdrumR, need worry !","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/timecount.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Count beats or measures — timecount","text":"many basic use cases, using timecount() essentially using floor(timeline()). However, timecount() gives us additional options add musicological power compared timeline(). (timecount() also starts 1 0, timeline() .) first beat input vector assigned value start argument, defaults start = 1L. 'zeroth' count, first beat occurs instant starting time---.e., first onset input vector. Every rhythmic onset associated one beat, multiple onsets may occur within beat---thus output timecount() assigns (rounds) onset previous beat onset. However, offBeats = FALSE, onsets land beat counted, offbeat values returning NA. phase controls offbeat onsets associated nearby beats. phase parsed rhythmic value must rhythmic values smaller smallest beat value. phase argument shifts \"boundary\" beats backwards, beat onset. default, phase = 0 beat-association boundary lands beat: onsets beat \"belong\" beat. phase = '8', beat boundary pushed back capture one eighth-note beat . can used , example, associate last 3/8s measure next measure (like pick ups); achieved command like timecount(dur, beat = '1', phase = 3/8).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/timecount.html"],"id":"-beats-","dir":"Reference","previous_headings":"","what":"\"Beats\"","title":"Count beats or measures — timecount","text":"unit argument used indicate size beat want count. default unit whole note, equivalent measure M4/4 time. unit argument uses rhythm parser, can understand unit values input variety formats: thus, specify quarter-note units either unit = '4' unit = 0.25. parser also understands parse (full) duration time signature: example, unit = 'M3/4' use dotted-half-note unit ('2.').","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/timecount.html"],"id":"changing-meter","dir":"Reference","previous_headings":"","what":"Changing meter","title":"Count beats or measures — timecount","text":"data changing meters (either pieces, within pieces), can specify unit argument vector length dur, indicating beat size moment/index. feature easy use dataset includes time signature interpretations, like \"*M4/4\"; interpetations, present, automatically read field called TimeSignature. dataset, can simply pass TimeSignature field unit argument timecount(), measures piece correctly counted (even changing!): timecount(x, unit = TimeSignature). Alternatively, can use tactus() command extract tactus beat time signature, like timecount(x, unit = tactus(TimeSignature)).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/timecount.html"],"id":"irregular-meter","dir":"Reference","previous_headings":"","what":"Irregular meter","title":"Count beats or measures — timecount","text":"musical meters consist pattern irregular beats. example, meter M7/8 often realized two \"short\" beats (two eigth-notes ) one \"long\" beat (three eigth-notes), forming 2 + 2 + 3 pattern. want count eighth-note, can simply specify unit = '8' get M7/8 beats counted c(1, 3, 5). However, want count short long beat single unit, must specify desired pattern list beat durations: example, unit = list(c(\"4\", \"4\", \"4.\")). see two cases look like, applied two M7/8 measures straight eighth-notes: accommodate changing meters, unit argument can still accept list patterns, long list length dur.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/timecount.html"],"id":"pickups","dir":"Reference","previous_headings":"","what":"Pickups","title":"Count beats or measures — timecount","text":"Another option pass pickup argument logical vector length input dur. Within piece/group, block TRUE values beginning pickup vector indicate pickup. first index pickup logical FALSE used location beat 1: earlier (pickup == TRUE) points negative counts, counting backwards start. humdrumR, datapoints first barline record (=) labeled Bar == 0 Bar field. Thus, common use pickup argument within(humData, timecount(Token, pickup = Bar < 1), makes downbeat first complete bar 1 stating point---notes pickup bars give negative counts. Note never 'beat zero'. Beats starting point progress directly -1 1 (start). result, arithmetic math beat \"counts\" can problematic using pickup argument. may better use round(timeline()) cases want much math counts.","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/timecount.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Count beats or measures — timecount","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/timeline.html"],"dir":"Reference","previous_headings":"","what":"Rhythmic timeline of a piece — timeline","title":"Rhythmic timeline of a piece — timeline","text":"functions calculate ammount time (either beats, seconds) unfolded since beginning piece, giving sense timeline events unfold. music21 information described \"offsets\"---however, prefer reserve words \"onset\" \"offset\" refer beginning (attack) end (release) rhythmic events. timeline() applied humdrumR data class may use data's fields arguments. field names specified, first selectedField used x. timestamp() applied humdrumR data class may use data's fields arguments. field names specified, first selectedField used x.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/timeline.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Rhythmic timeline of a piece — timeline","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/timeline.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Rhythmic timeline of a piece — timeline","text":"x Input rhythm information. Must atomic, NULL. parsed duration information. start timeline begin? Defaults 0. Must single number. pickup pickup (anacrusis)? Defaults NULL Must logical length(x), NULL. See \"Pickups\" section . threadNA rhythm-less tokens return NA? Defaults TRUE. Must singleton logical value: /switch. parseArgs optional list arguments passed rhythm parser. Defaults empty list(). Must list named arguments rhythm parser. groupby list vectors group x. Defaults list(). Must list; every element list must length length(x). function -record timeline, groupby list music include named Piece Record fields. Luckily, automatically passed ().humdrumR, need worry ! BPM tempo. Defaults 60. Must single number character string format \"MM120\" (120 bpm). default, ().humdrumR passes BPM field, present. minutes minutes counted output? Defaults TRUE. Must singleton logical value: /switch. TRUE, output seconds converted character string encoding minutes, seconds, milliseconds format MM.SS.ms.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/timeline.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Rhythmic timeline of a piece — timeline","text":"Music unfolds time, humdrum data typically represents placing simultaneous events record, successive events ever higher records---progressing \"top \" file. humdrum data, (implicit) ordering data time present. Record DataRecord fields capture ordering data parsed humdrumR. However, many (probably ) humdrum data files contain least information relative duration events, representing detailed information timing rhythm. timeline() parses input vector x durations, computes cumulative sum durations, start argument appended beginning. result numeric vector representing total duration since beginning vector (plus value start, defaults zero). cumulative durations timeline() represent musical duration units, 1 equals whole note. timestamp() converts durations seconds, either using BPM argument/field determine tempo using default tempo 60 beats per minute. minutes == TRUE, output formatted \"minute:seconds.milliseconds\" character strings. groupby argument provided, localDuration() used compute minimum durations group computing cumulative sum unique values Record groupby. default, ().humdrumR automatically pass groupby = list(Piece = Piece, Record = Record) calls timeline() timestamp(). Thus, call like within(humData, timeline(Token)) compute correct timeline position tokens across spines/paths/stops---values record . Note , timeline() timestamp() follow default behavior duration() treating grace-notes duration 0. means position timeline simply inherited previous event timeline, occur time. want use specified duration(s) grace notes, specify grace = TRUE. default, tokens without (parsable) rhythm information returned NA. However, threadNA = FALSE, rhythm-less tokens treated duration 0 well, thus (shared) position timeline.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/timeline.html"],"id":"pickups","dir":"Reference","previous_headings":"","what":"Pickups","title":"Rhythmic timeline of a piece — timeline","text":"Another option pass pickup argument logical vector length input x. Within piece/group, block TRUE values beginning pickup vector indicate pickup. first index pickup logical FALSE used starting point timeline/timecount; earlier (pickup == TRUE) points negative numbers, measured backwards start index. humdrumR, datapoints first barline record (=) labeled Bar == 0 Bar field. Thus, common use pickup argument within(humData, timeline(Token, pickup = Bar < 1), makes downbeat first complete bar 1 starting point timeline---notes pickup bars negative timeline.","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/timeline.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Rhythmic timeline of a piece — timeline","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/token.html"],"dir":"Reference","previous_headings":"","what":"Humdrum tokens — token","title":"Humdrum tokens — token","text":"token S4 class acts simple \"wrapper\" around atomic data, allowing humdrumR give data special treatment. basically atomic vectors known exclusive interpretation. able treat exactly like \"normal\" class atomic vector---e.g., character, numeric.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/token.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Humdrum tokens — token","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/tonalIntervalS4.html"],"dir":"Reference","previous_headings":"","what":"Representation of tonal pitch information — tonalIntervalS4","title":"Representation of tonal pitch information — tonalIntervalS4","text":"tonalInterval core tonal pitch representation humdrumR. tonalInterval abstract representation tonal pitch, can translated /standard \"concrete\" pitch representations: solfege, scientific pitch, semitones, frequencies, scale degrees, intervals, etc. part, users need interact tonalIntervals directly---rather, tonalIntervals work behind scene numerous humdrumR pitch functions. See pitch functions pitch parsing documentation details tonalIntervals used humdrumR.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/tonalIntervalS4.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Representation of tonal pitch information — tonalIntervalS4","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/tonalIntervalS4.html"],"id":"slots","dir":"Reference","previous_headings":"","what":"Slots","title":"Representation of tonal pitch information — tonalIntervalS4","text":"Octave integers representing octave offset. Fifth integers representing \"line--fifths\" value. Cent numeric values representing cents (1200th octave). tonalInterval S4 subclass humdrumR's virtual class struct, inherits lot useful \"vector-like\" behaviors/functionality.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/tonalIntervalS4.html"],"id":"creating-tonal-intervals","dir":"Reference","previous_headings":"","what":"Creating tonal intervals","title":"Representation of tonal pitch information — tonalIntervalS4","text":"Generally, tonalIntervals created using tonalInterval() function, various methods. tonalInterval function primarily parser, documented elsewhere, interprets various input representations generates tonalInterval S4 objects (documented ). Alternatively, constructor function tint can used directly create tonalInterval objects. three arguments tint correspond three slots: octave, LO5th (Fifth), cent. inputs coerced match length. octave argument can left blank, case appropriate octave automatically computed place interval octave . default, .character method, thus (via struct) show method, tonalIntervals call interval(). Thus, return tonalInterval command line see **interval representation printed.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/tonalIntervalS4.html"],"id":"predefined-intervals-","dir":"Reference","previous_headings":"","what":"Predefined Intervals:","title":"Representation of tonal pitch information — tonalIntervalS4","text":"humdrumR automatically exports bunch tonalIntervals, named musical interval representation. Every generic interval 1 15 combined every interval quality dd (doubly diminished), d (diminished), m (minor), M (major), (augumented) AA (doubly augmented). Thus, loading humdrumR, can type things like M3 + M3 get A5. addition, variables unison (= P1 = tint(0, 0)) pythagorean.comma (= d2 = tint(-19,12)) exported well.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/tonalIntervalS4.html"],"id":"arithmetic-","dir":"Reference","previous_headings":"","what":"Arithmetic:","title":"Representation of tonal pitch information — tonalIntervalS4","text":"Technically, tonalIntervals examples algebraic modules integers. means certain arithmetic operations defined tonalIntervals can called using standard arithmetic operators (+, -, etc.): Addition: tonalIntervals can added together, acting exactly expect (.e., \\(M3 + m3 = P5\\)). Subtraction: tonalIntervals can subtracted just added. Also, can negated single - operator (like -M3). Multiplication: tonalIntervals can multiplied together. However, scalar (integer) multiplication defined: thus, tonalIntervals can multiplied integers create new tonalIntervals: e.g., \\(M2 * 3 = A4\\). Division: natural inverse scale multiplication, Euclidean division defined tonalIntervals---.e., division /whole (integer) pieces, often leftover \"remainders\" (modulo). R, Euclidean division achieved %/% operator---/---, associated %% used remainder/modulo. Two tonalIntervals can divided produced integer; Conversely, tonalInterval can divided integer produce tonalInterval. Take note way humdrumR defines Euclidean division based tonal space---.e., line--fifths---frequency atonal-semitone space. example, augmented-fourth divided major-second 3L, diminished-fifth divided major-second 3L---d5 %/% M2 equals -3L remainder P8 (plus octave)! division algorithm works applying standard Euclidean division @Fifth slot (line--fifths tonal space), shifting @Octave value remainder match appropriate octave. attempt addition tonalInterval non-tonalInterval atomic vector (e.g., integer, character), humdrumR attempt coerce input tonalInterval, using tonalInterval() parser, math output answer original format (non-tonalInterval) format. instance, M3 + 2 interpret 2 two semitones add major-second major-third, resulting 6 semitones. \"-place\" parsing/deparsing used, \"extra\" characters input passed . example, M3 + 4.ee- return 4.gg.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/tonalIntervalS4.html"],"id":"relational-operators","dir":"Reference","previous_headings":"","what":"Relational Operators","title":"Representation of tonal pitch information — tonalIntervalS4","text":"tonalIntervals can compared using standard relational operations, like ==, !=, >, >=. Two tonalIntervals equal (according ==) slots (Octave, Fifth, Cent) exactly identical. Thus, enharmonic notes (like C Db) equal. contrast, ordinal comparisons (e.g., >, <=) tonalIntervals based semitone (equal temperament) size, enharmonicity irrelevant. Thus, m3 >= A2 A2 >= m3 TRUE, even though m3 == A2 .","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/tonalIntervalS4.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Representation of tonal pitch information — tonalIntervalS4","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/tonh.html"],"dir":"Reference","previous_headings":"","what":"German-style pitch notation. — tonh","title":"German-style pitch notation. — tonh","text":"Based common German system notating pitches, encoded humdrum **Tonh interpretation. tonh() applied humdrumR data class may use data's fields arguments. field names specified, first selectedField used x.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/tonh.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"German-style pitch notation. — tonh","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/tonh.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"German-style pitch notation. — tonh","text":"x Input data parse pitch information. x argument can (atomic) vector, tonalInterval, NULL. ... Arguments passed pitch deparser. also two hidden (advanced) arguments can specify: memoize deparse (see details ). generic \"specific\" pitch information (accidentals qualites) discarded? Defaults FALSE. Must singleton logical value: /switch. simple \"compound\" pitch information (octave/contour) discarded? Defaults FALSE. Must singleton logical value: /switch. Key input Key used parser, deparser, transposer. Defaults NULL. Must diatonicSet something coercable diatonicSet; must either length 1 length(x) transposeArgs optional list arguments passed special transpose() call. Defaults empty list(). Must list named arguments transpose(). parseArgs optional list arguments passed pitch parser. Defaults empty list(). Must list named arguments pitch parser. inPlace non-pitch information retained output string. Defaults FALSE. Must singleton logical value: /switch. argument effect input (x argument) character strings, extra, non-pitch information input strings \"besides\" pitch information. , inPlace = TRUE, output placed output string beside original non-pitch information. inPlace = FALSE, pitch output information returned (details ). S special shorthand Eb Ab used?. Defaults TRUE. S = TRUE, E-flat (Ees) output \"S\" -flat (Aes) output \"\".","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/tonh.html"],"id":"basic-pitch-arguments","dir":"Reference","previous_headings":"","what":"Basic pitch arguments","title":"German-style pitch notation. — tonh","text":"pitch function standard arguments control details output. important generic simple arguments, allow control type pitch information returned.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/tonh.html"],"id":"generic-vs-specific","dir":"Reference","previous_headings":"","what":"Generic vs Specific","title":"German-style pitch notation. — tonh","text":"generic = TRUE, specific pitch information (accidentals qualities) omitted output. alternative way controlling functionality, can use specific argument, specific == !generic. case atonal functions, \"generic\" version pitch output: example, semits('c#', generic = TRUE) return 0, \"generic\" version C# C, corresponds 0. However, note generic version pitch follows key, semits('c#', generic = TRUE, Key = ':') return 1!","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/tonh.html"],"id":"simple-vs-compound","dir":"Reference","previous_headings":"","what":"Simple vs Compound","title":"German-style pitch notation. — tonh","text":"simple = TRUE, compound pitch information (octave contour) omitted output. alternative way controlling functionality, can use compound argument ,compound == !simple. actually one way might want divide compound intervals simple octave parts. example, might like call output -M2 (descending major 2nd) +m7 (ascending minor 7th octave ). functionality can controlled octave.round argument: see pitch deparsing documentation.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/tonh.html"],"id":"key","dir":"Reference","previous_headings":"","what":"Key","title":"German-style pitch notation. — tonh","text":"Key argument must diatonicSet, something can parsed one. Key argument passed parser, deparser, transpose---unless alternate Key passed transposeArgs parseArgs. Various deparsing options use Key argument; example, use implicitSpecies (see advanced parsing section) dependent Key. use pitch function within special call withinHumdrum, humdrumR automatically pass Key field humdrum data function---means, cases, need explicitly anything Key argument! (want happen, need explicitly specify Key argument, Key = NULL.)","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/tonh.html"],"id":"parse-arguments","dir":"Reference","previous_headings":"","what":"Parse arguments","title":"German-style pitch notation. — tonh","text":"parseArgs argument must list() (named) arguments passed input parser. example, input representation uses \"X\" represent double sharps, specify kern('CX5', parseArgs = list(doublesharp = 'X')) get correct result (\"cc##\"). convenient shorthand, \"syntactic sugar,\" can specify parseArgs alternate way: Simply input parse(args...) unnamed argument pitch function. example, can get exact result typing kern('CX5', parse(doublesharp = 'X')).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/tonh.html"],"id":"transpose-arguments","dir":"Reference","previous_headings":"","what":"Transpose arguments","title":"German-style pitch notation. — tonh","text":"transposeArgs argument must list() (named) arguments passed internal call transpose(), allowing us easily transpose pitch information. example, type kern(c('C', 'D', 'E'), transposeArgs = list(= 'M9')) can get output c('d', 'e', 'f#'). possible transpose args : (tonalInterval, length == 1 | length == (x)) (diatonicSet, length == 1 | length == (x)) (diatonicSet, length == 1 | length == (x)) real (logical, length == 1) transposition real tonal? relative (logical, length == 1) key-wise transposition based relative parallel keys? convenient shorthand, \"syntactic sugar,\" can specify transposeArgs alternate way: Simply input transpose(args...) unnamed argument pitch function. example, can get exact result typing kern(c('C', 'D', 'E'), transpose(= 'M9')).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/tonh.html"],"id":"transposing-by-interval","dir":"Reference","previous_headings":"","what":"Transposing by interval","title":"German-style pitch notation. — tonh","text":"calling transpose() directly, argument can anything coercable tonalInterval, output transposed amount. real = FALSE, tonal transposition (within Key) performed. details transposition behavior, check transpose() docs.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/tonh.html"],"id":"transposing-by-key","dir":"Reference","previous_headings":"","what":"Transposing by key","title":"German-style pitch notation. — tonh","text":"Another way transposing specifying input (\"\") key output (\"\") key. default, Key argument passed transpose , nothing actually happens. Thus, specify either key key, transposition happen /key Key. course, specify transposition happen keys specify. use pitch function within special call withinHumdrum, humdrumR automatically pass Key field humdrum data function. specify key, Key field passed transpose key, result, pitches input transposed whatever keys target () key! real relative arguments give special control key-wise transposition works, check transpose() docs details!","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/tonh.html"],"id":"in-place-parsing","dir":"Reference","previous_headings":"","what":"In-place parsing","title":"German-style pitch notation. — tonh","text":"humdrum data, character strings often encoded multiple pieces musical information right besides : example, **kern data might include tokens like \"4.ee-[. humdrumR parser (tonalInterval) automatically \"pull \" pitch information within strings, can find using appropriate known regular expressions. example, pitch('4.ee-[') returns Eb5. However, pitch functions (like pitch() kern()) option keep \"extra\" information return result \"place\"---.e., embedded right found input string. controlled inPlace argument, FALSE default. , pitch('4.ee-[', inPlace = TRUE) return 4.Eb5[---keeping \"4.\" \"[\". (obviously works input string, numeric!) Note inPlace = TRUE force functions like semits, normally return numeric values, return character strings input character string.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/tonh.html"],"id":"pitch-gamut-levels","dir":"Reference","previous_headings":"","what":"Pitch-Gamut Levels","title":"German-style pitch notation. — tonh","text":"table() automatically generate factor levels pitch data using gamut() function. makes sure tabulated data sorted logical order, includes missing pitches. simple/complex generic/specific arguments automatically passed gamut(); additional arguments can passed gamut using gamutArgs = list(...), syntactic sugar gamut(...). (Read gamut() docs explanation gamut generation.) feature used control table layout pitch data, well assure consistent tables grouping data. inPlace = TRUE special tabulation occur.","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/tonh.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"German-style pitch notation. — tonh","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/transpose.html"],"dir":"Reference","previous_headings":"","what":"Transpose pitches and keys — transpose","title":"Transpose pitches and keys — transpose","text":"function transposes pitches keys various intervals target keys. Inside box, inputs transpositions take place tonalIntervals diatonicSets, numeric character string representation pitches can transposed well. function incorporated directly tonalTransform, thence, pitch translation functions, probably call directly often.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/transpose.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Transpose pitches and keys — transpose","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/transpose.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Transpose pitches and keys — transpose","text":"x ***input pitch(es) transpose. *** Can tonalInterval something intepretable pitch information. Transpose interval. Can tonalInterval something intepretable tonalInterval. Key Transpose key (key). Can diatonicSet something intepretable diatonicSet. tonal /transpositions, \"\" key. value NULL, defaults C major. Transpose key (Key key). Can diatonicSet something intepretable diatonicSet. real transposition real (tonal)? Defaults TRUE. Must singleon logical value: /switch. real == FALSE, transposition tonal. relative transposition keys relative (parallel)? Defaults FALSE. Must singleton logical value: /switch. relavent using transposing keys (Key ) different modes. relative == FALSE, transposition parallel.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/transpose.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Transpose pitches and keys — transpose","text":"two distinct types transposition (real tonal). also two different approaches specifying transpositions: \"\" \"\". \"\" transpositions can also either parallel relative.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/transpose.html"],"id":"types-of-transposition","dir":"Reference","previous_headings":"","what":"Types of Transposition","title":"Transpose pitches and keys — transpose","text":"two different types transposition: real transposition tonal transposition. real transposition, inputs transposed specific interval. example, pitches {C D E F G} transposed major second {C D E F# G}. tonal transposition, inputs transposed generic intervals, within key. example, sequence {C D E F G}, key C major, translated generic second {D E F G }. choose real tonal transposition, use real argument: real = TRUE real transposition, real = FALSE tonal transposition.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/transpose.html"],"id":"alterations","dir":"Reference","previous_headings":"","what":"Alterations","title":"Transpose pitches and keys — transpose","text":"Tonal transposition complicated presence alterations input pitches. instance, given pitches {C F# G D# E}`` key C major, tonally transposed second, within C major? one obvious, correct answer answer, can easily identified. algorithm implemented humdrumR` follows: Alterations/accidentals input identified. (case, F# D#). generic pitches transposed within key, resulting {D G E F}. Alterations input added output unless resulting pitches interpreted comma call tintPartion, given enharmonic wrap value (default 12). example, adding first accidental results {G#} comma. However, second accidental results {E#} comma away natural {F}. Thus, accidental added output, resulting {E}, {E#}. resulting output {D G# E F}. size enharmonicWrap effectively determines extreme accidentals allowed. default value, 12, assures output notes enharmonically equivalent notes key. illustrate, sequence {C F# G D# E, B- - G C# D, B D- C} transposed tonally within C major seven possible generic intervals, enharmonicWrap = 12:","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/transpose.html"],"id":"specifying-transpositions","dir":"Reference","previous_headings":"","what":"Specifying Transpositions","title":"Transpose pitches and keys — transpose","text":"two approaches specifying transpositions, arguments. argument must interval, input translated interval. interval specific real = FALSE, input treated generic interval, tranposition takes place within key indicated Key argument. argument translates input desired key. example, input key E major want transposed G major, say = '*E:'. real = TRUE, input simply translated root key, exact intervals. real = FALSE, input translated root new key, intervals changed match new key well. either case, result depends input's key , indicated standard Key argument. Key arguments like \"\" key. Key = NULL, input key interpreted C major. Consider input notes {D B C # B, D C# D E D} key G major. specify = e:, real = TRUE, output {B G# F## G#, B # B C# B}. (Notice even though key minor, output still clearly E major). specify = e:, real = FALSE, output instead {B G F# G, B # B C B}. Building previous example, consider input key matters well. use input notes ({D B C # B, D C# D E D}) input Key C major, : specify = e:, real = TRUE, output {F# D# E C## D#, F# E# F# G# F#}. specify = e:, real = FALSE, output instead {F# D E C# D, F# E F# G F#}. specified, transposition applied first, followed transposition. real = FALSE, transposition happens within key, Key key.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/transpose.html"],"id":"relative-vs-parallel","dir":"Reference","previous_headings":"","what":"Relative vs Parallel","title":"Transpose pitches and keys — transpose","text":"transposing , diferent approaches determining relationship \"\" key (Key argument) \"\" key (argument). think \"parallel\" relationships keys, match roots keys regardless modes. instance, C major C minor parallel keys. instead think \"relative\" relationships keys, match modes keys, roots. instance, C major minor relative keys. similar distinction \"la-based minor\" solfege (relative) vs \"fixed-\" solfege (parallel). transposing using argument, relative = FALSE input key (Key argument) transposed match root argument. example, input key G minor `` key C major, output transposed G minor. However, relative = TRUEthe input key transposed match mode thetokey: G minor input C majortowould translated minor, parallel minor thetokey. theKey(key) andto` (key) arguments mode, parallel relative transpositions .","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/transpose.html"],"id":"special-operators-","dir":"Reference","previous_headings":"","what":"Special Operators +-","title":"Transpose pitches and keys — transpose","text":"note, real transposition interval can achieved concisely using + - operators, long least one side operators actual tonalInterval object. humdrumR preassigns common tonalIntervals objects global environment. Thus, can type commands like \"c#\" + M2 get d#, c(\"C4\", \"E4\", \"C5\") - m6 get \"E3\" \"G#3\" \"E4\".","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/unfoldStops.html"],"dir":"Reference","previous_headings":"","what":"","title":"","text":"record/spine/path locations different numbers stops different fields, function spreads data smaller fields multiple stops.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/unfoldStops.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"","text":"","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/validateHumdrum.html"],"dir":"Reference","previous_headings":"","what":"Validate humdrum files — validateHumdrum","title":"Validate humdrum files — validateHumdrum","text":"function checks files local machine violations humdrum syntax. Detailed error reports can generated, pointing specific problematic records files.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/validateHumdrum.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Validate humdrum files — validateHumdrum","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/validateHumdrum.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Validate humdrum files — validateHumdrum","text":"... Arguments passed findHumdrum(). Used identify files local machine test humdrum validity. mainly used pass regex file-path search patterns, may also used pass recursive /contains arguments findHumdrum(). errorReport.path directory path write error report files. Defaults NULL. Must single character string. NULL (default), error report files written.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/validateHumdrum.html"],"id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Validate humdrum files — validateHumdrum","text":"validateHumdrum() returns \"error frame\" data.table object, invisibly (\"see\" output, must save variable, look ). error frame data.table three columns: Filepath: file name. Record: record contains error. Message: description error. Valid files rows error frame.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/validateHumdrum.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Validate humdrum files — validateHumdrum","text":"violations general humdrum syntax identified. example, missing exclusive interpretations, *- spine enders, null data tokens. validateHumdrum function check ill-formed data content---example, **kern spine containing token \"Lsharp\" rejected. Note validateHumdrum quite picky details! \"Hanging white space,\" even global records, marked invalid files! validateHumdrum called manner readHumdrum(), providing one regex search patterns match files machine. (..., recursive, contains arguments simply passed findHumdrum().) called, validateHumdrum prints basic messages informing result file matching validity testing.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/validateHumdrum.html"],"id":"error-reports","dir":"Reference","previous_headings":"","what":"Error reports","title":"Validate humdrum files — validateHumdrum","text":"desired, contents validateHumdrum \"error frame\" can written text files. allows us print errors tagged right alongside original raw data. write error report, set errorReport.path argument non-NULL string, pointing directory path machine. directory exist, R (attempt ) create . errorReport.path directory, complete error report(s) files (returned \"fileFrame\", see ) written single file named 'humdrumR_syntaxErrorReport_DATE.txt' (date coming Sys.Date). addition, sub directory called AnnotatedFilesis created. directory, copies files contain errors written, with_errorAnnotations` appended names. file, individual errors directly indicated record occur. output looks like :","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/validateHumdrum.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Validate humdrum files — validateHumdrum","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/vectorization.html"],"dir":"Reference","previous_headings":"","what":"What is ","title":"What is ","text":"\"vectorization\"?","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/vectorization.html"],"id":"vectorization-explained","dir":"Reference","previous_headings":"","what":"Vectorization explained","title":"What is ","text":"Many R operations/functions \"vectorized,\" meaning take vectors output vectors length. means , programmers, need worry element vector; can treat vector like single object, R oblige us. example, can math like: work strings like: get logical values: course, R functions take vectors return totally new vectors (just scalars). Examples: Vectorization works well working vectors either 1) length 2) length 1 (scalar). vectors different lengths, shorter one \"recycled\" (repeated) match longer one.","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/withinHumdrum.html"],"dir":"Reference","previous_headings":"","what":"Working with humdrum data fields — withinHumdrum","title":"Working with humdrum data fields — withinHumdrum","text":"functions primary means working humdrumR data. allow us perform arbitrary (free form) manipulation data fields held within humdrumR data object, convenient functionality ignoring null data, lagging data, grouping data, windowing, . () within() functions, come base R, core functions. However, dplyr \"verbs\" mutate(), summarize(), reframe() can used well---equivalent using ()/within() particular arguments.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/withinHumdrum.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Working with humdrum data fields — withinHumdrum","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/withinHumdrum.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Working with humdrum data fields — withinHumdrum","text":"data HumdrumR data. Must humdrumR data object. ... number expressions evaluate. expressions can reference fields() data name, well variables outside data. expressions named, names used name new fields (column names (..., drop = FALSE). dataTypes types humdrum records include. Defaults \"D\". Must single character string. Legal values 'G', 'L', '', 'M', 'D', 'd' combination (e.g., \"LIM\"). (See humdrum table documentation Fields section explanation.) recycle results \"recycled\" (padded) relative input length? within() reframe() default \"pad\"; mutate() defaults \"ifscalar\"; () defaults \"\". Must single character string. full list options \"\", \"yes\", \"pad\", \"ifscalar\", \"ifeven\", \"never\", \"summarize\", though functions accept options. See Parsing expression results section . alignLeft output shorter input aligned left? Defaults TRUE. Must singleton logical value: /switch. expandPaths spine paths expanded evaluating expressions? Defaults FALSE. Must singleton logical value: /switch. TRUE, expandPaths() function run data evaluating expressions. evaluation, expanded locations removed output. drop Whether return simplified data structure. Defaults TRUE. Must singleton logical value: /switch. argument conceptually similar drop argument R matrices. drop = TRUE, output ()/summarize() simplified much possible (trying return \"raw\" vector, list, table, etc. within ). drop = FALSE, result always data.table. .Optional grouping fields; alternative using group_by(). Defaults NULL. Must NULL, character strings partially match one fields() data. NULL, fields used group data. grouping fields already set call group_by(), .argument overrides . variables named list values, interpolate expressions. Defaults list(). Must named list. values interpolated ... expression arguments wherever variable name matches name list.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/withinHumdrum.html"],"id":"overview","dir":"Reference","previous_headings":"","what":"Overview","title":"Working with humdrum data fields — withinHumdrum","text":"functions primary means working humdrumR data. allow write code accesses manipulates raw fields() data. main differences results code: () summarize() return results normal, \"raw\" R formats, removed humdrumR data; contrast, within(), mutate(), reframe() always insert results code new fields() within humdrum data. distinctions functions recycle/pad results (see ).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/withinHumdrum.html"],"id":"expression-evaluation","dir":"Reference","previous_headings":"","what":"Expression evaluation","title":"Working with humdrum data fields — withinHumdrum","text":"(), within(), mutate(), summarize(), reframe() methods humdrumR data perform \"non-standard evalation\" expressions provide arguments. Basically, use function like (...) mutate(...), expressions write inside function call evaluated right ---instead, R takes expressions \"environment\" humdrum table, fields \"visible\" expression. means can write code (expressions) refer fields(), like Token Spine. example: Since fields humdrum table length, expressions write can , generally , vectorized. default, (), within(), etc. use whole humdrum table, instead evaluate expressions using rows containing non-null data tokens (Type == \"D\"). means interpretations, comments, barlines, null data tokens automatically ignored ! feature controlled dataTypes argument: can choose work token types providing character string containing combinations characters G (global comments), L (local comments), (interpretations), M (barlines), D (non-null data), d (null data). example, dataTypes = 'MDd' evaluate expressions barline tokens (=), non-null data, null data. See ditto() manual example application using dataTypes = 'Dd'. Keep mind humdrumR dynamically updates tokens considered \"null\" (\"d\") based fields selected. multiple expression arguments provided, expression evaluated order, left right. expression can refer variables assigned previous expression (examples ). Note: Within expressions, humdrumR namespace takes priority. means , example, use lag() within expression, humdrumR version lag() used, even loaded packages lag() function. use another package's function, specify package::function()---example, dplyr::lag(). issue functions exact name humdrumR function.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/withinHumdrum.html"],"id":"expression-pre-processing","dir":"Reference","previous_headings":"","what":"Expression pre-processing","title":"Working with humdrum data fields — withinHumdrum","text":"functions pre-processing expressions arguments evaluating . pre-processing provides convenient \"syntactic sugar\" working humdrum data. currently five pre-processing steps: Explicit variable interpolation. . placeholder selected fields. Automatic argument insertion. \"Lagged\"-vectors shorthand. \"Splatted\" arguments. explained .","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/withinHumdrum.html"],"id":"explicit-variable-interpolation","dir":"Reference","previous_headings":"","what":"Explicit variable interpolation","title":"Working with humdrum data fields — withinHumdrum","text":"variable argument can provided (option) list named values. names variable list appear symbols (variable names) expression argument, value interpolated place symbol. example, variable x changed TRUE, resulting : feature useful programmatic purposes, like like run expression many times slightly different parameters.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/withinHumdrum.html"],"id":"the-placeholder","dir":"Reference","previous_headings":"","what":"The . placeholder","title":"Working with humdrum data fields — withinHumdrum","text":". variable can used special placeholder representing data's first selected field. example, run count() Token field. new fields created within()/mutate()/reframe() become selected fields (details ), . makes easy refer last new field pipes. example, count() function run output mutate(kern(Token, simpe = TRUE)) expression.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/withinHumdrum.html"],"id":"automatic-argument-insertion","dir":"Reference","previous_headings":"","what":"Automatic argument insertion","title":"Working with humdrum data fields — withinHumdrum","text":"Many humdrumR functions designed work certain common fields humdrumR data. example, many pitch functions Key argument (can) take content Key readHumdrum() creates key interpretations, like *G:, data. expression argument uses one functions, explicitly set argument, humdrumR automatically insert appropriate field call (field present). , example, run data set includes Key field, expression changed : want happen, need explicitly give different Key argument, like: (Key argument can also set NULL). Another common/important automatic argument insertion functions groupby argument. functions automatically appropriate grouping fields inserted . example, mint() (melodic intervals) command automatically applied using groupby groupby = list(Piece, Spine, Path), makes sure melodic intervals calculated within spine paths...pieces/spines/paths (make sense!). humdrumR functions use automatic argument interpolation mention documentation. example, ?solfa documentation mentions treatment Key \"Key\" section.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/withinHumdrum.html"],"id":"lagged-vectors","dir":"Reference","previous_headings":"","what":"Lagged vectors","title":"Working with humdrum data fields — withinHumdrum","text":"music analysis, often want work \"lagged\" vectors data. example, want look relationship vector previous values vector---e.g., vector offset \"lagged\" one index. lag() lead() functions useful , always keeping length vectorization never hindered. expression arguments, can use convenient shorthand call lag() (lead). expression, vector can indexed integer argument named lag lead (case insensitive), causing lagged/led integer amount. (vector indexed lag = 0 returns unchanged vector.) example, following two calls : useful lag/lead index multiple values: indexed object appears within higher function call, lag inserted separate argument call. Thus, two calls also : Note lagging also automatically grouped within fields list(Piece, Spine, Path), default \"melodic\" structure data. assures vector \"lagged\" one piece another, one spine next. like turn change grouping, need override adding groupby argument lagged index, like Token[lag = 1, groupby = list(...)]. Using lagged vectors, since vectorized, fastest (computationally) easiest way working n-grams. example, want create character-string 5-grams data, call: Since lagging grouped list(Piece, Spine, Path), true \"melodic\" n-grams, created within spine-paths within piece.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/withinHumdrum.html"],"id":"splatted-arguments","dir":"Reference","previous_headings":"","what":"Splatted arguments","title":"Working with humdrum data fields — withinHumdrum","text":"\"Splatting\" refers feeding function list/vector arguments. Sometimes want divide data pieces (l\\'group_by()), rather applying expression piece, want feed separate pieces separate arguments function. can use syntactic sugar just . can index field call splat argument, must Field %% x. example, call, Token field divided two groups, one Spine == 1 Spine == 2; first group (Spine == 1) used first argument list, second group (Spine == 2) second argument. Thus, within translates previous expression : Splatting can little weird, nothing assure splatted arguments length, usually want (vectorization). example, previous example, guarantee Token[Spine == 1] Token[Spine == 2] length. just means use splatting really understand groups splatting. example, spine paths stops data, can know spines number data records, including data records (null non-null). , know stops/paths data, can run something like :","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/withinHumdrum.html"],"id":"saving-expressions-for-later","dir":"Reference","previous_headings":"","what":"Saving expressions for later","title":"Working with humdrum data fields — withinHumdrum","text":"cases may find certain arguments expressions use repeatedly. can store expressions variables \"quoting\" : common way quote expression R using ~, creates called \"formula\"---essentially quoted expression. can also quote expressions, using quote(). quoted expression can pass (), within(), mutate(), summarize(), reframe(). Image three different datasets (humData1, humData2, humData3), like evaluate expression count(kern(Token, simple = TRUE)) three. Use ~ operator quote save expression variable, use ():","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/withinHumdrum.html"],"id":"expanding-paths","dir":"Reference","previous_headings":"","what":"Expanding paths","title":"Working with humdrum data fields — withinHumdrum","text":"data includes spine paths (can check anyPaths()), analyses may require spine paths treated contiguous \"melodies.\" expandPaths() function can used \"expand\" spine paths new spines. expandPaths argument ()/within() cause expandPaths() run data evaluating argument expressions. evaluation, expanded parts data removed output.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/withinHumdrum.html"],"id":"parsing-expression-results","dir":"Reference","previous_headings":"","what":"Parsing expression results","title":"Working with humdrum data fields — withinHumdrum","text":"differences (), within(), mutate(), summarize(), reframe() humdrumR methods results expressions passed . major difference within(), mutate(), reframe() put results new fields humdrumR data, () summarize() just return results \"normal\" R. differences functions simply relate recycle drop arguments used (details ). recycle argument controls results code , , recycled (padded). write code using humdrumR data's fields() input, results inspected see long compared length input field(s). results longer input, get error message---humdrumR (yet) handle case. results shorter input, recycle argument controls happens result. seven options: \"\": result recycled padded. calls within(), mutate, reframe(), option allowed. \"yes\": result recycled, matter long . \"pad\": result padded NA values. \"ifscalar\": result scalar (length 1), recycled; otherwise see error. \"ifeven\": result length evenly divides input length, recycled; otherwise see error. \"never\": result recycled. result match input length, see error. \"summarize\": result scalar, even matches input length, see error. result recycled. result padding/recycling also depends alignLeft argument: alignLeft = TRUE, results padded right: like c(result, NA, NA, ...); alignLeft = FALSE, results padded left: like c(..., NA, NA, results). Recycling also affected result's length evenly divide input length. example, consider result c(1, 2, 3) needs recycled length 10: alignLeft = TRUE, result recycled c(1, 2, 3, 1, 2, 3, 1, 2, 3, 1); alignLeft = FALSE, result recycled c(3, 1, 2, 3, 1, 2, 3, 1, 2, 3).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/withinHumdrum.html"],"id":"with-and-summarize-","dir":"Reference","previous_headings":"","what":"with() and summarize()","title":"Working with humdrum data fields — withinHumdrum","text":"humdrumR () summarize() methods return \"normal\" R data objects. difference () summarize() methods default drop recycle arguments: (..., drop = TRUE, recycle = '') summarize(..., drop = FALSE, recycle = 'summarize') drop = TRUE, methods return whatever code's result , parsing. can kind R data, including vectors objects like lm fits tables. drop = FALSE, results instead returned data.table(). working grouped data, drop = FALSE output (data.table) include grouping columns well results expressions. drop = TRUE one result per group, grouping fields used generate names output vector.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/withinHumdrum.html"],"id":"within-mutate-and-reframe-","dir":"Reference","previous_headings":"","what":"within(), mutate(), and reframe().","title":"Working with humdrum data fields — withinHumdrum","text":"humdrumR within(), mutate(), reframe() methods always return new humdrumR data object, new fields created code results. differences methods default recycle argument types recycle argument allow: within(..., recycle = 'pad') Can accept recycle option except \"\". mutate(..., recycle = 'ifscalar') Can accept \"ifscalar\" \"never\". reframe(..., recycle = 'pad') Can accept \"pad\" \"yes\".","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/withinHumdrum.html"],"id":"creating-new-humdrumr-fields","dir":"Reference","previous_headings":"","what":"Creating new humdrumR fields","title":"Working with humdrum data fields — withinHumdrum","text":"running within(), mutate(), reframe(), new fields() added output humdrumR data. new fields become selected fields output. can explicitly name newly created fields (recommended), allow humdrumR automatically name (details ). using (..., drop = FALSE) summarize(..., drop = FALSE), column names output data.table determined way. Note within(), mutate(), reframe() (attempt ) put result back humdrumR data...even make much sense. Things work well vectors. Atomic vectors usually best work (.e., numbers, character strings, logical values), lists work well ---just remember need treat fields lists (e.g., might need use lapply() Map() work list fields.) non-vector result put list well, padded needed. example, use lm() compute linear-regression call within() result new field containing list, first element list single lm fit object, rest list empty (padded length field).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/withinHumdrum.html"],"id":"naming-new-fields","dir":"Reference","previous_headings":"","what":"Naming new fields","title":"Working with humdrum data fields — withinHumdrum","text":"explicitly name code expressions provide, new fields named capturing expression code character string. However, generally better idea explicitly name new fields. can done two ways: Base-R within() style: Use <- assignment operator inside expression. Example: within(humData, Kern <- kern(Token)). Tidyverse mutate() style: provide expression named argument =. Example: mutate(humData, Kern = kern(Token)). Either style can used humdrumR methods. using <-, top-level assignment create new field, means one field can assigned per expression. example, create two fields (Semits Recip). However, . result expressions grouped {} always last expression brackets. Thus, last example create one new field, corresponding result recip(Token). However, resulting field called Recip! top-level assignments used name expression: name multi-expression expression (using {}), something like : course, result recip(Token) saved Recip, Semits <- semits(Token) expression nothing useful .","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/withinHumdrum.html"],"id":"piped-references","dir":"Reference","previous_headings":"","what":"Piped references","title":"Working with humdrum data fields — withinHumdrum","text":"argument expressions passed ()/within() methods evaluated order, left right, assignments previous expression visible next expression. means can, example, : use Kern second expression refer Kern assigned previous expression.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/withinHumdrum.html"],"id":"evaluating-expressions-in-groups-or-windows","dir":"Reference","previous_headings":"","what":"Evaluating expressions in groups or windows","title":"Working with humdrum data fields — withinHumdrum","text":"(), within(), mutate(), summarize(), reframe() functions work grouped data, data contextual windows defined. groups windows defined, argument expressions evaluated independently within every group/window. Results processed (including recycling/padding) within group/window. Finally, results pieced back together locations corresponding original data locations. Since groups necessarily exhaustive non-overlapping, results location easy understand. hand contextual windows may overlap, means non-scalar results potentially overlap well; cases, result data lands may hard predict.","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/withinHumdrum.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Working with humdrum data fields — withinHumdrum","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/wort.html"],"dir":"Reference","previous_headings":"","what":"Paste syllables together into words — wort","title":"Paste syllables together into words — wort","text":"humdrum datasets include lyrics, include **silbe spine, representing syllable lyrics one line notes music. Syllables multi-syllabic words connected - markers end first syllable, beginning last syllable beginning end medial syllables. wort() command translates syllable representation words, simply collapsing together. resulting word aligned first syllable word **silbe. wort() applied humdrumR data class may use data's fields arguments. field names specified, first selectedField used x.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/wort.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Paste syllables together into words — wort","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/wort.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Paste syllables together into words — wort","text":"x vector exclusive intepretations control dispatch. Defaults NULL. Must NULL, character vector either length 1 length(x). sep separator input /output. Defaults \"-\". Must single, non-empty character string. keep.sep syllable separators kept output? Defaults TRUE. Must singleton logical value: /switch. number.syllables output show words numbered syllables? Defaults FALSE. Must singleton logical value: /switch. groupby Optional vectors group words within. Defaults list(). Must list; every element list must length length(x).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/wort.html"],"id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Paste syllables together into words — wort","text":"non-null Exclusive argument provided, wort() apply Exclusive == \"silbe\". used withinHumdrum() call, wort() automally passed Exclusive field humdrum data, well groupby = list(Piece, Spine, Path), words collapsed across pieces/spines/paths. output wort() always length input. collapsed syllables replaced **silbe melisma marker, \"_\". number.syllables = TRUE, whole word repeated syllable, numbered square brackets: e.g., c(\"yesterday[1], \"yesterday[2]\", \"yesterday[3]\", \"yesterday[4]\"). format seen lot computational linguistics. default, syllable separators retained collapsed output: makes possible recreate syllables necessary. mid-word melismas (indicated \"_\") kept collapsed well, reason. However, keep.sep = TRUE, seperators (mid-word melismas) removed, making function non invertible (easily get back syllables).","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/wort.html"],"id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Paste syllables together into words — wort","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/writeHumdrum.html"],"dir":"Reference","previous_headings":"","what":"Write humdrumR data to humdrum files — writeHumdrum","title":"Write humdrumR data to humdrum files — writeHumdrum","text":"writeHumdrum writes humdrumR data humdrum-syntax text files. current selected field(s) evaluated generate humdrum output data. written output match printout printing data R terminal.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/writeHumdrum.html"],"id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Write humdrumR data to humdrum files — writeHumdrum","text":"","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/writeHumdrum.html"],"id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Write humdrumR data to humdrum files — writeHumdrum","text":"humdrumR HumdrumR data write. Must humdrumR data object. prefix prefix add output filenames. Defaults \"humdrumR_\". Must single character string. renamer function modify output filenames. Defaults force (keep original filenames). Must function accepts character vector returns new charater vector length. affix affix add output filenames. Defaults \"\". Must single character string. Affix appended end filename, extension. extension extension use new files. Defaults NULL, means file extension original files used. Must NULL, single, non-empty character string. directory directory write files . Defaults NULL. Must single character string. NULL, files written directory (directories) read . overwrite Whether overite existing files. Defaults FALSE. Must singleton logical value: /switch. FALSE, writeHumdrum refuse overwrite files. TRUE, writeHumdrum overwrite files, additional prompt user. verbose Whether show file names writing. Defaults FALSE. Must singleton logical value: /switch. TRUE, new output file name printed console writing happens. EMD string write new !!!EMD: record file. Defaults \"Edited using humdrumR, version X.X.X.XXX, current data/time.\" Must single character string. NULL, appended.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/reference/writeHumdrum.html"],"id":"file-names","dir":"Reference","previous_headings":"","what":"File names","title":"Write humdrumR data to humdrum files — writeHumdrum","text":"main option control writeHumdrum files write . writeHumdrum uses original names files, read readHumdrum, basis new file names. default, writeHumdrum refuse overwrite original files---overwriting allowed specify overwrite == TRUE respond \"y\" prompt. writeHumdrum generates new file names modifying original read file names. renamer argument must function takes original names input character vector (excluding directory path file extension) returns new character vector length (default R's identity function force). running renamer, character-string affix prefix arguments appended/prepended renamed names. (affix affixed extension.) Finally, extension argument can used specify different file extension. files data set contain multiple pieces, can either write pieces files (seperateFiles = FALSE), originally, write piece new file (separateFiles = TRUE); writing pieces separate files, piece's file name appended _pieceN, N number piece within file. directory argument indicates file path write files. directory exist, created. directory NULL, files written original input directory (directories). EMD argument specifies character string put new !!!EMD reference record end file. EMD (Document modification description) records keep track modifications humdrum data. default behavior print string indicating humdrumR version number date. EMD set NULL, appended files.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/news/index.html"],"id":"humdrumr-705","dir":"Changelog","previous_headings":"","what":"humdrumR 7.0.5","title":"humdrumR 7.0.5","text":"Version 7.0.5 includes small patch fix bug related :: function, well new feature/behavior builds fix. previous versions, error occur used :: inside fundamental humdrumR “/within” methods (including base functions dplyr “verbs”). ’ve fixed bug. ’ve also added new feature; specifically, ’ve made using :: humdrumR less necessary. Now, within humdrumR call methods (listed ), use function exported humdrumR, humdrumR automatically use humdrumR version function, even another package attached includes function name. words, humdrumR namespace always takes priority within humdrumR method call. example, dplyr package exports function called lag() humdrumR (functions thing, humdrumR’s version extra features). update, loaded dplyr loaded humdrumR, dplyr’s lag() function generally take priority humdrumR’s lag(). , code like call dplyr::lag(). sort behavior can confusing wouldn’t normally end world (R supposed work, ). However, lag() function particularly problematic many humdrumR methods rely special version lag(). ’ve implemented change: Now, use lag() within humdrumR /within method, default using humdrumR version, regardless packages loaded. code use humdrumR::lag(). want use dplyr’s version (package), still can specifying (example) dplyr::lag(). Another function (past) lead frequent namespace confusion transpose()—now, can safely use transpose() know system use humdrumR::transpose(). .humdrumR methods following functions affected change: () within() mutate() reframe() summarize() filter() subset()","code":""},{"path":[],"code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/news/index.html"],"id":"count-and-table-7-0-3","dir":"Changelog","previous_headings":"","what":"count() and table()","title":"humdrumR 7.0.3","text":"wanted use tally() humdrumR’s main “count stuff” function. Unfortunately, found tally() already exists dplyr (generic tally) can’t really extended ’d like. ’ve reimplemented everything focusing extension dplyr::count() function. also necessitated renaming (metric) count() function timecount(). count() method now generates cool “distribution” table, easily manipulate. mostly working pretty well, still work progress documented. ’ve also extended base::table() work humdrumR data, ’ll emphasizing using count() documentation.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/news/index.html"],"id":"harte-7-0-3","dir":"Changelog","previous_headings":"","what":"harte()","title":"humdrumR 7.0.3","text":"’ve implemented parsing deparsing Harte syntax representing chords. chord functions able read harte notation, now harte() function outputting (deparsing) **harte.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/news/index.html"],"id":"humdrumr-700","dir":"Changelog","previous_headings":"","what":"humdrumR 7.0.0","title":"humdrumR 7.0.0","text":"HumdrumR 0.7.0.0 includes pretty major changes previous (0.6.x.x) versions. Notably, updated whole package make consistent Tidy-verse. ’ve also incorporated option use humdrumR functions super-concise manner closely modeled original humdrum toolkit. Finally, changed humdrumR data objects behave little like “normal” R data.frames (tibbles), allowed easily “see” manipulate data data.frame. reference manuals articles updated reflect changes.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/news/index.html"],"id":"tidy-verse-style-7-0-0","dir":"Changelog","previous_headings":"","what":"Tidy-verse style","title":"humdrumR 7.0.0","text":"HumdrumR changed ways align Tidy-verse, particular, dplyr package. following dplyr packages now humdrumR methods: select() filter() mutate() reframe() summarize() group_by() pull()","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/news/index.html"],"id":"select-7-0-0","dir":"Changelog","previous_headings":"Tidy-verse style","what":"select()","title":"humdrumR 7.0.0","text":"biggest change package use select() function. humdrumR, dropped use term “Active Field” favor term “Selected Field.” Use select() function select fields—can longer use $ purpose.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/news/index.html"],"id":"filter-7-0-0","dir":"Changelog","previous_headings":"Tidy-verse style","what":"filter()","title":"humdrumR 7.0.0","text":"can now call filter() alternative subset()—work exactly !","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/news/index.html"],"id":"mutate-summarize-and-reframe-7-0-0","dir":"Changelog","previous_headings":"Tidy-verse style","what":"mutate(), summarize(), and reframe()","title":"humdrumR 7.0.0","text":"now use dplyr “verbs” mutate(), summarize(), reframe() main tools manipulating humdrumR data. commands work similarly within() () functions previous humdrumR versions, slightly different recycle results. base-R () within() functions can still used —fact, () still particularly useful sometimes, basically going reframe() |> pull() one step.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/news/index.html"],"id":"group_by-7-0-0","dir":"Changelog","previous_headings":"Tidy-verse style","what":"group_by()","title":"humdrumR 7.0.0","text":"Instead providing = argument humdrumR functions, now call group_by() separate command. data stay grouped call ungroup().","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/news/index.html"],"id":"pull-7-0-0","dir":"Changelog","previous_headings":"Tidy-verse style","what":"pull()","title":"humdrumR 7.0.0","text":"dplyr “verb” pull() can also used extract field humdrumR dataset. also functions pull_data.frame(), pull_data.table() (requires data.table, pull_tibble() (requires tibble), pull multiple fields “normal” R data.frame/data.table/tibble. Note $ command changed consistent base-R Tidyverse. command now simply extract field humdrumR data.","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/news/index.html"],"id":"humdrum-style-7-0-0","dir":"Changelog","previous_headings":"","what":"Humdrum style","title":"humdrumR 7.0.0","text":"new feature many humdrumR’s functions can applied directly humdrumR data, without using mutate(), within(), etc. example, can take humdrum data pipe directly kern() function, like: humData |> kern().","code":""},{"path":["https://humdrumR.ccml.gtcmt.gatech.edu/news/index.html"],"id":"dataframe-view-7-0-0","dir":"Changelog","previous_headings":"","what":"Data.frame view","title":"humdrumR 7.0.0","text":"new option humdrumR 0.7.0.0 view humdrumR data normal R data.frame, instead showing data humdrum-syntax score. Call command humdrumR(\"data.frame\") switch new view. “data.frame view,” humdrumR still show selected fields. want see fields, use select(everythign()). want switch back “humdrum view” (default), call humdrumR(\"humdrum\").","code":""}]
diff --git a/man/withinHumdrum.Rd b/man/withinHumdrum.Rd
index 6c3186f1..cad507bd 100644
--- a/man/withinHumdrum.Rd
+++ b/man/withinHumdrum.Rd
@@ -205,6 +205,12 @@ are \link[=selectedFields]{selected}.
If multiple expression arguments are provided, each expression is evaluated in order, from left to right.
Each expression can refer variables assigned in the previous expression (examples below).
+
+\emph{Note}: Within any of these expressions, the humdrumR namespace takes priority.
+This means that, for example, if you use \code{lag()} within an expression, the humdrumR version of \code{lag()}
+will be used, even if you have loaded other packages which have their own \code{lag()} function.
+To use another package's function, you'll have to specify \verb{package::function()}---for example, \code{dplyr::lag()}.
+This is only an issue when functions have the exact same name as a humdrumR function.
\subsection{Expression pre-processing}{
These functions all do some
diff --git a/vignettes/Filtering.Rmd b/vignettes/Filtering.Rmd
index e4c2da50..5099a1a2 100644
--- a/vignettes/Filtering.Rmd
+++ b/vignettes/Filtering.Rmd
@@ -239,10 +239,11 @@ we see that what is now the third file actually had flats in all four spines, an
In some cases you may find the renumbering of spines on a *per file* basis confusing, and you want to keep track of the original spine numbers.
Fortunately, for you there is an option that might helpful, which you will learn more about below:
-try specifying `removeEmpty = FALSE`:
+try specifying `drop = FALSE`.
+(The `drop` argument is less intuitive, but is the standard R argument for this sort of thing.)
```{r}
-chorales[[ , '-', removeEmpty = FALSE]]
+chorales[[ , '-', drop = FALSE]]
```