diff --git a/_nuxt/73ca53709765ffef6093.js b/_nuxt/73ca53709765ffef6093.js new file mode 100644 index 0000000..6a11730 --- /dev/null +++ b/_nuxt/73ca53709765ffef6093.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[0],{0:function(e,t,n){"use strict";n.d(t,"k",(function(){return v})),n.d(t,"m",(function(){return x})),n.d(t,"l",(function(){return w})),n.d(t,"e",(function(){return M})),n.d(t,"b",(function(){return T})),n.d(t,"r",(function(){return D})),n.d(t,"g",(function(){return k})),n.d(t,"h",(function(){return O})),n.d(t,"d",(function(){return C})),n.d(t,"q",(function(){return P})),n.d(t,"j",(function(){return I})),n.d(t,"s",(function(){return S})),n.d(t,"n",(function(){return L})),n.d(t,"p",(function(){return _})),n.d(t,"f",(function(){return j})),n.d(t,"c",(function(){return z})),n.d(t,"i",(function(){return B})),n.d(t,"o",(function(){return E})),n.d(t,"a",(function(){return G}));n(97),n(41),n(30),n(48),n(65),n(66);var o=n(39),r=(n(133),n(134),n(135),n(25)),l=(n(34),n(35),n(137),n(140),n(98),n(36),n(5)),c=(n(51),n(37),n(15),n(68),n(38),n(56)),d=n(1);function m(object,e){var t=Object.keys(object);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(object);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(object,e).enumerable}))),t.push.apply(t,n)}return t}function h(e){for(var i=1;i=e.length?{done:!0}:{done:!1,value:e[i++]}},e:function(e){throw e},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var r,l=!0,c=!1;return{s:function(){n=e[Symbol.iterator]()},n:function(){var e=n.next();return l=e.done,e},e:function(e){c=!0,r=e},f:function(){try{l||null==n.return||n.return()}finally{if(c)throw r}}}}function y(e,t){(null==t||t>e.length)&&(t=e.length);for(var i=0,n=new Array(t);i1&&void 0!==arguments[1]?arguments[1]:[],o=e.$children||[],r=f(o);try{for(r.s();!(t=r.n()).done;){var l=t.value;l.$fetch?n.push(l):l.$children&&M(l,n)}}catch(e){r.e(e)}finally{r.f()}return n}function T(e,t){if(t||!e.options.__hasNuxtData){var n=e.options._originDataFn||e.options.data||function(){return{}};e.options._originDataFn=n,e.options.data=function(){var data=n.call(this,this);return this.$ssrContext&&(t=this.$ssrContext.asyncData[e.cid]),h(h({},data),t)},e.options.__hasNuxtData=!0,e._Ctor&&e._Ctor.options&&(e._Ctor.options.data=e.options.data)}}function D(e){return e.options&&e._Ctor===e||(e.options?(e._Ctor=e,e.extendOptions=e.options):(e=d.a.extend(e))._Ctor=e,!e.options.name&&e.options.__file&&(e.options.name=e.options.__file)),e}function k(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"components";return Array.prototype.concat.apply([],e.matched.map((function(e,o){return Object.keys(e[n]).map((function(r){return t&&t.push(o),e[n][r]}))})))}function O(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return k(e,t,"instances")}function C(e,t){return Array.prototype.concat.apply([],e.matched.map((function(e,n){return Object.keys(e.components).reduce((function(o,r){return e.components[r]?o.push(t(e.components[r],e.instances[r],e,r,n)):delete e.components[r],o}),[])})))}function P(e,t){return Promise.all(C(e,function(){var e=Object(l.a)(regeneratorRuntime.mark((function e(n,o,r,l){return regeneratorRuntime.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if("function"!=typeof n||n.options){e.next=4;break}return e.next=3,n();case 3:n=e.sent;case 4:return r.components[l]=n=D(n),e.abrupt("return","function"==typeof t?t(n,o,r,l):n);case 6:case"end":return e.stop()}}),e)})));return function(t,n,o,r){return e.apply(this,arguments)}}()))}function I(e){return A.apply(this,arguments)}function A(){return(A=Object(l.a)(regeneratorRuntime.mark((function e(t){return regeneratorRuntime.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t){e.next=2;break}return e.abrupt("return");case 2:return e.next=4,P(t);case 4:return e.abrupt("return",h(h({},t),{},{meta:k(t).map((function(e,n){return h(h({},e.options.meta),(t.matched[n]||{}).meta)}))}));case 5:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function S(e,t){return R.apply(this,arguments)}function R(){return(R=Object(l.a)(regeneratorRuntime.mark((function e(t,n){var l,c,d,m;return regeneratorRuntime.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t.context||(t.context={isStatic:!0,isDev:!1,isHMR:!1,app:t,payload:n.payload,error:n.error,base:"/MPM/",env:{}},n.req&&(t.context.req=n.req),n.res&&(t.context.res=n.res),n.ssrContext&&(t.context.ssrContext=n.ssrContext),t.context.redirect=function(e,path,n){if(e){t.context._redirected=!0;var o=Object(r.a)(path);if("number"==typeof e||"undefined"!==o&&"object"!==o||(n=path||{},path=e,o=Object(r.a)(path),e=302),"object"===o&&(path=t.router.resolve(path).route.fullPath),!/(^[.]{1,2}\/)|(^\/(?!\/))/.test(path))throw path=W(path,n),window.location.replace(path),new Error("ERR_REDIRECT");t.context.next({path:path,query:n,status:e})}},t.context.nuxtState=window.__NUXT__),e.next=3,Promise.all([I(n.route),I(n.from)]);case 3:l=e.sent,c=Object(o.a)(l,2),d=c[0],m=c[1],n.route&&(t.context.route=d),n.from&&(t.context.from=m),t.context.next=n.next,t.context._redirected=!1,t.context._errored=!1,t.context.isHMR=!1,t.context.params=t.context.route.params||{},t.context.query=t.context.route.query||{};case 15:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function L(e,t){return!e.length||t._redirected||t._errored?Promise.resolve():_(e[0],t).then((function(){return L(e.slice(1),t)}))}function _(e,t){var n;return(n=2===e.length?new Promise((function(n){e(t,(function(e,data){e&&t.error(e),n(data=data||{})}))})):e(t))&&n instanceof Promise&&"function"==typeof n.then?n:Promise.resolve(n)}function j(base,e){var path=decodeURI(window.location.pathname);return"hash"===e?window.location.hash.replace(/^#\//,""):(base&&0===path.indexOf(base)&&(path=path.slice(base.length)),(path||"/")+window.location.search+window.location.hash)}function z(e,t){return function(e,t){for(var n=new Array(e.length),i=0;i0)){e.next=18;break}return e.next=18,new Promise((function(e){return setTimeout(e,o)}));case 18:this.$fetchState.error=t,this.$fetchState.pending=!1,this.$fetchState.timestamp=Date.now(),this.$nextTick((function(){return r.$nuxt.nbFetching--}));case 22:case"end":return e.stop()}}),e,this,[[6,11]])})))).apply(this,arguments)}t.a={beforeCreate:function(){Object(l.l)(this)&&(this._fetchDelay="number"==typeof this.$options.fetchDelay?this.$options.fetchDelay:200,r.a.util.defineReactive(this,"$fetchState",{pending:!1,error:null,timestamp:Date.now()}),this.$fetch=h.bind(this),Object(l.a)(this,"created",m),Object(l.a)(this,"beforeMount",d))}}},104:function(e){e.exports=JSON.parse('{"items":[{"base":"specs/accentuation.xml","ident":"accentuation","type":"element","module":"mpm.core","gloss":["accentuation"],"desc":"

An accentuation is a building block for the definition of accentuation patterns. It defines a relative loudness offset (in the interval [-1.0; 1.0]) from the underlying absolute loudness (which is defined by the dynamicsMap).

","examples":["

The first element sets the maximum accentuation for the first beat and all notes that follow until the beat position of the subsequent element. The second element sets an accentuation of -0.5 at and only at the second beat. All notes between this and the beat position of the next element are set to -1.0 accentuation (full restraint). The third element sets 0.5 accentuation at and only at the third beat. The remaining notes are accentuated according to a linear function starting at -0.5 and transitioning to 1.0. As this is the last accentuation in this pattern the transition goes to the end of the pattern length.

","
<accentuation beat=\\"1.0\\" value=\\"1.0\\"/>\\n<accentuation beat=\\"2.0\\" value=\\"-0.5\\" transition.from=\\"-1.0\\"/>\\n<accentuation beat=\\"3.0\\" value=\\"0.5\\" transition.from=\\"-0.5\\" transition.to=\\"1.0\\"/>
"],"memberOf":["att.time.symbolic.beat","att.value.double","att.transition.from","att.transition.to","att.id"],"remarks":["

The values of attributes value, transition.from and transition.to are limited to the interval [-1.0; 1.0]. These are relative values, 1.0 marks the maximum accentuation, -1.0 the minimum (the strongest restraint). When used in articulation maps they get scaled to actual loudness values; therefore, each accentuationPattern element comes with a scale attribute.

"],"attributes":{"beat":{"text":"

Position indication in musical beats.

","type":"double","facet":"value ≥ 1.0","usage":"Required"},"value":{"text":"

A 64 bit floating-point value.

","type":"double","facet":"-1.0 ≤ value ≤ 1.0","usage":"Optional"},"transition.from":{"text":"

This attribute specifies the initial value that a continuous transition starts with.

","type":"double","facet":"-1.0 ≤ value ≤ 1.0","usage":"Optional"},"transition.to":{"text":"

This attribute specifies the final value that a continuous transition ends with.

","type":"double","facet":"-1.0 ≤ value ≤ 1.0","usage":"Optional"},"xml:id":{"text":"

This provides a unique identifier for the element bearing the attribute.

","type":"ID","facet":"","usage":"Optional"}},"mayContain":[],"containedBy":["accentuationPatternDef"]},{"base":"specs/accentuationPattern.xml","ident":"accentuationPattern","type":"element","module":"mpm.core","gloss":["accentuation pattern"],"desc":"

A metrical accentuation instruction specifies which accentuation pattern should be applied at and after its date.

","examples":["

A minimal and a complete accentuation pattern instruction. Note that, according to the values of scale, the former is less pronounced than the latter.

","
<accentuationPattern date=\\"0.0\\" name.ref=\\"my accentuation pattern 1\\" scale=\\"6.0\\"/>\\n<accentuationPattern date=\\"165000.0\\" name.ref=\\"my accentuation pattern 2\\" scale=\\"25.0\\" loop=\\"true\\" stickToMeasures=\\"true\\"/>
","

Note also that a style element must be added before the first accentuation pattern instruction and it must refer to a metrical accentuation style with the two patterns in attribute name.ref. Otherwise, \\"my accentuation pattern 1\\" and \\"my accentuation pattern 2\\" are undefined.

"],"memberOf":["att.time.symbolic.date","att.reference.name","att.scale","att.loop","att.id"],"remarks":["

If the accentuation pattern is looping, it will be repeatedly applied starting at date until the date of the subsequent accentuationPattern element.

"],"attributes":{"date":{"text":"

Attribute date provides a symbolic (i.e. tempo-independent) position in time for a map element. The basis to convert this date into a musical note value is the performance\'s pulsesPerQuarter value.

","type":"double","facet":"value ≥ 0.0","usage":"Required"},"name.ref":{"text":"

This attribute should be used for references by name.

","type":"string","facet":"","usage":"Required"},"scale":{"text":"

This attribute is required to scale relative values (which are defined in [0.0; 1.0]) to explicit values.

","type":"double","facet":"","usage":"Required"},"loop":{"text":"

This attribute should be used to set the behavior of an element as being applied only once (false) or repeatedly (true).

","type":"boolean","facet":"","usage":"Optional"},"xml:id":{"text":"

This provides a unique identifier for the element bearing the attribute.

","type":"ID","facet":"","usage":"Optional"},"stickToMeasures":{"text":"

Set this attribute true if the accentuation pattern should restart at the beginning of each measure.

","type":"boolean","facet":"","usage":"Optional"}},"mayContain":[],"containedBy":["metricalAccentuationMap"]},{"base":"specs/accentuationPatternDef.xml","ident":"accentuationPatternDef","type":"element","module":"mpm.core","gloss":["accentuation pattern definition"],"desc":"

An accentuation pattern definition associates a literal accentuation instruction with an accentuation pattern.

","examples":["
<accentuationPatternDef name=\\"my pattern\\" length=\\"3.0\\">\\n  <accentuation beat=\\"1.0\\" value=\\"1.0\\" transition.from=\\"1.0\\" transition.to=\\"0.0\\"/>\\n  <accentuation beat=\\"2.0\\" value=\\"0.5\\" transition.from=\\"0.5\\" transition.to=\\"-1.0\\"/>\\n  <accentuation beat=\\"3.0\\" value=\\"0.0\\" transition.from=\\"0.0\\" transition.to=\\"1.0\\"/>\\n</accentuationPatternDef>
"],"memberOf":["att.name","att.time.symbolic.length","att.id","model.defLike"],"remarks":[],"attributes":{"name":{"text":"

This attribute should be used to specify a name identifier for the element.

","type":"string","facet":"","usage":"Required"},"length":{"text":"

Length indication in musical beats.

","type":"double","facet":"value > 0.0","usage":"Required"},"xml:id":{"text":"

This provides a unique identifier for the element bearing the attribute.

","type":"ID","facet":"","usage":"Optional"}},"mayContain":["accentuation"],"containedBy":["styleDef"]},{"base":"specs/articulation.xml","ident":"articulation","type":"element","module":"mpm.core","gloss":["articulation"],"desc":"

An articulation instruction

","examples":["

The first element articulates all notes at date 3450.0 legato. The second sets the note with the specified ID at date 5670.0 staccato. The third articulates another note at the same date. Furthermore, it does not refer to an articulationDef but defines its own effects to the note. The forth articulates the same note as the third, its effect adds to the prior.

","
<articulation date=\\"3450.0\\" name.ref=\\"legato\\"/>\\n<articulation date=\\"5670.0\\" name.ref=\\"staccato\\" noteid=\\"#note04706\\"/>\\n<articulation date=\\"5670.0\\" noteid=\\"#note05821\\" relativeDuration=\\"0.4\\" absoluteDelayMs=\\"14.0\\" absoluteVelocityChange=\\"-21.0\\"/>\\n<articulation date=\\"5670.0\\" noteid=\\"#note05821\\" absoluteDurationChangeMs=\\"40.0\\"/>
"],"memberOf":["att.time.symbolic.date","att.reference.name","att.reference.noteid","att.articulationDef","att.id"],"remarks":["

The use of attribute name.ref requires the presence of an articulationDef with the same name and within an articulation style. In the articulationMap there must be a style element switching to this style before the first reference to an articulationDef within that style.

","

Articulations are interpreted sequentially. Let us say that an articulation halves the toneduration. If it is applied a second time to the same not, the already shortened note is shourtened again by 50 percent. In the end the note has 25 percent of its initial duration.

"],"attributes":{"date":{"text":"

Attribute date provides a symbolic (i.e. tempo-independent) position in time for a map element. The basis to convert this date into a musical note value is the performance\'s pulsesPerQuarter value.

","type":"double","facet":"value ≥ 0.0","usage":"Required"},"name.ref":{"text":"

This attribute should be used for references by name.

","type":"string","facet":"","usage":"Optional"},"noteid":{"text":"

This attribute should be used for references to note elements (e.g. in MEI and MSM).

","type":"anyURI","facet":"","usage":"Optional"},"absoluteDuration":{"text":"

Set the absolute duration of the note (in symbolic time).

","type":"double","facet":"value ≥ 0.0","usage":"Optional"},"absoluteDurationChange":{"text":"

Change the absolute duration of the note by the specified value (in symbolic time).

","type":"double","facet":"","usage":"Optional"},"relativeDuration":{"text":"

Change the duration of the note relatively to its initial value. E.g. a value of 0.5 halves the duration.

","type":"double","facet":"value ≥ 0.0","usage":"Optional"},"absoluteDelay":{"text":"

Delay the note by the specified value (in symbolic time).

","type":"double","facet":"","usage":"Optional"},"absoluteDurationMs":{"text":"

Set the absolute duration of the note (in milliseconds).

","type":"double","facet":"value ≥ 0.0","usage":"Optional"},"absoluteDurationChangeMs":{"text":"

Change the absolute duration of the note by the specified value (in milliseceonds).

","type":"double","facet":"","usage":"Optional"},"absoluteDelayMs":{"text":"

Delay the note by the specified value (in milliseconds).

","type":"double","facet":"","usage":"Optional"},"absoluteVelocity":{"text":"

Set the absolute velocity of a note.

","type":"double","facet":"value ≥ 0.0","usage":"Optional"},"relativeVelocity":{"text":"

Change the velocity of a note relative to its initial velocity. E.g., a value of 0.5 halves the velocity.

","type":"double","facet":"value ≥ 0.0","usage":"Optional"},"absoluteVelocityChange":{"text":"

Change the velocity of a note by the specified amount.

","type":"double","facet":"","usage":"Optional"},"detuneCents":{"text":"

Change a note\'s tuning by the specified amount in cents.

","type":"double","facet":"","usage":"Optional"},"detuneHz":{"text":"

Change a note\'s tuning by the specified amount in Hertz.

","type":"double","facet":"","usage":"Optional"},"xml:id":{"text":"

This provides a unique identifier for the element bearing the attribute.

","type":"ID","facet":"","usage":"Optional"}},"mayContain":[],"containedBy":["articulationMap"]},{"base":"specs/articulationDef.xml","ident":"articulationDef","type":"element","module":"mpm.core","gloss":["articulation definition"],"desc":"

An articulation definition associates a literal articulation instruction with a series of modifiers.

","examples":["
<articulationDef name=\\"accent\\" absoluteVelocityChange=\\"25.0\\"/>\\n<articulationDef name=\\"legato\\" relativeDuratio=\\"1.0\\"/>\\n<articulationDef name=\\"nonlegato\\" relativeDuration=\\"0.95\\"/>\\n<articulationDef name=\\"staccato\\" absoluteDurationMs=\\"160.0\\" absoluteVelocityChange=\\"-5.0\\"/>
"],"memberOf":["att.name","att.articulationDef","att.id","model.defLike"],"remarks":[],"attributes":{"name":{"text":"

This attribute should be used to specify a name identifier for the element.

","type":"string","facet":"","usage":"Required"},"absoluteDuration":{"text":"

Set the absolute duration of the note (in symbolic time).

","type":"double","facet":"value ≥ 0.0","usage":"Optional"},"absoluteDurationChange":{"text":"

Change the absolute duration of the note by the specified value (in symbolic time).

","type":"double","facet":"","usage":"Optional"},"relativeDuration":{"text":"

Change the duration of the note relatively to its initial value. E.g. a value of 0.5 halves the duration.

","type":"double","facet":"value ≥ 0.0","usage":"Optional"},"absoluteDelay":{"text":"

Delay the note by the specified value (in symbolic time).

","type":"double","facet":"","usage":"Optional"},"absoluteDurationMs":{"text":"

Set the absolute duration of the note (in milliseconds).

","type":"double","facet":"value ≥ 0.0","usage":"Optional"},"absoluteDurationChangeMs":{"text":"

Change the absolute duration of the note by the specified value (in milliseceonds).

","type":"double","facet":"","usage":"Optional"},"absoluteDelayMs":{"text":"

Delay the note by the specified value (in milliseconds).

","type":"double","facet":"","usage":"Optional"},"absoluteVelocity":{"text":"

Set the absolute velocity of a note.

","type":"double","facet":"value ≥ 0.0","usage":"Optional"},"relativeVelocity":{"text":"

Change the velocity of a note relative to its initial velocity. E.g., a value of 0.5 halves the velocity.

","type":"double","facet":"value ≥ 0.0","usage":"Optional"},"absoluteVelocityChange":{"text":"

Change the velocity of a note by the specified amount.

","type":"double","facet":"","usage":"Optional"},"detuneCents":{"text":"

Change a note\'s tuning by the specified amount in cents.

","type":"double","facet":"","usage":"Optional"},"detuneHz":{"text":"

Change a note\'s tuning by the specified amount in Hertz.

","type":"double","facet":"","usage":"Optional"},"xml:id":{"text":"

This provides a unique identifier for the element bearing the attribute.

","type":"ID","facet":"","usage":"Optional"}},"mayContain":[],"containedBy":["styleDef"]},{"base":"specs/articulationMap.xml","ident":"articulationMap","type":"element","module":"mpm.core","gloss":["articulation map"],"desc":"

The articulation map is the container for articulation instructions.

","examples":["
<articulationMap>\\n  <style date=\\"0.0\\" name.ref=\\"Rattle\\" defaultArticulation=\\"nonlegato\\"/>\\n  <articulation date=\\"3450.0\\" name.ref=\\"legato\\"/>\\n  <articulation date=\\"5670.0\\" name.ref=\\"staccato\\" noteid=\\"#note04706\\"/>\\n  <articulation date=\\"5670.0\\" noteid=\\"#note05821\\" relativeDuration=\\"0.4\\" absoluteDelayMs=\\"14.0\\" absoluteVelocityChange=\\"-21.0\\"/>\\n  <articulation date=\\"5670.0\\" noteid=\\"#note05821\\" absoluteDurationChangeMs=\\"40.0\\"/>\\n</articulationMap>
"],"memberOf":["model.mapLike","att.id"],"remarks":["

The style element when used within an articulationMap should also provide attribute defaultArticulation. This articulation will be applied to all notes that are not articulated otherwise. If no default articulation is given, the note remains unaltered.

"],"attributes":{"xml:id":{"text":"

This provides a unique identifier for the element bearing the attribute.

","type":"ID","facet":"","usage":"Optional"}},"mayContain":["articulation","style"],"containedBy":["dated"]},{"base":"specs/articulationStyles.xml","ident":"articulationStyles","type":"element","module":"mpm.core","gloss":["articulation style collection"],"desc":"

This element groups definitions of articulation styles.

","examples":["

This example shows the definition of two articulation styles and the later use of one of them in an articulationMap.

","
<header>\\n  <articulationStyles>\\n    <styleDef name=\\"Bob\\">\\n      <articulationDef name=\\"accent\\" absoluteVelocityChange=\\"25.0\\"/>\\n      <articulationDef name=\\"legato\\" relativeDuratio=\\"1.0\\"/>\\n      <articulationDef name=\\"nonlegato\\" relativeDuration=\\"0.95\\"/>\\n      <articulationDef name=\\"staccato\\" absoluteDurationMs=\\"160.0\\" absoluteVelocityChange=\\"-5.0\\"/>\\n    </styleDef>\\n    <styleDef name=\\"Alice\\">\\n      <articulationDef name=\\"accent\\" absoluteVelocityChange=\\"30.0\\" absoluteDurationChangeMs=\\"-15.0\\"/>\\n      <articulationDef name=\\"legato\\" relativeDuratio=\\"1.1\\" absoluteVelocityChange=\\"-1.0\\"/>\\n      <articulationDef name=\\"nonlegato\\" relativeDuration=\\"0.93\\"/>\\n      <articulationDef name=\\"staccato\\" absoluteDurationMs=\\"152.0\\" absoluteVelocityChange=\\"8.0\\"/>\\n    </styleDef>\\n  </articulationStyles>\\n</header>\\n<dated>\\n  <articulationMap>\\n    <style date=\\"0.0\\" name.ref=\\"Alice\\" defaultArticulation=\\"nonlegato\\"/>\\n    <articulation date=\\"0.0\\" name.ref=\\"staccato\\"/>\\n    <articulation date=\\"3450.0\\" name.ref=\\"legato\\"/>\\n    <articulation date=\\"5670.0\\" name.ref=\\"staccato\\" noteid=\\"#note04706\\"/>\\n  </articulationMap>\\n</dated>
"],"memberOf":["model.styleCollectionLike","att.id"],"remarks":[],"attributes":{"xml:id":{"text":"

This provides a unique identifier for the element bearing the attribute.

","type":"ID","facet":"","usage":"Optional"}},"mayContain":["styleDef"],"containedBy":["header"]},{"base":"specs/asynchrony.xml","ident":"asynchrony","type":"element","module":"mpm.core","gloss":["asynchrony"],"desc":"

This element sets a constant milliseconds offset starting a the musical position specified via attribute date ans lasting until the subsequent asynchrony element in the asynchronyMap specifies a different offset.

","examples":["

With the following asynchronyMap the musical part starts with a delay of 100 milliseconds. Later the offset changes to -50 milliseconds, i.e. the part comes 50 milliseconds early.

","
<asynchronyMap>\\n  <asynchrony date=\\"0.0\\" milliseconds.offset=\\"100.0\\"/>\\n  <asynchrony date=\\"34650.0\\" milliseconds.offset=\\"-50.0\\"/>\\n</asynchronyMap>
"],"memberOf":["att.time.symbolic.date","att.time.physical.offset","att.id"],"remarks":["

A negative offset at the beginning that shifts the physical date (milliseconds date) below 0.0 will take no effect in most applications. Take, e.g., a media player; how can it play a note before the user hit the play button? Hence, a negative offset should be avoided if it might evoke such a situation.

"],"attributes":{"date":{"text":"

Attribute date provides a symbolic (i.e. tempo-independent) position in time for a map element. The basis to convert this date into a musical note value is the performance\'s pulsesPerQuarter value.

","type":"double","facet":"value ≥ 0.0","usage":"Required"},"milliseconds.offset":{"text":"

This attribute defines an offset/delay (positive or negative) in milliseconds.

","type":"double","facet":"","usage":"Required"},"xml:id":{"text":"

This provides a unique identifier for the element bearing the attribute.

","type":"ID","facet":"","usage":"Optional"}},"mayContain":[],"containedBy":["asynchronyMap"]},{"base":"specs/asynchronyMap.xml","ident":"asynchronyMap","type":"element","module":"mpm.core","gloss":["asynchrony map"],"desc":"

The asynchronyMap is used to specify timing offsets/delays of a musical part or group of parts.

","examples":["

With the following asynchronyMap the musical part starts with a delay of 100 milliseconds. Later the offset changes to -50 milliseconds, i.e. the part comes 50 milliseconds early.

","
<asynchronyMap>\\n  <asynchrony date=\\"0.0\\" milliseconds.offset=\\"100.0\\"/>\\n  <asynchrony date=\\"34650.0\\" milliseconds.offset=\\"-50.0\\"/>\\n</asynchronyMap>
"],"memberOf":["model.mapLike","att.id"],"remarks":["

Asynchrony should be used to model timing offsets between musical parts that remain constant for a certain time. It is not very handy (even though possible) for fine-grained offset changes, e.g. in terms of continuously varying imprecision in the interaction between the musicians. Therefore, imprecisionMap.timing should be used. If the variations are of a more systematic fashion, rubatoMap is probably a better tool. All these micro-timing maps can, of course, be used in combination to create more complex effects, e.g. a swinging (via rubatoMap) laid-back (via asynchronyMap) double bass with a bit of random imprecision (via imprecisionMap.timing).

"],"attributes":{"xml:id":{"text":"

This provides a unique identifier for the element bearing the attribute.

","type":"ID","facet":"","usage":"Optional"}},"mayContain":["asynchrony"],"containedBy":["dated"]},{"base":"specs/author.xml","ident":"author","type":"element","module":"mpm.metadata","gloss":["author"],"desc":"

The author of the present encoding.

","examples":["

The following list of authors uses the optional attribute number to indicate the primary and secondary author.

","
<author number=\\"1\\">\\n  Jane Doe\\n</author>\\n<author number=\\"2\\">\\n  John Smith\\n</author>
"],"memberOf":["att.number","att.id"],"remarks":["

If the encoding is a joint effort of multiple authors, attribute number can be used to indicate hierarchy. The number can instead also be used to associate authors with performances.

"],"attributes":{"number":{"text":"

This attribute should be used to specify an integer identifier for the element, which is not necessarily unique within the document.

","type":"integer","facet":"","usage":"Optional"},"xml:id":{"text":"

This provides a unique identifier for the element bearing the attribute.

","type":"ID","facet":"","usage":"Optional"}},"mayContain":[],"containedBy":["metadata"]},{"base":"specs/comment.xml","ident":"comment","type":"element","module":"mpm.metadata","gloss":["textual comment"],"desc":"

A textual comment.

","examples":["
<comment>\\n  This comment comments on the music performance at hand ...\\n</comment>
"],"memberOf":["att.id"],"remarks":["

...

"],"attributes":{"xml:id":{"text":"

This provides a unique identifier for the element bearing the attribute.

","type":"ID","facet":"","usage":"Optional"}},"mayContain":[],"containedBy":["metadata"]},{"base":"specs/dated.xml","ident":"dated","type":"element","module":"mpm.core","gloss":["dated information"],"desc":"

The dated environment is the place for all datable information, ie. that are located at a specific position in time. They are organised in maps. Each map represents a specific domain, such as tempo, rubato, asynchrony, dynamics, metrical accentuation, articulation, etc.

","examples":["

The following dated element holds two maps, one for tempo instructions, the other for dynamics instructions.

","
<dated>\\n  <dynamicsMap>\\n    <style date=\\"0.0\\" name.ref=\\"Karajan\\"/>\\n    <dynamics date=\\"11880.0\\" volume=\\"f\\"/>\\n    <dynamics date=\\"60480.0\\" volume=\\"p\\"/>\\n    <dynamics date=\\"164520.0\\" volume=\\"f\\"/>\\n    <dynamics date=\\"334080.0\\" volume=\\"p\\"/>\\n    <dynamics date=\\"360360.0\\" volume=\\"f\\"/>\\n  </dynamicsMap>\\n  <tempoMap>\\n    <style date=\\"0.0\\" name.ref=\\"Karajan\\"/>\\n    <tempo date=\\"0.0\\" bpm=\\"Allegro\\" beatLength=\\"0.25\\"/>\\n    <tempo date=\\"345960.0\\" bpm=\\"Allegro\\" beatLength=\\"0.25\\" transition.to=\\"Adagio\\" meanTempoAt=\\"0.9\\"/>\\n    <tempo date=\\"360360.0\\" bpm=\\"Adagio\\" beatLength=\\"0.25\\"/>\\n  </tempoMap>\\n</dated>
"],"memberOf":["model.partContent"],"remarks":["

Each type of map is allowed only once in the dated environment. There cannot be, e.g., more than one tempoMap in the dated.

"],"attributes":{},"mayContain":["articulationMap","asynchronyMap","dynamicsMap","imprecisionMap","imprecisionMap.dynamics","imprecisionMap.timing","imprecisionMap.toneduration","imprecisionMap.tuning","metricalAccentuationMap","ornamentationMap","rubatoMap","tempoMap"],"containedBy":["global","part"]},{"base":"specs/distribution.correlated.brownianNoise.xml","ident":"distribution.correlated.brownianNoise","type":"element","module":"mpm.core","gloss":["Brownian noise distribution"],"desc":"

This defines a correlated distribution based on Brownian noise.

","examples":["
<distribution.correlated.brownianNoise date=\\"0.0\\" stepWidth.max=\\"10.0\\" limit.lower=\\"-40.0\\" limit.upper=\\"40.0\\" milliseconds.timingBasis=\\"300.0\\"/>
"],"memberOf":["att.time.symbolic.date","att.distribution.limits","att.distribution.seed","att.time.physical.timingBasis","att.id","model.distributionLike"],"remarks":["

An intuitive explanation of Brownian noise in MPM is the random walk in 1D. Suppose at time position t we have a random value x. The next time position is at t+milliseconds.timingBasis. The value at this position is determined by making a random step starting at x. The step width is delimited by stepWidth.max. Thus, possible values are in the interval [x-stepWidth.max; x+stepWidth.max] and further delimited by limit.lower and limit.upper. The fact that the value range at any iteration depends on the values of previous iterations makes this distribution a correlated distribution.

"],"attributes":{"date":{"text":"

Attribute date provides a symbolic (i.e. tempo-independent) position in time for a map element. The basis to convert this date into a musical note value is the performance\'s pulsesPerQuarter value.

","type":"double","facet":"value ≥ 0.0","usage":"Required"},"limit.lower":{"text":"

defines the lowest possible value.

","type":"double","facet":"","usage":"Required"},"limit.upper":{"text":"

defines the highest possible value.

","type":"double","facet":"","usage":"Required"},"seed":{"text":"

This attribute allows the user to specify a seed for the random distributions. Initialized with this seed, a random number generator generates always the same series of \\"random\\" numbers. Thus, by using the seed attribute the imprecisions (timing, dynamics etc.) become reproducible.

","type":"long","facet":"","usage":"Optional"},"milliseconds.timingBasis":{"text":"

defines the timing basis in milliseconds.

","type":"double","facet":"value > 0.0","usage":"Required"},"xml:id":{"text":"

This provides a unique identifier for the element bearing the attribute.

","type":"ID","facet":"","usage":"Optional"},"stepWidth.max":{"text":"

specifies the maximum value change width from one time step to the next.

","type":"double","facet":"value ≥ 0.0","usage":"Required"}},"mayContain":[],"containedBy":["imprecisionMap","imprecisionMap.dynamics","imprecisionMap.timing","imprecisionMap.toneduration","imprecisionMap.tuning"]},{"base":"specs/distribution.correlated.compensatingTriangle.xml","ident":"distribution.correlated.compensatingTriangle","type":"element","module":"mpm.core","gloss":["Compensating Triangle Distribution"],"desc":"

This defines a Compensating Triangle Distribution.

","examples":["

The following can be used to create plausible timing fluctuations in polyphonic music.

","
<distribution.correlated.compensatingTriangle date=\\"0.0\\" degreeOfCorrelation=\\"4.0\\" limit.lower=\\"-80.0\\" limit.upper=\\"80.0\\" clip.lower=\\"-80.0\\" clip.upper=\\"80.0\\" milliseconds.timingBasis=\\"300.0\\"/>
"],"memberOf":["att.time.symbolic.date","att.distribution.limits","att.distribution.clips","att.distribution.seed","att.time.physical.timingBasis","att.id","model.distributionLike"],"remarks":["

Compensating Triangle Distribution is a custom type of distribution. A detailed documentation will follow soon.

"],"attributes":{"date":{"text":"

Attribute date provides a symbolic (i.e. tempo-independent) position in time for a map element. The basis to convert this date into a musical note value is the performance\'s pulsesPerQuarter value.

","type":"double","facet":"value ≥ 0.0","usage":"Required"},"limit.lower":{"text":"

defines the lowest possible value.

","type":"double","facet":"","usage":"Required"},"limit.upper":{"text":"

defines the highest possible value.

","type":"double","facet":"","usage":"Required"},"clip.lower":{"text":"

defines the lowest clipping border. If random values get below this they will be set to this value.

","type":"double","facet":"","usage":"Required"},"clip.upper":{"text":"

defines the highest clipping border. Random values greater than this will be set to this value.

","type":"double","facet":"","usage":"Required"},"seed":{"text":"

This attribute allows the user to specify a seed for the random distributions. Initialized with this seed, a random number generator generates always the same series of \\"random\\" numbers. Thus, by using the seed attribute the imprecisions (timing, dynamics etc.) become reproducible.

","type":"long","facet":"","usage":"Optional"},"milliseconds.timingBasis":{"text":"

defines the timing basis in milliseconds.

","type":"double","facet":"value > 0.0","usage":"Required"},"xml:id":{"text":"

This provides a unique identifier for the element bearing the attribute.

","type":"ID","facet":"","usage":"Optional"},"degreeOfCorrelation":{"text":"

The higher this value the more correlated is the random number series, i.e. the more does a random value depend on its predecessors in the series.

","type":"double","facet":"value ≥ 0.0","usage":"Required"}},"mayContain":[],"containedBy":["imprecisionMap","imprecisionMap.dynamics","imprecisionMap.timing","imprecisionMap.toneduration","imprecisionMap.tuning"]},{"base":"specs/distribution.gaussian.xml","ident":"distribution.gaussian","type":"element","module":"mpm.core","gloss":["Gaussian distribution"],"desc":"

This defines a gaussian distribution. Its expectation value is 0.0. Attributes limit.lower and limit.upper are used to clip the range of random values.

","examples":["
<distribution.gaussian date=\\"0.0\\" deviation.standard=\\"20.0\\" limit.lower=\\"-30.0\\" limit.upper=\\"14.5\\"/>
"],"memberOf":["att.time.symbolic.date","att.distribution.limits","att.distribution.seed","att.id","model.distributionLike"],"remarks":["

An expectation value other than 0.0 would conflict with constant offsets and base values of the specific domain, such as asynchrony in the timing domain, dynamics in the dynamics domain, or duration modifiers in the articulation domain. These should be used to set an expectation value.

"],"attributes":{"date":{"text":"

Attribute date provides a symbolic (i.e. tempo-independent) position in time for a map element. The basis to convert this date into a musical note value is the performance\'s pulsesPerQuarter value.

","type":"double","facet":"value ≥ 0.0","usage":"Required"},"limit.lower":{"text":"

defines the lowest possible value.

","type":"double","facet":"","usage":"Required"},"limit.upper":{"text":"

defines the highest possible value.

","type":"double","facet":"","usage":"Required"},"seed":{"text":"

This attribute allows the user to specify a seed for the random distributions. Initialized with this seed, a random number generator generates always the same series of \\"random\\" numbers. Thus, by using the seed attribute the imprecisions (timing, dynamics etc.) become reproducible.

","type":"long","facet":"","usage":"Optional"},"xml:id":{"text":"

This provides a unique identifier for the element bearing the attribute.

","type":"ID","facet":"","usage":"Optional"},"deviation.standard":{"text":"

defines the standard deviation.

","type":"double","facet":"","usage":"Required"}},"mayContain":[],"containedBy":["imprecisionMap","imprecisionMap.dynamics","imprecisionMap.timing","imprecisionMap.toneduration","imprecisionMap.tuning"]},{"base":"specs/distribution.list.xml","ident":"distribution.list","type":"element","module":"mpm.core","gloss":["distribution list"],"desc":"

This defines a list of distribution values.

","examples":["

This example shows a distribution list that captures dynamics fluctuations.

","
<imprecisionMap.dynamics>\\n  <distribution.list date=\\"0.0\\" milliseconds.timingBasis=\\"300.0\\">\\n    <measurement value=\\"2.7\\"/>\\n    <measurement value=\\"6.67\\"/>\\n    <measurement value=\\"10.45\\"/>\\n    <measurement value=\\"-7.13\\"/>\\n    <measurement value=\\"3.2\\"/>\\n    <measurement value=\\"-2.63\\"/>\\n    <measurement value=\\"-8.4\\"/>\\n    <measurement value=\\"6.0\\"/>\\n    <!-- ... -->\\n  </distribution.list>\\n</imprecisionMap.dynamics>
"],"memberOf":["att.time.symbolic.date","att.time.physical.timingBasis","att.id","model.distributionLike"],"remarks":["

Distribution lists are deterministic alternatives to stochastic distributions. Instead of random values a distribution list contains a fixed sequence of values that can be applied in any type of imprecision map.

","

A typical scenario for the usage of a distribution list is the following. During timing analysis of a music recording we already created a global tempoMap and a local rubatoMap for a musician. But there are still timing offsets left that we cannot (yet) explain systematically. We put these offsets into a distribution list for further analysis and to reproduce them during performance rendering. It is important to set the timing basis (the milliseconds length of one measurement sample) as fine as necessary as these lists can become very long.

"],"attributes":{"date":{"text":"

Attribute date provides a symbolic (i.e. tempo-independent) position in time for a map element. The basis to convert this date into a musical note value is the performance\'s pulsesPerQuarter value.

","type":"double","facet":"value ≥ 0.0","usage":"Required"},"milliseconds.timingBasis":{"text":"

defines the timing basis in milliseconds.

","type":"double","facet":"value > 0.0","usage":"Required"},"xml:id":{"text":"

This provides a unique identifier for the element bearing the attribute.

","type":"ID","facet":"","usage":"Optional"}},"mayContain":["measurement"],"containedBy":["imprecisionMap","imprecisionMap.dynamics","imprecisionMap.timing","imprecisionMap.toneduration","imprecisionMap.tuning"]},{"base":"specs/distribution.triangular.xml","ident":"distribution.triangular","type":"element","module":"mpm.core","gloss":["triangular distribution"],"desc":"

This defines a triangular distribution.

","examples":["
<distribution.triangular date=\\"42.0\\" limit.lower=\\"-20.0\\" limit.upper=\\"30.0\\" mode=\\"5.0\\" clip.lower=\\"-20.0\\" clip.upper=\\"20.0\\"/>
"],"memberOf":["att.time.symbolic.date","att.distribution.clips","att.distribution.limits","att.distribution.seed","att.id","model.distributionLike"],"remarks":["

The lower and upper limit of the triangular distribution are set by attributes limit.lower and limit.upper. The peak of the triangular distribution is set by attribute mode. Attributes clip.lower and clip.upper can be used to narrow the output range even further, i.e. values outside the clipping window are set to the closest clipping border.

"],"attributes":{"date":{"text":"

Attribute date provides a symbolic (i.e. tempo-independent) position in time for a map element. The basis to convert this date into a musical note value is the performance\'s pulsesPerQuarter value.

","type":"double","facet":"value ≥ 0.0","usage":"Required"},"clip.lower":{"text":"

defines the lowest clipping border. If random values get below this they will be set to this value.

","type":"double","facet":"","usage":"Required"},"clip.upper":{"text":"

defines the highest clipping border. Random values greater than this will be set to this value.

","type":"double","facet":"","usage":"Required"},"limit.lower":{"text":"

defines the lowest possible value.

","type":"double","facet":"","usage":"Required"},"limit.upper":{"text":"

defines the highest possible value.

","type":"double","facet":"","usage":"Required"},"seed":{"text":"

This attribute allows the user to specify a seed for the random distributions. Initialized with this seed, a random number generator generates always the same series of \\"random\\" numbers. Thus, by using the seed attribute the imprecisions (timing, dynamics etc.) become reproducible.

","type":"long","facet":"","usage":"Optional"},"xml:id":{"text":"

This provides a unique identifier for the element bearing the attribute.

","type":"ID","facet":"","usage":"Optional"},"mode":{"text":"

defines the mode of the triangular distribution, i.e. the position of the triangle\'s peak.

","type":"double","facet":"","usage":"Required"}},"mayContain":[],"containedBy":["imprecisionMap","imprecisionMap.dynamics","imprecisionMap.timing","imprecisionMap.toneduration","imprecisionMap.tuning"]},{"base":"specs/distribution.uniform.xml","ident":"distribution.uniform","type":"element","module":"mpm.core","gloss":["uniform distribution"],"desc":"

This defines a uniform distribution within the specified limits (inclusive).

","examples":["
<distribution.uniform date=\\"345.0\\" limit.lower=\\"-10.0\\" limit.upper=\\"35.6\\"/>
"],"memberOf":["att.time.symbolic.date","att.distribution.limits","att.distribution.seed","att.id","model.distributionLike"],"remarks":[],"attributes":{"date":{"text":"

Attribute date provides a symbolic (i.e. tempo-independent) position in time for a map element. The basis to convert this date into a musical note value is the performance\'s pulsesPerQuarter value.

","type":"double","facet":"value ≥ 0.0","usage":"Required"},"limit.lower":{"text":"

defines the lowest possible value.

","type":"double","facet":"","usage":"Required"},"limit.upper":{"text":"

defines the highest possible value.

","type":"double","facet":"","usage":"Required"},"seed":{"text":"

This attribute allows the user to specify a seed for the random distributions. Initialized with this seed, a random number generator generates always the same series of \\"random\\" numbers. Thus, by using the seed attribute the imprecisions (timing, dynamics etc.) become reproducible.

","type":"long","facet":"","usage":"Optional"},"xml:id":{"text":"

This provides a unique identifier for the element bearing the attribute.

","type":"ID","facet":"","usage":"Optional"}},"mayContain":[],"containedBy":["imprecisionMap","imprecisionMap.dynamics","imprecisionMap.timing","imprecisionMap.toneduration","imprecisionMap.tuning"]},{"base":"specs/dynamics.xml","ident":"dynamics","type":"element","module":"mpm.core","gloss":["dynamics"],"desc":"

A dynamics instruction

","examples":["

A constant dynamics instruction with a numeric volume value, a constant dynamics instruction with a literal volume value (requires an according dynamicsDef), a decrescendo instruction, and a crescendo instruction. The fifth instruction is a \\"decrescendo al niente\\" with a perfectly linear shape.

","
<dynamics date=\\"0.0\\" volume=\\"96.0\\"/>\\n<dynamics date=\\"720.0\\" volume=\\"forte\\"/>\\n<dynamics date=\\"6500.0\\" volume=\\"mf\\" transition.to=\\"pp\\" curvature=\\"0.7\\" protraction=\\"-0.4\\"/>\\n<dynamics date=\\"90500.0\\" volume=\\"pp\\" transition.to=\\"127.0\\" curvature=\\"0.5\\" protraction=\\"0.6\\" subNoteDynamics=\\"true\\"/>\\n<dynamics date=\\"120700.0\\" volume=\\"100.0\\" transition.to=\\"0.0\\" curvature=\\"0.0\\" protraction=\\"0.0\\" subNoteDynamics=\\"true\\"/>
"],"memberOf":["att.time.symbolic.date","att.transition.to","att.id"],"remarks":["

The dynamics instruction starts at the specified date and ends at the date of the subsequent dynamics instruction. Within this time interval the dynamics is either constant, monotonically increasing or monotonically decreasing. Non-monotonic shapes (e.g. cresc. followed by decresc.) are composed of a sequence of multiple dynamics elements.

","

When using literal volume values (in attributes volume and transition.to) make sure that the according dynamics style is associated. This is done by placing a style element in the dynamics map before the first use of literal volume values.

"],"attributes":{"date":{"text":"

Attribute date provides a symbolic (i.e. tempo-independent) position in time for a map element. The basis to convert this date into a musical note value is the performance\'s pulsesPerQuarter value.

","type":"double","facet":"value ≥ 0.0","usage":"Required"},"transition.to":{"text":"

If this attribute is specified, the instruction represents a continuous transition (e.g. accel./rit. or cresc./decresc.) from an initial value to the target value given in this attribute.

","type":"string","facet":"","usage":"Optional"},"xml:id":{"text":"

This provides a unique identifier for the element bearing the attribute.

","type":"ID","facet":"","usage":"Optional"},"volume":{"text":"

The initial volume of this instruction.

","type":"string","facet":"","usage":"Required"},"curvature":{"text":"

If attribute transition.to is specified and, thus, the element describes a continuous dynamics transition (cresc., decresc.) the shape of the transition can be further refined by this attribute. Its value in the interval [0.0; 1.0] indicates a distinct sigmoidal (S) shape of the dynamics curve (value > 0.0) or a straight linear transition (value = 0.0).

","type":"double","facet":"0.0 ≤ value ≤ 1.0","usage":"Optional"},"protraction":{"text":"

If attribute transition.to is specified and, thus, the element describes a continuous dynamics transition (cresc., decresc.) the shape of the transition can be further refined by this attribute. Its value in the interval [-1.0; 1.0] indicates whether the transition comes relatively early (value < 0.0), relatively late (value > 0.0) or is equally shared between first and second half of the interval between date and the subsequent dynamics instruction\'sdate.

","type":"double","facet":"-1.0 ≤ value ≤ 1.0","usage":"Optional"},"subNoteDynamics":{"text":"

If attribute transition.to is specified and, thus, the element describes a continuous dynamics transition (cresc., decresc.) this attribute can be used to indicate whether the dynamics are performed note-wise (false) or on the sub-note level (true).

","type":"boolean","facet":"","usage":"Optional"}},"mayContain":[],"containedBy":["dynamicsMap"]},{"base":"specs/dynamicsDef.xml","ident":"dynamicsDef","type":"element","module":"mpm.core","gloss":["dynamics definition"],"desc":"

A dynamics definition associates a literal dynamics instruction with a numeric loudness value.

","examples":["
<dynamicsDef name=\\"piano\\" value=\\"48.0\\"/>\\n<dynamicsDef name=\\"mp\\" value=\\"64.0\\"/>\\n<dynamicsDef name=\\"ff\\" value=\\"111.0\\"/>\\n<dynamicsDef name=\\"as loud as possible\\" value=\\"127.0\\"/>
"],"memberOf":["att.value.double","att.name","att.id","model.defLike"],"remarks":["

If the loudness values should be MIDI compliant the maximum loudness is 127.0. This should be kept in mind if the performance should be rendered to an expressive MIDI/audio output. Apart from this, however, the user is free to associate any other unit of measure.

"],"attributes":{"value":{"text":"

A 64 bit floating-point value.

","type":"double","facet":"","usage":"Required"},"name":{"text":"

This attribute should be used to specify a name identifier for the element.

","type":"string","facet":"","usage":"Required"},"xml:id":{"text":"

This provides a unique identifier for the element bearing the attribute.

","type":"ID","facet":"","usage":"Optional"}},"mayContain":[],"containedBy":["styleDef"]},{"base":"specs/dynamicsGradient.xml","ident":"dynamicsGradient","type":"element","module":"mpm.core","gloss":["dynamics gradient"],"desc":"

This element defines a relative dynamics transition throughout the ornament. It will be scaled to absolute values by element ornament\'s scale in the ornamentationMap.

","examples":["

Defines a dynamic transition from -1 to 1, resulting in a crescendo effect.

","
<ornamentationStyles>\\n  <styleDef name=\\"Stylename\\">\\n    <ornamentDef name=\\"arpeggio\\">\\n      <dynamicsGradient transition.from=\\"-1.0\\" transition.to=\\"1.0\\"/>\\n    </ornamentDef>\\n  </styleDef>\\n</ornamentationStyles>
"],"memberOf":["att.transition.from","att.transition.to","att.id","model.ornamentDefContent"],"remarks":["

Either transition.to or transition.from or both must be present.

"],"attributes":{"transition.from":{"text":"

This attribute specifies the initial value that a continuous transition starts with.

","type":"double","facet":"-1.0 ≤ value ≤ 1.0","usage":"Optional"},"transition.to":{"text":"

This attribute specifies the final value that a continuous transition ends with.

","type":"double","facet":"-1.0 ≤ value ≤ 1.0","usage":"Optional"},"xml:id":{"text":"

This provides a unique identifier for the element bearing the attribute.

","type":"ID","facet":"","usage":"Optional"}},"mayContain":[],"containedBy":["ornamentDef"]},{"base":"specs/dynamicsMap.xml","ident":"dynamicsMap","type":"element","module":"mpm.core","gloss":["dynamics map"],"desc":"

The dynamics map is the place to specify a macro dynamics curve, i.e. the basic dynamics curve onto which all micro dynamics features are then added. The curve is composed of monotonic curve segments, each segment is a dynamics element.

","examples":["
<dynamicsMap>\\n  <style date=\\"0.0\\" name.ref=\\"Karajan\\"/>\\n  <dynamics date=\\"11880.0\\" volume=\\"f\\"/>\\n  <dynamics date=\\"60480.0\\" volume=\\"p\\" transition.to=\\"114.0\\" curvature=\\"0.3\\" protraction=\\"0.5\\"/>\\n  <dynamics date=\\"164520.0\\" volume=\\"114.0\\"/>\\n  <dynamics date=\\"334080.0\\" volume=\\"p\\" transition.to=\\"ppp\\"/>\\n  <dynamics date=\\"360360.0\\" volume=\\"f\\"/>\\n</dynamicsMap>
"],"memberOf":["model.mapLike","att.id"],"remarks":[],"attributes":{"xml:id":{"text":"

This provides a unique identifier for the element bearing the attribute.

","type":"ID","facet":"","usage":"Optional"}},"mayContain":["dynamics","style"],"containedBy":["dated"]},{"base":"specs/dynamicsStyles.xml","ident":"dynamicsStyles","type":"element","module":"mpm.core","gloss":["dynamics style collection"],"desc":"

This element groups definitions of dynamics styles.

","examples":["

This example shows the definition of two dynamics styles and the later use of one of them in a dynamicsMap.

","
<header>\\n  <dynamicsStyles>\\n    <styleDef name=\\"Karajan\\">\\n      <dynamicsDef name=\\"p\\" value=\\"30.0\\"/>\\n      <dynamicsDef name=\\"f\\" value=\\"95.0\\"/>\\n      <dynamicsDef name=\\"ff\\" value=\\"122.0\\"/>\\n    </styleDef>\\n    <styleDef name=\\"Rattle\\">\\n      <dynamicsDef name=\\"p\\" value=\\"26.0\\"/>\\n      <dynamicsDef name=\\"f\\" value=\\"101.0\\"/>\\n      <dynamicsDef name=\\"ff\\" value=\\"125.0\\"/>\\n    </styleDef>\\n  </dynamicsStyles>\\n</header>\\n<dated>\\n  <dynamicsMap>\\n    <style date=\\"0.0\\" name.ref=\\"Rattle\\"/>\\n    <dynamics date=\\"0.0\\" bpm=\\"f\\" transition.to=\\"p\\" protraction=\\"0.8\\"/>\\n    <dynamics date=\\"47000.0\\" bpm=\\"ff\\"/>\\n  </dynamicsMap>\\n</dated>
"],"memberOf":["model.styleCollectionLike","att.id"],"remarks":[],"attributes":{"xml:id":{"text":"

This provides a unique identifier for the element bearing the attribute.

","type":"ID","facet":"","usage":"Optional"}},"mayContain":["styleDef"],"containedBy":["header"]},{"base":"specs/global.xml","ident":"global","type":"element","module":"mpm.core","gloss":["global performance data"],"desc":"

This element includes all information that apply to all parts of a musical performance.

","examples":["

This is the typical structure of a performance.

","
<performance name=\\"a performance\\" pulsesPerQuarter=\\"720\\">\\n  <global>\\n    <header>\\n      <!-- header information for all parts -->\\n    </header>\\n    <dated>\\n      <!-- performance maps (tempoMap, dynamicsMap etc.) that apply to all parts -->\\n    </dated>\\n  </global>\\n  <part name=\\"Soprano\\" number=\\"1\\" midi.channel=\\"0\\" midi.port=\\"0\\">\\n    <header>\\n      <!-- header information for this part -->\\n    </header>\\n    <dated>\\n      <!-- performance maps that apply to this part -->\\n    </dated>\\n  </part>\\n  <!-- further parts -->\\n</performance>
"],"memberOf":[],"remarks":["

The interplay between global and local (i.e. part-specific) information can be understood as follows. A global map (e.g. tempoMap) is applied to each part as long as it does not define a local map of the same type. Even if that local map is empty, its presence signals that the part has its own map and will, thus, ignore the global map. A typical scenario is that the tempoMap is defined globally, i.e. all parts follow the same tempo, \\"follow the same conductor\\" and stay synchronised. Each part, however, can add individual timing details via a local rubatoMap, asynchronyMap, imprecisionMap.timing etc. The same rule applies to global vs. local style definitions. A part prefers its local information over the global ones.

"],"attributes":{},"mayContain":["dated","header"],"containedBy":["performance"]},{"base":"specs/header.xml","ident":"header","type":"element","module":"mpm.core","gloss":["header information"],"desc":"

The header environment in MPM is the place for non-dateable information, i.e. information that are not tied to a particular position on the time axis, such as style definitions.

","examples":["

A typical header looks like this.

","
<header>\\n  <tempoStyles>\\n    <styleDef name=\\"Baumgartner\\">\\n      <tempoDef name=\\"Allegro\\" value=\\"147.0\\"/>\\n      <tempoDef name=\\"Andante\\" value=\\"100.0\\"/>\\n    </styleDef>\\n    <styleDef name=\\"Gould\\">\\n      <tempoDef name=\\"Allegro\\" value=\\"151.0\\"/>\\n      <tempoDef name=\\"Andante\\" value=\\"93.0\\"/>\\n    </styleDef>\\n  </tempoStyles>\\n  <dynamicsStyles>\\n    <styleDef name=\\"Baumgartner\\">\\n      <dynamicsDef name=\\"p\\" value=\\"48.0\\"/>\\n      <dynamicsDef name=\\"f\\" value=\\"97.0\\"/>\\n      <dynamicsDef name=\\"sf\\" value=\\"127.0\\"/>\\n    </styleDef>\\n    <styleDef name=\\"Gould\\">\\n      <dynamicsDef name=\\"p\\" value=\\"44.0\\"/>\\n      <dynamicsDef name=\\"f\\" value=\\"102.0\\"/>\\n      <dynamicsDef name=\\"sf\\" value=\\"126.0\\"/>\\n    </styleDef>\\n  </dynamicsStyles>\\n  <articulationStyles>\\n    <styleDef name=\\"Baumgartner\\">\\n      <articulationDef name=\\"nonlegato\\" relativeDuration=\\"0.95\\"/>\\n      <articulationDef name=\\"stacc\\" absoluteDurationMs=\\"160.0\\" absoluteVelocityChange=\\"-5.0\\"/>\\n      <articulationDef name=\\"legato\\" relativeDuration=\\"1.0\\"/>\\n      <articulationDef name=\\"legatoStop\\" relativeDuration=\\"0.8\\" relativeVelocity=\\"0.7\\"/>\\n    </styleDef>\\n    <styleDef name=\\"Gould\\">\\n      <articulationDef name=\\"nonlegato\\" relativeDuration=\\"0.98\\"/>\\n      <articulationDef name=\\"stacc\\" absoluteDurationMs=\\"105.0\\" absoluteVelocityChange=\\"2.0\\"/>\\n      <articulationDef name=\\"legato\\" relativeDuration=\\"1.1\\"/>\\n      <articulationDef name=\\"legatoStop\\" relativeDuration=\\"0.78\\" relativeVelocity=\\"0.8\\"/>\\n    </styleDef>\\n  </articulationStyles>\\n</header>
","

Here we see how two different styles are contrasted in the header. In the maps a style element can be used to switch between the styles.

"],"memberOf":["model.partContent"],"remarks":["

Each style type is allowed only once in the header environment. There cannot be, e.g., more than one tempoStyles in the header.

"],"attributes":{},"mayContain":["articulationStyles","dynamicsStyles","metricalAccentuationStyles","ornamentationStyles","rubatoStyles","tempoStyles"],"containedBy":["global","part"]},{"base":"specs/imprecisionMap.xml","ident":"imprecisionMap","type":"element","module":"mpm.core","gloss":["imprecision map"],"desc":"

This map is used to model random fluctuations. The domain, however, is unspecified.

","examples":[],"memberOf":["model.mapLike","att.id"],"remarks":["

The domain of this type of imprecision map is unspecified. This means it is up to the user/application to interpret it or introduce a domain-specific imprecision map (e.g. imprecisionMap.myDomain) to the format.

"],"attributes":{"xml:id":{"text":"

This provides a unique identifier for the element bearing the attribute.

","type":"ID","facet":"","usage":"Optional"}},"mayContain":["distribution.correlated.brownianNoise","distribution.correlated.compensatingTriangle","distribution.gaussian","distribution.list","distribution.triangular","distribution.uniform"],"containedBy":["dated"]},{"base":"specs/imprecisionMap.dynamics.xml","ident":"imprecisionMap.dynamics","type":"element","module":"mpm.core","gloss":["imprecision map dynamics"],"desc":"

This map is used to model random dynamics fluctuations.

","examples":["

The following dynamics imprecision map has only one entry, a Gaussian distribution starting at symbolic date 0.0 (the very beginning). This means that this distribution is applied throughout the whole musical piece. The distribution values are between -15.0 and 15.0. These are deviations that add to the underlying dynamics.

","
<imprecisionMap.dynamics>\\n  <distribution.gaussian date=\\"0.0\\" deviation.standard=\\"7.5\\" limit.lower=\\"-15.0\\" limit.upper=\\"15.0\\"/>\\n</imprecisionMap.dynamics>
"],"memberOf":["model.mapLike","att.id"],"remarks":["

Editors should keep in mind that the dynamics fluctuations are additive. At the end of the dynamics computation pipeline each musical event has a certain dynamics value. The distribution function applied in the imprecisionMap.dynamics adds a random offset to this. Hence, the distribution values are interpreted as relate (no absolute) dynamics values.

"],"attributes":{"xml:id":{"text":"

This provides a unique identifier for the element bearing the attribute.

","type":"ID","facet":"","usage":"Optional"}},"mayContain":["distribution.correlated.brownianNoise","distribution.correlated.compensatingTriangle","distribution.gaussian","distribution.list","distribution.triangular","distribution.uniform"],"containedBy":["dated"]},{"base":"specs/imprecisionMap.timing.xml","ident":"imprecisionMap.timing","type":"element","module":"mpm.core","gloss":["imprecision map timing"],"desc":"

This map is used to model random timing/rhythmical fluctuations.

","examples":["

The following timing imprecision map starts with a Compensating Triangle Distribution. The values of limit.lower, limit.upper, value.min, and value.max are interpreted in milliseconds. Thus, this creates timing fluctuations (rhythmic offsets) of +/- 80.0 milliseconds. This is also true for the uniform distribution that follows at symbolic date 256,490.0 but generates a clearly different type of fluctuations.

","
<imprecisionMap.timing>\\n  <distribution.correlated.compensatingTriangle date=\\"0.0\\" degreeOfCorrelation=\\"4.0\\" limit.lower=\\"-80.0\\" limit.upper=\\"80.0\\" clip.lower=\\"-80.0\\" clip.upper=\\"80.0\\" milliseconds.timingBasis=\\"300.0\\"/>\\n  <distribution.uniform date=\\"256490.0\\" limit.lower=\\"-80.0\\" limit.upper=\\"80.0\\"/>\\n</imprecisionMap.timing>
"],"memberOf":["model.mapLike","att.id"],"remarks":["

Editors should keep in mind that the timing fluctuations are additive. At the end of the timing computation pipeline each musical event has a physical date in milliseconds. The distribution function applied in the imprecisionMap.timing adds a random offset to this. Hence, the distribution values are interpreted as milliseconds.

"],"attributes":{"xml:id":{"text":"

This provides a unique identifier for the element bearing the attribute.

","type":"ID","facet":"","usage":"Optional"}},"mayContain":["distribution.correlated.brownianNoise","distribution.correlated.compensatingTriangle","distribution.gaussian","distribution.list","distribution.triangular","distribution.uniform"],"containedBy":["dated"]},{"base":"specs/imprecisionMap.toneduration.xml","ident":"imprecisionMap.toneduration","type":"element","module":"mpm.core","gloss":["imprecision map tone duration"],"desc":"

This map is used to model random imprecision in articulation/tone duration.

","examples":["

The following tone duration imprecision map varies the tone durations by up to -30.0 milliseconds.

","
<imprecisionMap.toneduration>\\n  <distribution.triangular date=\\"0.0\\" limit.lower=\\"-30.0\\" limit.upper=\\"0.0\\" mode=\\"0.0\\" clip.lower=\\"-30.0\\" clip.upper=\\"0.0\\"/>\\n</imprecisionMap.toneduration>
"],"memberOf":["model.mapLike","att.id"],"remarks":["

Editors should keep in mind that the random variations that this imprecision map generates are additive. The values do not represent absolute tone durations but changes of already given tone durations. Hence, this does not overwrite articulation but adds variation to it. These variations are measured in milliseconds.

"],"attributes":{"xml:id":{"text":"

This provides a unique identifier for the element bearing the attribute.

","type":"ID","facet":"","usage":"Optional"}},"mayContain":["distribution.correlated.brownianNoise","distribution.correlated.compensatingTriangle","distribution.gaussian","distribution.list","distribution.triangular","distribution.uniform"],"containedBy":["dated"]},{"base":"specs/imprecisionMap.tuning.xml","ident":"imprecisionMap.tuning","type":"element","module":"mpm.core","gloss":["imprecision map tuning"],"desc":"

This map is used to model random fluctuations in tuning.

","examples":["

This code snippet introduces random tuning fluctuations by up to +/- 40.0 cents.

","
<imprecisionMap.tuning detuneUnit=\\"cents\\">\\n  <distribution.correlated.brownianNoise date=\\"0.0\\" stepWidth.max=\\"10.0\\" limit.lower=\\"-40.0\\" limit.upper=\\"40.0\\" milliseconds.timingBasis=\\"300.0\\"/>\\n</imprecisionMap.tuning>
"],"memberOf":["model.mapLike","att.id"],"remarks":["

The tuning fluctuations that this type of imprecision map generates are additive, i.e. they do not overwrite tuning specifications from articulation but add to it.

"],"attributes":{"xml:id":{"text":"

This provides a unique identifier for the element bearing the attribute.

","type":"ID","facet":"","usage":"Optional"},"detuneUnit":{"text":"

specifies the measure of detuning.

","type":"values: \\"cents\\", \\"Hz\\", \\"Hertz\\"","facet":"","usage":"Required"}},"mayContain":["distribution.correlated.brownianNoise","distribution.correlated.compensatingTriangle","distribution.gaussian","distribution.list","distribution.triangular","distribution.uniform"],"containedBy":["dated"]},{"base":"specs/measurement.xml","ident":"measurement","type":"element","module":"mpm.core","gloss":["measurement"],"desc":"

This element represents a 64 bit floating-point list entry.

","examples":["
<measurement value=\\"20.0\\"/>
"],"memberOf":["att.value.double","att.id"],"remarks":["

As child of distribution.list measurement represents one entry in the list.

"],"attributes":{"value":{"text":"

A 64 bit floating-point value.

","type":"double","facet":"","usage":"Required"},"xml:id":{"text":"

This provides a unique identifier for the element bearing the attribute.

","type":"ID","facet":"","usage":"Optional"}},"mayContain":[],"containedBy":["distribution.list"]},{"base":"specs/metadata.xml","ident":"metadata","type":"element","module":"mpm.metadata","gloss":["metadata"],"desc":"

This element can be used to provide contextual information about the encoding in this MPM file.

","examples":["
<metadata>\\n  <author number=\\"1\\">\\n    Jane Doe\\n  </author>\\n  <comment>\\n    The first performance, authored by author no. 1, is based on a violin treatise from 1678.\\n  </comment>\\n  <author number=\\"2\\">\\n    John Smith\\n  </author>\\n  <comment>\\n    Author no. 2 made the second performance on the basis of a tape recording by famous pianist Clare Clear.\\n  </comment>\\n  <relatedResources>\\n    <resource uri=\\"pathTo/music.mei\\" type=\\"mei\\"/>\\n    <resource uri=\\"pathTo/music.msm\\" type=\\"msm\\"/>\\n    <!-- further resource references -->\\n  </relatedResources>\\n</metadata>
"],"memberOf":[],"remarks":[],"attributes":{},"mayContain":["author","comment","relatedResources"],"containedBy":["mpm"]},{"base":"specs/metricalAccentuationMap.xml","ident":"metricalAccentuationMap","type":"element","module":"mpm.core","gloss":["metrical accentuation map"],"desc":"

The metrical accentuation map specifies which accentuation patterns are being applied at which time positions in the music.

","examples":["
<metricalAccentuationMap>\\n  <style date=\\"0.0\\" name.ref=\\"Karajan\\"/>\\n  <accentuationPattern date=\\"0.0\\" name.ref=\\"my accentuation pattern 1\\" scale=\\"6.0\\"/>\\n  <accentuationPattern date=\\"165000.0\\" name.ref=\\"my accentuation pattern 2\\" scale=\\"25.0\\" loop=\\"true\\" stickToMeasures=\\"true\\"/>\\n</metricalAccentuationMap>
"],"memberOf":["model.mapLike","att.id"],"remarks":[],"attributes":{"xml:id":{"text":"

This provides a unique identifier for the element bearing the attribute.

","type":"ID","facet":"","usage":"Optional"}},"mayContain":["accentuationPattern","style"],"containedBy":["dated"]},{"base":"specs/metricalAccentuationStyles.xml","ident":"metricalAccentuationStyles","type":"element","module":"mpm.core","gloss":["collection of styles for metrical accentuation"],"desc":"

This element groups definitions of metrical accentuation styles.

","examples":["

This example shows the definition of a metrical accentuation style with two accentuation patterns and the later use of one of them in a metricalAccentuationMap.

","
<header>\\n  <metricalAccentuationStyles>\\n    <styleDef name=\\"my accentuation patterns\\">\\n      <accentuationPatternDef name=\\"quad time\\" length=\\"4.0\\">\\n        <accentuation beat=\\"1\\" value=\\"1.0\\" transition.from=\\"0.0\\" transition.to=\\"0.25\\"/>\\n        <accentuation beat=\\"2.5\\" value=\\"0.5\\" transition.from=\\"-0.5\\" transition.to=\\"-1\\"/>\\n        <accentuation beat=\\"4\\" value=\\"0.5\\" transition.from=\\"0.0\\" transition.to=\\"1.0\\"/>\\n      </accentuationPatternDef>\\n      <accentuationPatternDef name=\\"triple time\\" length=\\"3.0\\">\\n        <accentuation beat=\\"1.0\\" value=\\"1.0\\" transition.from=\\"1.0\\" transition.to=\\"0.0\\"/>\\n        <accentuation beat=\\"2.0\\" value=\\"0.5\\" transition.from=\\"0.5\\" transition.to=\\"-1.0\\"/>\\n        <accentuation beat=\\"3.0\\" value=\\"0.0\\" transition.from=\\"0.0\\" transition.to=\\"1.0\\"/>\\n      </accentuationPatternDef>\\n    </styleDef>\\n  </metricalAccentuationStyles>\\n</header>\\n<dated>\\n  <metricalAccentuationMap>\\n    <style date=\\"0.0\\" name.ref=\\"my accentuation patterns\\"/>\\n    <accentuationPattern date=\\"0.0\\" name.ref=\\"quad time\\" scale=\\"50.0\\" loop=\\"true\\" stickToMeasures=\\"true\\"/>\\n  </metricalAccentuationMap>\\n</dated>
"],"memberOf":["model.styleCollectionLike","att.id"],"remarks":[],"attributes":{"xml:id":{"text":"

This provides a unique identifier for the element bearing the attribute.

","type":"ID","facet":"","usage":"Optional"}},"mayContain":["styleDef"],"containedBy":["header"]},{"base":"specs/mpm.xml","ident":"mpm","type":"element","module":"mpm.core","gloss":["MPM document"],"desc":"

The root element of an MPM-conformant document.

","examples":["

The basic structure of an MPM document looks like this.

","
<mpm>\\n  <metadata>\\n    <author>\\n      Some One\\n    </author>\\n    <comment>\\n      comment\\n    </comment>\\n    <relatedResources>\\n      <resource uri=\\"pathTo/music.mei\\" type=\\"mei\\"/>\\n      <resource uri=\\"pathTo/music.msm\\" type=\\"msm\\"/>\\n      <!-- further resource references -->\\n    </relatedResources>\\n  </metadata>\\n  <performance name=\\"a performance\\" pulsesPerQuarter=\\"720\\">\\n    <global>\\n      <header>\\n        <!-- header information for all parts -->\\n      </header>\\n      <dated>\\n        <!-- performance maps (tempoMap, dynamicsMap etc.) that apply to all parts -->\\n      </dated>\\n    </global>\\n    <part name=\\"Soprano\\" number=\\"1\\" midi.channel=\\"0\\" midi.port=\\"0\\">\\n      <header>\\n        <!-- header information for this part -->\\n      </header>\\n      <dated>\\n        <!-- performance maps that apply to this part -->\\n      </dated>\\n    </part>\\n    <!-- further parts -->\\n  </performance>\\n  <!-- further performances -->\\n</mpm>
","

This is a minimal MPM document.

","
<mpm>\\n  <performance name=\\"a performance\\" pulsesPerQuarter=\\"720\\">\\n    <global>\\n      <header/>\\n      <dated/>\\n    </global>\\n  </performance>\\n</mpm>
"],"memberOf":[],"remarks":["

This element is required. It is customary to specify the MPM namespace http://www.cemfi.de/mpm/ns/1.0 on it, using the xmlns attribute.

"],"attributes":{},"mayContain":["metadata","performance"],"containedBy":[]},{"base":"specs/ornament.xml","ident":"ornament","type":"element","module":"mpm.core","gloss":["ornament"],"desc":"

An ornament instruction

","examples":["

\\n The first ornament applies an upwards arpeggiation to all notes (listed lowest to highest pitch) at date 0.0 with \\n a scaled dynamic gradient.\\n The second ornament defines an arpeggiation of the notes listed in\\n note.order in the given order.\\n

","
<ornament date=\\"0.0\\" name.ref=\\"arpeggio\\" scale=\\"20.0\\" note.order=\\"ascending pitch\\"/>\\n<ornament date=\\"720.0\\" name.ref=\\"arpeggio\\" scale=\\"20.0\\" note.order=\\"#id1 #id3 #id2 #id4\\"/>
"],"memberOf":["att.id","att.note.order","att.reference.name","att.scale","att.time.symbolic.date"],"remarks":["

The use of attribute name.ref requires the presence of an ornamentDef of the same name within an ornament style. In the ornamentationMap there must be a style element switching to this style before the first reference to an ornamentationDef within that style.

"],"attributes":{"xml:id":{"text":"

This provides a unique identifier for the element bearing the attribute.

","type":"ID","facet":"","usage":"Optional"},"note.order":{"text":"

This attribute defines the order of notes. It can take the values \\"ascending pitch\\", \\"descending pitch\\" or a list of ids specifying the exact order of notes.

","type":"string","facet":"","usage":"Optional"},"name.ref":{"text":"

This attribute should be used for references by name.

","type":"string","facet":"","usage":"Required"},"scale":{"text":"

This attribute is used to scale a dynamic gradient defined in an ornamentDef.

","type":"double","facet":"","usage":"Optional"},"date":{"text":"

Attribute date provides a symbolic (i.e. tempo-independent) position in time for a map element. The basis to convert this date into a musical note value is the performance\'s pulsesPerQuarter value.

","type":"double","facet":"value ≥ 0.0","usage":"Required"}},"mayContain":[],"containedBy":["ornamentationMap"]},{"base":"specs/ornamentDef.xml","ident":"ornamentDef","type":"element","module":"mpm.core","gloss":["ornamentation definition"],"desc":"

An ornamentation definition describes an ornament as a series of transformations.

","examples":["
<ornamentDef name=\\"arpeggio\\">\\n  <temporalSpread frame.start=\\"-100.0\\" frameLength=\\"200.0\\" intensity=\\"1.4\\" noteoff.shift=\\"true\\"/>\\n  <dynamicsGradient transition.from=\\"-1.0\\" transition.to=\\"1.0\\"/>\\n</ornamentDef>
"],"memberOf":["att.name","att.id","model.defLike"],"remarks":[],"attributes":{"name":{"text":"

This attribute should be used to specify a name identifier for the element.

","type":"string","facet":"","usage":"Required"},"xml:id":{"text":"

This provides a unique identifier for the element bearing the attribute.

","type":"ID","facet":"","usage":"Optional"}},"mayContain":["dynamicsGradient","temporalSpread"],"containedBy":["styleDef"]},{"base":"specs/ornamentationMap.xml","ident":"ornamentationMap","type":"element","module":"mpm.core","gloss":["ornamentation map"],"desc":"

The ornamentation map is the container for ornamentation instructions.

","examples":["
<ornamentationMap>\\n  <style date=\\"0.0\\" name.ref=\\"Stylename\\"/>\\n  <ornament date=\\"0.0\\" name.ref=\\"arpeggio\\" scale=\\"20.0\\" note.order=\\"ascending pitch\\"/>\\n  <ornament date=\\"720.0\\" name.ref=\\"arpeggio\\" scale=\\"20.0\\" noteids=\\"id1 id3 id2 id4\\"/>\\n</ornamentationMap>
"],"memberOf":["model.mapLike","att.id"],"remarks":["

"],"attributes":{"xml:id":{"text":"

This provides a unique identifier for the element bearing the attribute.

","type":"ID","facet":"","usage":"Optional"}},"mayContain":["ornament","style"],"containedBy":["dated"]},{"base":"specs/ornamentationStyles.xml","ident":"ornamentationStyles","type":"element","module":"mpm.core","gloss":["collection of styles for ornamentations"],"desc":"

This element groups definitions of ornamentation styles.

","examples":["

This example shows the definition of an ornamentation style including an ornamentDef and its later use in an ornamentationMap.

","
<header>\\n  <ornamentationStyles>\\n    <styleDef name=\\"Stylename\\">\\n      <ornamentDef name=\\"arpeggio\\">\\n        <temporalSpread frame.start=\\"-100.0\\" frameLength=\\"200.0\\"/>\\n        <dynamicsGradient transition.from=\\"-1.0\\" transition.to=\\"1.0\\"/>\\n      </ornamentDef>\\n    </styleDef>\\n  </ornamentationStyles>\\n</header>\\n<dated>\\n  <ornamentationMap>\\n    <style date=\\"0.0\\" name.ref=\\"Stylename\\"/>\\n    <ornament date=\\"720.0\\" name.ref=\\"arpeggio\\" scale=\\"20.0\\"/>\\n  </ornamentationMap>\\n</dated>
"],"memberOf":["model.styleCollectionLike","att.id"],"remarks":[],"attributes":{"xml:id":{"text":"

This provides a unique identifier for the element bearing the attribute.

","type":"ID","facet":"","usage":"Optional"}},"mayContain":["styleDef"],"containedBy":["header"]},{"base":"specs/part.xml","ident":"part","type":"element","module":"mpm.core","gloss":["part-specific performance data"],"desc":"

This element includes all information that applies to a specific musical part or voice.

","examples":["

This is the typical structure of a performance.

","
<performance name=\\"a performance\\" pulsesPerQuarter=\\"720\\">\\n  <global>\\n    <header>\\n      <!-- header information for all parts -->\\n    </header>\\n    <dated>\\n      <!-- performance maps (tempoMap, dynamicsMap etc.) that apply to all parts -->\\n    </dated>\\n  </global>\\n  <part name=\\"Soprano\\" number=\\"1\\" midi.channel=\\"0\\" midi.port=\\"0\\">\\n    <header>\\n      <!-- header information for this part -->\\n    </header>\\n    <dated>\\n      <!-- performance maps that apply to this part -->\\n    </dated>\\n  </part>\\n  <!-- further parts -->\\n</performance>
"],"memberOf":["att.name","att.number","att.id","att.midiRouting"],"remarks":["

Basically, a part in MPM can also be polyphonic, i.e. it represents a collection of parts. E.g., in orchestral music notation one staff may contain two parts. Thus, the performance instructions notated in the staff apply to both.

","

The interplay between global and local (i.e. part-specific) information can be understood as follows. A global map (e.g. tempoMap) is applied to each part as long as it does not define a local map of the same type. Even if that local map is empty, its presence signals that the part has its own map and will, thus, ignore the global map. A typical scenario is that the tempoMap is defined globally, i.e. all parts follow the same tempo, \\"follow the same conductor\\" and stay synchronised. Each part, however, can add individual timing details via a local rubatoMap, asynchronyMap, imprecisionMap.timing etc. The same rule applies to global vs. local style definitions. A part prefers its local information over the global ones.

"],"attributes":{"name":{"text":"

This attribute should be used to specify a name identifier for the element.

","type":"string","facet":"","usage":"Required"},"number":{"text":"

This attribute should be used to specify an integer identifier for the element, which is not necessarily unique within the document.

","type":"integer","facet":"","usage":"Required"},"xml:id":{"text":"

This provides a unique identifier for the element bearing the attribute.

","type":"ID","facet":"","usage":"Optional"},"midi.channel":{"text":"

Channel numbering starts with 0! The first MIDI channel is 0. the 16th MIDI channel is 15.

","type":"nonNegativeInteger","facet":"0 ≤ value ≤ 15","usage":"Required"},"midi.port":{"text":"

Each MIDI device (MIDI port) can have up to 16 channels (i.e. voices) which is sometimes not enough, e.g. for an orchestral setup. To address further voices choose another port.

","type":"nonNegativeInteger","facet":"0 ≤ value ≤ 255","usage":"Required"}},"mayContain":["dated","header"],"containedBy":["performance"]},{"base":"specs/performance.xml","ident":"performance","type":"element","module":"mpm.core","gloss":["performance description"],"desc":"

This element includes all information of a single musical performance.

","examples":["

This is the typical structure of a performance.

","
<performance name=\\"a performance\\" pulsesPerQuarter=\\"720\\">\\n  <global>\\n    <header>\\n      <!-- header information for all parts -->\\n    </header>\\n    <dated>\\n      <!-- performance maps (tempoMap, dynamicsMap etc.) that apply to all parts -->\\n    </dated>\\n  </global>\\n  <part name=\\"Soprano\\" number=\\"1\\" midi.channel=\\"0\\" midi.port=\\"0\\">\\n    <header>\\n      <!-- header information for this part -->\\n    </header>\\n    <dated>\\n      <!-- performance maps that apply to this part -->\\n    </dated>\\n  </part>\\n  <!-- further parts -->\\n</performance>
"],"memberOf":["att.name","att.id","att.pulsesPerQuarter"],"remarks":["

In the context of the Music Performance Markup format a musical performance description comprises all information necessary to transform symbolic music data (e.g. sheet music represented as MEI or MSM) into a representation (MIDI) that can be played back by any kind of sound generator (e.g. synthesizer or sampler) and, thus, be synthesised to audio. While the symbolic music data may already be playable via a trivial transformation (similar to an empty performance) the result will sound very mechanic and non-human. With a performance description the performance transformation adds all the details that are require for an expressive interpretation of the symbolic raw data, such as tempo variations, micro timing, dynamics, metrical accentuation, and articulation. This performance element provides these information in a formalised way that is also accessible to analytical, creative and scientific application domains. Obviously, there can be more than one ways to perform a piece of music. Hence, an MPM can have more than one performance. It is even possible to apply a performance to multiple pieces of music to experiment how it transfers to a different music context.

"],"attributes":{"name":{"text":"

This attribute should be used to specify a name identifier for the element.

","type":"string","facet":"","usage":"Required"},"xml:id":{"text":"

This provides a unique identifier for the element bearing the attribute.

","type":"ID","facet":"","usage":"Optional"},"pulsesPerQuarter":{"text":"

This attribute specifies the timing resolution of the maps, i.e. of attributes with a symbolic time value such as date and duration.

","type":"nonNegativeInteger","facet":"","usage":"Required"}},"mayContain":["global","part"],"containedBy":["mpm"]},{"base":"specs/relatedResources.xml","ident":"relatedResources","type":"element","module":"mpm.resources","gloss":["related resources"],"desc":"

This element can be used to provide references to related resources of (musical) data.

","examples":["

The element relatedResources holds one or more references to other resources, e.g. the MEI file from which it was derived or an MSM file which it is intended to be applied to.

","
<relatedResources>\\n  <resource uri=\\"pathTo/music.mei\\" type=\\"mei\\"/>\\n  <resource uri=\\"pathTo/music.msm\\" type=\\"msm\\"/>\\n  <resource uri=\\"pathTo/music.mid\\" type=\\"midi\\"/>\\n  <resource uri=\\"pathTo/another.mid\\" type=\\"midi\\"/>\\n  <resource uri=\\"pathTo/music.xml\\" type=\\"musicXML\\"/>\\n  <resource uri=\\"pathTo/music.mxl\\" type=\\"musicXML\\"/>\\n  <resource uri=\\"pathTo/unsupportedMusicType.umt\\" type=\\"umt\\"/>\\n</relatedResources>
"],"memberOf":[],"remarks":["

This list of resource references is basically of an informal nature and does not imply any specific meaning. E.g., performances are not restricted to be applied only to the MSM objects listed here. It is up to the user/application to be more specific with this, e.g. by means of edition guidelines for a historical-critical music edition.

"],"attributes":{},"mayContain":["resource"],"containedBy":["metadata"]},{"base":"specs/resource.xml","ident":"resource","type":"element","module":"mpm.resources","gloss":["data reference"],"desc":"

This element represents a reference to a related resource of (musical) data.

","examples":["

The element relatedResources holds one or more references to other sources, e.g. the MEI file from which it was derived or an MSM file which it is intended to be applied to.

","
<relatedResources>\\n  <resource uri=\\"pathTo/music.mei\\" type=\\"mei\\"/>\\n  <resource uri=\\"pathTo/music.msm\\" type=\\"msm\\"/>\\n  <resource uri=\\"pathTo/music.mid\\" type=\\"midi\\"/>\\n  <resource uri=\\"pathTo/another.mid\\" type=\\"midi\\"/>\\n  <resource uri=\\"pathTo/music.xml\\" type=\\"musicXML\\"/>\\n  <resource uri=\\"pathTo/music.mxl\\" type=\\"musicXML\\"/>\\n  <resource uri=\\"pathTo/unsupportedMusicType.umt\\" type=\\"umt\\"/>\\n</relatedResources>
"],"memberOf":["att.reference.resource"],"remarks":["

The resource reference is basically of an informal nature and does not imply any specific meaning. It is up to the user/application to be more specific with this, e.g. by means of edition guidelines for a historical-critical music edition.

"],"attributes":{"uri":{"text":"

A uniform resource identifier for the resource to be referenced.

","type":"anyURI","facet":"","usage":"Required"},"type":{"text":"

This attribute should be used to indicate the type of the resource.

","type":"token","facet":"","usage":"Required"}},"mayContain":[],"containedBy":["relatedResources"]},{"base":"specs/rubato.xml","ident":"rubato","type":"element","module":"mpm.core","gloss":["rubato"],"desc":"

A rubato instruction

","examples":["

The first rubato instruction refers to a rubatoDef. The second specifies its own rubato. The third takes the rubatoDef for \\"Viennese waltz\\" but adds/changes its intensity.

","
<rubato date=\\"0.0\\" name.ref=\\"swing\\" loop=\\"true\\"/>\\n<rubato date=\\"28800.0\\" frameLength=\\"2160.0\\" intensity=\\"0.8\\" lateStart=\\"0.0\\" earlyEnd=\\"1.0\\" loop=\\"true\\"/>\\n<rubato date=\\"65400.0\\" name.ref=\\"Viennese waltz\\" intensity=\\"1.7\\" loop=\\"true\\"/>
","

Note that in the rubatoMap a style element must be added before the first rubato instruction and it must refer to a rubato style with the two rubatoDefs in attribute name.ref. Otherwise, \\"swing\\" and \\"Viennese waltz\\" are undefined.

"],"memberOf":["att.time.symbolic.date","att.reference.name","att.rubatoDef","att.loop","att.id"],"remarks":["

The rubato definition refered by attribute name.ref can be edited/overwritten by the local attributes frameLength, intensity, lateStart, and earlyEnd. The values of local attributes dominate imported ones. If no name.refis given, attribute frameLength is required.

"],"attributes":{"date":{"text":"

Attribute date provides a symbolic (i.e. tempo-independent) position in time for a map element. The basis to convert this date into a musical note value is the performance\'s pulsesPerQuarter value.

","type":"double","facet":"value ≥ 0.0","usage":"Required"},"name.ref":{"text":"

This attribute should be used for references by name.

","type":"string","facet":"","usage":"Optional"},"frameLength":{"text":"

The length of a rubato frame (in symbolic time), i.e. the time window within which the timing deviation takes place and compensates again.

","type":"double","facet":"value > 0.0","usage":"Optional"},"intensity":{"text":"

The intensity of a timing distortion effect.

","type":"double","facet":"value > 0.0","usage":"Optional"},"lateStart":{"text":"

Add an initial delay to the rubato frame.

","type":"double","facet":"0.0 ≤ value < 1.0","usage":"Optional"},"earlyEnd":{"text":"

Make the rubato frame end early.

","type":"double","facet":"0.0 < value ≤ 1.0","usage":"Optional"},"loop":{"text":"

This attribute should be used to set the behavior of an element as being applied only once (false) or repeatedly (true).

","type":"boolean","facet":"","usage":"Optional"},"xml:id":{"text":"

This provides a unique identifier for the element bearing the attribute.

","type":"ID","facet":"","usage":"Optional"}},"mayContain":[],"containedBy":["rubatoMap"]},{"base":"specs/rubatoDef.xml","ident":"rubatoDef","type":"element","module":"mpm.core","gloss":["rubato definition"],"desc":"

A rubato definition associates a literal rubato instruction with a rubato schema. Rubato in MPM is defined as a metronomic tempo variation, i.e. it compensates within a certain frame of symbolic time so that the end of the frame is synchronous again with the underlying meter.

","examples":["
<rubatoDef name=\\"swing\\" frameLength=\\"720.0\\" intensity=\\"0.6\\"/>\\n<rubatoDef name=\\"Viennese waltz\\" frameLength=\\"2160.0\\" intensity=\\"1.5\\" lateStart=\\"0.0\\" earlyEnd=\\"1.0\\"/>\\n<rubatoDef name=\\"late on 1st beat\\" frameLength=\\"2880.0\\" lateStart=\\"0.2\\"/>
"],"memberOf":["att.name","att.rubatoDef","att.id","model.defLike"],"remarks":[],"attributes":{"name":{"text":"

This attribute should be used to specify a name identifier for the element.

","type":"string","facet":"","usage":"Required"},"frameLength":{"text":"

The length of a rubato frame (in symbolic time), i.e. the time window within which the timing deviation takes place and compensates again.

","type":"double","facet":"value > 0.0","usage":"Required"},"intensity":{"text":"

The intensity of a timing distortion effect.

","type":"double","facet":"value > 0.0","usage":"Optional"},"lateStart":{"text":"

Add an initial delay to the rubato frame.

","type":"double","facet":"0.0 ≤ value < 1.0","usage":"Optional"},"earlyEnd":{"text":"

Make the rubato frame end early.

","type":"double","facet":"0.0 < value ≤ 1.0","usage":"Optional"},"xml:id":{"text":"

This provides a unique identifier for the element bearing the attribute.

","type":"ID","facet":"","usage":"Optional"}},"mayContain":[],"containedBy":["styleDef"]},{"base":"specs/rubatoMap.xml","ident":"rubatoMap","type":"element","module":"mpm.core","gloss":["rubato map"],"desc":"

Rubato in MPM is defined as a metronomic tempo variation, i.e. it compensates within a certain frame of symbolic time so that the end of the frame is synchronous again with the underlying meter. The rubatoMap is the place to add rubati to a performance. Rubato distortions are micro timing features, i.e. they add onto the macro timing curve specified by the tempoMap.

","examples":["

This rubato map assumes that there is a rubato style named \\"inégalité\\" that holds a rubatoDef for \\"swing\\" and one for \\"Viennese waltz\\".

","
<rubatoMap>\\n  <style date=\\"0.0\\" name.ref=\\"in&#xE9;galit&#xE9;\\"/>\\n  <rubato date=\\"0.0\\" name.ref=\\"swing\\" loop=\\"true\\"/>\\n  <rubato date=\\"28800.0\\" frameLength=\\"2160.0\\" intensity=\\"0.8\\" lateStart=\\"0.0\\" earlyEnd=\\"1.0\\" loop=\\"true\\"/>\\n  <rubato date=\\"65400.0\\" name.ref=\\"Viennese waltz\\" intensity=\\"0.7\\" loop=\\"true\\"/>\\n</rubatoMap>
"],"memberOf":["model.mapLike","att.id"],"remarks":[],"attributes":{"xml:id":{"text":"

This provides a unique identifier for the element bearing the attribute.

","type":"ID","facet":"","usage":"Optional"}},"mayContain":["rubato","style"],"containedBy":["dated"]},{"base":"specs/rubatoStyles.xml","ident":"rubatoStyles","type":"element","module":"mpm.core","gloss":["rubato style collection"],"desc":"

This element groups definitions of rubato styles.

","examples":["

This example shows the definition of two rubato styles and the later use of one of them in a rubatoMap.

","
<header>\\n  <rubatoStyles>\\n    <styleDef name=\\"Jones\\">\\n      <rubatoDef name=\\"swing\\" frameLength=\\"720.0\\" intensity=\\"0.6\\"/>\\n      <rubatoDef name=\\"Viennese waltz\\" frameLength=\\"2160.0\\" intensity=\\"1.5\\"/>\\n    </styleDef>\\n    <styleDef name=\\"Henry\\">\\n      <rubatoDef name=\\"swing\\" frameLength=\\"720.0\\" intensity=\\"0.8\\"/>\\n      <rubatoDef name=\\"Viennese waltz\\" frameLength=\\"2160.0\\" intensity=\\"1.2\\" lateStart=\\"0.1\\" earlyEnd=\\"0.95\\"/>\\n    </styleDef>\\n  </rubatoStyles>\\n</header>\\n<dated>\\n  <rubatoMap>\\n    <style date=\\"0.0\\" name.ref=\\"Henry\\"/>\\n    <rubato date=\\"0.0\\" name.ref=\\"swing\\" loop=\\"true\\"/>\\n    <rubato date=\\"45600.0\\" name.ref=\\"swing\\" frameLength=\\"1440.0\\" loop=\\"true\\"/>\\n  </rubatoMap>\\n</dated>
","

Considering a pulses per quarter value of 720, the last rubato instruction in the map applies the swing timing on a half note level by overwriting the quarter note frameLength that the rubatoDef has defined.

"],"memberOf":["model.styleCollectionLike","att.id"],"remarks":[],"attributes":{"xml:id":{"text":"

This provides a unique identifier for the element bearing the attribute.

","type":"ID","facet":"","usage":"Optional"}},"mayContain":["styleDef"],"containedBy":["header"]},{"base":"specs/style.xml","ident":"style","type":"element","module":"mpm.core","gloss":["style switch"],"desc":"

This element is used to switch between styles which are defined in the global or local header environment via styleDef elements.

","examples":["

Switching the style reference in maps is generally done by placing the style element within the map.

","
<style date=\\"654.0\\" name.ref=\\"Karajan\\"/>
","

Switching the style reference in an articulationMap is a special case. Here an optional further attribute is available, defaultArticulation.

","
<style date=\\"654.0\\" name.ref=\\"Karajan\\" defaultArticulation=\\"nonlegato\\"/>
","

The default articulation refers to the articulationDef that should be applied to every note that is not articulated otherwise.

"],"memberOf":["att.time.symbolic.date","att.id","att.reference.name"],"remarks":["

If the performance instructions in a map rely on a style definition, the style switch must be placed in the map before the first such instruction, typically right at the beginning at date 0.0.

"],"attributes":{"date":{"text":"

Attribute date provides a symbolic (i.e. tempo-independent) position in time for a map element. The basis to convert this date into a musical note value is the performance\'s pulsesPerQuarter value.

","type":"double","facet":"value ≥ 0.0","usage":"Required"},"xml:id":{"text":"

This provides a unique identifier for the element bearing the attribute.

","type":"ID","facet":"","usage":"Optional"},"name.ref":{"text":"

This attribute should be used for references by name.

","type":"string","facet":"","usage":"Required"},"defaultArticulation":{"text":"

This attribute should be used to refer to an articulationDef.

","type":"string","facet":"","usage":"Optional"}},"mayContain":[],"containedBy":["articulationMap","dynamicsMap","metricalAccentuationMap","ornamentationMap","rubatoMap","tempoMap"]},{"base":"specs/styleDef.xml","ident":"styleDef","type":"element","module":"mpm.core","gloss":["style definition"],"desc":"

A style definition in MPM is a collection of performance feature definitions. These can then be referenced in the maps instead of defining them anew everytime they are needed. The feature domain is restricted by the styleDef\'s parent element, i.e. tempo styles should define only tempo features, articulation styles only articulations and so forth.

","examples":["

This example shows that the type of children of a styleDef is restricted by the parent as it defines the domain. It makes no sense to to place, e.g., a tempoDef in a dynamics style.

","
<header>\\n  <dynamicsStyles>\\n    <styleDef name=\\"Karajan\\">\\n      <dynamicsDef name=\\"p\\" value=\\"30.0\\"/>\\n      <dynamicsDef name=\\"f\\" value=\\"95.0\\"/>\\n    </styleDef>\\n    <styleDef name=\\"Rattle\\">\\n      <dynamicsDef name=\\"p\\" value=\\"26.0\\"/>\\n      <dynamicsDef name=\\"f\\" value=\\"101.0\\"/>\\n    </styleDef>\\n  </dynamicsStyles>\\n  <tempoStyles>\\n    <styleDef name=\\"Karajan\\">\\n      <tempoDef name=\\"Adagio\\" value=\\"60.0\\"/>\\n      <tempoDef name=\\"Allegro\\" value=\\"130.0\\"/>\\n    </styleDef>\\n    <styleDef name=\\"Rattle\\">\\n      <tempoDef name=\\"Adagio\\" value=\\"67.0\\"/>\\n      <tempoDef name=\\"Allegro\\" value=\\"133.6\\"/>\\n    </styleDef>\\n  </tempoStyles>\\n</header>\\n<dated>\\n  <tempoMap>\\n    <style date=\\"0.0\\" name.ref=\\"Rattle\\"/>\\n    <tempo date=\\"0.0\\" bpm=\\"Allegro\\" beatLength=\\"0.25\\"/>\\n  </tempoMap>\\n  <dynamicsMap>\\n    <style date=\\"0.0\\" name.ref=\\"Rattle\\"/>\\n    <dynamics date=\\"0.0\\" bpm=\\"f\\"/>\\n  </dynamicsMap>\\n</dated>
","

Using the same names for style definitions in different domains makes style switching easier in the maps and prevents confusion. And it is, of course, possible to experiment with style mixtures.

"],"memberOf":["att.name","att.id"],"remarks":[],"attributes":{"name":{"text":"

This attribute should be used to specify a name identifier for the element.

","type":"string","facet":"","usage":"Required"},"xml:id":{"text":"

This provides a unique identifier for the element bearing the attribute.

","type":"ID","facet":"","usage":"Optional"}},"mayContain":["accentuationPatternDef","articulationDef","dynamicsDef","ornamentDef","rubatoDef","tempoDef"],"containedBy":["articulationStyles","dynamicsStyles","metricalAccentuationStyles","ornamentationStyles","rubatoStyles","tempoStyles"]},{"base":"specs/tempo.xml","ident":"tempo","type":"element","module":"mpm.core","gloss":["tempo"],"desc":"

A tempo instruction

","examples":["

A constant tempo instruction with a numeric bpm value, a constant tempo instruction with a literal tempo value (requires an according tempoDef), a ritardando instruction, and an accelerando instruction. The first three have a beat length of a quarter note (1/4 = 0.25), the fourth is an eighth note (1/8 = 0.125).

","
<tempo date=\\"0.0\\" bpm=\\"110.0\\" beatLength=\\"0.25\\"/>\\n<tempo date=\\"14400.0\\" bpm=\\"Vivace\\" beatLength=\\"0.25\\"/>\\n<tempo date=\\"286500.0\\" bpm=\\"Vivace\\" transition.to=\\"Grave\\" beatLength=\\"0.25\\" meanTempoAt=\\"0.8\\"/>\\n<tempo date=\\"447500.0\\" bpm=\\"Grave\\" transition.to=\\"125.0\\" beatLength=\\"0.125\\" meanTempoAt=\\"0.4\\"/>
"],"memberOf":["att.time.symbolic.date","att.transition.to","att.id"],"remarks":["

The tempo instruction starts at the specified date and ends at the date of the subsequent tempo instruction. Within this time interval the tempo is either constant, monotonically increasing or monotonically decreasing. Non-monotonic shapes (e.g. acccel. followed by rit.) are composed of a sequence of multiple tempo elements.

","

When using literal tempo values (in attributes bpm and transition.to) make sure that the according tempo style is associated. This is done by placing a style element in the tempo map before the first use of literal tempo values.

"],"attributes":{"date":{"text":"

Attribute date provides a symbolic (i.e. tempo-independent) position in time for a map element. The basis to convert this date into a musical note value is the performance\'s pulsesPerQuarter value.

","type":"double","facet":"value ≥ 0.0","usage":"Required"},"transition.to":{"text":"

If this attribute is specified, the instruction represents a continuous transition (e.g. accel./rit. or cresc./decresc.) from an initial value to the target value given in this attribute.

","type":"string","facet":"","usage":"Optional"},"xml:id":{"text":"

This provides a unique identifier for the element bearing the attribute.

","type":"ID","facet":"","usage":"Optional"},"bpm":{"text":"

The initial tempo of this instruction.

","type":"string","facet":"","usage":"Required"},"beatLength":{"text":"

The length of one beat in musical terms, e.g. quarter note=0.25, half note=0.5 etc. Without this, the tempi in beats per minute cannot be interpreted.

","type":"double","facet":"value > 0.0","usage":"Required"},"meanTempoAt":{"text":"

If attribute transition.to is specified and, thus, the element describes a continuous tempo transition (accel., rit.) the shape of the transition can be further refined by this attribute. Its value in the interval [0.0; 1.0] indicates the realtive position (symbolic time) between start and end of the tempo transition at which half of the tempo change is achieved, i.e. the mean tempo is reached.

","type":"double","facet":"0.0 ≤ value ≤ 1.0","usage":"Optional"}},"mayContain":[],"containedBy":["tempoMap"]},{"base":"specs/tempoDef.xml","ident":"tempoDef","type":"element","module":"mpm.core","gloss":["tempo definition"],"desc":"

A tempo definition associates a literal tempo instruction with a value beats per minute (bpm).

","examples":["
<tempoDef name=\\"Adagio\\" value=\\"79.0\\"/>\\n<tempoDef name=\\"Vivace\\" value=\\"164.0\\"/>\\n<tempoDef name=\\"too fast\\" value=\\"243.0\\"/>\\n<tempoDef name=\\"my own tempo\\" value=\\"106.87\\"/>
"],"memberOf":["att.name","att.value.double","att.id","model.defLike"],"remarks":[],"attributes":{"name":{"text":"

This attribute should be used to specify a name identifier for the element.

","type":"string","facet":"","usage":"Required"},"value":{"text":"

A 64 bit floating-point value.

","type":"double","facet":"","usage":"Required"},"xml:id":{"text":"

This provides a unique identifier for the element bearing the attribute.

","type":"ID","facet":"","usage":"Optional"}},"mayContain":[],"containedBy":["styleDef"]},{"base":"specs/tempoMap.xml","ident":"tempoMap","type":"element","module":"mpm.core","gloss":["tempo map"],"desc":"

The tempo map is the place to specify a macro timing curve, i.e. the basic tempo curve onto which all micro timing features are then added. The curve is composed of monotonic curve segments, each segment is a tempo element.

","examples":["
<tempoMap>\\n  <style date=\\"0.0\\" name.ref=\\"Karajan\\"/>\\n  <tempo date=\\"0.0\\" bpm=\\"123.0\\" beatLength=\\"0.25\\"/>\\n  <tempo date=\\"345960.0\\" bpm=\\"Allegro\\" beatLength=\\"0.25\\" transition.to=\\"Adagio\\" meanTempoAt=\\"0.9\\"/>\\n  <tempo date=\\"360360.0\\" bpm=\\"Adagio\\" beatLength=\\"0.25\\"/>\\n</tempoMap>
"],"memberOf":["model.mapLike","att.id"],"remarks":[],"attributes":{"xml:id":{"text":"

This provides a unique identifier for the element bearing the attribute.

","type":"ID","facet":"","usage":"Optional"}},"mayContain":["style","tempo"],"containedBy":["dated"]},{"base":"specs/tempoStyles.xml","ident":"tempoStyles","type":"element","module":"mpm.core","gloss":["tempo style collection"],"desc":"

This element groups definitions of tempo styles.

","examples":["

This example shows the definition of two tempo styles and the later use of one of them in a tempoMap.

","
<header>\\n  <tempoStyles>\\n    <styleDef name=\\"Karajan\\">\\n      <tempoDef name=\\"Adagio\\" value=\\"60.0\\"/>\\n      <tempoDef name=\\"Allegro\\" value=\\"130.0\\"/>\\n      <tempoDef name=\\"Vivace\\" value=\\"152.0\\"/>\\n    </styleDef>\\n    <styleDef name=\\"Rattle\\">\\n      <tempoDef name=\\"Adagio\\" value=\\"67.0\\"/>\\n      <tempoDef name=\\"Allegro\\" value=\\"133.6\\"/>\\n      <tempoDef name=\\"Vivace\\" value=\\"163.0\\"/>\\n    </styleDef>\\n  </tempoStyles>\\n</header>\\n<dated>\\n  <tempoMap>\\n    <style date=\\"0.0\\" name.ref=\\"Rattle\\"/>\\n    <tempo date=\\"0.0\\" bpm=\\"Allegro\\" beatLength=\\"0.25\\"/>\\n    <tempo date=\\"47000.0\\" bpm=\\"Adagio\\" beatLength=\\"0.5\\"/>\\n  </tempoMap>\\n</dated>
"],"memberOf":["model.styleCollectionLike","att.id"],"remarks":[],"attributes":{"xml:id":{"text":"

This provides a unique identifier for the element bearing the attribute.

","type":"ID","facet":"","usage":"Optional"}},"mayContain":["styleDef"],"containedBy":["header"]},{"base":"specs/temporalSpread.xml","ident":"temporalSpread","type":"element","module":"mpm.core","gloss":["temporal spread"],"desc":"

The temporalSpread transformer offsets all elements at a given time by a certain amount defined by a power function.

","examples":["
<temporalSpread frame.start=\\"-100.0\\" frameLength=\\"200.0\\" intensity=\\"1.4\\" noteoff.shift=\\"true\\"/>
"],"memberOf":["att.id","att.temporalSpread","att.time.frame","att.time.frameLength","att.time.unit","model.ornamentDefContent"],"remarks":["

The unit of the frame attributes is defined by time.unit.

"],"attributes":{"xml:id":{"text":"

This provides a unique identifier for the element bearing the attribute.

","type":"ID","facet":"","usage":"Optional"},"intensity":{"text":"

The intensity of a timing distortion effect.

","type":"double","facet":"value > 0.0","usage":"Optional"},"noteoff.shift":{"text":"

This attribute defines whether the note offsets should shift in parallel with the note onsets.

","type":"values: \\"true\\", \\"false\\", \\"monophonic\\"","facet":"","usage":"Optional"},"frame.start":{"text":"

The attribute frame.start provides the start of a frame.

","type":"double","facet":"","usage":"Optional"},"frameLength":{"text":"

The length of a time frame.

","type":"double","facet":"value ≥ 0.0","usage":"Optional"},"time.unit":{"text":"

This attribute specifies the time unit to be either ticks (symbolic) or milliseconds (physical).

","type":"values: \\"ticks\\", \\"milliseconds\\"","facet":"","usage":"Optional"}},"mayContain":[],"containedBy":["ornamentDef"]},{"base":"specs/att.articulationDef.xml","ident":"att.articulationDef","type":"atts","module":"mpm.core","gloss":["articulation definition attribute class"],"desc":"

This attribute class provides attributes needed to define an articulation.

","examples":[],"memberOf":["att.time.symbolic.articulation","att.time.physical.articulation"],"remarks":[],"attributes":{"absoluteDuration":{"text":"

Set the absolute duration of the note (in symbolic time).

","type":"double","facet":"value ≥ 0.0","usage":"Optional"},"absoluteDurationChange":{"text":"

Change the absolute duration of the note by the specified value (in symbolic time).

","type":"double","facet":"","usage":"Optional"},"relativeDuration":{"text":"

Change the duration of the note relatively to its initial value. E.g. a value of 0.5 halves the duration.

","type":"double","facet":"value ≥ 0.0","usage":"Optional"},"absoluteDelay":{"text":"

Delay the note by the specified value (in symbolic time).

","type":"double","facet":"","usage":"Optional"},"absoluteDurationMs":{"text":"

Set the absolute duration of the note (in milliseconds).

","type":"double","facet":"value ≥ 0.0","usage":"Optional"},"absoluteDurationChangeMs":{"text":"

Change the absolute duration of the note by the specified value (in milliseceonds).

","type":"double","facet":"","usage":"Optional"},"absoluteDelayMs":{"text":"

Delay the note by the specified value (in milliseconds).

","type":"double","facet":"","usage":"Optional"},"absoluteVelocity":{"text":"

Set the absolute velocity of a note.

","type":"double","facet":"value ≥ 0.0","usage":"Optional"},"relativeVelocity":{"text":"

Change the velocity of a note relative to its initial velocity. E.g., a value of 0.5 halves the velocity.

","type":"double","facet":"value ≥ 0.0","usage":"Optional"},"absoluteVelocityChange":{"text":"

Change the velocity of a note by the specified amount.

","type":"double","facet":"","usage":"Optional"},"detuneCents":{"text":"

Change a note\'s tuning by the specified amount in cents.

","type":"double","facet":"","usage":"Optional"},"detuneHz":{"text":"

Change a note\'s tuning by the specified amount in Hertz.

","type":"double","facet":"","usage":"Optional"}},"mayContain":[],"containedBy":[]},{"base":"specs/att.distribution.clips.xml","ident":"att.distribution.clips","type":"atts","module":"mpm.core","gloss":["lower and upper clipping value attribute class"],"desc":"

This attribute class provides attributes clip.lower and clip.upper. They are used to clip the range of random values.

","examples":[],"memberOf":[],"remarks":[],"attributes":{"clip.lower":{"text":"

defines the lowest clipping border. If random values get below this they will be set to this value.

","type":"double","facet":"","usage":"Required"},"clip.upper":{"text":"

defines the highest clipping border. Random values greater than this will be set to this value.

","type":"double","facet":"","usage":"Required"}},"mayContain":[],"containedBy":[]},{"base":"specs/att.distribution.limits.xml","ident":"att.distribution.limits","type":"atts","module":"mpm.core","gloss":["limit attribute class"],"desc":"

This attribute class provides attributes limit.lower and limit.upper.

","examples":[],"memberOf":[],"remarks":[],"attributes":{"limit.lower":{"text":"

defines the lowest possible value.

","type":"double","facet":"","usage":"Required"},"limit.upper":{"text":"

defines the highest possible value.

","type":"double","facet":"","usage":"Required"}},"mayContain":[],"containedBy":[]},{"base":"specs/att.distribution.seed.xml","ident":"att.distribution.seed","type":"atts","module":"mpm.core","gloss":["seed attribute class"],"desc":"

This attribute class provides attribute seed.

","examples":[],"memberOf":[],"remarks":[],"attributes":{"seed":{"text":"

This attribute allows the user to specify a seed for the random distributions. Initialized with this seed, a random number generator generates always the same series of \\"random\\" numbers. Thus, by using the seed attribute the imprecisions (timing, dynamics etc.) become reproducible.

","type":"long","facet":"","usage":"Optional"}},"mayContain":[],"containedBy":[]},{"base":"specs/att.id.xml","ident":"att.id","type":"atts","module":"mpm.core","gloss":["xml:id attribute class"],"desc":"

This attribute class supplies the xml:id attribute.

","examples":[],"memberOf":[],"remarks":[],"attributes":{"xml:id":{"text":"

This provides a unique identifier for the element bearing the attribute.

","type":"ID","facet":"","usage":"Optional"}},"mayContain":[],"containedBy":[]},{"base":"specs/att.intensity.xml","ident":"att.intensity","type":"atts","module":"mpm.core","gloss":["intensity attribute class"],"desc":"

This attribute class provides the attribute intensity.

","examples":[],"memberOf":[],"remarks":[],"attributes":{"intensity":{"text":"

The intensity of a timing distortion effect.

","type":"double","facet":"value > 0.0","usage":"Optional"}},"mayContain":[],"containedBy":[]},{"base":"specs/att.loop.xml","ident":"att.loop","type":"atts","module":"mpm.core","gloss":["loop attribute class"],"desc":"

This attribute class provides attribute loop.

","examples":[],"memberOf":[],"remarks":[],"attributes":{"loop":{"text":"

This attribute should be used to set the behavior of an element as being applied only once (false) or repeatedly (true).

","type":"boolean","facet":"","usage":"Optional"}},"mayContain":[],"containedBy":[]},{"base":"specs/att.midiRouting.xml","ident":"att.midiRouting","type":"atts","module":"mpm.midi","gloss":["MIDI routing attributes class"],"desc":"

This attribute class provides attributes midi.channel and midi.port.

","examples":[],"memberOf":[],"remarks":[],"attributes":{"midi.channel":{"text":"

Channel numbering starts with 0! The first MIDI channel is 0. the 16th MIDI channel is 15.

","type":"nonNegativeInteger","facet":"0 ≤ value ≤ 15","usage":"Required"},"midi.port":{"text":"

Each MIDI device (MIDI port) can have up to 16 channels (i.e. voices) which is sometimes not enough, e.g. for an orchestral setup. To address further voices choose another port.

","type":"nonNegativeInteger","facet":"0 ≤ value ≤ 255","usage":"Required"}},"mayContain":[],"containedBy":[]},{"base":"specs/att.name.xml","ident":"att.name","type":"atts","module":"mpm.core","gloss":["name attribute class"],"desc":"

This attribute class provides attribute name.

","examples":[],"memberOf":[],"remarks":[],"attributes":{"name":{"text":"

This attribute should be used to specify a name identifier for the element.

","type":"string","facet":"","usage":"Required"}},"mayContain":[],"containedBy":[]},{"base":"specs/att.note.order.xml","ident":"att.note.order","type":"atts","module":"mpm.core","gloss":["note order attribute class"],"desc":"

This attribute class provides the attribute note.order.

","examples":[],"memberOf":[],"remarks":[],"attributes":{"note.order":{"text":"

This attribute defines the order of notes. It can take the values \\"ascending pitch\\", \\"descending pitch\\" or a list of ids specifying the exact order of notes.

","type":"string","facet":"","usage":"Optional"}},"mayContain":[],"containedBy":[]},{"base":"specs/att.number.xml","ident":"att.number","type":"atts","module":"mpm.core","gloss":["number attribute class"],"desc":"

This attribute class provides attribute number.

","examples":[],"memberOf":[],"remarks":[],"attributes":{"number":{"text":"

This attribute should be used to specify an integer identifier for the element, which is not necessarily unique within the document.

","type":"integer","facet":"","usage":"Required"}},"mayContain":[],"containedBy":[]},{"base":"specs/att.pulsesPerQuarter.xml","ident":"att.pulsesPerQuarter","type":"atts","module":"mpm.midi","gloss":["pulsesPerQuarter attribute class"],"desc":"

This attribute class provides attribute pulsesPerQuarter.

","examples":[],"memberOf":[],"remarks":[],"attributes":{"pulsesPerQuarter":{"text":"

This attribute specifies the timing resolution of the maps, i.e. of attributes with a symbolic time value such as date and duration.

","type":"nonNegativeInteger","facet":"","usage":"Required"}},"mayContain":[],"containedBy":[]},{"base":"specs/att.reference.name.xml","ident":"att.reference.name","type":"atts","module":"mpm.core","gloss":["name reference attribute class"],"desc":"

This attribute class provides attribute name.ref.

","examples":[],"memberOf":[],"remarks":[],"attributes":{"name.ref":{"text":"

This attribute should be used for references by name.

","type":"string","facet":"","usage":"Required"}},"mayContain":[],"containedBy":[]},{"base":"specs/att.reference.noteid.xml","ident":"att.reference.noteid","type":"atts","module":"mpm.core","gloss":["note identifier attribute class"],"desc":"

This attribute class provides attribute noteid.

","examples":[],"memberOf":[],"remarks":[],"attributes":{"noteid":{"text":"

This attribute should be used for references to note elements (e.g. in MEI and MSM).

","type":"anyURI","facet":"","usage":"Optional"}},"mayContain":[],"containedBy":[]},{"base":"specs/att.reference.resource.xml","ident":"att.reference.resource","type":"atts","module":"mpm.resources","gloss":["resource reference attributes"],"desc":"

This attribute class provides attributes for referencing an external resource.

","examples":["

This attribute class is used by the resource elements.

","
<relatedResources>\\n  <resource uri=\\"pathTo/music.mei\\" type=\\"mei\\"/>\\n  <resource uri=\\"pathTo/music.msm\\" type=\\"msm\\"/>\\n  <resource uri=\\"pathTo/music.mid\\" type=\\"midi\\"/>\\n  <resource uri=\\"pathTo/another.mid\\" type=\\"midi\\"/>\\n  <resource uri=\\"pathTo/music.xml\\" type=\\"musicXML\\"/>\\n  <resource uri=\\"pathTo/music.mxl\\" type=\\"musicXML\\"/>\\n  <resource uri=\\"pathTo/unsupportedMusicType.umt\\" type=\\"umt\\"/>\\n</relatedResources>
"],"memberOf":[],"remarks":[],"attributes":{"uri":{"text":"

A uniform resource identifier for the resource to be referenced.

","type":"anyURI","facet":"","usage":"Required"},"type":{"text":"

This attribute should be used to indicate the type of the resource.

","type":"token","facet":"","usage":"Required"}},"mayContain":[],"containedBy":[]},{"base":"specs/att.rubatoDef.xml","ident":"att.rubatoDef","type":"atts","module":"mpm.core","gloss":["rubato definition attribute class"],"desc":"

This attribute class provides attributes needed to define a rubato.

","examples":[],"memberOf":["att.time.frameLength","att.intensity"],"remarks":[],"attributes":{"frameLength":{"text":"

The length of a time frame.

","type":"double","facet":"","usage":"Optional"},"intensity":{"text":"

The intensity of a timing distortion effect.

","type":"double","facet":"value > 0.0","usage":"Optional"},"lateStart":{"text":"

Add an initial delay to the rubato frame.

","type":"double","facet":"0.0 ≤ value < 1.0","usage":"Optional"},"earlyEnd":{"text":"

Make the rubato frame end early.

","type":"double","facet":"0.0 < value ≤ 1.0","usage":"Optional"}},"mayContain":[],"containedBy":[]},{"base":"specs/att.scale.xml","ident":"att.scale","type":"atts","module":"mpm.core","gloss":["scale attribute class"],"desc":"

This attribute class provides attribute scale.

","examples":[],"memberOf":[],"remarks":[],"attributes":{"scale":{"text":"

This attribute is required to scale relative values (which are defined in [0.0; 1.0]) to explicit values.

","type":"double","facet":"","usage":"Required"}},"mayContain":[],"containedBy":[]},{"base":"specs/att.temporalSpread.xml","ident":"att.temporalSpread","type":"atts","module":"mpm.core","gloss":["temporalSpread definition attribute class"],"desc":"

This attribute class provides attributes needed to define a temporalSpread.

","examples":[],"memberOf":["att.intensity"],"remarks":[],"attributes":{"intensity":{"text":"

The intensity of a timing distortion effect.

","type":"double","facet":"value > 0.0","usage":"Optional"},"noteoff.shift":{"text":"

This attribute defines whether the note offsets should shift in parallel with the note onsets.

","type":"values: \\"true\\", \\"false\\", \\"monophonic\\"","facet":"","usage":"Optional"}},"mayContain":[],"containedBy":[]},{"base":"specs/att.time.xml","ident":"att.time","type":"atts","module":"mpm.core","gloss":["time attribute class"],"desc":"

This attribute class provides time-related attributes.

","examples":[],"memberOf":["att.time.symbolic","att.time.physical"],"remarks":[],"attributes":{"date":{"text":"

Attribute date provides a symbolic (i.e. tempo-independent) position in time for a map element. The basis to convert this date into a musical note value is the performance\'s pulsesPerQuarter value.

","type":"double","facet":"value ≥ 0.0","usage":"Required"},"duration":{"text":"

Attribute duration provides a symbolic (i.e. tempo-independent) timeframe. The basis to convert this into a musical note value is the performance\'s pulsesPerQuarter value.

","type":"double","facet":"value ≥ 0.0","usage":"Required"},"absoluteDuration":{"text":"

Set the absolute duration of the note (in symbolic time).

","type":"double","facet":"value ≥ 0.0","usage":"Optional"},"absoluteDurationChange":{"text":"

Change the absolute duration of the note by the specified value (in symbolic time).

","type":"double","facet":"","usage":"Optional"},"relativeDuration":{"text":"

Change the duration of the note relatively to its initial value. E.g. a value of 0.5 halves the duration.

","type":"double","facet":"value ≥ 0.0","usage":"Optional"},"absoluteDelay":{"text":"

Delay the note by the specified value (in symbolic time).

","type":"double","facet":"","usage":"Optional"},"absoluteDurationMs":{"text":"

Set the absolute duration of the note (in milliseconds).

","type":"double","facet":"value ≥ 0.0","usage":"Optional"},"absoluteDurationChangeMs":{"text":"

Change the absolute duration of the note by the specified value (in milliseceonds).

","type":"double","facet":"","usage":"Optional"},"absoluteDelayMs":{"text":"

Delay the note by the specified value (in milliseconds).

","type":"double","facet":"","usage":"Optional"},"milliseconds.offset":{"text":"

This attribute defines an offset/delay (positive or negative) in milliseconds.

","type":"double","facet":"","usage":"Required"},"milliseconds.timingBasis":{"text":"

defines the timing basis in milliseconds.

","type":"double","facet":"value > 0.0","usage":"Required"}},"mayContain":[],"containedBy":[]},{"base":"specs/att.time.frame.xml","ident":"att.time.frame","type":"atts","module":"mpm.core","gloss":["frame attribute class"],"desc":"

This attribute class provides the attribute frame.start.

","examples":[],"memberOf":[],"remarks":[],"attributes":{"frame.start":{"text":"

The attribute frame.start provides the start of a frame.

","type":"double","facet":"","usage":"Optional"}},"mayContain":[],"containedBy":[]},{"base":"specs/att.time.frameLength.xml","ident":"att.time.frameLength","type":"atts","module":"mpm.core","gloss":["frame length attribute class"],"desc":"

This attribute class provides the attribute frameLength.

","examples":[],"memberOf":[],"remarks":[],"attributes":{"frameLength":{"text":"

The length of a time frame.

","type":"double","facet":"","usage":"Optional"}},"mayContain":[],"containedBy":[]},{"base":"specs/att.time.physical.xml","ident":"att.time.physical","type":"atts","module":"mpm.core","gloss":["physical time attribute class"],"desc":"

This attribute class provides attributes for the physical time domain.

","examples":[],"memberOf":["att.time.physical.articulation","att.time.physical.offset","att.time.physical.timingBasis"],"remarks":[],"attributes":{"absoluteDurationMs":{"text":"

Set the absolute duration of the note (in milliseconds).

","type":"double","facet":"value ≥ 0.0","usage":"Optional"},"absoluteDurationChangeMs":{"text":"

Change the absolute duration of the note by the specified value (in milliseceonds).

","type":"double","facet":"","usage":"Optional"},"absoluteDelayMs":{"text":"

Delay the note by the specified value (in milliseconds).

","type":"double","facet":"","usage":"Optional"},"milliseconds.offset":{"text":"

This attribute defines an offset/delay (positive or negative) in milliseconds.

","type":"double","facet":"","usage":"Required"},"milliseconds.timingBasis":{"text":"

defines the timing basis in milliseconds.

","type":"double","facet":"value > 0.0","usage":"Required"}},"mayContain":[],"containedBy":[]},{"base":"specs/att.time.physical.articulation.xml","ident":"att.time.physical.articulation","type":"atts","module":"mpm.core","gloss":["articulation attribute class for physical time"],"desc":"

This class provides physical time based attributes used for articulation definitions.

","examples":[],"memberOf":[],"remarks":[],"attributes":{"absoluteDurationMs":{"text":"

Set the absolute duration of the note (in milliseconds).

","type":"double","facet":"value ≥ 0.0","usage":"Optional"},"absoluteDurationChangeMs":{"text":"

Change the absolute duration of the note by the specified value (in milliseceonds).

","type":"double","facet":"","usage":"Optional"},"absoluteDelayMs":{"text":"

Delay the note by the specified value (in milliseconds).

","type":"double","facet":"","usage":"Optional"}},"mayContain":[],"containedBy":[]},{"base":"specs/att.time.physical.offset.xml","ident":"att.time.physical.offset","type":"atts","module":"mpm.core","gloss":["milliseconds offset attribute class"],"desc":"

This attribute class provides attribute milliseconds.offset.

","examples":[],"memberOf":[],"remarks":[],"attributes":{"milliseconds.offset":{"text":"

This attribute defines an offset/delay (positive or negative) in milliseconds.

","type":"double","facet":"","usage":"Required"}},"mayContain":[],"containedBy":[]},{"base":"specs/att.time.physical.timingBasis.xml","ident":"att.time.physical.timingBasis","type":"atts","module":"mpm.core","gloss":["milliseconds timing basis attribute class"],"desc":"

This attribute class provides attribute milliseconds.timingBasis.

","examples":[],"memberOf":[],"remarks":[],"attributes":{"milliseconds.timingBasis":{"text":"

defines the timing basis in milliseconds.

","type":"double","facet":"value > 0.0","usage":"Required"}},"mayContain":[],"containedBy":[]},{"base":"specs/att.time.symbolic.xml","ident":"att.time.symbolic","type":"atts","module":"mpm.core","gloss":["symbolic time attribute class"],"desc":"

This attribute class provides attributes for the symbolic time domain.

","examples":[],"memberOf":["att.time.symbolic.date","att.time.symbolic.duration","att.time.symbolic.articulation"],"remarks":[],"attributes":{"date":{"text":"

Attribute date provides a symbolic (i.e. tempo-independent) position in time for a map element. The basis to convert this date into a musical note value is the performance\'s pulsesPerQuarter value.

","type":"double","facet":"value ≥ 0.0","usage":"Required"},"duration":{"text":"

Attribute duration provides a symbolic (i.e. tempo-independent) timeframe. The basis to convert this into a musical note value is the performance\'s pulsesPerQuarter value.

","type":"double","facet":"value ≥ 0.0","usage":"Required"},"absoluteDuration":{"text":"

Set the absolute duration of the note (in symbolic time).

","type":"double","facet":"value ≥ 0.0","usage":"Optional"},"absoluteDurationChange":{"text":"

Change the absolute duration of the note by the specified value (in symbolic time).

","type":"double","facet":"","usage":"Optional"},"relativeDuration":{"text":"

Change the duration of the note relatively to its initial value. E.g. a value of 0.5 halves the duration.

","type":"double","facet":"value ≥ 0.0","usage":"Optional"},"absoluteDelay":{"text":"

Delay the note by the specified value (in symbolic time).

","type":"double","facet":"","usage":"Optional"}},"mayContain":[],"containedBy":[]},{"base":"specs/att.time.symbolic.articulation.xml","ident":"att.time.symbolic.articulation","type":"atts","module":"mpm.core","gloss":["articulation attribute class for symbolic time"],"desc":"

This class provides symbolic time based attributes used for articulation definitions.

","examples":[],"memberOf":[],"remarks":[],"attributes":{"absoluteDuration":{"text":"

Set the absolute duration of the note (in symbolic time).

","type":"double","facet":"value ≥ 0.0","usage":"Optional"},"absoluteDurationChange":{"text":"

Change the absolute duration of the note by the specified value (in symbolic time).

","type":"double","facet":"","usage":"Optional"},"relativeDuration":{"text":"

Change the duration of the note relatively to its initial value. E.g. a value of 0.5 halves the duration.

","type":"double","facet":"value ≥ 0.0","usage":"Optional"},"absoluteDelay":{"text":"

Delay the note by the specified value (in symbolic time).

","type":"double","facet":"","usage":"Optional"}},"mayContain":[],"containedBy":[]},{"base":"specs/att.time.symbolic.beat.xml","ident":"att.time.symbolic.beat","type":"atts","module":"mpm.core","gloss":["beat attribute class"],"desc":"

This attribute class provides attribute beat.

","examples":[],"memberOf":[],"remarks":[],"attributes":{"beat":{"text":"

Position indication in musical beats.

","type":"double","facet":"value ≥ 1.0","usage":"Required"}},"mayContain":[],"containedBy":[]},{"base":"specs/att.time.symbolic.date.xml","ident":"att.time.symbolic.date","type":"atts","module":"mpm.core","gloss":["date attribute class"],"desc":"

This attribute class provides attribute date.

","examples":[],"memberOf":[],"remarks":[],"attributes":{"date":{"text":"

Attribute date provides a symbolic (i.e. tempo-independent) position in time for a map element. The basis to convert this date into a musical note value is the performance\'s pulsesPerQuarter value.

","type":"double","facet":"value ≥ 0.0","usage":"Required"}},"mayContain":[],"containedBy":[]},{"base":"specs/att.time.symbolic.duration.xml","ident":"att.time.symbolic.duration","type":"atts","module":"mpm.core","gloss":["duration attribute class"],"desc":"

This attribute class provides attribute duration.

","examples":[],"memberOf":[],"remarks":[],"attributes":{"duration":{"text":"

Attribute duration provides a symbolic (i.e. tempo-independent) timeframe. The basis to convert this into a musical note value is the performance\'s pulsesPerQuarter value.

","type":"double","facet":"value ≥ 0.0","usage":"Required"}},"mayContain":[],"containedBy":[]},{"base":"specs/att.time.symbolic.length.xml","ident":"att.time.symbolic.length","type":"atts","module":"mpm.core","gloss":["length attribute class"],"desc":"

This attribute class provides attribute length.

","examples":[],"memberOf":[],"remarks":[],"attributes":{"length":{"text":"

Length indication in musical beats.

","type":"double","facet":"value > 0.0","usage":"Required"}},"mayContain":[],"containedBy":[]},{"base":"specs/att.time.unit.xml","ident":"att.time.unit","type":"atts","module":"mpm.core","gloss":["time unit attribute class"],"desc":"

This attribute class provides the attribute time.unit.

","examples":[],"memberOf":[],"remarks":[],"attributes":{"time.unit":{"text":"

This attribute specifies the time unit to be either ticks (symbolic) or milliseconds (physical).

","type":"values: \\"ticks\\", \\"milliseconds\\"","facet":"","usage":"Optional"}},"mayContain":[],"containedBy":[]},{"base":"specs/att.transition.from.xml","ident":"att.transition.from","type":"atts","module":"mpm.core","gloss":["transition.from attribute class"],"desc":"

This attribute class provides attribute transition.from.

","examples":[],"memberOf":[],"remarks":[],"attributes":{"transition.from":{"text":"

This attribute specifies the initial value that a continuous transition starts with.

","type":"double","facet":"","usage":"Optional"}},"mayContain":[],"containedBy":[]},{"base":"specs/att.transition.to.xml","ident":"att.transition.to","type":"atts","module":"mpm.core","gloss":["transition.to attribute class"],"desc":"

This attribute class provides attribute transition.to.

","examples":[],"memberOf":[],"remarks":[],"attributes":{"transition.to":{"text":"

If this attribute is specified, the instruction represents a continuous transition (e.g. accel./rit. or cresc./decresc.) from an initial value to the target value given in this attribute.

","type":"string","facet":"","usage":"Optional"}},"mayContain":[],"containedBy":[]},{"base":"specs/att.value.double.xml","ident":"att.value.double","type":"atts","module":"mpm.core","gloss":["double value attribute class"],"desc":"

This attribute class provides attribute value.

","examples":[],"memberOf":[],"remarks":[],"attributes":{"value":{"text":"

A 64 bit floating-point value.

","type":"double","facet":"","usage":"Required"}},"mayContain":[],"containedBy":[]},{"base":"specs/model.defLike.xml","ident":"model.defLike","type":"model","module":"mpm.core","gloss":["style definition content model"],"desc":"

The content model for style definitions.

","examples":[],"memberOf":[],"remarks":[],"attributes":{},"mayContain":[],"containedBy":[]},{"base":"specs/model.distributionLike.xml","ident":"model.distributionLike","type":"model","module":"mpm.core","gloss":["imprecisionMap content model"],"desc":"

The content model for all types of imprecision maps.

","examples":[],"memberOf":[],"remarks":[],"attributes":{},"mayContain":[],"containedBy":[]},{"base":"specs/model.mapLike.xml","ident":"model.mapLike","type":"model","module":"mpm.core","gloss":["dated content model"],"desc":"

The content model for element dated.

","examples":[],"memberOf":[],"remarks":[],"attributes":{},"mayContain":[],"containedBy":[]},{"base":"specs/model.ornamentDefContent.xml","ident":"model.ornamentDefContent","type":"model","module":"mpm.core","gloss":["ornamentDef content model"],"desc":"

The content model for element ornamentDef.

","examples":[],"memberOf":[],"remarks":[],"attributes":{},"mayContain":[],"containedBy":[]},{"base":"specs/model.partContent.xml","ident":"model.partContent","type":"model","module":"mpm.core","gloss":["global and part content model"],"desc":"

The content model for elements global and part.

","examples":[],"memberOf":[],"remarks":[],"attributes":{},"mayContain":[],"containedBy":[]},{"base":"specs/model.styleCollectionLike.xml","ident":"model.styleCollectionLike","type":"model","module":"mpm.core","gloss":["header content model"],"desc":"

The content model for element header.

","examples":[],"memberOf":[],"remarks":[],"attributes":{},"mayContain":[],"containedBy":[]}],"version":"2.1.5","chapters":["

The Music Performance Markup Format

A musical performance of some symbolic music data (e.g. the score, MusicXML, MEI) is the entirety of all transformations necessary to make the music sound. This includes the temporal order of sound events as well as their specific execution. The Music Performance Markup format (MPM) is dedicated to describe and model musical performances in large detail in the manner of a construction kit. It comes packed with a series of performance features from several domains incl. the following:

  • Timing features: tempo (incl. discrete and continuous tempo changes), rubato, asynchrony, random/non-systematical deviations from precise timing,
  • Dynamics features: macro dynamics (incl. discrete and continuous dynamics changes), metrical accentuation, random/non-systematical deviations from precise dynamics,
  • Articulation: absolute and relative modifications of a tone\'s duration, dynamics, timing (e.g. agogic accent), and intonation, random/non-systematic variations of tone duration and intonation,
  • Ornamentation: temporal spread (e.g. of arpeggiated chords), dynamics gradients of ornaments.

Each feature is designed on the basis of a mathematical model that was derived from empirical research. These models not only reproduce the typical characteristics of their respective features. Two musicians may perform the same features (say an articulation, a crescendo, or a ritardando) very differently. Thus, the models are also equipped with expressive parameters to recreate the whole bandwidth of such variations.

Application Scenarios

MPM was developed with several application scenarios in mind. It is an editorial tool for the philological registration and critical analysis of musical interpretations in the context of digital music editions. This directly leads to usage scenarios in the library context for archiving sound documents and their editions. For the analysis of individual performances, the model-based approach of MPM provides feature classes that allow for an abstracted and differentiated view. With larger data sets of musical performances, corpus analyses with methods from the field of information retrieval promise new insights, e.g. into personal and contemporary styles or the influence of performers from certain schools.

MPM does not primarily serve a purely positivistic quantification of music, though. Along the lines of \\"transformative digital intermedia studies\\" and coupled with the possibilities to apply the modeled performances to symbolic music data in the standard MIDI file format and render them into audio files, MPM can be a tool for the hermeneutic approximation of a human music performance. As an experimenting tool, it can be used for the (re-)construction of performances that have not been handed down as sound documents but in textual form, e.g. in music-practical texts and performance scores. Beyond the purely scientific use, it has also creative applications in digital music production, e.g. for creating expressive performances which can then be rendered into high-quality music productions using sound libraries and synthesizers. Last but not least, the model-based basic concept of MPM also motivates new research questions in the field of music performance research that could not be approached systematically before.

Development History

The roots of MPM lie in a performance research project in 2008-2011. In cooperation with the \\"Zentrum für Telemann-Pflege und -Forschung Magdeburg\\" (Center for Telemann Care and Research Magdeburg) Tilo Hähnel and Axel Berndt conducted a series of empirical studies with musicians, measurements in music recordings, experiments with listeners and software implementations that ultimately yielded a corpus of mathematical models used to synthesize musical performances. What was used as a proprietary scripting format was effectively the first incarnation of what would later become MPM.

It took another five years until in 2016 Benjamin Wolff Bohl and Axel Berndt, in the context of the Center \\"Music - Edition - Media\\" project, started a comprehensive redesign and created version 1 of MPM, yet incomplete in some regards but the initiation of a project dedicated to MPM exclusively. Funded by the Fritz Thyssen Foundation the MPM schema definition was fully revamped into the present version 2. Throughout 2019-2023 the project was dedicated to the development of comprehensive documentation, guidelines, sample encodings, workshops, and several software tools.

Software Tools for MPM

  • The official MPM API (application programming interface) has been written in Java and is published under GPL 3.0 as part of the meico framework.
  • An MEI to MPM converter is part of the meico framework.
  • A performance rendering engine is also part of the MPM API. End users can utilize it via meico\'s graphical user interface. It can be used to combine MEI, MSM or MIDI data with performance encodings and render them into expressive MIDI sequences and audio data. As part of the API it may also be integrated with other applications.
  • With MPM Toolbox we also provide a convenient graphical editor software. This is the most efficient way of creating and editing musical performances, analyzing performance scores, and rendering expressive MIDI and audio from it.
","

Introduction to MPM

The performance of a piece of music transforms the symbolic music data (also called logical music data, typically a score representation) into sounding output. An MPM encoded performance describes this transformation. A musical piece can be performed in many different ways. In other words, there can be many different performances for the same logical music data rendering it impractical to combine both domains in one and the same data structure. Thus, in the MPM ecosystem both are clearly separated. MPM itself represents only the gestural domain, i.e. the performance descriptions. Logical domain data comes as a separate entity, e.g. as a MIDI, MEI or MSM (Musical Sequence Markup) file. The meico converter and MPM Toolbox can be used to convert these formats. Hence, MPM is always used in tandem with a logical music representation format. Simply put, the latter contributes the notes, MPM says how they are performed.

Yet not included in MPM\'s vocabulary is the sound generation. The typical workflow for listening to a music performance is to transform the logical music representation and an MPM performance into an expressive MIDI sequence, then play it back directly or render it to audio. In both cases certain sound generators are involved, be it sample libraries or synthesizers. If the sounds do not match the requirements, others may be tested. MPM Toolbox can send its MIDI output to external receivers/sound generators. It is even possible to import the generated expressive MIDI file in a Digital Audio Workstation (DAW) and process the music in a more dedicated, professional production environment. In the remainder of this text we will the MPM format and give introduction to its concepts, features and capabilities.

The Basic Structure

The following code example shows the topmost structure of MPM documents. The root node mpm has two kinds of children, one element metadata (optional) and one or more elements performance, each with a unique name.

<mpm>\\n  <metadata>\\n    ...\\n  </metadata>\\n  <performance name=\\"a performance\\" pulsesPerQuarter=\\"720\\">\\n    ...\\n  </performance>\\n  <performance name=\\"another performance\\" pulsesPerQuarter=\\"720\\">\\n    ...\\n  </performance>\\n  ...\\n</mpm>

Metadata

Element metadata is optional. Here authorship can be stated, textual comments made and related resources referred.

<metadata>\\n  <author number=\\"1\\">\\n    Jane Doe\\n  </author>\\n  <comment>\\n    The first performance, authored by author no. 1, is based on a violin treatise from 1678.\\n  </comment>\\n  <author number=\\"2\\">\\n    John Smith\\n  </author>\\n  <comment>\\n    Author no. 2 made the second performance on the basis of a tape recording by famous pianist Clare Clear.\\n  </comment>\\n  <relatedResources>\\n    ...\\n  </relatedResources>\\n</metadata>

Linking Related Resources

Element relatedResources provides a list of references to other data resources that are somehow related to this MPM. This might be the logical music data file, an audio file whose performance is recreated here or an accompanying text document. This list is basically of an informal nature and does not imply any specific meaning. E.g., performances are not restricted to be applied only to the sources listed here. It is up to the user/application to be more specific with this, e.g. by means of edition guidelines for a historical-critical music edition.

<relatedResources>\\n  <resource uri=\\"pathTo/music.mei\\" type=\\"mei\\"/>\\n  <resource uri=\\"pathTo/music.msm\\" type=\\"msm\\"/>\\n  <resource uri=\\"pathTo/music.mid\\" type=\\"midi\\"/>\\n  <resource uri=\\"pathTo/another.mid\\" type=\\"midi\\"/>\\n  <resource uri=\\"pathTo/music.xml\\" type=\\"musicXML\\"/>\\n  <resource uri=\\"pathTo/music.mxl\\" type=\\"musicXML\\"/>\\n  <resource uri=\\"pathTo/text.tei\\" type=\\"tei\\"/>\\n  <resource uri=\\"pathTo/unsupportedMusicType.umt\\" type=\\"umt\\"/>\\n</relatedResources>

Timing Concept

Each performance must specify attribute pulsesPerQuarter. This defines the numeric timing basis used throughout the performance. MPM\'s timing model is equivalent to that used in the MIDI standard and in many DAWs. Instead of measure, beat and subbeat numbers MPM uses a metronomic clock to indicate musical time positions and durations. The attribute says how often the metronome ticks in one quarter note. In this example it is 720 times. A half note corresponds with 1440 ticks, an eighth note with 360 and so on. The tick position (symbolic date) of the second measure in a 4/4 time signature is 720 * 4 = 2880. The symbolic date of the second quarter in the third measure is (720 * 4 * 2) + 720 = 6480.

This symbolic representation of time is independent of tempo, i.e. the symbolic dates and durations stay the same regardless of the tempo of the music. Even if the music plays twice as fast, a quarter note has 720 ticks. This is because a tempo instruction just makes the metronome run faster or slower. If we place an articulation on a note at symbolic date 54320, it will always be that same position even if another tempo is set. Since we want this \\"positional stability\\" for all our performance instructions, all time-related attributes, such as date, frameLength and absoluteDuration, are symbolic. Attributes with physical time values have \\"milliseconds\\" or \\"Ms\\" in their name, e.g. absoluteDurationMs, milliseconds.timingBasis and milliseconds.offset. Later, in the timing section, we will see how symbolic time values translate to milliseconds.

Typical pulsesPerQuarter values are 360, 480 and 720. Why this? Now, in MPM time positions (dates) and durations can be floating point numbers which provide very high precision, but in MIDI they are integers. If a quarter note would have just 1 tick, it would be impossible to express eighth notes or sixteenth notes etc. The same with dotted note values. In the MIDI world the granularity of the timing grid must provide integer representation of such smaller subdivisions and even odd subdivisions such as triplets and quintuplets. It is not really necessary to follow this convention in the MPM world and the API implementation in meico can even handle differing pulsesPerQuarter values in the logical source and MPM. But it makes editing easier and prevents numeric problems when the dates and durations align.

Scopes

All information of a performance are organized along two categorizations that define the scope of the information.

<performance name=\\"a performance\\" pulsesPerQuarter=\\"720\\">\\n  <global>\\n    <header>\\n      ...\\n    </header>\\n    <dated>\\n      ...\\n    </dated>\\n  </global>\\n  <part name=\\"Soprano\\" number=\\"1\\" midi.channel=\\"0\\" midi.port=\\"0\\">\\n    <header>\\n      ...\\n    </header>\\n    <dated>\\n      ...\\n    </dated>\\n  </part>\\n  <part name=\\"Alto\\" number=\\"2\\" midi.channel=\\"1\\" midi.port=\\"0\\">\\n    <header>\\n      ...\\n    </header>\\n    <dated>\\n      ...\\n    </dated>\\n  </part>\\n  ...\\n</performance>

Information can be global, i.e. they apply to all musical parts, and local, i.e. they apply to a single part. Technically, the parts correspond with MEI staffs and MIDI channels. Here is a typical example: If dynamics instructions are placed in the global environment, they are performed by all parts. If the dynamics instructions are placed in a part environment, only this particular part will perform them. If both is given, global and part-specific dynamics instructions, the specific part will ignore the global ones and perform its local instructions while all other parts will follow the global instructions as long they have no local ones. In other words: Local information dominate the global. This pays off, e.g., in solo-plus-accompaniment constellations. Global performance instructions are executed by the whole ensemble; only the solo part features its own local instructions that \\"overwrite\\" the global.

The interplay of global and local information is the key to complex polyphonic performance structures. Each part can feature its own performance plan. One part may perform a decrescendo while another part plays a crescendo. One part may perform a swing micro timing, another an even timing, while they all follow the same basic tempo. A key feature of our models to allow such multifarious performance representations is the self-containedness of each single model. This gives precise and independent control of each performance detail without any distorting interference from another detail. It is possible, for instance, to change the tempo completely while keeping all micro timing features unaltered.

Both, global and local information, are subdivided into header and dated information. Header information apply to the whole movement, it is the place for style definitions, the place to define articulations, literal dynamics instructions etc. Dated information are organized in sequential lists, so-called maps, one for each type of performance feature. Each element in a map has a required date attribute (in ticks) that positions it along the symbolic time axis. Discrete performance features, e.g. articulation instructions, are applied at the respective time position. Most performance features, however, extend over a certain timeframe. A dynamics instruction, such as forte for instance, lasts from its date until the date of the subsequent instruction.

","

Timing

Generally speaking, timing is a mapping of symbolic time (e.g. score time and the tick dates in MIDI) to physical time (typically measured in milliseconds here). MPM distinguishes between macro and micro timing features. The macro timing, i.e. tempo, defines the rough timing function. The micro timing features (rubato, asynchrony, random imprecision and parts of articulation and ornamentation) add fine-grained details to this timing curve. The timing computation pipeline with all timing aspects is shown subsequently and detailed in the following sections.

date in symbolic time (ticks)

\\n Articulation (symbolic timing modifiers)

\\n Rubato

\\n Ornamentation (symbolic timing modifiers)

\\n Tempo (this converts ticks to milliseconds, all further transformations take place in the milliseconds domain)

\\n Asynchrony

\\n Articulation (physical timing modifiers)

\\n Ornamentation (physical timing modifiers)

\\n Timing Imprecision

date in physical time (milliseconds)

Tempo

Tempo information can be located in the header and dated environment. In the header, tempo styles can be defined. A tempo style is, basically, a lookup table that associates literal tempo instructions with numerical values (in beats per minute). These can then be used in the tempoMap as shown in the following example.

<header>\\n  <tempoStyles>\\n    <styleDef name=\\"Karajan\\">\\n      <tempoDef name=\\"Adagio\\" value=\\"60.0\\"/>\\n      <tempoDef name=\\"Allegro\\" value=\\"130.0\\"/>\\n      <tempoDef name=\\"Vivace\\" value=\\"152.0\\"/>\\n    </styleDef>\\n    <styleDef name=\\"Rattle\\">\\n      <tempoDef name=\\"Adagio\\" value=\\"67.0\\"/>\\n      <tempoDef name=\\"Allegro\\" value=\\"133.6\\"/>\\n      <tempoDef name=\\"Vivace\\" value=\\"163.0\\"/>\\n    </styleDef>\\n  </tempoStyles>\\n</header>\\n<dated>\\n  <tempoMap>\\n    <style date=\\"0.0\\" name.ref=\\"Rattle\\"/>\\n    <tempo date=\\"0.0\\" bpm=\\"Allegro\\" beatLength=\\"0.25\\"/>\\n    <tempo date=\\"12340.0\\" bpm=\\"Adagio\\" beatLength=\\"0.5\\"/>\\n  </tempoMap>\\n</dated>

Let us have a closer look at the tempoMap. This is the place where the actual tempo instructions are formulated and placed along the symbolic time axis, together with style switches. The latter are required only if literal tempo values are used as in the above example. The style switch informs about the tempo style at which the corresponding numeric value is to be found. tempo instructions can dictate either a constant tempo or a continuous tempo transition (accelerando/ritardando).

<!-- constant tempo -->\\n<tempo date=\\"0.0\\" bpm=\\"100.0\\" beatLength=\\"0.25\\"/>\\n<!-- continuous tempo transition -->\\n<tempo date=\\"0.0\\" bpm=\\"100.0\\" transition.to=\\"120.0\\" beatLength=\\"0.25\\"/>

In the above example we used numeric instead of literal tempo values. Both, bpm and transition.to can be either numeric bpm values or literals from the underlying tempo style. If transition.to is present and has a different value than bpm the tempo instruction represents a continuous tempo transition beginning at date and ending at the date of the subsequent tempo instruction in the map. Hence, it is not advisable to have a continuous tempo transition as last child of a tempoMap. Always have a tempo instruction after a ritardando or accelerando, so it knows where it ends!

Since the tempo values are in beats per minute, we need to know the note value of one beat. This is specified by the required attribute beatLength. Here the numerical interpretation of musical note values are used, e.g. quarter note = 1/4 = 0.25, eighth note = 1/8 = 0.125, half note = 1/2 = 0.5, whole note = 1.0 and so forth.

The shape of continuous tempo transitions can be further refined by attribute meanTempoAt.

<tempo date=\\"0.0\\" bpm=\\"100.0\\" transition.to=\\"120.0\\" beatLength=\\"0.25\\" meanTempoAt=\\"0.2\\"/>

This is a value between 0.0 and 1.0 indicating a relative position between start date and end date of the tempo transition. This is the position where half of the tempo change is done. Placing it in the first half (between 0.0 and 0.5) will shift the bulk part of the tempo change to the beginning (the performers get sooner faster/slower, so to say), vice versa for the second half (between 0.5 and 1.0, performers get later faster/slower). Value 0.5 will create a perfectly linear tempo transition that typically sounds rather neutral or mechanic.

Tempo curves are constructed from power functions in the interval [0.0, 1.0]. The shape is specified via meanTempoAt.

Rubato

Several different definitions of rubato can be found in the literature. It is often understood according to Riemann as a free treatment of tempo, short-term tempo fluctuations or \\"expressive timing\\". This is already covered by the concept of tempo (see the section on tempo) and needs no further concurrent representation. Reginald Gatty (\\"Tempo Rubato\\". In The Musical Times 53, 1912, No. 829, pp 160-162), however, lists three further definitions:

  • accent shifts (see metrical accentuation),
  • non-metronomic irregular timing (agogic offsets of single notes, see articulation), and
  • the metronomic tempo variation in the sense of a deceleration or acceleration, which is compensated within a defined timeframe, so that the end of the timeframe is again synchronous with the underlying meter.

The latter definition is also ideal for describing phenomena such as swing timing, Viennese waltz and inégalité. And it is not covered by any other feature type, so this is MPM\'s definition of rubato. Rubato instructions are organized in maps in the dated environment. The following rubatoMap features three variants of rubato instructions.

<dated>\\n  <rubatoMap>\\n    <rubato date=\\"0.0\\" intensity=\\"0.8\\" frameLength=\\"720.0\\"/>\\n    <rubato date=\\"720.0\\" intensity=\\"2.0\\" frameLength=\\"2160.0\\" loop=\\"true\\"/>\\n    <rubato date=\\"14400.0\\" frameLength=\\"2160.0\\" lateStart=\\"0.1\\" earlyEnd=\\"0.9\\" loop=\\"false\\"/>\\n  </rubatoMap>\\n</dated>

The first instruction creates a slight swing timing. However, it is performed only once. If the rubato scheme should be repeated on every subsequent frame, attribute loop should be set true, as done in the second instruction. This rubato starts fast and slows down until the end of the frame. The third instruction does not use the intensity attribute for timing distortions but adds compression. The first ten percent of the frame are delayed by lateStart and the final 10 percent are played early by earlyEnd. Both together cause the frame being played late and so fast that it is finished early. It is also possible to combine this feature with intensity to create even more complex characteristics. The following figure illustrates the whole rubato model.

MPM\'s rubato model is based on a power function in the interval [0.0, 1.0] that is then scaled to frame length and shifted to the frame\'s date.

It is also possible to define rubato styles in the header. These can then be obtained via name.ref as shown in the following code example.

<header>\\n  <rubatoStyles>\\n    <styleDef name=\\"Jones\\">\\n      <rubatoDef name=\\"swing\\" frameLength=\\"720.0\\" intensity=\\"0.6\\"/>\\n      <rubatoDef name=\\"Viennese waltz\\" frameLength=\\"2160.0\\" intensity=\\"1.5\\"/>\\n    </styleDef>\\n    <styleDef name=\\"Henry\\">\\n      <rubatoDef name=\\"swing\\" frameLength=\\"720.0\\" intensity=\\"0.8\\"/>\\n      <rubatoDef name=\\"Viennese waltz\\" frameLength=\\"2160.0\\" intensity=\\"1.2\\" lateStart=\\"0.1\\" earlyEnd=\\"0.95\\"/>\\n    </styleDef>\\n  </rubatoStyles>\\n</header>\\n<dated>\\n  <rubatoMap>\\n    <style date=\\"0.0\\" name.ref=\\"Henry\\"/>\\n    <rubato date=\\"0.0\\" name.ref=\\"swing\\" loop=\\"true\\"/>\\n    <rubato date=\\"45600.0\\" name.ref=\\"swing\\" frameLength=\\"1440.0\\" loop=\\"true\\"/>\\n  </rubatoMap>\\n</dated>

In the rubatoMap, element style must be used first to indicate the style to look for the rubato definition rubatoDef. The first rubato element takes the \\"swing\\" definition from style \\"Henry\\" and applies it repeatedly beginning at symbolic date 0.0. At date 45600.0 the same rubato definition is used but with a change of frame length. This shows that all attributes from the rubatoDef can be overwritten by local attributes at the rubato element. A typical application scenario for this mechanism is to predefine a basic rubato that is obtained by several parts but each with a slight variation, e.g. of intensity.

Asynchrony

In the dated environment, an asynchronyMap can be used to express milliseconds offsets to the timing, as shown in the following example. Positive values delay the timing, negative shift it ahead.

<asynchronyMap>\\n  <asynchrony date=\\"0.0\\" milliseconds.offset=\\"100.0\\"/>\\n  <asynchrony date=\\"34650.0\\" milliseconds.offset=\\"-50.0\\"/>\\n</asynchronyMap>

Further Timing Features

The timing function can be further enriched by single-note offsets (e.g. agogic accents) that are part of the articulation model and effects from ornamentation. Furthermore, MPM offers imprecisionMap.timing to model non-systematic/quasi-random timing fluctuations. This is described in section \\"Randomization\\".

","

Dynamics

The concept of macro and micro features in dynamics is similar to that of timing. Macro dynamics (simply called dynamics in MPM) defines a basic loudness curve while micro dynamics (metrical accentuation, articulation, ornamentation, random imprecision) add deviations to the curve. This additive relation also implies that the micro dynamics features are relative values, the respective sections will expand on this. However, the loudness of a tone is not sufficiently defined by its amplitude. Equally important is its timbre. Loud tones sound loud. The attack phase of a tone’s amplitude envelope influences its loudness perception, too. And even if we focus solely on amplitude, what is the unit of measurement of our values? Consequently, it is important to be aware of what the dynamics values in a particular context should actually express. MPM makes no restrictions in this regard. MPM\'s dynamics values are plain floating point numbers. It is up to the user/application to decide about the feature domain, unit of measurement and scaling.

If MPM is used for expressive performance rendering, most probably in combination with the meico framework that integrates the official MPM API and rendering engine, dynamics values are interpreted as MIDI velocity values. In this case it is important to be aware of the numerical limits of MIDI that reach from 0 to 127. It is up to the sound generators in use, i.e. synthesizers and/or samplers, to create audio and, thus, interpret the dynamics/velocity values. Since this is not standardized, the results can be very different with each sound generator. If the sounding result is unsatisfactory it is not the fault of MIDI or the dynamics values! But it might help to adapt the dynamics values or import the expressive MIDI data in a digital audio workstation where both the MIDI data and the sound generators may be further edited. Regarding the numerical limits of MIDI velocity, the interplay of macro and micro dynamics features may, nonetheless, sometimes go beyond these limits (i.e. below 0 or above 127). The rendering engine will detect these situations and scale down the dynamics range, accordingly. The result should suffice for most cases. Alternatively the dynamics values should be adapted.

Macro Dynamics

MPM\'s macro dynamics defines the basic dynamics curve, including discrete changes (terraced dynamics) and continuous transitions (crescendo, decrescendo). These are defined in the dated environment\'s dynamicsMap. The following code snippet shows a dynamicsMap with three dynamics instructions. It starts with a volume level of 80.0. At date 14400.0 we see a terraced dynamics change from 80.0 to 50.0. However, this second dynamics instruction does not remain constant as it actually defines a crescendo from 50.0 to 115.0 starting at date 14400.0 and ending right before the subsequent dynamics instruction at date 164520.0. That third dynamics instruction defines a constant dynamics level of 80.0, just as the first instruction did. Hence, we have a crescendo followed by \\"subito 80.0\\".

<dynamicsMap>\\n  <dynamics date=\\"0.0\\" volume=\\"80.0\\"/>\\n  <dynamics date=\\"14400.0\\" volume=\\"50.0\\" transition.to=\\"115.0\\" curvature=\\"0.3\\" protraction=\\"0.5\\" subNoteDynamics=\\"true\\"/>\\n  <dynamics date=\\"164520.0\\" volume=\\"80.0\\"/>\\n</dynamicsMap>

Each continuous dynamics transition should be followed by another dynamics instruction (continuous or constant) as that provides the required end date of the transition. Otherwise the transition would stretch to infinity. The second dynamics instruction sets the optional attribute subNoteDynamics true (default value is false) which expresses that the dynamics transition is performed not only in a note-wise fashion but also within each tone. This feature may not be applicable to, e.g., struck instruments such as piano and harp. Other instruments, however, are able to modulate the dynamics of a held tone, such as the human voice, wind and bowed string instruments. Practical work with sub-note dynamics, esp. when it should be rendered to expressive MIDI/Audio, should consider the following comments and practical hints.

  • Sub-note dynamics is implemented in MIDI different to note-wise dynamics. While the latter is rendered into the velocity attribute of the noteOn events, sub-note dynamics is implemented as a series of channel volume controller events. In non-sub-note dynamics sections these are set to 100 by default. When starting or ending a sub-note dynamics section the controller changes its value instantaneously which creates a clearly audible artifact if there is already a note playing in the respective part. Hence, switching from non-subnote dynamics to sub-note dynamics or vice versa should be done right before the beginning of a note or during a rest, not within a note, to avoid this artifact.
  • If the aforementioned artifact cannot be avoided (often because a tone\'s release phase reaches beyond the date where the sub-note dynamics are switched on/off) it often helps to keep the sub-note dynamics switched on even on a constant dynamics instruction.
  • The previous hint is also useful if the music ends with sub-note dynamics (e.g. a decrescendo on the final chord). This is also the case in the above example code. At the end of the music the channel volume slider is set to 100 again. If this happens while the tone\'s release phase is still running, you will hear the artifact again. The workaround is to delay this switch. For this, copy the final dynamics element and add some time to the copy\'s date. It should be enough for the tone to fade out (e.g. a quarter note) which depends on the sounds you are using. Next set the original (former last) dynamics instruction\'s subNoteDynamics true.
  • Be aware that metrical accentuation and articulation add on top of dynamics, this means that a continuous crescendo or decrescendo (even with sub-note dynamics) is not necessarily smooth as far as it incorporates fluctuations originating from these domains. If your intention is to produce a smooth dynamics curve over several tones, then diminish other influences. In addition, depending on the sound generation in use, the tones\' amplitude envelope adds another layer of dynamics fluctuations. Some synthesizers and samplers allow switching to a legato articulation (on the synthesis level, not to confuse with MPM\'s articulation) which creates much smoother results. As synthesizers handle this quite differently and are often very special with this, it is beyond the scope of MPM and its official rendering engine.

The shape of continuous dynamics transitions can be further refined by attributes curvature and protraction. Attribute curvature is defined in the interval [0.0, 1.0] and indicates a distinct sigmoidal (S) shape of the dynamics curve (value > 0.0) or a straight linear transition (value = 0.0). The higher the value the more accentuated is the transition. Attribute protraction is defined in the interval [-1.0, 1.0] and indicates whether the transition comes relatively early (value < 0.0), relatively late (value > 0.0) or is equally shared between first and second half of the interval between date and the subsequent dynamics instruction\'s date. The mathematical model to construct dynamics curves translates these attributes into cubic Bézier curves as shown in the following figures.

Continuous dynamics transitions are constructed from cubic Bézier curves (dashed lines are the control polygon). Their shape is specified by attributes curvature and protraction. Symbolic time is represented on the x-axis; the dynamics value on the y-axis.

Attributes volume and transition.to are not restricted to purely numeric values. It is also possible to use literals such as \\"pp\\", \\"mf\\", \\"forte\\", \\"as loud as possible\\". These literals must be associated with a numeric value in the header\'s dynamicsStyles environment as shown below.

<header>\\n  <dynamicsStyles>\\n    <styleDef name=\\"Karajan\\">\\n      <dynamicsDef name=\\"p\\" value=\\"30.0\\"/>\\n      <dynamicsDef name=\\"f\\" value=\\"95.0\\"/>\\n      <dynamicsDef name=\\"ff\\" value=\\"122.0\\"/>\\n    </styleDef>\\n    <styleDef name=\\"Rattle\\">\\n      <dynamicsDef name=\\"p\\" value=\\"26.0\\"/>\\n      <dynamicsDef name=\\"f\\" value=\\"101.0\\"/>\\n      <dynamicsDef name=\\"ff\\" value=\\"125.0\\"/>\\n    </styleDef>\\n  </dynamicsStyles>\\n</header>\\n<dated>\\n  <dynamicsMap>\\n    <style date=\\"0.0\\" name.ref=\\"Rattle\\"/>\\n    <dynamics date=\\"0.0\\" volume=\\"f\\" transition.to=\\"p\\" protraction=\\"0.8\\"/>\\n    <dynamics date=\\"32000\\" volume=\\"p\\" transition.to=\\"105.0\\"/>\\n    <dynamics date=\\"47000.0\\" volume=\\"ff\\"/>\\n  </dynamicsMap>\\n</dated>

The third dynamics instruction shows that literals and numeric values can be mixed. The preceding style element is mandatory to make clear which dynamics style should be used.

Metrical Accentuation

Metrical and rhythmical structure often suggest specific accentuation patterns that recur usually measure-wise. They render the distinction between \\"weak\\" beats and \\"strong\\" beats, the perceptual grouping of pulses according to a metrical and rhythmical structure. Such an accentuation pattern specifies the contour of deviations from the underlying macro dynamics curve. In MPM accentuation patterns are defined in the header environment\'s metricalAccentuationStyles. Their application at a specific position in the music takes place in the dated environment\'s metricalAccentuationMap.

<header>\\n  <metricalAccentuationStyles>\\n    <styleDef name=\\"my accentuation patterns\\">\\n      <accentuationPatternDef name=\\"quad time\\" length=\\"4.0\\">\\n        <accentuation beat=\\"1\\" value=\\"1.0\\" transition.from=\\"0.0\\" transition.to=\\"0.25\\"/>\\n        <accentuation beat=\\"2.5\\" value=\\"0.5\\" transition.from=\\"-0.5\\" transition.to=\\"-1\\"/>\\n        <accentuation beat=\\"4\\" value=\\"0.5\\" transition.from=\\"0.0\\" transition.to=\\"1.0\\"/>\\n      </accentuationPatternDef>\\n      <accentuationPatternDef name=\\"triple time\\" length=\\"3.0\\">\\n        <accentuation beat=\\"1.0\\" value=\\"1.0\\" transition.from=\\"1.0\\" transition.to=\\"0.0\\"/>\\n        <accentuation beat=\\"2.0\\" value=\\"0.5\\" transition.from=\\"0.5\\" transition.to=\\"-1.0\\"/>\\n        <accentuation beat=\\"3.0\\" value=\\"0.0\\" transition.from=\\"0.0\\" transition.to=\\"1.0\\"/>\\n      </accentuationPatternDef>\\n    </styleDef>\\n  </metricalAccentuationStyles>\\n</header>\\n<dated>\\n  <metricalAccentuationMap>\\n    <style date=\\"0.0\\" name.ref=\\"my accentuation patterns\\"/>\\n    <accentuationPattern date=\\"0.0\\" name.ref=\\"quad time\\" scale=\\"50.0\\" loop=\\"true\\" stickToMeasures=\\"true\\"/>\\n  </metricalAccentuationMap>\\n</dated>

The above code example defines two accentuation patterns, \\"quad time\\" and \\"triple time\\" and applies the former in the metricalAccentuationMap. Element accentuationPattern\'s attribute loop (false by default) indicates that the pattern is repeatedly applied. Attribute stickToMeasures (true by default) says that the pattern starts anew with each measure, even if the measure is shorter than the pattern\'s length, and will not loop within the same measure. This behavior can be deactivated by setting stickToMeasures false.

Of key importance for the interpretation of accentuation patterns is attribute scale because the patterns\' accentuations are defined in the range [-1.0, 1.0] and need to be scaled up to actual dynamics values. In the above example, the actual dynamics range is set to [-50.0, 50.0] by attribute scale. This means that the maximum accentuation (1.0 in the accentuationPatternDef/accentuation/value) is scaled to 50.0 and the maximum restraint (-1.0) is actually scaled to -50.0.

Let us have a closer look at the definition of metrical accentuation patterns in element accentuationPatternDef. The element itself defines a name that is referred in the metricalAccentuationMap and the length of the pattern in musical beats. Pattern \\"quad time\\" is 4.0 beats long and \\"triple time\\" 3.0 beats. The length of a beat is defined by the time signature\'s denominator at the musical position where the pattern is applied. The child elements of accentuationPatternDef define each an individual accentuation, i.e., a dynamics change (attribute value in [-1.0, 1.0]) at a the specified beat position. If nothing else is given, this accentuation level will also be used for all notes that might occur between this beat and the subsequent accentuation\'s beat position. Often, however, this should be accentuated different than the beat itself. Therefore, attributes transition.from and transition.to are used. Here, we have the following options, also illustrated in the figures below.

    value is specified, nothing else
  • The accentuation level will be used for all notes that might occur between this and the next accentuation (see subfigure 1).
  • value and transition.from are specified
  • For all notes between this and the next accentuation, their accentuation levels are set to a constant accentuation level of transition.from. Only the notes that are placed exactly at the beat position are accentuated with value (see subfigure 2).
  • value and transition.to are specified
  • For all notes between this and the next accentuation, their accentuation levels are linearly interpolated from value to transition.to (see subfigure 3).
  • value, transition.from and transition.to are specified
  • For all notes between this and the next accentuation, their accentuation levels are linearly interpolated from transition.from to transition.to. Only the notes that are placed exactly at the beat position are accentuated with value (see subfigure 4).
Some example accentuation patterns with varying combinations of attributes value, transition.from and transition.to. See the above list for details.

By the way, beat does not have to be integer. Accentuations can also be defined for positions between integer beat positions. And not every beat needs to have an accentuation.

Further Dynamics Features

The musical dynamics can be further enriched by articulation, ornamentation and non-systematic/quasi-random timing fluctuations via imprecisionMap.dynamics (as is described in section \\"Randomization\\").

","

Articulation

An articulation shapes a tone. While the note symbol gives only rough information about how the corresponding tone should be played (pitch and rhythmical indication) articulations provide information about how the tone is shaped in terms of duration, dynamics, timing, and tuning. In contrast to all other performance features in MPM, articulations are discrete, i.e. an articulation instruction does not span over a certain time frame. It takes effect only at the symbolic time position where it is positioned in the articulationMap and only on those notes that are placed at this same date. An articulation that does not coincide with a note has no effect.

Note Association

The articulationMap, just as all maps in MPM, is child of the dated environment. Let us start with the following incomplete code snippet.

<articulationMap>\\n  <articulation date=\\"0.0\\"/>\\n  <articulation date=\\"720.0\\" noteid=\\"#2358d\\"/>\\n</articulationMap>

This map has two articulation instructions. Yet, they do nothing but we will add more information soon. The first articulation affects all notes in its scope at symbolic date 0.0. If the map is in the global environment, it affects all notes of all parts at this time position. If it is in a part environment, then it affects only notes of this particular part. The second instruction uses a further attribute, noteid, to make sure that only one particular note will be affected, even if further notes occur at the same date.

Modifiers

Articulations are defined by modifiers. These affect the properties of a note-tone mapping. The following list gives an overview of the modifiers that MPM currently includes.

    absoluteDuration
  • Set the absolute duration of the note (in symbolic time).
  • absoluteDurationChange
  • Change the absolute duration of the note by the specified value (in symbolic time).
  • relativeDuration
  • Change the duration of the note relatively to its initial value. E.g. a value of 0.5 halves the duration.
  • absoluteDurationMs
  • Set the absolute duration of the note (in milliseconds).
  • absoluteDurationChangeMs
  • Change the absolute duration of the note by the specified value (in milliseconds).
  • absoluteDelay
  • Delay the note by the specified value (in symbolic time).
  • absoluteDelayMs
  • Delay the note by the specified value (in milliseconds).
  • absoluteVelocity
  • Set the absolute velocity of a note. The underlying macro dynamics and metrical accentuation are ignored.
  • relativeVelocity
  • Change the velocity of a note relative to its initial velocity. E.g., a value of 0.5 halves the velocity.
  • absoluteVelocityChange
  • Change the velocity (that derives from macro dynamics and metrical accentuation) of a note by the specified absolute amount.
  • detuneCents
  • Change a note\'s tuning by the specified amount in cents.
  • detuneHz
  • Change a note\'s tuning by the specified amount in Hertz.

An articulation element can apply any combination of modifiers.

<articulation date=\\"6570.0\\" relativeDuration=\\"0.4\\" absoluteDelayMs=\\"14.0\\" absoluteVelocityChange=\\"-21.0\\"/>\\n<articulation date=\\"7850.0\\" noteid=\\"#note05821\\" absoluteDurationChangeMs=\\"40.0\\" detuneCents=\\"-13.0\\"/>\\n<articulation date=\\"8765.0\\" relativeDuration=\\"0.5\\" absoluteDurationChange=\\"3.0\\" absoluteDurationChangeMs=\\"-10.0\\"/>

Some of these modifiers affect the same domain and may conflict. Thus it is useful to know the sequence in which the performance rendering engine applies them. The official MPM rendering engine in meico does the following sequence.

  • macro dynamics
  • metrical accentuation
  • absoluteDelay
  • absoluteDuration
  • relativeDuration
  • absoluteDurationChange
  • absoluteVelocity
  • relativeVelocity
  • absoluteVelocityChange
  • ornamentation (dynamics and non-milliseconds modifiers)
  • at this point all timing computations are done (see section Timing), except for the randomization
  • absoluteDelayMs
  • absoluteDurationMs
  • absoluteDurationChangeMs
  • ornamentation (milliseconds modifiers)
  • randomizations

The non-milliseconds duration modifiers are omitted if absoluteDurationMs is specified as this will overwrite them anyway. The detune modifiers are not yet supported by the official rendering engine, hence, they do not occur in the sequence so far. Randomizations are applied at the end of the performance rendering pipeline. This includes timing, dynamics and duration randomization.

Articulation Styles

Articulations can be predefined in the header/articulationStyles environment and invoked by element articulation via attribute name.ref. The following example code shows the definition of an articulation style and its application in the articulationMap.

<header>\\n  <articulationStyles>\\n    <styleDef name=\\"Peterson\\">\\n      <articulationDef name=\\"accent\\" absoluteVelocityChange=\\"25.0\\"/>\\n      <articulationDef name=\\"breath\\" absoluteDurationChangeMs=\\"-400.0\\" absoluteVelocityChange=\\"-5.0\\"/>\\n      <articulationDef name=\\"legatissimo\\" absoluteDurationChangeMs=\\"250.0\\"/>\\n      <articulationDef name=\\"legato\\" relativeDuration=\\"1.0\\"/>\\n      <articulationDef name=\\"legatostop\\" relativeDuration=\\"0.8\\" relativeVelocity=\\"0.7\\"/>\\n      <articulationDef name=\\"marcato\\" relativeDuration=\\"0.8\\" absoluteVelocityChange=\\"25.0\\"/>\\n      <articulationDef name=\\"nonlegato\\" relativeDuration=\\"0.95\\"/>\\n      <articulationDef name=\\"pizzicato\\" absoluteDuration=\\"1.0\\"/>\\n      <articulationDef name=\\"portato\\" relativeDuration=\\"0.8\\"/>\\n      <articulationDef name=\\"sforzato\\" absoluteVelocity=\\"127.0\\" relativeDuration=\\"0.8\\"/>\\n      <articulationDef name=\\"snap pizzicato\\" absoluteDuration=\\"1.0\\" absoluteVelocityChange=\\"25.0\\"/>\\n      <articulationDef name=\\"spiccato\\" absoluteDurationMs=\\"140.0\\" absoluteVelocityChange=\\"25.0\\"/>\\n      <articulationDef name=\\"staccato\\" absoluteDurationMs=\\"160.0\\" absoluteVelocityChange=\\"-5.0\\"/>\\n      <articulationDef name=\\"staccatissimo\\" absoluteDurationMs=\\"140.0\\" absoluteVelocityChange=\\"5.0\\"/>\\n      <articulationDef name=\\"tenuto\\" relativeDuration=\\"0.9\\" absoluteVelocityChange=\\"12.0\\"/>\\n    </styleDef>\\n  </articulationStyles>\\n</header>\\n<dated>\\n  <articulationMap>\\n    <style date=\\"0.0\\" name.ref=\\"Peterson\\" defaultArticulation=\\"nonlegato\\"/>\\n    <articulation date=\\"0.0\\" name.ref=\\"staccato\\"/>\\n    <articulation date=\\"3450.0\\" name.ref=\\"legato\\"/>\\n    <articulation date=\\"3450.0\\" noteid=\\"#note04706\\" name.ref=\\"accent\\"/>\\n    <articulation date=\\"5670.0\\" name.ref=\\"accent\\" absoluteDurationMs=\\"155.0\\"/>\\n    <articulation date=\\"6780.0\\" name.ref=\\"marcato\\" relativeDuration=\\"0.75\\"/>\\n  </articulationMap>\\n</dated>

The first articulation in the above articulationMap sets all notes at date 0.0 \\"staccato\\". The second sets all notes at date 3450.0 legato. The third articulation adds an \\"accent\\" to one particular note at the same date. This shows that articulations can be combined by placing multiple articulation elements at the same date. They are then applied to the notes in the same sequence as they occur in the map. The fourth articulation applies an accent to all notes at date 5670.0 and additionally changes their milliseconds duration. This way it is possible to add and overwrite properties of a predefined articulation, as is done again in the fifth articulation element.

Before the articulation names can be used it is necessary to indicate the style to retrieve the corresponding articulation definitions. Therefore, a style element must be placed in the articulationMap before the first use of predefined articulations. The style element in the articulation context features an additional optional attribute defaultArticulation. If it is not specified, all notes that are not affected by an articulation remain unaltered. If defaultArticulation is specified (again by referencing to an articulationDef\'s name), this articulation definition will be applied to all the notes that are not affected by an articulation element.

","

Ornamentation

Musical ornamentation and embellishment is a complex conglomeration of effects to the music. It may affect the way a group of events/notes are played or alter their chronological sequence (e.g. through arpeggiations). It might add further notes (e.g. grace notes and passing notes) or even replace the musical material. The current state of research is still rather fragmented and far away from a cohesive, theoretical model. Therefore, MPM\'s ornamentation section is yet very basic and desires substantial extensions with future in-depth research. In MPM, an ornament is defined by a series of transformations. These describe how the musical material, that it is applied to, is altered. The following transformations are currently available.

    temporalSpread
  • This transformer offsets the notes at a given time by a certain amount defined by a power function. The offset window starts at initial date - frame.start and it ends at initial date - frame.start + frameLength. The unit of these offsets can be \\"ticks\\" (default) or \\"milliseconds\\", as specified by time.unit. The notes will be distributed over this time frame, just as with an arpeggiated chord. Their placement can be further refined by intensity which sets the course of a power function (default is 1.0 for an equidistant placement). The offset of the notes can get further treatment via noteoff.shift. By default, the offset remains at its initial date, so the notes end at he same time as before the offset. Setting noteoff.shift true shifts the offset by the same amount as the note\'s onset. If noteoff.shift is set \\"monoponic\\" the notes are played sequentially and non-overlapping.
  • dynamicsGradient
  • This transformer adds dynamics to an ornament. Following the same concept as metrical accentuation this can feature a constant or linear course, specified by transition.from and transition.to, both in [-1.0, 1.0] where 1.0 means maximum accentuation and -1.0 maximum restraint.
Defining arpeggio ornaments with MPM\'s ornamentation transformers temporalSpread and dynamicsGradient. The modelling of arpeggios is more deeply discussed in this issue.

As ornaments can become relatively complex, they are generally defined in the header\'s ornamentationStyles and referenced in the ornamentationMap. In the following code example we define \\"arpeggio\\" in two styles and apply one via ornament in the ornamentationMap.

<header>\\n  <ornamentationStyles>\\n    <styleDef name=\\"my style\\">\\n      <ornamentDef name=\\"arpeggio\\">\\n        <dynamicsGradient transition.from=\\"-1.0\\" transition.to=\\"1.0\\"/>\\n        <temporalSpread frame.start=\\"-22.0\\" frameLength=\\"44.0\\"/>\\n      </ornamentDef>\\n      <styleDef name=\\"your style\\">\\n        <ornamentDef name=\\"arpeggio\\">\\n          <dynamicsGradient transition.from=\\"0.5\\" transition.to=\\"-1.0\\"/>\\n          <temporalSpread frame.start=\\"0.0\\" frameLength=\\"300.0\\" time.unit=\\"milliseconds\\" intensity=\\"0.5\\" noteoff.shift=\\"false\\"/>\\n        </ornamentDef>\\n      </styleDef>\\n    </styleDef>\\n  </ornamentationStyles>\\n</header>\\n<dated>\\n  <ornamentationMap>\\n    <style date=\\"0.0\\" name.ref=\\"your style\\"/>\\n    <ornament date=\\"4860.0\\" name.ref=\\"arpeggio\\" scale=\\"10.0\\" note.order=\\"#n96 #n97 #n98\\"/>\\n  </ornamentationMap>\\n</dated>

In element ornament attribute scale (optional, default value is 0.0) has the same function as in accentuationPattern, it scales the ornament\'s dynamics gradient to loudness/velocity values. With note.order (optional) we can specify which notes in the current scope are part of the ornament and in which sequence. Possible values are \\"ascending pitch\\" (order all notes at date by increasing pitch), \\"descending pitch\\" (opposite of \\"ascending pitch\\"), or a space separated list of note ID references as in the above code example.

","

Randomization

Anyone who has ever tried to analyze a musical performance by measuring the audio recording knows that quite a substantial amount of variations in timing, dynamics etc. exhibits a rather unsystematic behavior, or a behavior that cannot (yet) be traced back to systematic reasons. This can hardly be emulated by the feature models described so far. On the one hand, this is an interesting indication that can help musical performance researchers to identify new and relevant research questions, investigate these phenomena systematically and develop new models that might be future additions to MPM (see the contributing guidelines). On the other hand, MPM needs to provide a way to recreate these phenomena now, at least in an approximate fashion, for those who simply want to create rich expressive performances for their music production.

This is the point where \\"humanizing\\" comes into play. In music production so far, humanizers are almost exclusively applied to the timing domain. A humanizer shakes up, i.e. randomizes, the timing of the musical events so they are played less precise. MPM goes further. Randomization can be applied not only to the timing domain but also to dynamics, tone duration and tuning. Moreover, MPM offers a variety of different stochastic models to shape the randomizations in a number of ways. Randomization is the last step in the performance rendering pipeline, added after computing all other features. This also implies that it is a micro feature, i.e. it does not set absolute values but adds deviations.

Stochastic Models

MPM provides the following stochastic models.

    Uniform Distribution
  • This defines a uniform distribution within the specified limits (inclusive). \\n
    <distribution.uniform date=\\"0.0\\" limit.lower=\\"-10.0\\" limit.upper=\\"10.0\\"/>
  • Gaussian Distribution
  • This defines a gaussian distribution. Its expectation value is 0.0. Attributes limit.lower and limit.upper are used to clip the range of random values.\\n
    <distribution.gaussian date=\\"0.0\\" limit.lower=\\"-10.0\\" limit.upper=\\"10.0\\" deviation.standard=\\"3.0\\"/>
  • Triangular Distribution
  • This defines a triangular distribution. The lower and upper limit of the triangular distribution are set by attributes limit.lower and limit.upper. The peak of the triangular distribution is set by attribute mode. Attribute mode does not have to be perfectly centered between the limits, hence, triangular distribution is well suited to create and approximate skewed distributions. Attributes clip.lower and clip.upper can be used to narrow the output range even further, i.e. values outside the clipping window are set to the closest clipping border.\\n
    <distribution.triangular date=\\"0.0\\" mode=\\"0.0\\" limit.lower=\\"-1.0\\" limit.upper=\\"1.0\\" clip.lower=\\"-0.7\\" clip.upper=\\"0.6\\"/>
  • Brownian Noise Distribution
  • This defines a correlated distribution based on Brownian noise. An intuitive explanation of Brownian noise in MPM is the random walk in 1D. Suppose at time position t we have a random value x. The next time position is at t+milliseconds.timingBasis. The value at this position is determined by making a random step starting at x. The step width is delimited by stepWidth.max. Thus, possible values are in the interval [x-stepWidth.max, x+stepWidth.max] and further delimited by limit.lower and limit.upper. The fact that the value range at any iteration depends on the values of previous iterations makes this a correlated distribution.\\n
    <distribution.correlated.brownianNoise date=\\"0.0\\" limit.lower=\\"-1.0\\" limit.upper=\\"1.0\\" stepWidth.max=\\"400.0\\" milliseconds.timingBasis=\\"300.0\\"/>
  • Compensating Triangle Distribution
  • This defines a Compensating Triangle Distribution, a correlated distribution based on triangular distribution. The difference to triangular distribution is that, before computing the next value in the random number series, the mode (the triangle\'s peak) is placed at the position of the last random value. If degreeOfCorrelation = 1.0, the triangle\'s lower and upper edge are fixed at limit.lower and limit.upper. The greater degreeOfCorrelation, the narrower is the triangle while wandering around between the limits. This stochastic model has been developed to simulate a specific phenomenon, especially relevant to timing imprecision in ensemble play: If a musician is far off, the probability increases that he/she notices it and tries to synchronize again. This implies an unsymmetrical distribution function that Brownian noise does not have. With Brownian noise the musician can be far off for quite a long time as if he/she does not listen to the rest of the ensemble. The Compensating Triangle Distribution enhances this by simulating an increased chance of compensating behavior the more the random walk gets off the center of the distribution range.\\n
    <distribution.correlated.compensatingTriangle date=\\"0.0\\" limit.lower=\\"-80.0\\" limit.upper=\\"80.0\\" clip.lower=\\"-80.0\\" clip.upper=\\"80.0\\" degreeOfCorrelation=\\"4.0\\" milliseconds.timingBasis=\\"300.0\\"/>
  • Distribution List
  • Distribution lists are deterministic alternatives to stochastic distributions. A distribution list defines a list of static values which are used instead of a random number series. A typical scenario for the use of a distribution list is the following. During timing analysis of a music recording we already created a global tempoMap and a local rubatoMap for a musician. But there are still timing offsets left that we cannot explain systematically. We put these offsets into a distribution list for further analysis and to reproduce them during performance rendering. It is important to set the timing basis just as fine as necessary as these lists can become very long.\\n
    <distribution.list date=\\"0.0\\" milliseconds.timingBasis=\\"300.0\\">\\n  <measurement value=\\"2.7\\"/>\\n  <measurement value=\\"6.67\\"/>\\n  <measurement value=\\"10.45\\"/>\\n  <measurement value=\\"-7.13\\"/>\\n  <measurement value=\\"3.2\\"/>\\n  <measurement value=\\"-2.63\\"/>\\n  <measurement value=\\"-8.4\\"/>\\n  <measurement value=\\"6.0\\"/>\\n  <!-- ... -->\\n</distribution.list>

Attribute milliseconds.timingBasis (used by distribution.correlated.brownianNoise, distribution.correlated.compensatingTriangle and distribution.list) can be understood as the rate (in milliseconds) at which new random values are generated. Except for the distribution list model, all other models support seeding by specifying attribute seed. It allows the user to set the seed value for the random distributions. Initialized with this seed, a random number generator generates always the same series of \\"random\\" numbers. Thus, by using the seed attribute the imprecisions become reproducible.

Application Example: Building a Basic Humanizer

Let us build a performance that can be used to add humanizing/randomization to any music it is applied to. Since it is not made for a particular piece of music we do not know how many parts it has. The randomizations should apply to all parts anyway, thus, we place them in the global environment, the part elements are not needed in this example. Randomizations are organized in so-called imprecision maps, i.e. chronologically sorted lists of imprecision instructions. Hence, they are children of the dated environment. Four types of imprecision maps do exist, imprecisionMap.timing, imprecisionMap.dynamics, imprecisionMap.toneduration, imprecisionMap.tuning. The latter is not yet supported by the official performance rendering engine in meico, so we leave it out. Any of the above distribution elements can be placed in the imprecision maps.

For timing we highly recommend using a correlated distribution type because uncorrelated deviations tend to produce implausible rhythmic stumbling. In this example we use distribution.correlated.compensatingTriangle as it best imitates the behavior described above. Attribute milliseconds.timingBasis is set to 300.0 milliseconds. This is approximately the timeframe a human needs to adapt his/her motor program to a stimulus such as \\"I am off.\\" We allow them to be off by up to +/-80 milliseconds.

For dynamics we use an uncorrelated distribution in this example because we regard each tone being a new independent effort of force. The stroke velocity of a key on the piano, a string on the guitar, or the blowing pressure of a wind instrument, all these may, for the sake of this example, be regarded as independent of the preceding tones. Be aware that this is not a general statement. We use a Gaussian distribution with a standard deviation of 7.5 dynamics units (here MIDI velocity) and limit the range of random dynamics deviations by +/-50.0. This means that we allow the virtual musicians to play the tones up to 50.0 (MIDI velocity) units softer or louder than the perfect dynamics.

Imprecision in the tone duration domain may also be regarded as uncorrelated. Intuitively speaking, the fact that a musician played the previous tone too short or too long has no influence on the duration of the next tone. For demonstration purposes and as we want to construct a skewed distribution here, we use a triangular distribution. Let us say that we have no polyphonic instruments (piano, organ, guitar etc.) in the music and that the tones of an instrument are not allowed to overlap. Hence, we exclude duration increases, only decreases are allowed. Therefore, we set attribute limit.upper to 0.0 milliseconds and limit.lower to -30.0 milliseconds. To make sure that the perfect duration has, nonetheless, highest probability we set the mode (peak of the triangle) to 0.0 milliseconds.

<performance name=\\"humanizer\\" pulsesPerQuarter=\\"720\\">\\n  <global>\\n    <header/>\\n    <dated>\\n      <imprecisionMap.timing>\\n        <distribution.correlated.compensatingTriangle date=\\"0.0\\" degreeOfCorrelation=\\"4.0\\" limit.lower=\\"-80.0\\" limit.upper=\\"80.0\\" clip.lower=\\"-80.0\\" clip.upper=\\"80.0\\" milliseconds.timingBasis=\\"300.0\\"/>\\n      </imprecisionMap.timing>\\n      <imprecisionMap.dynamics>\\n        <distribution.gaussian date=\\"0.0\\" deviation.standard=\\"7.5\\" limit.lower=\\"-15.0\\" limit.upper=\\"15.0\\"/>\\n      </imprecisionMap.dynamics>\\n      <imprecisionMap.toneduration>\\n        <distribution.triangular date=\\"0.0\\" limit.lower=\\"-30.0\\" limit.upper=\\"0.0\\" mode=\\"0.0\\" clip.lower=\\"-30.0\\" clip.upper=\\"0.0\\"/>\\n      </imprecisionMap.toneduration>\\n    </dated>\\n  </global>\\n</performance>

Applying this performance to a piece of music (the easiest way is to use MPM Toolbox or the meico app) will add the above randomizations to all musical parts. These imprecision maps may also be added to other performances. When working on a performance for a particular piece of music it is advisable to have a closer look into the parts and create part-specific imprecision maps. If a musical section is very difficult to play, why not increasing the variance of the corresponding distribution during this section? Or do you want to simulate an ensemble with an inattentive flute player? Then let this flute player perform less precise than the rest of the ensemble. You can contrast an ensemble of professionals that play well together and a less experienced amateur ensemble.

"]}')},105:function(e,t,n){e.exports=n(106)},106:function(e,t,n){"use strict";n.r(t),function(e){n(41),n(30),n(48),n(34),n(35),n(51);var t=n(25),o=(n(36),n(117),n(5)),r=(n(65),n(66),n(37),n(15),n(68),n(38),n(92),n(121),n(129),n(131),n(1)),l=n(99),c=n(72),d=n(0),m=n(12),h=n(103),f=n(57);function y(e,t){var n;if("undefined"==typeof Symbol||null==e[Symbol.iterator]){if(Array.isArray(e)||(n=function(e,t){if(!e)return;if("string"==typeof e)return v(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return v(e,t)}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var i=0,o=function(){};return{s:o,n:function(){return i>=e.length?{done:!0}:{done:!1,value:e[i++]}},e:function(e){throw e},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var r,l=!0,c=!1;return{s:function(){n=e[Symbol.iterator]()},n:function(){var e=n.next();return l=e.done,e},e:function(e){c=!0,r=e},f:function(){try{l||null==n.return||n.return()}finally{if(c)throw r}}}}function v(e,t){(null==t||t>e.length)&&(t=e.length);for(var i=0,n=new Array(t);i2?t-2:0),o=2;o1&&void 0!==arguments[1]?arguments[1]:x,n=arguments.length>2?arguments[2]:void 0;return w.call(this,e,t,n)},l.a.use(y.a);var M={mode:"history",base:decodeURI("/MPM/"),linkActiveClass:"nuxt-link-active",linkExactActiveClass:"nuxt-link-exact-active",scrollBehavior:function(e,t,n){var o=!1,r=Object(v.g)(e);(r.length<2&&r.every((function(e){return!1!==e.options.scrollToTop}))||r.some((function(e){return e.options.scrollToTop})))&&(o={x:0,y:0}),n&&(o=n);var l=window.$nuxt;return e.path===t.path&&e.hash!==t.hash&&l.$nextTick((function(){return l.$emit("triggerScroll")})),new Promise((function(t){l.$once("triggerScroll",(function(){if(e.hash){var n=e.hash;void 0!==window.CSS&&void 0!==window.CSS.escape&&(n="#"+window.CSS.escape(n.substr(1)));try{document.querySelector(n)&&(o={selector:n})}catch(e){console.warn("Failed to save scroll position. Please add CSS.escape() polyfill (https://github.com/mathiasbynens/CSS.escape).")}}t(o)}))}))},routes:[{path:"/docs",component:function(){return Object(v.m)(n.e(2).then(n.bind(null,151)))},name:"docs"},{path:"/guidelines",component:function(){return Object(v.m)(n.e(3).then(n.bind(null,152)))},name:"guidelines"},{path:"/",component:function(){return Object(v.m)(n.e(4).then(n.bind(null,153)))},name:"index"}],fallback:!1};function T(){return new y.a(M)}var D={name:"NuxtChild",functional:!0,props:{nuxtChildKey:{type:String,default:""},keepAlive:Boolean,keepAliveProps:{type:Object,default:void 0}},render:function(e,t){var n=t.parent,data=t.data,o=t.props,r=n.$createElement;data.nuxtChild=!0;for(var l=n,c=n.$nuxt.nuxt.transitions,d=n.$nuxt.nuxt.defaultTransition,m=0;n;)n.$vnode&&n.$vnode.data.nuxtChild&&m++,n=n.$parent;data.nuxtChildDepth=m;var h=c[m]||d,f={};k.forEach((function(e){void 0!==h[e]&&(f[e]=h[e])}));var y={};O.forEach((function(e){"function"==typeof h[e]&&(y[e]=h[e].bind(l))}));var v=y.beforeEnter;if(y.beforeEnter=function(e){if(window.$nuxt.$nextTick((function(){window.$nuxt.$emit("triggerScroll")})),v)return v.call(l,e)},!1===h.css){var x=y.leave;(!x||x.length<2)&&(y.leave=function(e,t){x&&x.call(l,e),l.$nextTick(t)})}var w=r("routerView",data);return o.keepAlive&&(w=r("keep-alive",{props:o.keepAliveProps},[w])),r("transition",{props:f,on:y},[w])}},k=["name","mode","appear","css","type","duration","enterClass","leaveClass","appearClass","enterActiveClass","enterActiveClass","leaveActiveClass","appearActiveClass","enterToClass","leaveToClass","appearToClass"],O=["beforeEnter","enter","afterEnter","enterCancelled","beforeLeave","leave","afterLeave","leaveCancelled","beforeAppear","appear","afterAppear","appearCancelled"],C={name:"NuxtError",props:{error:{type:Object,default:null}},computed:{statusCode:function(){return this.error&&this.error.statusCode||500},message:function(){return this.error.message||"Error"}},head:function(){return{title:this.message,meta:[{name:"viewport",content:"width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no"}]}}},P=(n(145),n(19)),I=Object(P.a)(C,(function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"__nuxt-error-page"},[n("div",{staticClass:"error"},[n("svg",{attrs:{xmlns:"http://www.w3.org/2000/svg",width:"90",height:"90",fill:"#DBE1EC",viewBox:"0 0 48 48"}},[n("path",{attrs:{d:"M22 30h4v4h-4zm0-16h4v12h-4zm1.99-10C12.94 4 4 12.95 4 24s8.94 20 19.99 20S44 35.05 44 24 35.04 4 23.99 4zM24 40c-8.84 0-16-7.16-16-16S15.16 8 24 8s16 7.16 16 16-7.16 16-16 16z"}})]),e._v(" "),n("div",{staticClass:"title"},[e._v(e._s(e.message))]),e._v(" "),404===e.statusCode?n("p",{staticClass:"description"},[n("NuxtLink",{staticClass:"error-link",attrs:{to:"/"}},[e._v("Back to the home page")])],1):e._e(),e._v(" "),e._m(0)])])}),[function(){var e=this.$createElement,t=this._self._c||e;return t("div",{staticClass:"logo"},[t("a",{attrs:{href:"https://nuxtjs.org",target:"_blank",rel:"noopener"}},[this._v("Nuxt.js")])])}],!1,null,null,null).exports,A=(n(34),n(35),n(98),n(39)),S={name:"Nuxt",components:{NuxtChild:D,NuxtError:I},props:{nuxtChildKey:{type:String,default:void 0},keepAlive:Boolean,keepAliveProps:{type:Object,default:void 0},name:{type:String,default:"default"}},errorCaptured:function(e){this.displayingNuxtError&&(this.errorFromNuxtError=e,this.$forceUpdate())},computed:{routerViewKey:function(){if(void 0!==this.nuxtChildKey||this.$route.matched.length>1)return this.nuxtChildKey||Object(v.c)(this.$route.matched[0].path)(this.$route.params);var e=Object(A.a)(this.$route.matched,1)[0];if(!e)return this.$route.path;var t=e.components.default;if(t&&t.options){var n=t.options;if(n.key)return"function"==typeof n.key?n.key(this.$route):n.key}return/\/$/.test(e.path)?this.$route.path:this.$route.path.replace(/\/$/,"")}},beforeCreate:function(){l.a.util.defineReactive(this,"nuxt",this.$root.$options.nuxt)},render:function(e){var t=this;return this.nuxt.err?this.errorFromNuxtError?(this.$nextTick((function(){return t.errorFromNuxtError=!1})),e("div",{},[e("h2","An error occured while showing the error page"),e("p","Unfortunately an error occured and while showing the error page another error occured"),e("p","Error details: ".concat(this.errorFromNuxtError.toString())),e("nuxt-link",{props:{to:"/"}},"Go back to home")])):(this.displayingNuxtError=!0,this.$nextTick((function(){return t.displayingNuxtError=!1})),e(I,{props:{error:this.nuxt.err}})):e("NuxtChild",{key:this.routerViewKey,props:this.$props})}},R=(n(41),n(48),n(51),{name:"NuxtLoading",data:function(){return{percent:0,show:!1,canSucceed:!0,reversed:!1,skipTimerCount:0,rtl:!1,throttle:200,duration:5e3,continuous:!1}},computed:{left:function(){return!(!this.continuous&&!this.rtl)&&(this.rtl?this.reversed?"0px":"auto":this.reversed?"auto":"0px")}},beforeDestroy:function(){this.clear()},methods:{clear:function(){clearInterval(this._timer),clearTimeout(this._throttle),this._timer=null},start:function(){var e=this;return this.clear(),this.percent=0,this.reversed=!1,this.skipTimerCount=0,this.canSucceed=!0,this.throttle?this._throttle=setTimeout((function(){return e.startTimer()}),this.throttle):this.startTimer(),this},set:function(e){return this.show=!0,this.canSucceed=!0,this.percent=Math.min(100,Math.max(0,Math.floor(e))),this},get:function(){return this.percent},increase:function(e){return this.percent=Math.min(100,Math.floor(this.percent+e)),this},decrease:function(e){return this.percent=Math.max(0,Math.floor(this.percent-e)),this},pause:function(){return clearInterval(this._timer),this},resume:function(){return this.startTimer(),this},finish:function(){return this.percent=this.reversed?0:100,this.hide(),this},hide:function(){var e=this;return this.clear(),setTimeout((function(){e.show=!1,e.$nextTick((function(){e.percent=0,e.reversed=!1}))}),500),this},fail:function(e){return this.canSucceed=!1,this},startTimer:function(){var e=this;this.show||(this.show=!0),void 0===this._cut&&(this._cut=1e4/Math.floor(this.duration)),this._timer=setInterval((function(){e.skipTimerCount>0?e.skipTimerCount--:(e.reversed?e.decrease(e._cut):e.increase(e._cut),e.continuous&&(e.percent>=100||e.percent<=0)&&(e.skipTimerCount=1,e.reversed=!e.reversed))}),100)}},render:function(e){var t=e(!1);return this.show&&(t=e("div",{staticClass:"nuxt-progress",class:{"nuxt-progress-notransition":this.skipTimerCount>0,"nuxt-progress-failed":!this.canSucceed},style:{width:this.percent+"%",left:this.left}})),t}}),L=(n(147),Object(P.a)(R,void 0,void 0,!1,null,null,null).exports),_=(n(149),{name:"app",data:function(){return{version:"",menuOpen:!1}},methods:{toggleMenu:function(){this.menuOpen=!this.menuOpen}},created:function(){var data=n(104);this.version=data.version}}),j=Object(P.a)(_,(function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{attrs:{id:"app"}},[n("header",{staticClass:"font-semibold text-white bg-blue-800"},[n("div",{staticClass:"container pb-12 mx-auto md:hidden"},[n("div",{staticClass:"flex items-center justify-between"},[n("nuxt-link",{attrs:{to:"/"}},[n("svg",{staticClass:"mx-2 mt-2 sm:mx-0",attrs:{width:"196",height:"39",fill:"none",xmlns:"http://www.w3.org/2000/svg"}},[n("path",{attrs:{d:"M11.605 17.095L12.21 39H0V.228h17.105l7.04 20.865h.275L30.525.228h17.654V39H35.474l.385-21.795-.33-.055L28.27 39h-9.24l-7.15-21.905h-.274z",fill:"#fff"}}),e._v(" "),n("path",{attrs:{d:"M59.262 17.095L59.867 39h-12.21V.228h17.105l7.04 20.865h.275L78.182.228h17.654V39H83.132l.385-21.795-.33-.055L75.927 39h-9.24l-7.15-21.905h-.275z",fill:"#fff"}}),e._v(" "),n("path",{attrs:{d:"M48.967 26.422v12.08h-12.61V.992h16.175c7.662 0 15.43 2.913 15.43 12.609 0 9.271-7.608 12.821-15.43 12.821h-3.565zm0-15.63v6.04h2.66c1.916 0 3.831-.9 3.831-3.125 0-2.384-1.915-2.914-3.83-2.914h-2.661z",fill:"#2C5282"}}),e._v(" "),n("path",{attrs:{d:"M49.365 38.9H35.958V.593h16.574c4.397 0 8.135.946 10.81 2.736 3.33 2.229 5.019 5.685 5.019 10.272 0 9.746-8.177 13.22-15.829 13.22h-3.167V38.9zm-12.61-.796h11.814v-12.08h3.963c7.267 0 15.032-3.264 15.032-12.423 0-10.625-9.418-12.211-15.032-12.211H36.755v36.714zM51.627 17.23H48.57v-6.836h3.058c3.496 0 4.23 1.8 4.23 3.312 0 2.6-2.278 3.524-4.23 3.524zm-2.262-.797h2.262c1.66 0 3.433-.716 3.433-2.727 0-1.08-.356-2.516-3.433-2.516h-2.262v5.243zM108.914 6.918h.024l2.584-6.696h1.904v8.715h-1.224V1.65h-.025l-2.904 7.287h-.779l-2.893-7.287h-.025v7.287h-1.186V.222h1.904l2.62 6.696zM115.491 5.712V.222h1.224v5.416c0 1.194.543 2.425 2.175 2.425 1.632 0 2.176-1.23 2.176-2.425V.222h1.224v5.49c0 1.785-1.088 3.447-3.399 3.447-2.312 0-3.4-1.662-3.4-3.447zM128.705 1.834c-.346-.48-.977-.812-1.706-.812-.791 0-1.706.43-1.706 1.415 0 .948.804 1.207 1.793 1.527 1.174.37 2.571.812 2.571 2.548 0 1.81-1.471 2.647-3.028 2.647-1.101 0-2.213-.431-2.881-1.268l.952-.8a2.389 2.389 0 001.953 1.021c.816 0 1.755-.455 1.755-1.49 0-1.058-.964-1.341-2.077-1.686-1.112-.344-2.274-.85-2.274-2.45 0-1.735 1.557-2.486 3.004-2.486 1.014 0 1.965.394 2.509.997l-.865.837zM132.611 8.937h-1.224V.222h1.224v8.715zM142.241 7.583c-.68.923-1.805 1.576-3.338 1.576-2.682 0-4.611-1.908-4.611-4.592 0-2.72 2.003-4.567 4.661-4.567 1.199 0 2.497.468 3.14 1.354l-.965.739c-.42-.591-1.273-1.022-2.175-1.022-2.028 0-3.326 1.588-3.326 3.496 0 1.958 1.274 3.508 3.289 3.508.976 0 1.829-.406 2.348-1.157l.977.665zM104.39 14.992h2.67c1.891 0 3.127.726 3.127 2.425 0 1.748-1.372 2.462-3.189 2.462h-1.385v3.829h-1.224v-8.716h.001zm1.224 3.853h1.298c1.199 0 2.039-.394 2.039-1.427 0-1.047-.865-1.392-2.015-1.392h-1.322v2.82zM112.969 22.625h4.574v1.083h-5.798v-8.716h5.612v1.071h-4.388v2.61h4.129v1.046h-4.129v2.906zM120.398 23.708h-1.224v-8.716h2.806c1.694 0 3.116.64 3.116 2.413 0 1.28-.878 2.092-2.127 2.302l2.448 4h-1.484l-2.225-3.877h-1.31v3.878zm0-4.9h1.409c1.149 0 2.052-.357 2.052-1.403s-.902-1.379-1.965-1.379h-1.496v2.783zM127.988 23.708h-1.224v-8.716h5.464v1.071h-4.24v2.708h3.969v1.047h-3.969v3.89zM137.964 23.93c-2.658 0-4.624-1.909-4.624-4.592 0-2.721 1.966-4.568 4.624-4.568 2.67 0 4.648 1.847 4.648 4.568 0 2.683-1.978 4.591-4.648 4.591zm0-8.088c-2.015 0-3.301 1.588-3.301 3.496 0 1.945 1.298 3.496 3.301 3.496 2.027 0 3.325-1.55 3.325-3.496 0-1.908-1.285-3.496-3.325-3.496zM145.505 23.708h-1.224v-8.716h2.806c1.693 0 3.115.64 3.115 2.413 0 1.28-.877 2.092-2.126 2.302l2.447 4h-1.483l-2.225-3.877h-1.31v3.878zm0-4.9h1.409c1.149 0 2.052-.357 2.052-1.403s-.902-1.379-1.965-1.379h-1.496v2.783zM156.395 21.69h.025l2.583-6.697h1.904v8.715h-1.224v-7.287h-.024l-2.905 7.287h-.779l-2.893-7.287h-.024v7.287h-1.187v-8.715h1.904l2.62 6.696zM163.392 23.708h-1.36l3.795-8.716h1.113l3.758 8.716h-1.385l-.89-2.142h-4.153l-.878 2.142zm1.31-3.213h3.276l-1.632-4.087-1.644 4.087zM177.991 21.96h.025v-6.967h1.224v8.715h-1.546l-4.623-7.115h-.025v7.115h-1.224v-8.715h1.595l4.574 6.967zM188.869 22.354c-.68.923-1.805 1.576-3.338 1.576-2.682 0-4.61-1.909-4.61-4.592 0-2.72 2.002-4.567 4.66-4.567 1.199 0 2.497.467 3.14 1.354l-.964.738c-.42-.59-1.274-1.021-2.176-1.021-2.028 0-3.325 1.588-3.325 3.496 0 1.957 1.273 3.508 3.288 3.508.976 0 1.83-.406 2.349-1.157l.976.665zM191.341 22.625h4.574v1.083h-5.797v-8.716h5.612v1.071h-4.389v2.61h4.129v1.046h-4.129v2.906zM108.914 36.46h.024l2.584-6.697h1.904v8.716h-1.224V31.19h-.025l-2.904 7.288h-.779l-2.893-7.288h-.025v7.288h-1.186v-8.716h1.904l2.62 6.697zM115.911 38.479h-1.36l3.795-8.716h1.113l3.758 8.716h-1.385l-.89-2.142h-4.153l-.878 2.142zm1.31-3.213h3.276l-1.632-4.087-1.644 4.087zM125.565 38.479h-1.224v-8.716h2.807c1.693 0 3.115.64 3.115 2.413 0 1.28-.878 2.092-2.127 2.302l2.448 4h-1.483l-2.225-3.877h-1.311v3.878zm0-4.9h1.409c1.15 0 2.053-.357 2.053-1.403s-.902-1.379-1.966-1.379h-1.496v2.782zM133.155 33.604h.025l3.906-3.84h1.694l-4.252 3.988 4.511 4.727h-1.755l-4.104-4.506h-.025v4.506h-1.224v-8.716h1.224v3.84zM140.016 35.253v-5.49h1.224v5.416c0 1.195.544 2.426 2.176 2.426 1.631 0 2.175-1.231 2.175-2.425v-5.417h1.224v5.49c0 1.785-1.087 3.447-3.399 3.447-2.312 0-3.4-1.662-3.4-3.447zM148.879 29.763h2.67c1.892 0 3.128.726 3.128 2.425 0 1.748-1.373 2.462-3.19 2.462h-1.384v3.829h-1.224v-8.716zm1.224 3.853h1.298c1.199 0 2.04-.394 2.04-1.428 0-1.046-.866-1.39-2.015-1.39h-1.323v2.818z",fill:"#fff"}})])]),e._v(" "),n("div",{staticClass:"flex flex-row"},[n("a",{staticClass:"px-2 py-1 my-auto mr-4 text-sm border border-white rounded-md",attrs:{href:"https://github.com/axelberndt/MPM/"}},[e._v("\n GitHub\n ")]),e._v(" "),n("div",{staticClass:"my-auto",on:{click:e.toggleMenu}},[n("svg",{staticClass:"h-6 mt-1 mr-4 cursor-pointer",attrs:{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 448 512"}},[n("path",{attrs:{fill:"currentColor",d:"M16 132h416c8.837 0 16-7.163 16-16V76c0-8.837-7.163-16-16-16H16C7.163 60 0 67.163 0 76v40c0 8.837 7.163 16 16 16zm0 160h416c8.837 0 16-7.163 16-16v-40c0-8.837-7.163-16-16-16H16c-8.837 0-16 7.163-16 16v40c0 8.837 7.163 16 16 16zm0 160h416c8.837 0 16-7.163 16-16v-40c0-8.837-7.163-16-16-16H16c-8.837 0-16 7.163-16 16v40c0 8.837 7.163 16 16 16z"}})])])])],1),e._v(" "),n("nav",{directives:[{name:"show",rawName:"v-show",value:e.menuOpen,expression:"menuOpen"}],staticClass:"container flex flex-col mx-auto mt-3"},[n("nuxt-link",{staticClass:"px-3 py-2 m-auto rounded-md hover:bg-white hover:text-blue-900",attrs:{to:"/"},nativeOn:{click:function(t){return e.toggleMenu(t)}}},[e._v("\n Home\n ")]),e._v(" "),n("nuxt-link",{staticClass:"px-3 py-2 m-auto rounded-md hover:bg-white hover:text-blue-900",attrs:{to:"/guidelines"},nativeOn:{click:function(t){return e.toggleMenu(t)}}},[e._v("\n Guidelines\n ")]),e._v(" "),n("nuxt-link",{staticClass:"px-3 py-2 m-auto rounded-md hover:bg-white hover:text-blue-900",attrs:{to:"/docs"},nativeOn:{click:function(t){return e.toggleMenu(t)}}},[e._v("\n Documentation\n ")])],1)]),e._v(" "),n("div",{staticClass:"container items-center justify-between hidden pt-6 pb-16 mx-auto font-semibold text-white md:flex"},[n("nav",{staticClass:"flex"},[n("nuxt-link",{staticClass:"mr-3",attrs:{to:"/"}},[n("svg",{attrs:{width:"257",height:"52",fill:"none",xmlns:"http://www.w3.org/2000/svg"}},[n("path",{attrs:{d:"M15.223 22.425l.794 28.735H0V.3h22.438l9.235 27.37h.36L40.042.3h23.16v50.86H46.534l.505-28.591-.433-.072-9.523 28.663H24.963l-9.38-28.735h-.36z",fill:"#fff"}}),e._v(" "),n("path",{attrs:{d:"M77.74 22.425l.793 28.735H62.516V.3h22.438l9.235 27.37h.361L102.558.3h23.16v50.86h-16.666l.505-28.591-.433-.072L99.6 51.16H87.48L78.1 22.426h-.36z",fill:"#fff"}}),e._v(" "),n("path",{attrs:{d:"M64.234 34.66v15.847H47.692V1.3h21.219c10.05 0 20.242 3.823 20.242 16.541 0 12.163-9.982 16.82-20.242 16.82h-4.677zm0-20.502v7.923h3.49c2.513 0 5.026-1.181 5.026-4.1 0-3.128-2.513-3.823-5.026-3.823h-3.49z",fill:"#2C5282"}}),e._v(" "),n("path",{attrs:{d:"M64.757 51.029H47.17V.778H68.91c5.768 0 10.671 1.241 14.18 3.59 4.37 2.923 6.584 7.456 6.584 13.473 0 12.786-10.726 17.342-20.764 17.342h-4.154v15.846zm-16.542-1.045h15.497V34.138h5.199c9.533 0 19.72-4.281 19.72-16.297 0-13.937-12.355-16.018-19.72-16.018H48.215v48.161zm19.51-27.38h-4.013v-8.968h4.012c4.586 0 5.548 2.363 5.548 4.345 0 3.412-2.988 4.622-5.548 4.622zm-2.968-1.046h2.967c2.177 0 4.504-.94 4.504-3.577 0-1.417-.467-3.3-4.504-3.3h-2.967v6.877zM142.873 9.076h.032L146.294.29h2.498v11.433h-1.605v-9.56h-.033l-3.811 9.56h-1.021l-3.794-9.56h-.033v9.56h-1.557V.291h2.498l3.437 8.785zM151.5 7.493V.29h1.606v7.105c0 1.567.713 3.181 2.854 3.181 2.14 0 2.854-1.615 2.854-3.18V.29h1.605v7.202c0 2.341-1.427 4.522-4.459 4.522-3.033 0-4.46-2.18-4.46-4.522zM168.834 2.406c-.454-.63-1.281-1.066-2.237-1.066-1.038 0-2.238.566-2.238 1.857 0 1.244 1.054 1.583 2.352 2.003 1.54.484 3.372 1.066 3.372 3.342 0 2.374-1.93 3.473-3.972 3.473-1.444 0-2.903-.566-3.779-1.664l1.248-1.05c.536.792 1.508 1.34 2.563 1.34 1.07 0 2.302-.597 2.302-1.953 0-1.39-1.265-1.76-2.724-2.213-1.46-.452-2.984-1.114-2.984-3.213C162.737.985 164.78 0 166.678 0c1.329 0 2.578.517 3.292 1.308l-1.136 1.098zM173.958 11.724h-1.605V.29h1.605v11.433zM186.591 9.948c-.892 1.21-2.368 2.067-4.379 2.067-3.519 0-6.048-2.503-6.048-6.024 0-3.569 2.627-5.991 6.113-5.991 1.573 0 3.276.614 4.119 1.776l-1.265.97c-.551-.776-1.67-1.341-2.854-1.341-2.659 0-4.362 2.083-4.362 4.586 0 2.568 1.671 4.602 4.314 4.602 1.281 0 2.4-.533 3.081-1.517l1.281.872zM136.938 19.667h3.502c2.481 0 4.103.952 4.103 3.181 0 2.293-1.8 3.23-4.184 3.23h-1.816V31.1h-1.606V19.667h.001zm1.605 5.054h1.703c1.573 0 2.676-.517 2.676-1.873 0-1.372-1.136-1.825-2.644-1.825h-1.735v3.698zM148.192 29.679h6v1.42h-7.606V19.668h7.363v1.404h-5.757v3.424h5.416v1.372h-5.416v3.812zM157.937 31.1h-1.606V19.667h3.682c2.221 0 4.086.84 4.086 3.164 0 1.68-1.151 2.746-2.789 3.02l3.211 5.249h-1.946l-2.919-5.087h-1.719V31.1zm0-6.427h1.849c1.507 0 2.692-.468 2.692-1.841s-1.184-1.809-2.579-1.809h-1.962v3.65zM167.894 31.1h-1.606V19.667h7.168v1.404h-5.562v3.553h5.206v1.373h-5.206V31.1zM180.98 31.39c-3.487 0-6.065-2.503-6.065-6.023 0-3.569 2.578-5.991 6.065-5.991 3.502 0 6.097 2.422 6.097 5.99 0 3.522-2.594 6.024-6.097 6.024zm0-10.609c-2.643 0-4.33 2.083-4.33 4.586 0 2.552 1.703 4.587 4.33 4.587 2.66 0 4.362-2.035 4.362-4.587 0-2.503-1.686-4.586-4.362-4.586zM190.872 31.1h-1.606V19.667h3.681c2.222 0 4.087.84 4.087 3.164 0 1.68-1.151 2.746-2.789 3.02l3.21 5.249h-1.945l-2.919-5.087h-1.719V31.1zm0-6.427h1.848c1.508 0 2.693-.468 2.693-1.841s-1.184-1.809-2.579-1.809h-1.962v3.65zM205.158 28.452h.032l3.39-8.785h2.497V31.1h-1.605v-9.56h-.033l-3.81 9.56h-1.022l-3.794-9.56h-.033v9.56h-1.557V19.667h2.498l3.437 8.785zM214.336 31.1h-1.783l4.978-11.433h1.46L223.92 31.1h-1.816l-1.168-2.81h-5.448l-1.152 2.81zm1.719-4.215h4.297l-2.14-5.361-2.157 5.361zM233.487 28.807h.033v-9.14h1.605V31.1h-2.027l-6.065-9.334h-.032V31.1h-1.606V19.667h2.092l6 9.14zM247.758 29.324c-.892 1.21-2.368 2.067-4.379 2.067-3.519 0-6.049-2.503-6.049-6.024 0-3.569 2.628-5.99 6.114-5.99 1.573 0 3.275.613 4.119 1.775l-1.265.97c-.551-.776-1.671-1.34-2.854-1.34-2.66 0-4.362 2.082-4.362 4.585 0 2.568 1.67 4.602 4.313 4.602 1.281 0 2.401-.533 3.081-1.517l1.282.872zM251 29.679h6v1.42h-7.605V19.668h7.362v1.404H251v3.424h5.416v1.372H251v3.812zM142.873 47.828h.032l3.389-8.785h2.498v11.433h-1.605v-9.56h-.033l-3.811 9.56h-1.021l-3.794-9.56h-.033v9.56h-1.557V39.043h2.498l3.437 8.785zM152.051 50.476h-1.784l4.979-11.433h1.459l4.93 11.433h-1.816l-1.168-2.81h-5.448l-1.152 2.81zm1.719-4.215h4.297l-2.14-5.36-2.157 5.36zM164.716 50.476h-1.606V39.043h3.681c2.222 0 4.087.84 4.087 3.165 0 1.68-1.151 2.745-2.789 3.02l3.21 5.248h-1.945l-2.919-5.087h-1.719v5.087zm0-6.427h1.848c1.508 0 2.693-.468 2.693-1.84 0-1.373-1.184-1.81-2.579-1.81h-1.962v3.65zM174.672 44.081h.033l5.124-5.038h2.222l-5.579 5.232 5.919 6.201h-2.303l-5.383-5.91h-.033v5.91h-1.605V39.043h1.605v5.038zM183.672 46.245v-7.202h1.606v7.105c0 1.567.713 3.182 2.854 3.182 2.14 0 2.854-1.615 2.854-3.182v-7.105h1.606v7.202c0 2.342-1.428 4.522-4.46 4.522s-4.46-2.18-4.46-4.522zM195.299 39.043h3.503c2.481 0 4.102.953 4.102 3.181 0 2.293-1.8 3.23-4.184 3.23h-1.816v5.022h-1.605V39.043zm1.605 5.054h1.703c1.573 0 2.676-.517 2.676-1.873 0-1.372-1.136-1.824-2.644-1.824h-1.735v3.697z",fill:"#fff"}})])]),e._v(" "),n("nuxt-link",{staticClass:"px-3 py-2 my-auto ml-4 rounded-md hover:bg-blue-900",attrs:{to:"/"}},[e._v("\n Home\n ")]),e._v(" "),n("nuxt-link",{staticClass:"px-3 py-2 my-auto ml-4 rounded-md hover:bg-blue-900",attrs:{to:"/guidelines"}},[e._v("\n Guidelines\n ")]),e._v(" "),n("nuxt-link",{staticClass:"px-3 py-2 my-auto ml-4 rounded-md hover:bg-blue-900",attrs:{to:"/docs"}},[e._v("\n Documentation\n ")])],1),e._v(" "),n("a",{staticClass:"px-3 py-2 text-sm border border-white rounded-md",attrs:{href:"https://github.com/axelberndt/MPM/"}},[e._v("\n GitHub\n ")])])]),e._v(" "),n("nuxt"),e._v(" "),e._m(0)],1)}),[function(){var e=this.$createElement,t=this._self._c||e;return t("footer",{staticClass:"mt-12 bg-blue-800"},[t("div",{staticClass:"container flex justify-between py-4 mx-auto text-xs text-white align-center"},[t("div",{staticClass:"flex flex-col mx-2 sm:mx-0"},[this._v("\n Copyright © Axel Berndt\n ")]),this._v(" "),t("a",{staticClass:"mx-2 hover:underline sm:mx-0",attrs:{href:"https://github.com/sonovice"}},[this._v("\n Design: Simon Waloschek\n ")])])])}],!1,null,null,null).exports;function z(e,t){var n;if("undefined"==typeof Symbol||null==e[Symbol.iterator]){if(Array.isArray(e)||(n=function(e,t){if(!e)return;if("string"==typeof e)return B(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return B(e,t)}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var i=0,o=function(){};return{s:o,n:function(){return i>=e.length?{done:!0}:{done:!1,value:e[i++]}},e:function(e){throw e},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var r,l=!0,c=!1;return{s:function(){n=e[Symbol.iterator]()},n:function(){var e=n.next();return l=e.done,e},e:function(e){c=!0,r=e},f:function(){try{l||null==n.return||n.return()}finally{if(c)throw r}}}}function B(e,t){(null==t||t>e.length)&&(t=e.length);for(var i=0,n=new Array(t);i0}},methods:{refreshOnlineStatus:function(){void 0===window.navigator.onLine?this.isOnline=!0:this.isOnline=window.navigator.onLine},refresh:function(){var e=this;return Object(o.a)(regeneratorRuntime.mark((function t(){var n,o;return regeneratorRuntime.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if((n=Object(v.h)(e.$route)).length){t.next=3;break}return t.abrupt("return");case 3:return e.$loading.start(),o=n.map((function(t){var p=[];if(t.$options.fetch&&t.$options.fetch.length&&p.push(Object(v.p)(t.$options.fetch,e.context)),t.$fetch)p.push(t.$fetch());else{var n,o=z(Object(v.e)(t.$vnode.componentInstance));try{for(o.s();!(n=o.n()).done;){var component=n.value;p.push(component.$fetch())}}catch(e){o.e(e)}finally{o.f()}}return t.$options.asyncData&&p.push(Object(v.p)(t.$options.asyncData,e.context).then((function(e){for(var n in e)l.a.set(t.$data,n,e[n])}))),Promise.all(p)})),t.prev=5,t.next=8,Promise.all(o);case 8:t.next=15;break;case 10:t.prev=10,t.t0=t.catch(5),e.$loading.fail(t.t0),Object(v.k)(t.t0),e.error(t.t0);case 15:e.$loading.finish();case 16:case"end":return t.stop()}}),t,null,[[5,10]])})))()},errorChanged:function(){this.nuxt.err&&this.$loading&&(this.$loading.fail&&this.$loading.fail(this.nuxt.err),this.$loading.finish&&this.$loading.finish())},setLayout:function(e){return e&&E["_"+e]||(e="default"),this.layoutName=e,this.layout=E["_"+e],this.layout},loadLayout:function(e){return e&&E["_"+e]||(e="default"),Promise.resolve(E["_"+e])}},components:{NuxtLoading:L}},N=n(102),V=n.n(N);function H(object,e){var t=Object.keys(object);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(object);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(object,e).enumerable}))),t.push.apply(t,n)}return t}function Q(e){for(var i=1;i has been deprecated and will be removed in Nuxt 3, please use instead")),f.a.render(e,t)}})),l.a.component(D.name,D),l.a.component("NChild",D),l.a.component(S.name,S),l.a.use(c.a,{keyName:"head",attribute:"data-n-head",ssrAttribute:"data-n-head-ssr",tagIDKeyName:"hid"});var W={name:"page",mode:"out-in",appear:!0,appearClass:"appear",appearActiveClass:"appear-active",appearToClass:"appear-to"};function G(e){return F.apply(this,arguments)}function F(){return(F=Object(o.a)(regeneratorRuntime.mark((function e(t){var n,o,r,c,path;return regeneratorRuntime.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,T();case 2:return n=e.sent,o=Q({head:{title:"MPM: Music Performance Markup",meta:[{charset:"utf-8"},{name:"viewport",content:"width=device-width, initial-scale=1"},{hid:"description",name:"description",content:"Music Performance Markup"}],link:[{rel:"icon",type:"image/x-icon",href:"/favicon.ico"},{rel:"stylesheet",href:"https://rsms.me/inter/inter.css"}],style:[],script:[]},router:n,nuxt:{defaultTransition:W,transitions:[W],setTransitions:function(e){return Array.isArray(e)||(e=[e]),e=e.map((function(e){return e=e?"string"==typeof e?Object.assign({},W,{name:e}):Object.assign({},W,e):W})),this.$options.nuxt.transitions=e,e},err:null,dateErr:null,error:function(e){e=e||null,o.context._errored=Boolean(e),e=e?Object(v.o)(e):null;var n=o.nuxt;return this&&(n=this.nuxt||this.$options.nuxt),n.dateErr=Date.now(),n.err=e,t&&(t.nuxt.error=e),e}}},$),r=t?t.next:function(e){return o.router.push(e)},t?c=n.resolve(t.url).route:(path=Object(v.f)(n.options.base,n.options.mode),c=n.resolve(path).route),e.next=8,Object(v.s)(o,{route:c,next:r,error:o.nuxt.error.bind(o),payload:t?t.payload:void 0,req:t?t.req:void 0,res:t?t.res:void 0,beforeRenderFns:t?t.beforeRenderFns:void 0,ssrContext:t});case 8:(function(e,t){if(!e)throw new Error("inject(key, value) has no key provided");if(void 0===t)throw new Error("inject('".concat(e,"', value) has no value provided"));o[e="$"+e]=t;var n="__nuxt_"+e+"_installed__";l.a[n]||(l.a[n]=!0,l.a.use((function(){Object.prototype.hasOwnProperty.call(l.a,e)||Object.defineProperty(l.a.prototype,e,{get:function(){return this.$root.$options[e]}})})))}),e.next=12;break;case 12:e.next=15;break;case 15:return e.abrupt("return",{app:o,router:n});case 16:case"end":return e.stop()}}),e)})))).apply(this,arguments)}},145:function(e,t,n){"use strict";var o=n(54);n.n(o).a},146:function(e,t,n){(t=n(70)(!1)).push([e.i,"",""]),e.exports=t},147:function(e,t,n){"use strict";var o=n(55);n.n(o).a},148:function(e,t,n){(t=n(70)(!1)).push([e.i,".nuxt-progress{position:fixed;top:0;left:0;right:0;height:2px;width:0;opacity:1;transition:width .1s,opacity .4s;background-color:#fff;z-index:999999}",""]),e.exports=t},149:function(e,t,n){var content=n(150);"string"==typeof content&&(content=[[e.i,content,""]]),content.locals&&(e.exports=content.locals);(0,n(71).default)("38dfa7e4",content,!0,{sourceMap:!1})},150:function(e,t,n){(t=n(70)(!1)).push([e.i,'/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}main{display:block}h1{font-size:2em;margin:.67em 0}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}[hidden],template{display:none}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}button{background-color:transparent;background-image:none;padding:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}fieldset,ol,ul{margin:0;padding:0}ol,ul{list-style:none}html{font-family:Inter;line-height:1.5}*,:after,:before{box-sizing:border-box;border:0 solid #e2e8f0}hr{border-top-width:1px}img{border-style:solid}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{color:#a0aec0}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#a0aec0}input::-ms-input-placeholder,textarea::-ms-input-placeholder{color:#a0aec0}input::placeholder,textarea::placeholder{color:#a0aec0}[role=button],button{cursor:pointer}table{border-collapse:collapse}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}button,input,optgroup,select,textarea{padding:0;line-height:inherit;color:inherit}code,kbd,pre,samp{font-family:Source Code Pro,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}/ body{background-color:#f6f7f9;overflow-y:scroll}.code-example{padding:.5rem .75rem;margin-top:.25rem;margin-bottom:.5rem;font-family:Source Code Pro,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;--bg-opacity:1;background-color:#f7fafc;background-color:rgba(247,250,252,var(--bg-opacity));border-width:1px;--border-opacity:1;border-color:#cbd5e0;border-color:rgba(203,213,224,var(--border-opacity));border-radius:.25rem;overflow-x:auto}a.gi{text-decoration:underline;font-weight:600}a.gi:before{content:"<"}a.gi:after{content:">"}span.att{font-weight:600}span.att:before{content:"@"}.link-icon:after{content:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGNsYXNzPSJ3LTYgaC02IiB2aWV3Qm94PSIwIDAgNDQ4IDUxMiI+PHBhdGggZmlsbD0iY3VycmVudENvbG9yIiBkPSJNNDAwIDMySDQ4QzIxLjQ5IDMyIDAgNTMuNDkgMCA4MHYzNTJjMCAyNi41MSAyMS40OSA0OCA0OCA0OGgzNTJjMjYuNTEgMCA0OC0yMS40OSA0OC00OFY4MGMwLTI2LjUxLTIxLjQ5LTQ4LTQ4LTQ4em0xNiA0MDBjMCA4LjgyMi03LjE3OCAxNi0xNiAxNkg0OGMtOC44MjIgMC0xNi03LjE3OC0xNi0xNlY4MGMwLTguODIyIDcuMTc4LTE2IDE2LTE2aDM1MmM4LjgyMiAwIDE2IDcuMTc4IDE2IDE2djM1MnpNOTkuNTE1IDM3NC44MjhjLTQuNjg2LTQuNjg2LTQuNjg2LTEyLjI4NCAwLTE2Ljk3MWwxOTUuMTUtMTk1LjE1LS43MDctLjcwNy04OS45NTguMzQyYy02LjYyNyAwLTEyLTUuMzczLTEyLTEydi05Ljk5OWMwLTYuNjI4IDUuMzcyLTEyIDEyLTEyTDM0MCAxMjhjNi42MjcgMCAxMiA1LjM3MiAxMiAxMmwtLjM0MyAxMzZjMCA2LjYyNy01LjM3MyAxMi0xMiAxMmgtOS45OTljLTYuNjI3IDAtMTItNS4zNzMtMTItMTJsLjM0Mi04OS45NTgtLjcwNy0uNzA3LTE5NS4xNSAxOTUuMTVjLTQuNjg2IDQuNjg2LTEyLjI4NCA0LjY4Ni0xNi45NzEgMGwtNS42NTctNS42NTd6Ii8+PC9zdmc+");width:1.5rem;height:1.5rem}h1{margin-top:.75rem;font-size:1.875rem;letter-spacing:.025em;text-transform:uppercase}h1,h2{font-weight:700}h2{font-size:1.25rem}.subchapter{margin-top:1rem}ul{margin-bottom:.75rem}.content p,.content ul{margin-bottom:.75rem}.content ul{margin-left:2rem;list-style-type:disc;list-style-position:inside}.content li{margin-bottom:.5rem}.content li a,.content p>a{font-weight:600;--text-opacity:1;color:#2c5282;color:rgba(44,82,130,var(--text-opacity));text-decoration:underline}.figure{align-self:center;font-style:italic;margin-top:1rem;margin-bottom:1rem}.figure,img,pre{font-weight:400}img{display:block;margin-left:auto;margin-right:auto;margin-bottom:.5rem}.label,img{font-style:italic}table tr:nth-child(odd){background-color:rgba(0,0,0,.02745)}.container{width:100%}@media (min-width:640px){.container{max-width:640px}}@media (min-width:768px){.container{max-width:768px}}@media (min-width:1024px){.container{max-width:1024px}}@media (min-width:1280px){.container{max-width:1280px}}.bg-white{--bg-opacity:1;background-color:#fff;background-color:rgba(255,255,255,var(--bg-opacity))}.bg-gray-50{--bg-opacity:1;background-color:#fcfeff;background-color:rgba(252,254,255,var(--bg-opacity))}.bg-gray-300{--bg-opacity:1;background-color:#e2e8f0;background-color:rgba(226,232,240,var(--bg-opacity))}.bg-red-100{--bg-opacity:1;background-color:#fff5f5;background-color:rgba(255,245,245,var(--bg-opacity))}.bg-red-200{--bg-opacity:1;background-color:#fed7d7;background-color:rgba(254,215,215,var(--bg-opacity))}.bg-red-300{--bg-opacity:1;background-color:#feb2b2;background-color:rgba(254,178,178,var(--bg-opacity))}.bg-green-100{--bg-opacity:1;background-color:#f0fff4;background-color:rgba(240,255,244,var(--bg-opacity))}.bg-green-200{--bg-opacity:1;background-color:#c6f6d5;background-color:rgba(198,246,213,var(--bg-opacity))}.bg-green-300{--bg-opacity:1;background-color:#9ae6b4;background-color:rgba(154,230,180,var(--bg-opacity))}.bg-blue-100{--bg-opacity:1;background-color:#ebf8ff;background-color:rgba(235,248,255,var(--bg-opacity))}.bg-blue-200{--bg-opacity:1;background-color:#bee3f8;background-color:rgba(190,227,248,var(--bg-opacity))}.bg-blue-800{--bg-opacity:1;background-color:#2c5282;background-color:rgba(44,82,130,var(--bg-opacity))}.hover\\:bg-white:hover{--bg-opacity:1;background-color:#fff;background-color:rgba(255,255,255,var(--bg-opacity))}.hover\\:bg-gray-100:hover{--bg-opacity:1;background-color:#f7fafc;background-color:rgba(247,250,252,var(--bg-opacity))}.hover\\:bg-blue-900:hover{--bg-opacity:1;background-color:#2a4365;background-color:rgba(42,67,101,var(--bg-opacity))}.border-white{--border-opacity:1;border-color:#fff;border-color:rgba(255,255,255,var(--border-opacity))}.border-gray-300{--border-opacity:1;border-color:#e2e8f0;border-color:rgba(226,232,240,var(--border-opacity))}.border-gray-400{--border-opacity:1;border-color:#cbd5e0;border-color:rgba(203,213,224,var(--border-opacity))}.border-red-200{--border-opacity:1;border-color:#fed7d7;border-color:rgba(254,215,215,var(--border-opacity))}.border-green-200{--border-opacity:1;border-color:#c6f6d5;border-color:rgba(198,246,213,var(--border-opacity))}.border-blue-200{--border-opacity:1;border-color:#bee3f8;border-color:rgba(190,227,248,var(--border-opacity))}.rounded-md{border-radius:.375rem}.rounded-lg{border-radius:.5rem}.rounded-full{border-radius:9999px}.border{border-width:1px}.border-l-16{border-left-width:16px}.border-t{border-top-width:1px}.cursor-pointer{cursor:pointer}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.table{display:table}.hidden{display:none}.flex-row{flex-direction:row}.flex-col{flex-direction:column}.items-start{align-items:flex-start}.items-center{align-items:center}.items-baseline{align-items:baseline}.justify-start{justify-content:flex-start}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.flex-shrink-0{flex-shrink:0}.font-semibold{font-weight:600}.font-bold{font-weight:700}.h-3{height:.75rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-8{height:2rem}.h-12{height:3rem}.text-xs{font-size:.75rem}.text-sm{font-size:.875rem}.leading-snug{line-height:1.375}.m-auto{margin:auto}.mx-2{margin-left:.5rem;margin-right:.5rem}.my-auto{margin-top:auto;margin-bottom:auto}.mx-auto{margin-left:auto;margin-right:auto}.mt-1{margin-top:.25rem}.mb-1{margin-bottom:.25rem}.mt-2{margin-top:.5rem}.mr-2{margin-right:.5rem}.ml-2{margin-left:.5rem}.mt-3{margin-top:.75rem}.mr-3{margin-right:.75rem}.mb-3{margin-bottom:.75rem}.ml-3{margin-left:.75rem}.mr-4{margin-right:1rem}.ml-4{margin-left:1rem}.mb-5{margin-bottom:1.25rem}.ml-5{margin-left:1.25rem}.mt-12{margin-top:3rem}.-mt-10{margin-top:-2.5rem}.focus\\:outline-none:focus{outline:0}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.p-5{padding:1.25rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.px-2{padding-left:.5rem;padding-right:.5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.px-3{padding-left:.75rem;padding-right:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.px-12{padding-left:3rem;padding-right:3rem}.pl-2{padding-left:.5rem}.pt-3{padding-top:.75rem}.pt-4{padding-top:1rem}.pt-6{padding-top:1.5rem}.pb-8{padding-bottom:2rem}.pb-12{padding-bottom:3rem}.pb-16{padding-bottom:4rem}.relative{position:relative}.shadow-md{box-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -1px rgba(0,0,0,.06)}.shadow-lg{box-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -2px rgba(0,0,0,.05)}.text-white{--text-opacity:1;color:#fff;color:rgba(255,255,255,var(--text-opacity))}.text-gray-500{--text-opacity:1;color:#a0aec0;color:rgba(160,174,192,var(--text-opacity))}.text-gray-700{--text-opacity:1;color:#4a5568;color:rgba(74,85,104,var(--text-opacity))}.text-gray-800{--text-opacity:1;color:#2d3748;color:rgba(45,55,72,var(--text-opacity))}.text-red-900{--text-opacity:1;color:#742a2a;color:rgba(116,42,42,var(--text-opacity))}.text-green-900{--text-opacity:1;color:#22543d;color:rgba(34,84,61,var(--text-opacity))}.hover\\:text-blue-900:hover,.text-blue-900{--text-opacity:1;color:#2a4365;color:rgba(42,67,101,var(--text-opacity))}.italic{font-style:italic}.uppercase{text-transform:uppercase}.hover\\:underline:hover,.underline{text-decoration:underline}.tracking-wide{letter-spacing:.025em}.align-baseline{vertical-align:baseline}.align-top{vertical-align:top}.w-3{width:.75rem}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-8{width:2rem}.w-12{width:3rem}.w-full{width:100%}*{transition:all .2s}@media (min-width:640px){.sm\\:rounded-lg{border-radius:.5rem}.sm\\:mx-0{margin-left:0;margin-right:0}}@media (min-width:768px){.md\\:flex{display:flex}.md\\:hidden{display:none}}@media (min-width:1024px){.lg\\:flex-row{flex-direction:row}.lg\\:ml-6{margin-left:1.5rem}.lg\\:w-1\\/3{width:33.333333%}.lg\\:w-2\\/3{width:66.666667%}}@media (min-width:1280px){.xl\\:w-1\\/4{width:25%}.xl\\:w-3\\/4{width:75%}}',""]),e.exports=t},54:function(e,t,n){var content=n(146);"string"==typeof content&&(content=[[e.i,content,""]]),content.locals&&(e.exports=content.locals);(0,n(71).default)("72daabed",content,!0,{sourceMap:!1})},55:function(e,t,n){var content=n(148);"string"==typeof content&&(content=[[e.i,content,""]]),content.locals&&(e.exports=content.locals);(0,n(71).default)("3191d5ad",content,!0,{sourceMap:!1})},57:function(e,t,n){"use strict";n(37),n(41),n(30),n(51),n(48),n(38),n(34),n(35),n(15),n(65),n(66);var o=n(1);function r(e,t){var n;if("undefined"==typeof Symbol||null==e[Symbol.iterator]){if(Array.isArray(e)||(n=function(e,t){if(!e)return;if("string"==typeof e)return l(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return l(e,t)}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var i=0,o=function(){};return{s:o,n:function(){return i>=e.length?{done:!0}:{done:!1,value:e[i++]}},e:function(e){throw e},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var r,c=!0,d=!1;return{s:function(){n=e[Symbol.iterator]()},n:function(){var e=n.next();return c=e.done,e},e:function(e){d=!0,r=e},f:function(){try{c||null==n.return||n.return()}finally{if(d)throw r}}}}function l(e,t){(null==t||t>e.length)&&(t=e.length);for(var i=0,n=new Array(t);i0},canPrefetch:function(){var e=navigator.connection;return!(this.$nuxt.isOffline||e&&((e.effectiveType||"").includes("2g")||e.saveData))},getPrefetchComponents:function(){return this.$router.resolve(this.to,this.$route,this.append).resolved.matched.map((function(e){return e.components.default})).filter((function(e){return"function"==typeof e&&!e.options&&!e.__prefetched}))},prefetchLink:function(){if(this.canPrefetch()){m.unobserve(this.$el);var e,t=r(this.getPrefetchComponents());try{for(t.s();!(e=t.n()).done;){var n=e.value,o=n();o instanceof Promise&&o.catch((function(){})),n.__prefetched=!0}}catch(e){t.e(e)}finally{t.f()}}}}}},72:function(e,t,n){"use strict";t.a={}}},[[105,5,1,6]]]); \ No newline at end of file