diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 705679e5a..a0294e234 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -21,6 +21,14 @@ jobs: - run: npm install - run: npm run build - run: npm run test + id: test + - uses: actions/upload-artifact@v4 + if: ${{ failure() && steps.test.conclusion == 'failure' }} + with: + name: test-results-web + path: | + test-data/**/*.new.png + test-data/**/*.diff.png build_csharp: name: Build and Test C# @@ -38,6 +46,14 @@ jobs: - run: npm install - run: npm run build-csharp - run: npm run test-csharp + id: test + - uses: actions/upload-artifact@v4 + if: ${{ failure() && steps.test.conclusion == 'failure' }} + with: + name: test-results-csharp + path: | + test-data/**/*.new.png + test-data/**/*.diff.png build_kotlin: name: Build and Test Kotlin @@ -68,4 +84,12 @@ jobs: - run: npm install - run: npm run build-kotlin - run: npm run test-kotlin + id: test + - uses: actions/upload-artifact@v4 + if: ${{ failure() && steps.test.conclusion == 'failure' }} + with: + name: test-results-kotlin + path: | + test-data/**/*.new.png + test-data/**/*.diff.png - run: ./src.kotlin/alphaTab/gradlew --stop diff --git a/src.compiler/AstPrinterBase.ts b/src.compiler/AstPrinterBase.ts index 4587ab39d..81de29cb9 100644 --- a/src.compiler/AstPrinterBase.ts +++ b/src.compiler/AstPrinterBase.ts @@ -211,6 +211,12 @@ export default abstract class AstPrinterBase { this.writeCommaSeparated(expr.typeArguments, t => this.writeType(t)); this.write('>'); } + + if(expr.nullSafe) { + this.write('?.'); + this.write(this._context.toMethodName("invoke")) + } + this.write('('); if (expr.arguments.length > 5) { this.writeLine(); diff --git a/src.compiler/csharp/CSharpAst.ts b/src.compiler/csharp/CSharpAst.ts index 41d9d7b7f..7d3db4df3 100644 --- a/src.compiler/csharp/CSharpAst.ts +++ b/src.compiler/csharp/CSharpAst.ts @@ -311,7 +311,7 @@ export interface PrimitiveTypeNode extends TypeNode { // Expressions -export interface Expression extends Node {} +export interface Expression extends Node { } export interface PrefixUnaryExpression extends Node { nodeType: SyntaxKind.PrefixUnaryExpression; @@ -337,7 +337,7 @@ export interface ThisLiteral extends Node { nodeType: SyntaxKind.ThisLiteral; } -export interface BaseLiteralExpression extends Node {} +export interface BaseLiteralExpression extends Node { } export interface StringLiteral extends Node { nodeType: SyntaxKind.StringLiteral; @@ -441,6 +441,7 @@ export interface InvocationExpression extends Node { expression: Expression; arguments: Expression[]; typeArguments?: TypeNode[]; + nullSafe?: Boolean; } export interface NewExpression extends Node { @@ -485,7 +486,7 @@ export interface YieldExpression extends Node { // Statements -export interface Statement extends Node {} +export interface Statement extends Node { } export interface Block extends Statement { nodeType: SyntaxKind.Block; diff --git a/src.compiler/csharp/CSharpAstTransformer.ts b/src.compiler/csharp/CSharpAstTransformer.ts index b99fae888..4bd74121b 100644 --- a/src.compiler/csharp/CSharpAstTransformer.ts +++ b/src.compiler/csharp/CSharpAstTransformer.ts @@ -3705,7 +3705,8 @@ export default class CSharpAstTransformer { expression: {} as cs.Expression, parent: parent, tsNode: expression, - nodeType: cs.SyntaxKind.InvocationExpression + nodeType: cs.SyntaxKind.InvocationExpression, + nullSafe: !!expression.questionDotToken } as cs.InvocationExpression; // chai diff --git a/src.compiler/typescript/Serializer.setProperty.ts b/src.compiler/typescript/Serializer.setProperty.ts index 6199dadd3..1895e2f83 100644 --- a/src.compiler/typescript/Serializer.setProperty.ts +++ b/src.compiler/typescript/Serializer.setProperty.ts @@ -264,8 +264,8 @@ function generateSetPropertyBody(serializable: TypeSchema, importer: (name: stri if (collectionAddMethod) { caseStatements.push( createNodeFromSource( - `for (const i of (v as unknown[])) { - obj.${collectionAddMethod}(i as ${elementTypeName}); + `for (const i of (v as ${elementTypeName}[])) { + obj.${collectionAddMethod}(i); }`, ts.SyntaxKind.ForOfStatement ) diff --git a/src.kotlin/alphaTab/android/src/main/java/alphaTab/collections/DoubleList.kt b/src.kotlin/alphaTab/android/src/main/java/alphaTab/collections/DoubleList.kt index b48f06f06..97ac00f3d 100644 --- a/src.kotlin/alphaTab/android/src/main/java/alphaTab/collections/DoubleList.kt +++ b/src.kotlin/alphaTab/android/src/main/java/alphaTab/collections/DoubleList.kt @@ -30,6 +30,15 @@ public class DoubleList : IDoubleIterable { _size = elements.size } + internal constructor(elements: IDoubleIterable) { + _items = DoubleArray(0) + _size = 0 + for(d in elements) { + push(d) + } + } + + private constructor(elements: DoubleArray, size: Int) { _items = elements _size = size @@ -150,7 +159,7 @@ public class DoubleList : IDoubleIterable { } } - + internal fun reduce(operation: (acc: Double, v: Double) -> Double, initial:Double): Double { var accumulator = initial for (element in _items) accumulator = operation(accumulator, element) diff --git a/src.kotlin/alphaTab/android/src/main/java/alphaTab/core/Globals.kt b/src.kotlin/alphaTab/android/src/main/java/alphaTab/core/Globals.kt index f25ef7bd9..0c958db22 100644 --- a/src.kotlin/alphaTab/android/src/main/java/alphaTab/core/Globals.kt +++ b/src.kotlin/alphaTab/android/src/main/java/alphaTab/core/Globals.kt @@ -202,7 +202,7 @@ internal inline fun Int?.toDouble(): Double? { internal inline fun String.toDoubleOrNaN(): Double { try { - val number = NumberFormat.getInstance(Locale.ROOT).parse(this) + val number = NumberFormat.getInstance(Locale.ROOT).parse(this.trim()) if (number != null) { return number.toDouble() } @@ -213,7 +213,7 @@ internal inline fun String.toDoubleOrNaN(): Double { internal fun String.toIntOrNaN(): Double { try { - val number = NumberFormat.getInstance(Locale.ROOT).parse(this) + val number = NumberFormat.getInstance(Locale.ROOT).parse(this.trim()) if (number != null) { return number.toInt().toDouble() } @@ -224,7 +224,7 @@ internal fun String.toIntOrNaN(): Double { internal fun String.toIntOrNaN(radix: Double): Double { try { - return Integer.parseInt(this, radix.toInt()).toDouble(); + return Integer.parseInt(this.trim(), radix.toInt()).toDouble(); } catch (e: Throwable) { } return Double.NaN diff --git a/src.kotlin/alphaTab/android/src/main/java/alphaTab/core/ecmaScript/Array.kt b/src.kotlin/alphaTab/android/src/main/java/alphaTab/core/ecmaScript/Array.kt index cd1e9910d..7e3450e91 100644 --- a/src.kotlin/alphaTab/android/src/main/java/alphaTab/core/ecmaScript/Array.kt +++ b/src.kotlin/alphaTab/android/src/main/java/alphaTab/core/ecmaScript/Array.kt @@ -1,11 +1,16 @@ package alphaTab.core.ecmaScript +import alphaTab.collections.IDoubleIterable + @Suppress("NOTHING_TO_INLINE") internal class Array { companion object { public inline fun from(x: Iterable): alphaTab.collections.List { return alphaTab.collections.List(x) } + public inline fun from(x: IDoubleIterable): alphaTab.collections.DoubleList { + return alphaTab.collections.DoubleList(x) + } public inline fun isArray(x:Any?):Boolean { return x is alphaTab.collections.List<*> } diff --git a/src.kotlin/alphaTab/android/src/main/java/alphaTab/core/ecmaScript/Set.kt b/src.kotlin/alphaTab/android/src/main/java/alphaTab/core/ecmaScript/Set.kt index e364a089a..fd6d74aba 100644 --- a/src.kotlin/alphaTab/android/src/main/java/alphaTab/core/ecmaScript/Set.kt +++ b/src.kotlin/alphaTab/android/src/main/java/alphaTab/core/ecmaScript/Set.kt @@ -1,42 +1,50 @@ package alphaTab.core.ecmaScript +import alphaTab.collections.ObjectBooleanMap + public class Set : Iterable { - private val _set: HashSet + private val _storage: ObjectBooleanMap public constructor() { - _set = HashSet() + _storage = ObjectBooleanMap() } public val size : Double - get() = _set.size.toDouble() + get() = _storage.size.toDouble() public constructor(values: Iterable?) { - _set = values?.toHashSet() ?: HashSet() + _storage = ObjectBooleanMap() + if(values != null){ + for(v in values) { + add(v) + } + } + } public fun add(item: T) { - _set.add(item) + _storage.set(item, true) } public fun has(item: T): Boolean { - return _set.contains(item) + return _storage.has(item) } public fun delete(item: T) { - _set.remove(item) + _storage.delete(item) } public fun forEach(action: (item: T) -> Unit) { - for (i in _set) { + for (i in _storage.keys()) { action(i) } } override fun iterator(): Iterator { - return _set.iterator() + return _storage.keys().iterator() } fun clear() { - _set.clear() + _storage.clear() } } diff --git a/src/generated/model/TrackSerializer.ts b/src/generated/model/TrackSerializer.ts index 94c604e49..5e7f9584f 100644 --- a/src/generated/model/TrackSerializer.ts +++ b/src/generated/model/TrackSerializer.ts @@ -33,6 +33,13 @@ export class TrackSerializer { o.set("shortname", obj.shortName); o.set("defaultsystemslayout", obj.defaultSystemsLayout); o.set("systemslayout", obj.systemsLayout); + if (obj.lineBreaks !== undefined) { + const a: number[] = []; + o.set("linebreaks", a); + for (const v of obj.lineBreaks!) { + a.push(v); + } + } o.set("percussionarticulations", obj.percussionArticulations.map(i => InstrumentArticulationSerializer.toJson(i))); if (obj.style) { o.set("style", TrackStyleSerializer.toJson(obj.style)); @@ -70,6 +77,11 @@ export class TrackSerializer { case "systemslayout": obj.systemsLayout = v! as number[]; return true; + case "linebreaks": + for (const i of (v as number[])) { + obj.addLineBreaks(i); + } + return true; case "percussionarticulations": obj.percussionArticulations = []; for (const o of (v as (Map | null)[])) { diff --git a/src/importer/MusicXmlImporter.ts b/src/importer/MusicXmlImporter.ts index 88dedcf18..8dcdbb1c4 100644 --- a/src/importer/MusicXmlImporter.ts +++ b/src/importer/MusicXmlImporter.ts @@ -104,10 +104,23 @@ class TrackInfo { private _instrumentIdToArticulationIndex: Map = new Map(); + private _lyricsLine = 0; + private _lyricsLines: Map = new Map(); + public constructor(track: Track) { this.track = track; } + public getLyricLine(number: string) { + if (this._lyricsLines.has(number)) { + return this._lyricsLines.get(number)!; + } + const line = this._lyricsLine; + this._lyricsLines.set(number, line); + this._lyricsLine++; + return line; + } + private static defaultNoteArticulation: InstrumentArticulation = new InstrumentArticulation( 'Default', 0, @@ -135,7 +148,12 @@ class TrackInfo { const bar = note.beat.voice.bar; // the calculation in the AccidentalHelper assumes a standard 5-line staff. - const musicXmlStaffSteps = AccidentalHelper.calculateNoteSteps(bar.masterBar.keySignature, bar.clef, noteValue); + let musicXmlStaffSteps: number; + if (noteValue === 0) { // no display pitch defined? + musicXmlStaffSteps = 4; // middle of bar + } else { + musicXmlStaffSteps = AccidentalHelper.calculateNoteSteps(bar.masterBar.keySignature, bar.clef, noteValue); + } // to translate this into the "staffLine" semantics we need to subtract additionally the steps "missing" from the absent lines const actualSteps = note.beat.voice.bar.staff.standardNotationLineCount * 2 - 1; @@ -169,7 +187,7 @@ export class MusicXmlImporter extends ScoreImporter { private _previousMasterBarNumber = -1; private _implicitBars: number = 0; - private _divisionsPerQuarterNote: number = MidiUtils.QuarterTime; + private _divisionsPerQuarterNote: number = 1; private _currentDynamics = DynamicValue.F; public get name(): string { @@ -181,13 +199,6 @@ export class MusicXmlImporter extends ScoreImporter { } public readScore(): Score { - this._idToTrackInfo.clear(); - this._indexToTrackInfo.clear(); - this._staffToContext.clear(); - this._implicitBars = 0; - this._divisionsPerQuarterNote = MidiUtils.QuarterTime; - this._currentDynamics = DynamicValue.F; - let xml: string = this.extractMusicXml(); let dom: XmlDocument = new XmlDocument(); try { @@ -197,17 +208,13 @@ export class MusicXmlImporter extends ScoreImporter { } this._score = new Score(); this._score.tempo = 120; + this._score.stylesheet.hideDynamics = true; this.parseDom(dom); this.consolidate(); this._score.finish(this.settings); this._score.rebuildRepeatGroups(); - // cleanup -> GC - this._idToTrackInfo.clear(); - this._indexToTrackInfo.clear(); - this._staffToContext.clear(); - return this._score; } @@ -265,7 +272,7 @@ export class MusicXmlImporter extends ScoreImporter { } } - extractMusicXml(): string { + private extractMusicXml(): string { const zip = new ZipReader(this.data); let entries: ZipEntry[]; try { @@ -435,22 +442,22 @@ export class MusicXmlImporter extends ScoreImporter { for (const type of creditTypes) { switch (type) { case 'title': - this._score.title = fullText; + this._score.title = MusicXmlImporter.sanitizeDisplay(fullText); break; case 'subtitle': - this._score.subTitle = fullText; + this._score.subTitle = MusicXmlImporter.sanitizeDisplay(fullText); break; case 'composer': - this._score.artist = fullText; + this._score.artist = MusicXmlImporter.sanitizeDisplay(fullText); break; case 'arranger': - this._score.artist = fullText; + this._score.artist = MusicXmlImporter.sanitizeDisplay(fullText); break; case 'lyricist': - this._score.words = fullText; + this._score.words = MusicXmlImporter.sanitizeDisplay(fullText); break; case 'rights': - this._score.copyright = fullText; + this._score.copyright = MusicXmlImporter.sanitizeDisplay(fullText); break; case 'part name': break; @@ -479,7 +486,7 @@ export class MusicXmlImporter extends ScoreImporter { fullText.includes('(c)') || fullText.includes('(C)') ) { - this._score.copyright = fullText; + this._score.copyright = MusicXmlImporter.sanitizeDisplay(fullText); return; } @@ -487,41 +494,50 @@ export class MusicXmlImporter extends ScoreImporter { // use the typical alphaTab placement as reference for valid props if (halign === 'center' || justify === 'center') { if (this._score.title.length === 0) { - this._score.title = fullText; + this._score.title = MusicXmlImporter.sanitizeDisplay(fullText); return; } if (this._score.subTitle.length === 0) { - this._score.subTitle = fullText; + this._score.subTitle = MusicXmlImporter.sanitizeDisplay(fullText); return; } if (this._score.album.length === 0) { - this._score.album = fullText; + this._score.album = MusicXmlImporter.sanitizeDisplay(fullText); return; } } else if (halign == 'right' || justify === 'right') { // in alphaTab only `music` is right if (this._score.music.length === 0) { - this._score.music = fullText; + this._score.music = MusicXmlImporter.sanitizeDisplay(fullText); return; } } // from here we simply fallback to filling any remaining information (first one wins approach) if (this._score.artist.length === 0) { - this._score.artist = fullText; + this._score.artist = MusicXmlImporter.sanitizeDisplay(fullText); return; } if (this._score.words.length === 0) { - this._score.words = fullText; + this._score.words = MusicXmlImporter.sanitizeDisplay(fullText); return; } } } } + private static sanitizeDisplay(text: string): string { + // no newlines or tabs, and non-breaking spaces + return text.replaceAll('\r', '') + .replaceAll('\n', ' ') + .replaceAll('\t', '\xA0\xA0') + .replaceAll(' ', '\xA0'); + + } + // visual aspects of credits are ignored // private parseCredit(element: XmlNode) { } @@ -553,17 +569,17 @@ export class MusicXmlImporter extends ScoreImporter { if (c.attributes.has('type')) { switch (c.attributes.get('type')!) { case 'composer': - this._score.artist = c.innerText; + this._score.artist = MusicXmlImporter.sanitizeDisplay(c.innerText); break; case 'lyricist': - this._score.words = c.innerText; + this._score.words = MusicXmlImporter.sanitizeDisplay(c.innerText); break; case 'arranger': - this._score.music = c.innerText; + this._score.music = MusicXmlImporter.sanitizeDisplay(c.innerText); break; } } else { - this._score.artist = c.innerText; + this._score.artist = MusicXmlImporter.sanitizeDisplay(c.innerText); } break; case 'rights': @@ -599,7 +615,7 @@ export class MusicXmlImporter extends ScoreImporter { break; // case 'software': Ignored case 'encoding-description': - this._score.notices += c.innerText; + this._score.notices += MusicXmlImporter.sanitizeDisplay(c.innerText); break; // case 'supports': Ignored } @@ -609,10 +625,10 @@ export class MusicXmlImporter extends ScoreImporter { private parseMovementTitle(element: XmlNode) { if (this._score.title.length == 0) { // we have no "work title", then use the "movement title" as main title - this._score.title = element.innerText; + this._score.title = MusicXmlImporter.sanitizeDisplay(element.innerText); } else { // we have a "work title", then use the "movement title" as subtitle - this._score.subTitle = element.innerText; + this._score.subTitle = MusicXmlImporter.sanitizeDisplay(element.innerText); } } @@ -645,13 +661,13 @@ export class MusicXmlImporter extends ScoreImporter { // case 'identification': Ignored, no part-wise information. // case 'part-link': Not supported case 'part-name': - track.name = c.innerText; + track.name = MusicXmlImporter.sanitizeDisplay(c.innerText); break; case 'part-name-display': track.name = this.parsePartDisplayAsText(c); break; case 'part-abbreviation': - track.shortName = c.innerText; + track.shortName = MusicXmlImporter.sanitizeDisplay(c.innerText); break; case 'part-abbreviation-display': track.shortName = this.parsePartDisplayAsText(c); @@ -718,10 +734,10 @@ export class MusicXmlImporter extends ScoreImporter { articulation.outputMidiNumber = parseInt(c.innerText) - 1; break; case 'volume': - articulation.outputVolume = MusicXmlImporter.interpolatePercent(parseInt(c.innerText)); + articulation.outputVolume = MusicXmlImporter.interpolatePercent(parseFloat(c.innerText)); break; case 'pan': - articulation.outputBalance = MusicXmlImporter.interpolatePan(parseInt(c.innerText)); + articulation.outputBalance = MusicXmlImporter.interpolatePan(parseFloat(c.innerText)); break; // case 'elevation': Ignored } @@ -862,7 +878,7 @@ export class MusicXmlImporter extends ScoreImporter { break; } } - return text; + return MusicXmlImporter.sanitizeDisplay(text); } private parseWork(element: XmlNode) { @@ -871,7 +887,7 @@ export class MusicXmlImporter extends ScoreImporter { // case 'work-number': Ignored // case 'opus': Ignored case 'work-title': - this._score.title = c.innerText; + this._score.title = MusicXmlImporter.sanitizeDisplay(c.innerText); break; } } @@ -987,6 +1003,8 @@ export class MusicXmlImporter extends ScoreImporter { const staff = this.getOrCreateStaff(track, 0); this.getOrCreateBar(staff, masterBar); + masterBar.alternateEndings = this._nextMasterBarRepeatEnding; + for (const c of element.childElements()) { switch (c.localName) { case 'note': @@ -1008,7 +1026,9 @@ export class MusicXmlImporter extends ScoreImporter { this.parseHarmony(c, track); break; // case 'figured-bass': Not supported - // case 'print': Ignored + case 'print': + this.parsePrint(c, masterBar, track); + break; case 'sound': this.parseSound(c, masterBar, track); break; @@ -1025,22 +1045,44 @@ export class MusicXmlImporter extends ScoreImporter { this.applySimileMarks(masterBar, track); } + private parsePrint(element: XmlNode, masterBar: MasterBar, track: Track) { + if (element.getAttribute('new-system', 'no') == 'yes') { + track.addLineBreaks(masterBar.index); + } else if (element.getAttribute('new-page', 'no') == 'yes') { + track.addLineBreaks(masterBar.index); + } + } + private applySimileMarks(masterBar: MasterBar, track: Track) { if (this._simileMarkAllStaves !== null) { for (const s of track.staves) { const bar = this.getOrCreateBar(s, masterBar); bar.simileMark = this._simileMarkAllStaves!; } - this._simileMarkAllStaves = null; + + if (this._simileMarkAllStaves == SimileMark.FirstOfDouble) { + this._simileMarkAllStaves = SimileMark.SecondOfDouble; + } else { + this._simileMarkAllStaves = null; + } } if (this._simileMarkPerStaff !== null) { - for (const [i, m] of this._simileMarkPerStaff!) { + const keys = Array.from(this._simileMarkPerStaff!.keys()); + for (const i of keys) { const s = this.getOrCreateStaff(track, i); const bar = this.getOrCreateBar(s, masterBar); - bar.simileMark = m; + bar.simileMark = this._simileMarkPerStaff!.get(i)!; + + if (bar.simileMark == SimileMark.FirstOfDouble) { + this._simileMarkPerStaff!.set(i, SimileMark.SecondOfDouble); + } else { + this._simileMarkPerStaff!.delete(i); + } + } + if (this._simileMarkPerStaff.size === 0) { + this._simileMarkPerStaff = null; } - this._simileMarkPerStaff = null; } } @@ -1079,21 +1121,37 @@ export class MusicXmlImporter extends ScoreImporter { } } + private _nextMasterBarRepeatEnding: number = 0; private parseEnding(element: XmlNode, masterBar: MasterBar): void { - let num: number = parseInt(element.getAttribute('number')); - if (num > 0) { - --num; - masterBar.alternateEndings = masterBar.alternateEndings | ((0x01 << num) & 0xff); + const numbers = element + .getAttribute('number') + .split(',') + .map(v => parseInt(v)); + + let flags = 0; + for (const num of numbers) { + flags = flags | ((0x01 << (num - 1)) & 0xff); + } + + masterBar.alternateEndings = flags; + + switch (element.getAttribute('type', '')) { + case 'start': + this._nextMasterBarRepeatEnding = this._nextMasterBarRepeatEnding | flags; + break; + case 'stop': + case 'discontinue': + this._nextMasterBarRepeatEnding = this._nextMasterBarRepeatEnding & ~flags; + break; + case 'continue': + // keep + break; } } private parseBarStyle(element: XmlNode, masterBar: MasterBar) { switch (element.innerText) { - case 'dashed': - // NOTE: temporary until we have full support for custom styles - masterBar.isFreeTime = true; - break; - + // case 'dashed': Not Supported // case 'dotted': Not Supported // case 'heavy': Not Supported // case 'heavy-heavy': Not Supported @@ -1169,7 +1227,7 @@ export class MusicXmlImporter extends ScoreImporter { const automation = new Automation(); automation.type = AutomationType.Balance; - automation.value = MusicXmlImporter.interpolatePan(parseInt(element.attributes.get('pan')!)); + automation.value = MusicXmlImporter.interpolatePan(parseFloat(element.attributes.get('pan')!)); this._nextBeatAutomations.push(automation); } @@ -1180,7 +1238,7 @@ export class MusicXmlImporter extends ScoreImporter { const automation = new Automation(); automation.type = AutomationType.Tempo; - automation.value = MusicXmlImporter.interpolatePercent(parseInt(element.attributes.get('tempo')!)); + automation.value = MusicXmlImporter.interpolatePercent(parseFloat(element.attributes.get('tempo')!)); this._nextBeatAutomations.push(automation); } } @@ -1233,10 +1291,10 @@ export class MusicXmlImporter extends ScoreImporter { private _nextBeatAutomations: Automation[] | null = null; private _nextBeatChord: Chord | null = null; private _nextBeatCrescendo: CrescendoType | null = null; - private _nextBeatDynamics: DynamicValue | null = null; private _nextBeatLetRing: boolean = false; private _nextBeatPalmMute: boolean = false; private _nextBeatOttavia: Ottavia | null = null; + private _nextBeatText: string | null = null; private parseSoundMidiInstrument(element: XmlNode, masterBar: MasterBar) { let automation: Automation; @@ -1252,7 +1310,7 @@ export class MusicXmlImporter extends ScoreImporter { automation = new Automation(); automation.type = AutomationType.Instrument; - automation.value = parseInt(c.innerText); + automation.value = parseInt(c.innerText) - 1; this._nextBeatAutomations!.push(automation); break; @@ -1264,7 +1322,7 @@ export class MusicXmlImporter extends ScoreImporter { automation = new Automation(); automation.type = AutomationType.Volume; - automation.value = MusicXmlImporter.interpolatePercent(parseInt(c.innerText)); + automation.value = MusicXmlImporter.interpolatePercent(parseFloat(c.innerText)); this._nextBeatAutomations!.push(automation); break; @@ -1275,7 +1333,7 @@ export class MusicXmlImporter extends ScoreImporter { automation = new Automation(); automation.type = AutomationType.Balance; - automation.value = MusicXmlImporter.interpolatePan(parseInt(c.innerText)); + automation.value = MusicXmlImporter.interpolatePan(parseFloat(c.innerText)); this._nextBeatAutomations!.push(automation); break; // case 'elevation': Ignored @@ -1311,7 +1369,9 @@ export class MusicXmlImporter extends ScoreImporter { chord.name += degreeParenthesis ? `(${degree})` : degree; } - this._nextBeatChord = chord; + if (this._nextBeatChord === null) { + this._nextBeatChord = chord; + } } private parseDegree(element: XmlNode) { @@ -1351,7 +1411,7 @@ export class MusicXmlImporter extends ScoreImporter { rootStep = c.innerText; break; case 'root-alter': - switch (parseInt(element.innerText)) { + switch (parseFloat(c.innerText)) { case -2: rootAlter = 'bb'; break; @@ -1535,7 +1595,7 @@ export class MusicXmlImporter extends ScoreImporter { // case 'footnote': Ignored // case 'level': Ignored case 'divisions': - this._divisionsPerQuarterNote = parseInt(c.innerText); + this._divisionsPerQuarterNote = parseFloat(c.innerText); break; case 'key': this.parseKey(c, masterBar); @@ -1566,7 +1626,7 @@ export class MusicXmlImporter extends ScoreImporter { // case 'for-part': not supported // case 'directive': Ignored case 'measure-style': - this.parseMeasureStyle(c, track); + this.parseMeasureStyle(c, track, false); break; } } @@ -1577,7 +1637,7 @@ export class MusicXmlImporter extends ScoreImporter { // case 'footnote': Ignored // case 'level': Ignored case 'divisions': - this._divisionsPerQuarterNote = parseInt(c.innerText); + this._divisionsPerQuarterNote = parseFloat(c.innerText); break; // https://github.com/CoderLine/alphaTab/issues/1991 // case 'key': Not supported @@ -1589,7 +1649,9 @@ export class MusicXmlImporter extends ScoreImporter { // case 'transpose': Not supported // case 'for-part': not supported // case 'directive': Ignored - // case 'measure-style': Not supported + case 'measure-style': + this.parseMeasureStyle(c, track, true); + break; } } } @@ -1598,41 +1660,43 @@ export class MusicXmlImporter extends ScoreImporter { private _simileMarkAllStaves: SimileMark | null = null; private _simileMarkPerStaff: Map | null = null; private _isBeatSlash: boolean = false; - parseMeasureStyle(element: XmlNode, track: Track) { + private parseMeasureStyle(element: XmlNode, track: Track, midBar: boolean) { for (let c of element.childElements()) { switch (c.localName) { // case 'multiple-rest': Ignored, when multibar rests are enabled for rendering this info shouldn't matter. case 'measure-repeat': - let simileMark: SimileMark | null = null; - switch (c.getAttribute('type')) { - case 'start': - switch (parseInt(c.getAttribute('slashes', '1'))) { - case 1: - simileMark = SimileMark.Simple; - break; - case 2: - simileMark = SimileMark.FirstOfDouble; - break; - default: - // not supported - break; - } - break; - case 'stop': - simileMark = null; - break; - } + if (!midBar) { + let simileMark: SimileMark | null = null; + switch (c.getAttribute('type')) { + case 'start': + switch (parseInt(c.getAttribute('slashes', '1'))) { + case 1: + simileMark = SimileMark.Simple; + break; + case 2: + simileMark = SimileMark.FirstOfDouble; + break; + default: + // not supported + break; + } + break; + case 'stop': + simileMark = null; + break; + } - if (element.attributes.has('number')) { - this._simileMarkPerStaff = this._simileMarkPerStaff ?? new Map(); - const staff = parseInt(element.attributes.get('number')!) - 1; - if (simileMark == null) { - this._simileMarkPerStaff!.delete(staff); + if (element.attributes.has('number')) { + this._simileMarkPerStaff = this._simileMarkPerStaff ?? new Map(); + const staff = parseInt(element.attributes.get('number')!) - 1; + if (simileMark == null) { + this._simileMarkPerStaff!.delete(staff); + } else { + this._simileMarkPerStaff!.set(staff, simileMark!); + } } else { - this._simileMarkPerStaff!.set(staff, simileMark!); + this._simileMarkAllStaves = simileMark; } - } else { - this._simileMarkAllStaves = simileMark; } break; @@ -1658,10 +1722,10 @@ export class MusicXmlImporter extends ScoreImporter { switch (c.localName) { // case 'diatonic': Not supported case 'chromatic': - semitones += parseInt(c.innerText); + semitones += parseFloat(c.innerText); break; case 'octave-change': - semitones += parseInt(c.innerText) * 12; + semitones += parseFloat(c.innerText) * 12; break; // case 'double': Not supported } @@ -1699,9 +1763,11 @@ export class MusicXmlImporter extends ScoreImporter { } private parseStaffTuning(element: XmlNode, staff: Staff): void { - staff.showTablature = true; - staff.showStandardNotation = false; - staff.stringTuning.tunings = new Array(staff.standardNotationLineCount).fill(0); + if (staff.stringTuning.tunings.length === 0) { + staff.showTablature = true; + staff.showStandardNotation = false; + staff.stringTuning.tunings = new Array(staff.standardNotationLineCount).fill(0); + } let line: number = parseInt(element.getAttribute('line')); let tuningStep: string = 'C'; @@ -1713,7 +1779,7 @@ export class MusicXmlImporter extends ScoreImporter { tuningStep = c.innerText; break; case 'tuning-alter': - tuningAlter = parseInt(c.innerText); + tuningAlter = parseFloat(c.innerText); break; case 'tuning-octave': tuningOctave = c.innerText; @@ -1792,7 +1858,10 @@ export class MusicXmlImporter extends ScoreImporter { if (v.indexOf('+') === -1) { masterBar.timeSignatureNumerator = parseInt(v); } else { - masterBar.timeSignatureNumerator = 4; + masterBar.timeSignatureNumerator = v + .split('+') + .map(v => parseInt(v)) + .reduce((sum, v) => v + sum, 0); } beatsParsed = true; } @@ -1802,7 +1871,10 @@ export class MusicXmlImporter extends ScoreImporter { if (v.indexOf('+') === -1) { masterBar.timeSignatureDenominator = parseInt(v); } else { - masterBar.timeSignatureDenominator = 4; + masterBar.timeSignatureDenominator = v + .split('+') + .map(v => parseInt(v)) + .reduce((sum, v) => v + sum, 0); } beatTypeParsed = true; } @@ -1814,9 +1886,9 @@ export class MusicXmlImporter extends ScoreImporter { switch (element.getAttribute('symbol', '')) { case 'common': + case 'cut': masterBar.timeSignatureCommon = true; break; - // case 'cut': Not supported // case 'dotted-note': Not supported // case 'normal': implicit // case 'note': Not supported @@ -1870,7 +1942,7 @@ export class MusicXmlImporter extends ScoreImporter { directionTypes.push(c.firstElement!); break; case 'offset': - offset = parseInt(c.innerText); + offset = parseFloat(c.innerText); break; // case 'footnote': Ignored // case 'level': Ignored @@ -1882,7 +1954,7 @@ export class MusicXmlImporter extends ScoreImporter { break; case 'sound': if (c.attributes.has('tempo')) { - tempo = parseInt(c.attributes.get('tempo')!); + tempo = parseFloat(c.attributes.get('tempo')!); } break; // case 'listening': Ignored @@ -1957,7 +2029,11 @@ export class MusicXmlImporter extends ScoreImporter { } break; case 'dynamics': - this._nextBeatDynamics = this.parseDynamics(direction); + const newDynamics = this.parseDynamics(direction); + if (newDynamics !== null) { + this._currentDynamics = newDynamics; + this._score.stylesheet.hideDynamics = false; + } break; case 'dashes': const type = direction.getAttribute('type', 'start'); @@ -1969,6 +2045,7 @@ export class MusicXmlImporter extends ScoreImporter { this._nextBeatPalmMute = type === 'start' || type == 'continue'; break; } + previousWords = ''; break; // case 'bracket': Ignored case 'pedal': @@ -2006,6 +2083,10 @@ export class MusicXmlImporter extends ScoreImporter { // case 'other-direction': Not supported } } + + if (previousWords) { + this._nextBeatText = previousWords; + } } private parseOctaveShift(element: XmlNode): Ottavia | null { const type = element.getAttribute('type'); @@ -2051,7 +2132,7 @@ export class MusicXmlImporter extends ScoreImporter { // case 'beat-unit-dot' not supported // case 'beat-unit-tied' not supported case 'per-minute': - perMinute = parseInt(c.innerText); + perMinute = parseFloat(c.innerText); break; // case 'metronome-arrows': not supported // case 'metronome-note': not supported @@ -2155,7 +2236,7 @@ export class MusicXmlImporter extends ScoreImporter { for (const c of element.childElements()) { switch (c.localName) { case 'duration': - this._musicalPosition += this.musicXmlDivisionsToAlphaTabTicks(parseInt(c.innerText)); + this._musicalPosition += this.musicXmlDivisionsToAlphaTabTicks(parseFloat(c.innerText)); break; // case 'footnote': Ignored // case 'level': Ignored @@ -2172,7 +2253,7 @@ export class MusicXmlImporter extends ScoreImporter { const beat = this._lastBeat; if (beat) { let musicalPosition = this._musicalPosition; - musicalPosition -= this.musicXmlDivisionsToAlphaTabTicks(parseInt(c.innerText)); + musicalPosition -= this.musicXmlDivisionsToAlphaTabTicks(parseFloat(c.innerText)); if (musicalPosition < 0) { musicalPosition = 0; } @@ -2205,24 +2286,6 @@ export class MusicXmlImporter extends ScoreImporter { while (staff.bars.length <= masterBar.index) { const newBar = new Bar(); - if (this._simileMarkPerStaff?.has(staff.index) === true) { - const simileMark = this._simileMarkPerStaff.get(staff.index)!; - newBar.simileMark = simileMark; - if (simileMark == SimileMark.FirstOfDouble) { - this._simileMarkPerStaff.set(staff.index, SimileMark.SecondOfDouble); - } else if (simileMark == SimileMark.SecondOfDouble) { - this._simileMarkPerStaff.set(staff.index, SimileMark.FirstOfDouble); - } - } else if (this._simileMarkAllStaves !== null) { - const simileMark = this._simileMarkAllStaves!; - newBar.simileMark = simileMark; - if (simileMark == SimileMark.FirstOfDouble) { - this._simileMarkAllStaves = SimileMark.SecondOfDouble; - } else if (simileMark == SimileMark.SecondOfDouble) { - this._simileMarkAllStaves = SimileMark.FirstOfDouble; - } - } - staff.addBar(newBar); if (newBar.previousBar) { @@ -2272,7 +2335,7 @@ export class MusicXmlImporter extends ScoreImporter { let staffIndex = 0; let voiceIndex = 0; - let durationInTicks = 0; + let durationInTicks = -1; let beatDuration: Duration | null = null; let dots = 0; @@ -2283,9 +2346,9 @@ export class MusicXmlImporter extends ScoreImporter { // Note level let note: Note | null = null; - let tieNode: XmlNode | null = null; let isPitched = false; let instrumentId: string | null = null; + let noteIsVisible = element.getAttribute('print-object', 'yes') !== 'no'; // will create new beat with all information in the correct tree // or add the note to an existing beat if specified accordingly. @@ -2311,9 +2374,6 @@ export class MusicXmlImporter extends ScoreImporter { if (isChord) { beat = this._lastBeat!; beat!.addNote(note!); - if (tieNode) { - this.parseTie(tieNode!, note!, staff); - } return; } @@ -2370,6 +2430,13 @@ export class MusicXmlImporter extends ScoreImporter { ); } + if (durationInTicks < 0 && beatDuration !== null) { + durationInTicks = MidiUtils.toTicks(beatDuration!); + if (dots > 0) { + durationInTicks = MidiUtils.applyDot(durationInTicks, dots == 2); + } + } + const newBeat = new Beat(); beat = newBeat; newBeat.beamingMode = beamMode; @@ -2402,12 +2469,6 @@ export class MusicXmlImporter extends ScoreImporter { newBeat.crescendo = crescendo; } - const dynamics = this._nextBeatDynamics; - // Don't reset until changed this._nextBeatDynamics = null; - if (dynamics !== null) { - newBeat.dynamics = dynamics; - } - const ottavia = this._nextBeatOttavia; // Don't set until 'stop' if (ottavia !== null) { @@ -2416,18 +2477,19 @@ export class MusicXmlImporter extends ScoreImporter { newBeat.isLetRing = this._nextBeatLetRing; newBeat.isPalmMute = this._nextBeatPalmMute; + if (this._nextBeatText) { + newBeat.text = this._nextBeatText; + this._nextBeatText = null; + } if (note !== null) { newBeat.addNote(note!); - - if (tieNode) { - this.parseTie(tieNode!, note!, staff); - } } this.insertBeatToVoice(newBeat, voice); if (note !== null) { + note!.isVisible = noteIsVisible; const trackInfo = this._indexToTrackInfo.get(track.index)!; if (instrumentId !== null) { note!.percussionArticulation = trackInfo.getOrCreateArticulation(instrumentId!, note!); @@ -2455,7 +2517,7 @@ export class MusicXmlImporter extends ScoreImporter { for (const c of element.childElements()) { switch (c.localName) { case 'grace': - const makeTime = parseInt(c.getAttribute('make-time', '-1')); + const makeTime = parseFloat(c.getAttribute('make-time', '-1')); if (makeTime >= 0) { graceDurationInDivisions = this.musicXmlDivisionsToAlphaTabTicks(makeTime); graceType = GraceType.BeforeBeat; @@ -2498,14 +2560,7 @@ export class MusicXmlImporter extends ScoreImporter { case 'duration': durationInTicks = this.parseDuration(c); break; - case 'tie': - if (note === null) { - Logger.warning('MusicXML', 'Malformed MusicXML, missing pitch or unpitched for note'); - } else { - tieNode = c; - } - break; - + // case 'tie': Ignored -> "tie" is sound, "tied" is notation case 'instrument': if (note === null) { Logger.warning('MusicXML', 'Malformed MusicXML, missing pitch or unpitched for note'); @@ -2593,7 +2648,7 @@ export class MusicXmlImporter extends ScoreImporter { break; case 'lyric': ensureBeat(); - this.parseLyric(c, beat!); + this.parseLyric(c, beat!, track); break; // case 'play': Ignored // case 'listen': Ignored @@ -2820,7 +2875,15 @@ export class MusicXmlImporter extends ScoreImporter { note.style!.noteHead = MusicFontSymbol.NoteheadNull; break; case 'normal': - // no need to style + this.applyNoteHead( + note, + beatDuration, + forceFill, + MusicFontSymbol.NoteheadDoubleWhole, + MusicFontSymbol.NoteheadWhole, + MusicFontSymbol.NoteheadHalf, + MusicFontSymbol.NoteheadBlack + ); break; case 're': this.applyNoteHead( @@ -2988,8 +3051,10 @@ export class MusicXmlImporter extends ScoreImporter { private parseBeatDuration(element: XmlNode): Duration | null { switch (element.innerText) { - // case "1024th": not supported - // case "512th": not supported + case '1024th': // not supported + return Duration.TwoHundredFiftySixth; + case '512th': // not supported + return Duration.TwoHundredFiftySixth; case '256th': return Duration.TwoHundredFiftySixth; case '128th': @@ -3059,19 +3124,28 @@ export class MusicXmlImporter extends ScoreImporter { newBeat.updateDurations(); } - private parseLyric(element: XmlNode, beat: Beat) { + private parseLyric(element: XmlNode, beat: Beat, track: Track) { + const info = this._indexToTrackInfo.get(track.index)!; + const index = info.getLyricLine(element.getAttribute('number', '')); + if (beat.lyrics === null) { + beat.lyrics = []; + } + while (beat.lyrics.length <= index) { + beat.lyrics.push(''); + } + for (let c of element.childElements()) { switch (c.localName) { // case 'syllabic' not supported case 'text': - if (beat.text) { - beat.text += ' ' + c.innerText; + if (beat.lyrics[index]) { + beat.lyrics[index] += ' ' + c.innerText; } else { - beat.text = c.innerText; + beat.lyrics[index] = c.innerText; } break; case 'elision': - beat.text += c.innerText; + beat.lyrics[index] += c.innerText; break; } } @@ -3293,7 +3367,7 @@ export class MusicXmlImporter extends ScoreImporter { break; case 'string': if (note) { - note.string = parseInt(c.innerText); + note.string = beat.voice.bar.staff.tuning.length - parseInt(c.innerText) + 1; } break; case 'hammer-on': @@ -3409,16 +3483,19 @@ export class MusicXmlImporter extends ScoreImporter { return Fingers.Unknown; } + private _currentTrillStep: number = -1; + private parseOrnaments(element: XmlNode, note: Note): void { - let previousIsTrill = false; + let currentTrillStep = -1; for (let c of element.childElements()) { switch (c.localName) { case 'trill-mark': - const step = parseInt(c.getAttribute('trill-step', '2')); - if (note.string >= 0) { - note.trillValue = note.stringTuning + step; + currentTrillStep = parseInt(c.getAttribute('trill-step', '2')); + if (note.isStringed) { + note.trillValue = note.stringTuning + currentTrillStep; + } else if (!note.isPercussion) { + note.trillValue = note.calculateRealValue(false, false) + currentTrillStep; } - previousIsTrill = true; break; case 'turn': note.ornament = NoteOrnament.Turn; @@ -3432,7 +3509,19 @@ export class MusicXmlImporter extends ScoreImporter { // case 'inverted-vertical-turn': Not supported // case 'shake': Not supported case 'wavy-line': - if (!previousIsTrill) { + if (currentTrillStep > 0) { + if (c.getAttribute('type') === 'start') { + this._currentTrillStep = currentTrillStep; + } + } else if (this._currentTrillStep > 0) { + if (c.getAttribute('type') === 'stop') { + this._currentTrillStep = -1; + } else if (note.isStringed) { + note.trillValue = note.stringTuning + this._currentTrillStep; + } else if (!note.isPercussion) { + note.trillValue = note.calculateRealValue(false, false) + this._currentTrillStep; + } + } else { note.vibrato = VibratoType.Slight; } break; @@ -3447,7 +3536,6 @@ export class MusicXmlImporter extends ScoreImporter { switch (c.innerText) { case '1': note.beat.tremoloSpeed = Duration.Eighth; - break; case '2': note.beat.tremoloSpeed = Duration.Sixteenth; @@ -3460,8 +3548,6 @@ export class MusicXmlImporter extends ScoreImporter { // case 'haydn': Not supported // case 'other-element': Not supported } - - previousIsTrill = c.localName === 'trill-mark'; } } @@ -3487,7 +3573,51 @@ export class MusicXmlImporter extends ScoreImporter { } private parseTied(element: XmlNode, note: Note, staff: Staff): void { - this.parseTie(element, note, staff); + const type = element.getAttribute('type'); + let number = element.getAttribute('number', ''); + + const context = this.getStaffContext(staff); + + if (type === 'start') { + if (number) { + // start without end + if(context.tieStartIds.has(number)) { + const unclosed = context.tieStartIds.get(number)!; + context.tieStarts.delete(unclosed); + } + + context.tieStartIds.set(number, note); + } + + context.tieStarts.add(note); + } else if (type === 'stop' && !note.isTieDestination) { + let tieOrigin: Note | null = null; + if (number) { + if (!context.tieStartIds.has(number)) { + return; + } + + tieOrigin = context.tieStartIds.get(number)!; + context.tieStartIds.delete(number); + context.tieStarts.delete(note); + } else { + const realValue = this.calculatePitchedNoteValue(note); + for (const t of context.tieStarts) { + if (this.calculatePitchedNoteValue(t) === realValue) { + tieOrigin = t; + context.tieStarts.delete(tieOrigin); + break; + } + } + } + + if (!tieOrigin) { + return; + } + + note.isTieDestination = true; + note.tieOrigin = tieOrigin; + } } private parseStem(element: XmlNode): BeamDirection | null { @@ -3566,53 +3696,12 @@ export class MusicXmlImporter extends ScoreImporter { } } - private parseTie(element: XmlNode, note: Note, staff: Staff) { - const type = element.getAttribute('type'); - let number = element.getAttribute('number', ''); - - const context = this.getStaffContext(staff); - - if (type === 'start') { - if (number) { - context.tieStartIds.set(number, note); - } - - context.tieStarts.add(note); - } else if (type === 'stop' && !note.isTieDestination) { - let tieOrigin: Note | null = null; - if (number) { - if (!context.tieStartIds.has(number)) { - return; - } - - tieOrigin = context.tieStartIds.get(number)!; - context.tieStartIds.delete(number); - } else { - const realValue = this.calculatePitchedNoteValue(note); - for (const t of context.tieStarts) { - if (this.calculatePitchedNoteValue(t) === realValue) { - tieOrigin = t; - context.tieStarts.delete(tieOrigin); - break; - } - } - } - - if (!tieOrigin) { - return; - } - - note.isTieDestination = true; - note.tieOrigin = tieOrigin; - } - } - private calculatePitchedNoteValue(note: Note) { return note.octave * 12 + note.tone; } private parseDuration(element: XmlNode): number { - return this.musicXmlDivisionsToAlphaTabTicks(parseInt(element.innerText)); + return this.musicXmlDivisionsToAlphaTabTicks(parseFloat(element.innerText)); } private parseUnpitched(element: XmlNode, track: Track): Note { @@ -3630,10 +3719,17 @@ export class MusicXmlImporter extends ScoreImporter { } } - let value: number = octave * 12 + ModelUtils.getToneForText(step).noteValue; + // if no display information -> middle of staff (handled in getOrCreateArticulation) const note = new Note(); - note.octave = (value / 12) | 0; - note.tone = value - note.octave * 12; + if (step === '') { + note.octave = 0; + note.tone = 0; + } + else { + const value: number = octave * 12 + ModelUtils.getToneForText(step).noteValue; + note.octave = (value / 12) | 0; + note.tone = value - note.octave * 12; + } return note; } diff --git a/src/model/Note.ts b/src/model/Note.ts index b497aaeb2..02c0f0220 100644 --- a/src/model/Note.ts +++ b/src/model/Note.ts @@ -31,6 +31,8 @@ class NoteIdBag { public slurOriginNoteId: number = -1; public hammerPullDestinationNoteId: number = -1; public hammerPullOriginNoteId: number = -1; + public slideTargetNoteId: number = -1; + public slideOriginNoteId: number = -1; } /** @@ -883,7 +885,10 @@ export class Note { switch (this.slideOutType) { case SlideOutType.Shift: case SlideOutType.Legato: - this.slideTarget = nextNoteOnLine.value; + if(!this.slideTarget) { + this.slideTarget = nextNoteOnLine.value; + } + if (!this.slideTarget) { this.slideOutType = SlideOutType.None; } else { @@ -1124,7 +1129,8 @@ export class Note { if ( this._noteIdBag.hammerPullDestinationNoteId !== -1 || this._noteIdBag.tieDestinationNoteId !== -1 || - this._noteIdBag.slurDestinationNoteId !== -1 + this._noteIdBag.slurDestinationNoteId !== -1 || + this._noteIdBag.slideTargetNoteId !== -1 ) { noteIdLookup.set(this.id, this); } @@ -1144,6 +1150,11 @@ export class Note { this.slurOrigin.slurDestination = this; } + if (this._noteIdBag.slideOriginNoteId !== -1) { + this.slideOrigin = noteIdLookup.get(this._noteIdBag.slideOriginNoteId)!; + this.slideOrigin.slideTarget = this; + } + this._noteIdBag = null; // not needed anymore } else { // no tie destination at all? @@ -1190,6 +1201,13 @@ export class Note { if (this.hammerPullDestination !== null) { o.set('hammerpulldestinationnoteid', this.hammerPullDestination.id); } + + if (this.slideTarget !== null) { + o.set('slidetargetnoteid', this.slideTarget.id); + } + if (this.slideOrigin !== null) { + o.set('slideoriginnoteid', this.slideOrigin.id); + } } /** @@ -1235,6 +1253,18 @@ export class Note { } this._noteIdBag.hammerPullDestinationNoteId = v as number; return true; + case 'slidetargetnoteid': + if (this._noteIdBag == null) { + this._noteIdBag = new NoteIdBag(); + } + this._noteIdBag.slideTargetNoteId = v as number; + return true; + case 'slideoriginnoteid': + if (this._noteIdBag == null) { + this._noteIdBag = new NoteIdBag(); + } + this._noteIdBag.slideOriginNoteId = v as number; + return true; } return false; } diff --git a/src/model/PercussionMapper.ts b/src/model/PercussionMapper.ts index aa5c8aa30..88331995e 100644 --- a/src/model/PercussionMapper.ts +++ b/src/model/PercussionMapper.ts @@ -274,6 +274,9 @@ export class PercussionMapper { public static getArticulation(n: Note): InstrumentArticulation | null { const articulationIndex = n.percussionArticulation; + if (articulationIndex < 0) { + return null; + } const trackArticulations = n.beat.voice.bar.staff.track.percussionArticulations; if (articulationIndex < trackArticulations.length) { diff --git a/src/model/Track.ts b/src/model/Track.ts index e42ae047e..1bb302286 100644 --- a/src/model/Track.ts +++ b/src/model/Track.ts @@ -31,10 +31,9 @@ export enum TrackSubElement { /** * The tuning of the strings. */ - StringTuning, + StringTuning } - /** * Defines the custom styles for tracks. * @json @@ -89,7 +88,7 @@ export class Track { * In formats like Guitar Pro this flag indicates whether on the default "multi-track" layout * tracks should be visible or not. */ - public isVisibleOnMultiTrack:boolean = true; + public isVisibleOnMultiTrack: boolean = true; /** * Gets or sets the short name of this track. @@ -108,6 +107,24 @@ export class Track { */ public systemsLayout: number[] = []; + /** + * Defines on which bars specifically a line break is forced. + * @json_add addLineBreaks + */ + public lineBreaks?: Set; + + /** + * Adds a new line break. + * @param index The index of the bar before which a line break should happen. + */ + public addLineBreaks(index: number) { + if (!this.lineBreaks) { + this.lineBreaks = new Set(); + } + + this.lineBreaks!.add(index); + } + /** * Gets or sets a mapping on which staff lines particular percussion instruments * should be shown. @@ -117,7 +134,7 @@ export class Track { /** * The style customizations for this item. */ - public style?:TrackStyle; + public style?: TrackStyle; public ensureStaveCount(staveCount: number): void { while (this.staves.length < staveCount) { @@ -162,7 +179,7 @@ export class Track { // initialize lyrics list for beat if required if (!beat.lyrics) { beat.lyrics = new Array(lyrics.length); - beat.lyrics.fill(""); + beat.lyrics.fill(''); } // assign chunk beat.lyrics[li] = lyric.chunks[ci]; diff --git a/src/rendering/effects/AlternateEndingsEffectInfo.ts b/src/rendering/effects/AlternateEndingsEffectInfo.ts index c4c759010..fe68e5243 100644 --- a/src/rendering/effects/AlternateEndingsEffectInfo.ts +++ b/src/rendering/effects/AlternateEndingsEffectInfo.ts @@ -29,7 +29,20 @@ export class AlternateEndingsEffectInfo extends EffectBarRendererInfo { } public createNewGlyph(renderer: BarRendererBase, beat: Beat): EffectGlyph { - return new AlternateEndingsGlyph(0, 0, beat.voice.bar.masterBar.alternateEndings); + const masterBar = beat.voice.bar.masterBar; + const openLine = + masterBar.previousMasterBar === null || + masterBar.alternateEndings !== masterBar.previousMasterBar!.alternateEndings; + let closeLine = + masterBar.isRepeatEnd || + masterBar.nextMasterBar === null || + masterBar.alternateEndings !== masterBar.nextMasterBar!.alternateEndings; + + if (!masterBar.repeatGroup.closings.some(c => c.index >= masterBar.index)) { + closeLine = false; + } + + return new AlternateEndingsGlyph(0, 0, masterBar.alternateEndings, openLine, closeLine); } public canExpand(from: Beat, to: Beat): boolean { diff --git a/src/rendering/effects/DynamicsEffectInfo.ts b/src/rendering/effects/DynamicsEffectInfo.ts index 7930d55a0..edc65b2f4 100644 --- a/src/rendering/effects/DynamicsEffectInfo.ts +++ b/src/rendering/effects/DynamicsEffectInfo.ts @@ -6,7 +6,6 @@ import { EffectGlyph } from '@src/rendering/glyphs/EffectGlyph'; import { EffectBarRendererInfo } from '@src/rendering/EffectBarRendererInfo'; import { Settings } from '@src/Settings'; import { NotationElement } from '@src/NotationSettings'; -import { GraceType } from '@src/model/GraceType'; export class DynamicsEffectInfo extends EffectBarRendererInfo { public get notationElement(): NotationElement { @@ -30,7 +29,7 @@ export class DynamicsEffectInfo extends EffectBarRendererInfo { } private internalShouldCreateGlyph(beat: Beat): boolean { - if (beat.voice.bar.staff.track.score.stylesheet.hideDynamics || beat.isEmpty || beat.voice.isEmpty || beat.isRest || beat.graceType !== GraceType.None) { + if (beat.voice.bar.staff.track.score.stylesheet.hideDynamics || beat.isEmpty || beat.voice.isEmpty || beat.isRest) { return false; } @@ -59,7 +58,7 @@ export class DynamicsEffectInfo extends EffectBarRendererInfo { private getPreviousDynamicsBeat(beat: Beat) { let previousBeat = beat.previousBeat; while (previousBeat != null) { - if (!previousBeat.isRest && previousBeat.graceType === GraceType.None) { + if (!previousBeat.isRest) { return previousBeat; } previousBeat = previousBeat.previousBeat; diff --git a/src/rendering/effects/TrillEffectInfo.ts b/src/rendering/effects/TrillEffectInfo.ts index 3292425c3..e388b71eb 100644 --- a/src/rendering/effects/TrillEffectInfo.ts +++ b/src/rendering/effects/TrillEffectInfo.ts @@ -17,7 +17,7 @@ export class TrillEffectInfo extends NoteEffectInfoBase { } public get sizingMode(): EffectBarGlyphSizing { - return EffectBarGlyphSizing.SingleOnBeat; + return EffectBarGlyphSizing.GroupedOnBeatToEnd; } public createNewGlyph(renderer: BarRendererBase, beat: Beat): EffectGlyph { diff --git a/src/rendering/glyphs/AlternateEndingsGlyph.ts b/src/rendering/glyphs/AlternateEndingsGlyph.ts index 1547bba84..69c37aa68 100644 --- a/src/rendering/glyphs/AlternateEndingsGlyph.ts +++ b/src/rendering/glyphs/AlternateEndingsGlyph.ts @@ -6,11 +6,15 @@ import { ModelUtils } from '@src/model/ModelUtils'; export class AlternateEndingsGlyph extends EffectGlyph { private static readonly Padding: number = 3; private _endings: number[]; - private _endingsString: string = ""; + private _endingsString: string = ''; + private _openLine: boolean; + private _closeLine: boolean; - public constructor(x: number, y: number, alternateEndings: number) { + public constructor(x: number, y: number, alternateEndings: number, openLine: boolean, closeLine: boolean) { super(x, y); this._endings = ModelUtils.getAlternateEndingsList(alternateEndings); + this._openLine = openLine; + this._closeLine = closeLine; } public override doLayout(): void { @@ -25,18 +29,33 @@ export class AlternateEndingsGlyph extends EffectGlyph { } public override paint(cx: number, cy: number, canvas: ICanvas): void { - super.paint(cx, cy, canvas); - let baseline: TextBaseline = canvas.textBaseline; - canvas.textBaseline = TextBaseline.Top; - if (this._endings.length > 0) { - let res: RenderingResources = this.renderer.resources; - canvas.font = res.wordsFont; + const width = this._closeLine ? this.width - 4 : this.width; + + cx = (cx | 0) + 0.5; + cy = (cy | 0) + 0.5; + + if (this._openLine) { canvas.moveTo(cx + this.x, cy + this.y + this.height); canvas.lineTo(cx + this.x, cy + this.y); - canvas.lineTo(cx + this.x + this.width, cy + this.y); - canvas.stroke(); + } else { + canvas.moveTo(cx + this.x, cy + this.y); + } + + canvas.lineTo(cx + this.x + width, cy + this.y); + + if (this._closeLine) { + canvas.lineTo(cx + this.x + width, cy + this.y + this.height); + } + + canvas.stroke(); + + if (this._openLine) { + const baseline: TextBaseline = canvas.textBaseline; + canvas.textBaseline = TextBaseline.Top; + const res: RenderingResources = this.renderer.resources; + canvas.font = res.wordsFont; canvas.fillText(this._endingsString, cx + this.x + AlternateEndingsGlyph.Padding, cy + this.y); + canvas.textBaseline = baseline; } - canvas.textBaseline = baseline; } } diff --git a/src/rendering/glyphs/ChordDiagramGlyph.ts b/src/rendering/glyphs/ChordDiagramGlyph.ts index 92e7c565e..478f7222e 100644 --- a/src/rendering/glyphs/ChordDiagramGlyph.ts +++ b/src/rendering/glyphs/ChordDiagramGlyph.ts @@ -38,7 +38,7 @@ export class ChordDiagramGlyph extends EffectGlyph { 2 * ChordDiagramGlyph.Padding[1]; this.width = this._firstFretSpacing + - (this._chord.staff.tuning.length - 1) * ChordDiagramGlyph.StringSpacing + + (this._chord.strings.length - 1) * ChordDiagramGlyph.StringSpacing + 2 * ChordDiagramGlyph.Padding[0]; } @@ -63,10 +63,10 @@ export class ChordDiagramGlyph extends EffectGlyph { cy += this._textRow; canvas.font = res.fretboardNumberFont; canvas.textBaseline = TextBaseline.Middle; - for (let i: number = 0; i < this._chord.staff.tuning.length; i++) { + for (let i: number = 0; i < this._chord.strings.length; i++) { let x: number = cx + i * stringSpacing; let y: number = cy + this._fretRow / 2; - let fret: number = this._chord.strings[this._chord.staff.tuning.length - i - 1]; + let fret: number = this._chord.strings[this._chord.strings.length - i - 1]; if (fret < 0) { canvas.fillMusicFontSymbol(x, y, 1, MusicFontSymbol.FretboardX, true); } else if (fret === 0) { @@ -78,7 +78,7 @@ export class ChordDiagramGlyph extends EffectGlyph { } cy += this._fretRow; - for (let i: number = 0; i < this._chord.staff.tuning.length; i++) { + for (let i: number = 0; i < this._chord.strings.length; i++) { let x: number = cx + i * stringSpacing; canvas.fillRect(x, cy, 1, fretSpacing * ChordDiagramGlyph.Frets + 1); } diff --git a/src/rendering/glyphs/DynamicsGlyph.ts b/src/rendering/glyphs/DynamicsGlyph.ts index c78699985..cb51ff314 100644 --- a/src/rendering/glyphs/DynamicsGlyph.ts +++ b/src/rendering/glyphs/DynamicsGlyph.ts @@ -5,6 +5,7 @@ import { MusicFontSymbol } from '@src/model/MusicFontSymbol'; export class DynamicsGlyph extends MusicFontGlyph { public constructor(x: number, y: number, dynamics: DynamicValue) { super(x, y, 0.6, DynamicsGlyph.getSymbol(dynamics)); + this.center = true; } public override doLayout(): void { diff --git a/src/rendering/glyphs/ScoreNoteChordGlyph.ts b/src/rendering/glyphs/ScoreNoteChordGlyph.ts index bd49e2430..b6d733e70 100644 --- a/src/rendering/glyphs/ScoreNoteChordGlyph.ts +++ b/src/rendering/glyphs/ScoreNoteChordGlyph.ts @@ -194,7 +194,7 @@ export class ScoreNoteChordGlyph extends ScoreNoteChordGlyphBase { if (this.beat.isTremolo && !this.beat.deadSlapped) { let offset: number = 0; let baseNote: ScoreNoteGlyphInfo = direction === BeamDirection.Up ? this.minNote! : this.maxNote!; - let tremoloX: number = direction === BeamDirection.Up ? this.displacedX : 0; + let tremoloX: number = direction === BeamDirection.Up ? this.upLineX : this.downLineX; let speed: Duration = this.beat.tremoloSpeed!; switch (speed) { case Duration.ThirtySecond: diff --git a/src/rendering/glyphs/TrillGlyph.ts b/src/rendering/glyphs/TrillGlyph.ts index cb3229d67..9d0bba563 100644 --- a/src/rendering/glyphs/TrillGlyph.ts +++ b/src/rendering/glyphs/TrillGlyph.ts @@ -1,33 +1,42 @@ import { ICanvas } from '@src/platform/ICanvas'; -import { EffectGlyph } from '@src/rendering/glyphs/EffectGlyph'; import { MusicFontSymbol } from '@src/model/MusicFontSymbol'; -import { RenderingResources } from '@src/RenderingResources'; +import { BeatXPosition } from '../BeatXPosition'; +import { GroupedEffectGlyph } from './GroupedEffectGlyph'; +import { MusicFontSymbolSizes } from '../utils/MusicFontSymbolSizes'; -export class TrillGlyph extends EffectGlyph { +export class TrillGlyph extends GroupedEffectGlyph { public constructor(x: number, y: number) { - super(x, y); + super(BeatXPosition.EndBeat); + this.x = x; + this.y = y; } public override doLayout(): void { super.doLayout(); - this.height = this.renderer.resources.markerFont.size; + this.height = MusicFontSymbolSizes.Heights.get(MusicFontSymbol.OrnamentTrill)! / 2; } - public override paint(cx: number, cy: number, canvas: ICanvas): void { - let res: RenderingResources = this.renderer.resources; - canvas.font = res.markerFont; - let textw: number = canvas.measureText('tr').width; - canvas.fillText('tr', cx + this.x, cy + this.y); - let startX: number = textw + 3; - let endX: number = this.width - startX; - let waveScale: number = 1.2; - let step: number = 11 * waveScale; - let loops: number = Math.max(1, (endX - startX) / step); + protected override paintGrouped(cx: number, cy: number, endX: number, canvas: ICanvas): void { + let startX: number = cx + this.x; + + canvas.fillMusicFontSymbol( + startX, + cy + this.y + this.height, + 1, + MusicFontSymbol.OrnamentTrill, + true + ); + + startX += MusicFontSymbolSizes.Widths.get(MusicFontSymbol.OrnamentTrill)! / 2; + + const waveScale: number = 1.2; + const step: number = MusicFontSymbolSizes.Widths.get(MusicFontSymbol.WiggleTrill)! * waveScale; + const loops: number = Math.floor((endX - startX) / step); + const loopY: number = cy + this.y + this.height * 1.37; let loopX: number = startX; - let loopY: number = cy + this.y + this.height * 1.2; for (let i: number = 0; i < loops; i++) { canvas.fillMusicFontSymbol( - cx + this.x + loopX, + loopX, loopY, waveScale, MusicFontSymbol.WiggleTrill, diff --git a/src/rendering/layout/PageViewLayout.ts b/src/rendering/layout/PageViewLayout.ts index c18634d99..cd90cf615 100644 --- a/src/rendering/layout/PageViewLayout.ts +++ b/src/rendering/layout/PageViewLayout.ts @@ -395,6 +395,23 @@ export class PageViewLayout extends ScoreLayout { system.isLast = false; this._barsFromPreviousSystem.reverse(); return system; + } else { + // do we need a line break after this bar + let anyTrackNeedsLineBreak = false; + let allTracksNeedLineBreak = true; + for(const track of this.renderer.tracks!) { + if(track.lineBreaks && track.lineBreaks!.has(barIndex + 1)) { + anyTrackNeedsLineBreak = true; + } else { + allTracksNeedLineBreak = false; + } + } + + if(anyTrackNeedsLineBreak && allTracksNeedLineBreak) { + system.isFull = true; + system.isLast = false; + return system; + } } system.x = 0; barIndex++; diff --git a/src/rendering/staves/BarLayoutingInfo.ts b/src/rendering/staves/BarLayoutingInfo.ts index dc8adf3cb..ec63b68ac 100644 --- a/src/rendering/staves/BarLayoutingInfo.ts +++ b/src/rendering/staves/BarLayoutingInfo.ts @@ -16,12 +16,14 @@ export class BarLayoutingInfo { private static readonly MinDurationWidth: number = 7; private _timeSortedSprings: Spring[] = []; - private _xMin: number = 0; private _minTime: number = -1; private _onTimePositionsForce: number = 0; private _onTimePositions: Map = new Map(); private _incompleteGraceRodsWidth: number = 0; + // the smallest duration we have between two springs to ensure we have positive spring constants + private _minDuration:number = BarLayoutingInfo.MinDuration; + /** * an internal version number that increments whenever a change was made. */ @@ -96,6 +98,10 @@ export class BarLayoutingInfo { smallestDuration = prevDuration; } } + //spring.smallestDuration = duration; + if(duration < this._minDuration) { + this._minDuration = duration; + } } spring.longestDuration = duration; spring.postSpringWidth = postSpringSize; @@ -203,13 +209,6 @@ export class BarLayoutingInfo { } private calculateSpringConstants(): void { - this._xMin = 0; - let springs: Map = this.springs; - for (const spring of springs.values()) { - if (spring.springWidth < this._xMin) { - this._xMin = spring.springWidth; - } - } let totalSpringConstant: number = 0; let sortedSprings: Spring[] = this._timeSortedSprings; if (sortedSprings.length === 0) { @@ -303,14 +302,18 @@ export class BarLayoutingInfo { private calculateSpringConstant(spring: Spring, duration: number): number { if (duration <= 0) { - duration = MidiUtils.toTicks(Duration.SixtyFourth); + duration = MidiUtils.toTicks(Duration.TwoHundredFiftySixth); } if (spring.smallestDuration === 0) { spring.smallestDuration = duration; } - let minDuration: number = spring.smallestDuration; - let phi: number = 1 + 0.85 * Math.log2(duration / BarLayoutingInfo.MinDuration); - return (minDuration / duration) * (1 / (phi * BarLayoutingInfo.MinDurationWidth)); + let smallestDuration: number = spring.smallestDuration; + + let minDuration = this._minDuration; + let minDurationWidth = BarLayoutingInfo.MinDurationWidth; + + let phi: number = 1 + 0.85 * Math.log2(duration / minDuration); + return (smallestDuration / duration) * (1 / (phi * minDurationWidth)); } public spaceToForce(space: number): number { diff --git a/src/rendering/utils/AccidentalHelper.ts b/src/rendering/utils/AccidentalHelper.ts index dcd0a775d..93d2a5441 100644 --- a/src/rendering/utils/AccidentalHelper.ts +++ b/src/rendering/utils/AccidentalHelper.ts @@ -322,9 +322,11 @@ export class AccidentalHelper { // https://ultimatemusictheory.com/tied-notes-with-accidentals/ if (note && note.isTieDestination && note.beat.index === 0) { // candidate for skip, check further if start note is on the same line - const previousRenderer = this._barRenderer.previousRenderer as ScoreBarRenderer; - if (previousRenderer) { - const tieOriginLine = previousRenderer.accidentalHelper.getNoteLine(note.tieOrigin!); + const tieOriginBarRenderer = this._barRenderer.scoreRenderer.layout?.getRendererForBar( + this._barRenderer.staff.staveId, + note.tieOrigin!.beat.voice.bar) as ScoreBarRenderer | null; + if (tieOriginBarRenderer && tieOriginBarRenderer.staff === this._barRenderer.staff) { + const tieOriginLine = tieOriginBarRenderer.accidentalHelper.getNoteLine(note.tieOrigin!); if (tieOriginLine === steps) { skipAccidental = true; } diff --git a/src/rendering/utils/MusicFontSymbolSizes.ts b/src/rendering/utils/MusicFontSymbolSizes.ts index 16b8fde2d..b32ebfccf 100644 --- a/src/rendering/utils/MusicFontSymbolSizes.ts +++ b/src/rendering/utils/MusicFontSymbolSizes.ts @@ -205,8 +205,8 @@ export class MusicFontSymbolSizes { [MusicFontSymbol.RestSixteenth, 9], [MusicFontSymbol.RestThirtySecond, 12], [MusicFontSymbol.RestSixtyFourth, 14], - [MusicFontSymbol.RestOneHundredTwentyEighth, 20], - [MusicFontSymbol.RestTwoHundredFiftySixth, 20], + [MusicFontSymbol.RestOneHundredTwentyEighth, 14], + [MusicFontSymbol.RestTwoHundredFiftySixth, 14], [MusicFontSymbol.RestHBarLeft, 0], [MusicFontSymbol.RestHBarMiddle, 0], @@ -230,7 +230,7 @@ export class MusicFontSymbolSizes { [MusicFontSymbol.DynamicFF, 0], [MusicFontSymbol.DynamicFFF, 0], - [MusicFontSymbol.OrnamentTrill, 26], + [MusicFontSymbol.OrnamentTrill, 20], [MusicFontSymbol.OrnamentTurn, 26], [MusicFontSymbol.OrnamentTurnInverted, 26], [MusicFontSymbol.OrnamentShortTrill, 0], @@ -497,7 +497,7 @@ export class MusicFontSymbolSizes { [MusicFontSymbol.DynamicFF, 28.4], [MusicFontSymbol.DynamicFFF, 28.4], - [MusicFontSymbol.OrnamentTrill, 18], + [MusicFontSymbol.OrnamentTrill, 24], [MusicFontSymbol.OrnamentTurn, 18], [MusicFontSymbol.OrnamentTurnInverted, 18], [MusicFontSymbol.OrnamentShortTrill, 18], diff --git a/test-data/musicxml-samples/BeetAnGeSample.png b/test-data/musicxml-samples/BeetAnGeSample.png new file mode 100644 index 000000000..545e2df85 Binary files /dev/null and b/test-data/musicxml-samples/BeetAnGeSample.png differ diff --git a/test-data/musicxml-samples/Binchois.png b/test-data/musicxml-samples/Binchois.png index a1ed7bd25..23146607f 100644 Binary files a/test-data/musicxml-samples/Binchois.png and b/test-data/musicxml-samples/Binchois.png differ diff --git a/test-data/musicxml-samples/BrahWiMeSample.png b/test-data/musicxml-samples/BrahWiMeSample.png new file mode 100644 index 000000000..d51fc4c4d Binary files /dev/null and b/test-data/musicxml-samples/BrahWiMeSample.png differ diff --git a/test-data/musicxml-samples/BrookeWestSample.png b/test-data/musicxml-samples/BrookeWestSample.png new file mode 100644 index 000000000..972753d2e Binary files /dev/null and b/test-data/musicxml-samples/BrookeWestSample.png differ diff --git a/test-data/musicxml-samples/Chant.png b/test-data/musicxml-samples/Chant.png index 056c2cf00..1ca58614b 100644 Binary files a/test-data/musicxml-samples/Chant.png and b/test-data/musicxml-samples/Chant.png differ diff --git a/test-data/musicxml-samples/DebuMandSample.png b/test-data/musicxml-samples/DebuMandSample.png new file mode 100644 index 000000000..77a96e771 Binary files /dev/null and b/test-data/musicxml-samples/DebuMandSample.png differ diff --git a/test-data/musicxml-samples/Dichterliebe01.png b/test-data/musicxml-samples/Dichterliebe01.png new file mode 100644 index 000000000..13a8a6fcb Binary files /dev/null and b/test-data/musicxml-samples/Dichterliebe01.png differ diff --git a/test-data/musicxml-samples/Echigo.png b/test-data/musicxml-samples/Echigo.png new file mode 100644 index 000000000..c614b4a2b Binary files /dev/null and b/test-data/musicxml-samples/Echigo.png differ diff --git a/test-data/musicxml-samples/FaurReveSample.png b/test-data/musicxml-samples/FaurReveSample.png new file mode 100644 index 000000000..ee2f75f9a Binary files /dev/null and b/test-data/musicxml-samples/FaurReveSample.png differ diff --git a/test-data/musicxml-samples/MahlFaGe4Sample.png b/test-data/musicxml-samples/MahlFaGe4Sample.png new file mode 100644 index 000000000..60416970b Binary files /dev/null and b/test-data/musicxml-samples/MahlFaGe4Sample.png differ diff --git a/test-data/musicxml-samples/MozaChloSample.png b/test-data/musicxml-samples/MozaChloSample.png new file mode 100644 index 000000000..20e4d9145 Binary files /dev/null and b/test-data/musicxml-samples/MozaChloSample.png differ diff --git a/test-data/musicxml-samples/MozaVeilSample.png b/test-data/musicxml-samples/MozaVeilSample.png new file mode 100644 index 000000000..f79ac82c2 Binary files /dev/null and b/test-data/musicxml-samples/MozaVeilSample.png differ diff --git a/test-data/musicxml-samples/MozartPianoSonata.png b/test-data/musicxml-samples/MozartPianoSonata.png index 2d8d8485d..e3f91a642 100644 Binary files a/test-data/musicxml-samples/MozartPianoSonata.png and b/test-data/musicxml-samples/MozartPianoSonata.png differ diff --git a/test-data/musicxml-samples/MozartTrio.png b/test-data/musicxml-samples/MozartTrio.png index 714e99543..da5cb97ab 100644 Binary files a/test-data/musicxml-samples/MozartTrio.png and b/test-data/musicxml-samples/MozartTrio.png differ diff --git a/test-data/musicxml-samples/Saltarello.png b/test-data/musicxml-samples/Saltarello.png index 25370ab39..4097faf0e 100644 Binary files a/test-data/musicxml-samples/Saltarello.png and b/test-data/musicxml-samples/Saltarello.png differ diff --git a/test-data/musicxml-samples/SchbAvMaSample.png b/test-data/musicxml-samples/SchbAvMaSample.png new file mode 100644 index 000000000..7e9a9cad6 Binary files /dev/null and b/test-data/musicxml-samples/SchbAvMaSample.png differ diff --git a/test-data/musicxml-samples/Telemann.png b/test-data/musicxml-samples/Telemann.png index 119262e0c..043f2b65a 100644 Binary files a/test-data/musicxml-samples/Telemann.png and b/test-data/musicxml-samples/Telemann.png differ diff --git a/test-data/musicxml-testsuite/01a-Pitches-Pitches.png b/test-data/musicxml-testsuite/01a-Pitches-Pitches.png new file mode 100644 index 000000000..d5679cd01 Binary files /dev/null and b/test-data/musicxml-testsuite/01a-Pitches-Pitches.png differ diff --git a/test-data/musicxml-testsuite/01a-Pitches-Pitches.xml b/test-data/musicxml-testsuite/01a-Pitches-Pitches.xml index 177f2c89d..365866a50 100644 --- a/test-data/musicxml-testsuite/01a-Pitches-Pitches.xml +++ b/test-data/musicxml-testsuite/01a-Pitches-Pitches.xml @@ -1,14 +1,15 @@ - - + Pitches and accidentals - All pitches from G to c'''' in - ascending steps; First without accidentals, then with a sharp and then - with a flat accidental. Double alterations and cautionary accidentals - are tested at the end. + All pitches from G to c’’’’ in + ascending steps. First without accidentals, then with a sharp and + then with a flat accidental, then with explicit natural accidentals. + Double alterations and cautionary accidentals are tested at the + end. @@ -1097,7 +1098,93 @@ - + + + + E + 4 + + 1 + 1 + quarter + natural + + + + F + 4 + + 1 + 1 + quarter + natural + + + + G + 4 + + 1 + 1 + quarter + natural + + + + A + 4 + + 1 + 1 + quarter + natural + + + + + + + B + 4 + + 1 + 1 + quarter + natural + + + + C + 5 + + 1 + 1 + quarter + natural + + + + D + 5 + + 1 + 1 + quarter + natural + + + + E + 5 + + 1 + 1 + quarter + natural + + + + C @@ -1144,7 +1231,7 @@ - + C diff --git a/test-data/musicxml-testsuite/01b-Pitches-Intervals.png b/test-data/musicxml-testsuite/01b-Pitches-Intervals.png new file mode 100644 index 000000000..2dc7c97fe Binary files /dev/null and b/test-data/musicxml-testsuite/01b-Pitches-Intervals.png differ diff --git a/test-data/musicxml-testsuite/01b-Pitches-Intervals.xml b/test-data/musicxml-testsuite/01b-Pitches-Intervals.xml index c033498d5..6ee2c003e 100644 --- a/test-data/musicxml-testsuite/01b-Pitches-Intervals.xml +++ b/test-data/musicxml-testsuite/01b-Pitches-Intervals.xml @@ -1,11 +1,11 @@ - - - Various piches and interval sizes + + Various pitches and interval sizes - All pitch intervals in ascending + All pitch intervals in ascending jump size. @@ -50,6 +50,8 @@ 1 quarter + + C @@ -59,6 +61,7 @@ 1 1 quarter + sharp @@ -69,7 +72,10 @@ 1 1 quarter + flat + + D @@ -79,6 +85,7 @@ 1 1 quarter + flat @@ -89,7 +96,10 @@ 1 1 quarter + sharp + + D @@ -108,6 +118,8 @@ 1 quarter + + D @@ -117,6 +129,7 @@ 1 1 quarter + sharp @@ -127,7 +140,10 @@ 1 1 quarter + flat + + E @@ -137,6 +153,7 @@ 1 1 quarter + flat @@ -147,7 +164,10 @@ 1 1 quarter + sharp + + E @@ -166,6 +186,8 @@ 1 quarter + + E @@ -175,6 +197,7 @@ 1 1 quarter + sharp @@ -185,7 +208,10 @@ 1 1 quarter + flat + + F @@ -195,6 +221,7 @@ 1 1 quarter + flat @@ -205,7 +232,10 @@ 1 1 quarter + sharp + + F @@ -224,6 +254,8 @@ 1 quarter + + F @@ -233,6 +265,7 @@ 1 1 quarter + sharp @@ -243,7 +276,10 @@ 1 1 quarter + flat + + G @@ -253,6 +289,7 @@ 1 1 quarter + flat @@ -263,7 +300,10 @@ 1 1 quarter + sharp + + G @@ -282,6 +322,8 @@ 1 quarter + + G @@ -291,6 +333,7 @@ 1 1 quarter + sharp @@ -301,7 +344,10 @@ 1 1 quarter + flat + + A @@ -311,6 +357,7 @@ 1 1 quarter + flat @@ -321,7 +368,10 @@ 1 1 quarter + sharp + + A @@ -340,6 +390,8 @@ 1 quarter + + A @@ -349,6 +401,7 @@ 1 1 quarter + sharp @@ -359,7 +412,10 @@ 1 1 quarter + flat + + B @@ -369,6 +425,7 @@ 1 1 quarter + flat @@ -379,7 +436,10 @@ 1 1 quarter + sharp + + B @@ -398,6 +458,8 @@ 1 quarter + + B @@ -407,6 +469,7 @@ 1 1 quarter + sharp @@ -417,7 +480,10 @@ 1 1 quarter + flat + + C @@ -427,6 +493,7 @@ 1 1 quarter + flat @@ -437,7 +504,10 @@ 1 1 quarter + sharp + + C @@ -456,6 +526,8 @@ 1 quarter + + C @@ -465,6 +537,7 @@ 1 1 quarter + sharp @@ -475,7 +548,10 @@ 1 1 quarter + flat + + D @@ -485,6 +561,7 @@ 1 1 quarter + flat @@ -495,7 +572,10 @@ 1 1 quarter + sharp + + D @@ -514,6 +594,8 @@ 1 quarter + + D @@ -523,6 +605,7 @@ 1 1 quarter + sharp @@ -533,7 +616,10 @@ 1 1 quarter + flat + + E @@ -543,6 +629,7 @@ 1 1 quarter + flat @@ -553,7 +640,10 @@ 1 1 quarter + sharp + + E @@ -572,6 +662,8 @@ 1 quarter + + E @@ -581,6 +673,7 @@ 1 1 quarter + sharp @@ -591,7 +684,10 @@ 1 1 quarter + flat + + F @@ -601,6 +697,7 @@ 1 1 quarter + flat @@ -611,7 +708,10 @@ 1 1 quarter + sharp + + F @@ -630,6 +730,8 @@ 1 quarter + + F @@ -639,6 +741,7 @@ 1 1 quarter + sharp @@ -649,7 +752,10 @@ 1 1 quarter + flat + + G @@ -659,6 +765,7 @@ 1 1 quarter + flat @@ -669,7 +776,10 @@ 1 1 quarter + sharp + + G @@ -688,6 +798,8 @@ 1 quarter + + G @@ -697,6 +809,7 @@ 1 1 quarter + sharp @@ -707,7 +820,10 @@ 1 1 quarter + flat + + A @@ -717,6 +833,7 @@ 1 1 quarter + flat @@ -727,7 +844,10 @@ 1 1 quarter + sharp + + A @@ -746,6 +866,8 @@ 1 quarter + + A @@ -755,6 +877,7 @@ 1 1 quarter + sharp @@ -765,7 +888,10 @@ 1 1 quarter + flat + + B @@ -775,6 +901,7 @@ 1 1 quarter + flat @@ -785,7 +912,10 @@ 1 1 quarter + sharp + + B @@ -804,6 +934,8 @@ 1 quarter + + B @@ -813,6 +945,7 @@ 1 1 quarter + sharp @@ -823,6 +956,7 @@ 1 1 quarter + flat diff --git a/test-data/musicxml-testsuite/01c-Pitches-NoVoiceElement.png b/test-data/musicxml-testsuite/01c-Pitches-NoVoiceElement.png new file mode 100644 index 000000000..bcee38e55 Binary files /dev/null and b/test-data/musicxml-testsuite/01c-Pitches-NoVoiceElement.png differ diff --git a/test-data/musicxml-testsuite/01c-Pitches-NoVoiceElement.xml b/test-data/musicxml-testsuite/01c-Pitches-NoVoiceElement.xml index 2f782c13f..a90c9523c 100644 --- a/test-data/musicxml-testsuite/01c-Pitches-NoVoiceElement.xml +++ b/test-data/musicxml-testsuite/01c-Pitches-NoVoiceElement.xml @@ -1,12 +1,13 @@ - - + + - The <voice> element - of notes is optional in MusicXML (although Dolet always writes it out). - Here, there is one note with lyrics, but without a voice assigned. It - should still be correctly converted. + The <voice> element + of notes is optional in MusicXML (although Dolet always writes it out). + Here, there is one note with lyrics, but without a voice assigned. It + should still be correctly converted. diff --git a/test-data/musicxml-testsuite/01d-Pitches-Microtones.png b/test-data/musicxml-testsuite/01d-Pitches-Microtones.png new file mode 100644 index 000000000..5654c489a Binary files /dev/null and b/test-data/musicxml-testsuite/01d-Pitches-Microtones.png differ diff --git a/test-data/musicxml-testsuite/01d-Pitches-Microtones.xml b/test-data/musicxml-testsuite/01d-Pitches-Microtones.xml index 2019abbf5..7b3d67ef8 100644 --- a/test-data/musicxml-testsuite/01d-Pitches-Microtones.xml +++ b/test-data/musicxml-testsuite/01d-Pitches-Microtones.xml @@ -1,12 +1,12 @@ - - + - Some microtones: c - flat-and-a-half, d half-flat, e half-sharp, f sharp-and-a half. - Once in the lower and once in the upper region of the + Some microtones: c + flat-and-a-half, d half-flat, e half-sharp, f sharp-and-a half. + Once in the lower and once in the upper region of the staff. diff --git a/test-data/musicxml-testsuite/01e-Pitches-ParenthesizedAccidentals.png b/test-data/musicxml-testsuite/01e-Pitches-ParenthesizedAccidentals.png new file mode 100644 index 000000000..7a5a38d3e Binary files /dev/null and b/test-data/musicxml-testsuite/01e-Pitches-ParenthesizedAccidentals.png differ diff --git a/test-data/musicxml-testsuite/01e-Pitches-ParenthesizedAccidentals.xml b/test-data/musicxml-testsuite/01e-Pitches-ParenthesizedAccidentals.xml index d10c45953..ac1ed19d4 100644 --- a/test-data/musicxml-testsuite/01e-Pitches-ParenthesizedAccidentals.xml +++ b/test-data/musicxml-testsuite/01e-Pitches-ParenthesizedAccidentals.xml @@ -1,12 +1,16 @@ - - + - Accidentals can be cautionary - or editorial. Each measure has a normal accidental, an editorial, - a cautionary and an editioal and cautionary accidental. + Accidentals have the attributes + ‘cautionary’, ‘editorial’, ‘parenthesized’, and ‘bracketed’. The first + two measures each have a cautionary accidental, an editorial, a + cautionary with parentheses off, and an editorial and cautionary + accidental. The next two measures each have a normal accidental, a + bracketed, a parenthesized, and a bracketed and parenthesized + accidental. @@ -41,7 +45,7 @@ 1 1 quarter - flat + flat @@ -63,7 +67,7 @@ 1 1 quarter - flat + flat @@ -88,7 +92,7 @@ 1 1 quarter - sharp + sharp @@ -110,7 +114,7 @@ 1 1 quarter - sharp + sharp @@ -135,7 +139,7 @@ 1 1 quarter - double-flat + flat-flat @@ -146,7 +150,7 @@ 1 1 quarter - double-flat + flat-flat @@ -157,7 +161,7 @@ 1 1 quarter - double-flat + flat-flat @@ -168,7 +172,7 @@ 1 1 quarter - double-flat + flat-flat @@ -193,7 +197,7 @@ 1 1 quarter - double-sharp + double-sharp @@ -204,7 +208,7 @@ 1 1 quarter - double-sharp + double-sharp @@ -215,7 +219,7 @@ 1 1 quarter - double-sharp + double-sharp diff --git a/test-data/musicxml-testsuite/01f-Pitches-ParenthesizedMicrotoneAccidentals.png b/test-data/musicxml-testsuite/01f-Pitches-ParenthesizedMicrotoneAccidentals.png new file mode 100644 index 000000000..c38f108e2 Binary files /dev/null and b/test-data/musicxml-testsuite/01f-Pitches-ParenthesizedMicrotoneAccidentals.png differ diff --git a/test-data/musicxml-testsuite/01f-Pitches-ParenthesizedMicrotoneAccidentals.xml b/test-data/musicxml-testsuite/01f-Pitches-ParenthesizedMicrotoneAccidentals.xml index 96158eef4..d355f5e96 100644 --- a/test-data/musicxml-testsuite/01f-Pitches-ParenthesizedMicrotoneAccidentals.xml +++ b/test-data/musicxml-testsuite/01f-Pitches-ParenthesizedMicrotoneAccidentals.xml @@ -1,7 +1,7 @@ - - + Microtone accidentals can be diff --git a/test-data/musicxml-testsuite/02a-Rests-Durations.png b/test-data/musicxml-testsuite/02a-Rests-Durations.png new file mode 100644 index 000000000..4e383ef6a Binary files /dev/null and b/test-data/musicxml-testsuite/02a-Rests-Durations.png differ diff --git a/test-data/musicxml-testsuite/02a-Rests-Durations.xml b/test-data/musicxml-testsuite/02a-Rests-Durations.xml index 139884454..bf6b642eb 100644 --- a/test-data/musicxml-testsuite/02a-Rests-Durations.xml +++ b/test-data/musicxml-testsuite/02a-Rests-Durations.xml @@ -1,13 +1,15 @@ - - + Rest unit test - All different rest lengths: A - two-bar multi-measure rest, a whole rest, a half, etc. until a - 128th-rest; Then the same with dotted durations. + All different rest lengths: A + two-bar multi-measure rest, a whole rest, a half, etc., until a + 1024th-rest, then the same with dotted durations. The last bar is a + full-measure rest with the attribute + ‘measure="no"’. @@ -19,14 +21,14 @@ - 32 + 512 0 major - - 128 + 2048 1 + whole - 128 + 2048 1 + whole - 128 + 2048 1 whole + - 64 + 1024 1 half - 32 + 512 1 quarter - 16 + 256 1 eighth - 8 + 128 1 16th - 4 + 64 1 32nd - 2 + 32 1 64th - 1 + 16 1 128th - 1 + 8 1 - 128th + 256th + + + + 4 + 1 + 512th + + + + 2 + 1 + 1024th + + + + 2 + 1 + 1024th + + + - 96 + 1536 1 half - 32 + 768 1 quarter + + + + + 384 + 1 + eighth + + + + + 192 + 1 + 16th + + + + + 96 + 1 + 32nd + - - - 48 1 - quarter + 64th 24 1 - eighth + 128th 12 1 - 16th + 256th 6 1 - 32nd + 512th 3 1 - 64th + 1024th - 2 + 3 1 - 128th + 1024th + + + + + + + + 3072 + 1 + whole diff --git a/test-data/musicxml-testsuite/02b-Rests-PitchedRests.png b/test-data/musicxml-testsuite/02b-Rests-PitchedRests.png new file mode 100644 index 000000000..1236d5958 Binary files /dev/null and b/test-data/musicxml-testsuite/02b-Rests-PitchedRests.png differ diff --git a/test-data/musicxml-testsuite/02b-Rests-PitchedRests.xml b/test-data/musicxml-testsuite/02b-Rests-PitchedRests.xml index 28fafc39a..20495e5d7 100644 --- a/test-data/musicxml-testsuite/02b-Rests-PitchedRests.xml +++ b/test-data/musicxml-testsuite/02b-Rests-PitchedRests.xml @@ -1,63 +1,101 @@ - - - - - - Rests can have - explicit pitches, where they are displayed. The - first rest uses no explicit position and should use - the default position, all others are explicitly - positioned somewhere else. - - - - MusicXML Part - - - - - 96 - 0 - - 1 - G2 - - - - 96 - 1 - quarter - 1 - - - E4 - 96 - 1 - quarter - 1 - - - F5 - 96 - 1 - quarter - 1 - - - A3 - 96 - 1 - quarter - 1 - - - C6 - 96 - 1 - quarter - 1 - - - + + + + + + Rests can have explicit pitches to + position them vertically. In the first bar, the first rest has no + explicit pitch and should use the default position, while the + remaining rests are explicitly positioned at pitches E4, F5, A3, and + C6. The second bar holds a full-measure rest at pitch G4 (within an + alto clef). + + + + + MusicXML Part + + + + + + 96 + 0 + + 1 + + G + 2 + + + + + 96 + 1 + quarter + 1 + + + + E + 4 + + 96 + 1 + quarter + 1 + + + + F + 5 + + 96 + 1 + quarter + 1 + + + + A + 3 + + 96 + 1 + quarter + 1 + + + + C + 6 + + 96 + 1 + quarter + 1 + + + + + + C + 3 + + + + + G + 4 + + 480 + 1 + 1 + + + diff --git a/test-data/musicxml-testsuite/02c-Rests-MultiMeasureRests.png b/test-data/musicxml-testsuite/02c-Rests-MultiMeasureRests.png new file mode 100644 index 000000000..af228d1ec Binary files /dev/null and b/test-data/musicxml-testsuite/02c-Rests-MultiMeasureRests.png differ diff --git a/test-data/musicxml-testsuite/02c-Rests-MultiMeasureRests.xml b/test-data/musicxml-testsuite/02c-Rests-MultiMeasureRests.xml index 346503e36..15478b1f9 100644 --- a/test-data/musicxml-testsuite/02c-Rests-MultiMeasureRests.xml +++ b/test-data/musicxml-testsuite/02c-Rests-MultiMeasureRests.xml @@ -1,11 +1,12 @@ - - + - Four multi-measure rests: 3 - measures, 15 measures, 1 measure, and 12 measures. + Five multi-measure rests: 3 + measures, 15 measures, 1 measure, 12 measures, and 3 measures with + ‘use-symbols’ set. @@ -289,6 +290,35 @@ 4 1 + + + + + + 3 + + + + + 4 + 1 + + + + + + + 4 + 1 + + + + + + + 4 + 1 + light-heavy diff --git a/test-data/musicxml-testsuite/02d-Rests-Multimeasure-TimeSignatures.png b/test-data/musicxml-testsuite/02d-Rests-Multimeasure-TimeSignatures.png new file mode 100644 index 000000000..890950b16 Binary files /dev/null and b/test-data/musicxml-testsuite/02d-Rests-Multimeasure-TimeSignatures.png differ diff --git a/test-data/musicxml-testsuite/02d-Rests-Multimeasure-TimeSignatures.xml b/test-data/musicxml-testsuite/02d-Rests-Multimeasure-TimeSignatures.xml index c357e5bf0..3798371b2 100644 --- a/test-data/musicxml-testsuite/02d-Rests-Multimeasure-TimeSignatures.xml +++ b/test-data/musicxml-testsuite/02d-Rests-Multimeasure-TimeSignatures.xml @@ -1,11 +1,11 @@ - - + - Multi-Measure rests should always - be converted into durations that are a multiple of the time + Multi-measure rests should always + be converted into durations that are a multiple of the time signature. diff --git a/test-data/musicxml-testsuite/02e-Rests-NoType.png b/test-data/musicxml-testsuite/02e-Rests-NoType.png new file mode 100644 index 000000000..feb61066e Binary files /dev/null and b/test-data/musicxml-testsuite/02e-Rests-NoType.png differ diff --git a/test-data/musicxml-testsuite/02e-Rests-NoType.xml b/test-data/musicxml-testsuite/02e-Rests-NoType.xml index 0b72a4d4e..276de1593 100644 --- a/test-data/musicxml-testsuite/02e-Rests-NoType.xml +++ b/test-data/musicxml-testsuite/02e-Rests-NoType.xml @@ -1,12 +1,12 @@ - - + - In some cases, a rest might + In some cases, a rest might not have its type attribute set (this happens, for example, with - voices in Finale, where you don't manually insert a + voices in Finale, where you don't manually insert a rest). diff --git a/test-data/musicxml-testsuite/03a-Rhythm-Durations.png b/test-data/musicxml-testsuite/03a-Rhythm-Durations.png new file mode 100644 index 000000000..45ddb5261 Binary files /dev/null and b/test-data/musicxml-testsuite/03a-Rhythm-Durations.png differ diff --git a/test-data/musicxml-testsuite/03a-Rhythm-Durations.xml b/test-data/musicxml-testsuite/03a-Rhythm-Durations.xml index b9fc0b150..986cee909 100644 --- a/test-data/musicxml-testsuite/03a-Rhythm-Durations.xml +++ b/test-data/musicxml-testsuite/03a-Rhythm-Durations.xml @@ -1,12 +1,12 @@ - - + - All note durations, from long, - brevis, whole until 128th; First with their plain values, then dotted - and finally doubly-dotted. + All note durations, from long, + brevis, whole, etc., until 1024th. First with their plain values, + then dotted, and finally double-dotted. @@ -18,7 +18,7 @@ - 64 + 1024 0 major @@ -37,7 +37,7 @@ C 5 - 1024 + 16384 1 long @@ -49,7 +49,7 @@ C 5 - 512 + 8192 1 breve @@ -58,7 +58,7 @@ C 5 - 256 + 4096 1 whole @@ -67,7 +67,7 @@ C 5 - 128 + 2048 1 half @@ -76,7 +76,7 @@ C 5 - 64 + 1024 1 quarter @@ -85,7 +85,7 @@ C 5 - 32 + 512 1 eighth @@ -94,7 +94,7 @@ C 5 - 16 + 256 1 16th @@ -103,7 +103,7 @@ C 5 - 8 + 128 1 32nd @@ -112,7 +112,7 @@ C 5 - 4 + 64 1 64th @@ -121,7 +121,7 @@ C 5 - 2 + 32 1 128th @@ -130,9 +130,36 @@ C 5 - 2 + 16 1 - 128th + 256th + + + + C + 5 + + 8 + 1 + 512th + + + + C + 5 + + 4 + 1 + 1024th + + + + C + 5 + + 4 + 1 + 1024th @@ -148,7 +175,7 @@ C 5 - 1536 + 24576 1 long @@ -161,7 +188,7 @@ C 5 - 768 + 12288 1 breve @@ -171,7 +198,7 @@ C 5 - 384 + 6144 1 whole @@ -181,7 +208,7 @@ C 5 - 192 + 3072 1 half @@ -191,7 +218,7 @@ C 5 - 96 + 1536 1 quarter @@ -201,7 +228,7 @@ C 5 - 48 + 768 1 eighth @@ -211,7 +238,7 @@ C 5 - 24 + 384 1 16th @@ -221,7 +248,7 @@ C 5 - 12 + 192 1 32nd @@ -231,7 +258,7 @@ C 5 - 6 + 96 1 64th @@ -241,7 +268,7 @@ C 5 - 3 + 48 1 128th @@ -251,9 +278,39 @@ C 5 - 3 + 24 1 - 128th + 256th + + + + + C + 5 + + 12 + 1 + 512th + + + + + C + 5 + + 6 + 1 + 1024th + + + + + C + 5 + + 6 + 1 + 1024th @@ -270,7 +327,7 @@ C 5 - 1792 + 28672 1 long @@ -284,7 +341,7 @@ C 5 - 896 + 14336 1 breve @@ -295,7 +352,7 @@ C 5 - 448 + 7168 1 whole @@ -306,7 +363,7 @@ C 5 - 224 + 3584 1 half @@ -317,7 +374,7 @@ C 5 - 112 + 1792 1 quarter @@ -328,7 +385,7 @@ C 5 - 56 + 896 1 eighth @@ -339,7 +396,7 @@ C 5 - 28 + 448 1 16th @@ -350,7 +407,7 @@ C 5 - 14 + 224 1 32nd @@ -361,12 +418,45 @@ C 5 - 7 + 112 1 64th + + + C + 5 + + 56 + 1 + 128th + + + + + + C + 5 + + 28 + 1 + 256th + + + + + + C + 5 + + 14 + 1 + 512th + + + C @@ -374,7 +464,18 @@ 7 1 - 64th + 1024th + + + + + + C + 5 + + 7 + 1 + 1024th diff --git a/test-data/musicxml-testsuite/03b-Rhythm-Backup.png b/test-data/musicxml-testsuite/03b-Rhythm-Backup.png new file mode 100644 index 000000000..0901f0e5e Binary files /dev/null and b/test-data/musicxml-testsuite/03b-Rhythm-Backup.png differ diff --git a/test-data/musicxml-testsuite/03b-Rhythm-Backup.xml b/test-data/musicxml-testsuite/03b-Rhythm-Backup.xml index b0e675496..1d31d352b 100644 --- a/test-data/musicxml-testsuite/03b-Rhythm-Backup.xml +++ b/test-data/musicxml-testsuite/03b-Rhythm-Backup.xml @@ -1,13 +1,13 @@ - - - - + + + - Two voices with a backup, that - does not jump to the beginning for the measure for voice 2, but - somewhere in the middle. Voice 2 thus won't have any notes or rests - for the first beat of the measures. + Two voices with a <backup> + element that does not jump to the beginning of the measure for voice + two but somewhere in the middle. Voice two thus won't have any notes + or rests for the first beat of the measure. diff --git a/test-data/musicxml-testsuite/03c-Rhythm-DivisionChange.png b/test-data/musicxml-testsuite/03c-Rhythm-DivisionChange.png new file mode 100644 index 000000000..492184f41 Binary files /dev/null and b/test-data/musicxml-testsuite/03c-Rhythm-DivisionChange.png differ diff --git a/test-data/musicxml-testsuite/03c-Rhythm-DivisionChange.xml b/test-data/musicxml-testsuite/03c-Rhythm-DivisionChange.xml index 16a54c5f5..7926f5401 100644 --- a/test-data/musicxml-testsuite/03c-Rhythm-DivisionChange.xml +++ b/test-data/musicxml-testsuite/03c-Rhythm-DivisionChange.xml @@ -1,7 +1,7 @@ - - + Although uncommon, the divisions diff --git a/test-data/musicxml-testsuite/03d-Rhythm-DottedDurations-Factors.png b/test-data/musicxml-testsuite/03d-Rhythm-DottedDurations-Factors.png new file mode 100644 index 000000000..817e356b6 Binary files /dev/null and b/test-data/musicxml-testsuite/03d-Rhythm-DottedDurations-Factors.png differ diff --git a/test-data/musicxml-testsuite/03d-Rhythm-DottedDurations-Factors.xml b/test-data/musicxml-testsuite/03d-Rhythm-DottedDurations-Factors.xml index 2a53d2c7f..de0cd44f1 100644 --- a/test-data/musicxml-testsuite/03d-Rhythm-DottedDurations-Factors.xml +++ b/test-data/musicxml-testsuite/03d-Rhythm-DottedDurations-Factors.xml @@ -1,12 +1,15 @@ - - + Several durations can be written - with dots. For multimeasure rests, we can also have durations that - cannot be expressed with dotted notes (like 5/8). + with dots. For multi-measure rests it is also possible to have + durations that cannot be expressed with dotted notes (like 5/8). + + In bar 15 there is only a 16th note and no rest for the remaining part + of the bar. diff --git a/test-data/musicxml-testsuite/03e-Rhythm-No-Divisions.png b/test-data/musicxml-testsuite/03e-Rhythm-No-Divisions.png new file mode 100644 index 000000000..52d09047b Binary files /dev/null and b/test-data/musicxml-testsuite/03e-Rhythm-No-Divisions.png differ diff --git a/test-data/musicxml-testsuite/03e-Rhythm-No-Divisions.xml b/test-data/musicxml-testsuite/03e-Rhythm-No-Divisions.xml new file mode 100644 index 000000000..87adfb851 --- /dev/null +++ b/test-data/musicxml-testsuite/03e-Rhythm-No-Divisions.xml @@ -0,0 +1,41 @@ + + + + + + No <divisions> + element. + + + + + MusicXML Part + + + + + + + 0 + + + + G + 2 + + + + + C + 4 + + 4 + whole + + + + diff --git a/test-data/musicxml-testsuite/03f-Rhythm-Forward.png b/test-data/musicxml-testsuite/03f-Rhythm-Forward.png new file mode 100644 index 000000000..dd637a91c Binary files /dev/null and b/test-data/musicxml-testsuite/03f-Rhythm-Forward.png differ diff --git a/test-data/musicxml-testsuite/03f-Rhythm-Forward.xml b/test-data/musicxml-testsuite/03f-Rhythm-Forward.xml new file mode 100644 index 000000000..61add5152 --- /dev/null +++ b/test-data/musicxml-testsuite/03f-Rhythm-Forward.xml @@ -0,0 +1,58 @@ + + + + + + A voice with two <forward> + elements, putting the first note on the third beat and the second note + on the last 16th of the measure. There are no visible + rests. + + + + + + + + + + + 4 + 0 + + + G + 2 + + + + 8 + + + + C + 4 + + 4 + 1 + quarter + + + 3 + + + + C + 4 + + 1 + 1 + 16th + + + + diff --git a/test-data/musicxml-testsuite/11a-TimeSignatures.png b/test-data/musicxml-testsuite/11a-TimeSignatures.png new file mode 100644 index 000000000..10c968cd2 Binary files /dev/null and b/test-data/musicxml-testsuite/11a-TimeSignatures.png differ diff --git a/test-data/musicxml-testsuite/11a-TimeSignatures.xml b/test-data/musicxml-testsuite/11a-TimeSignatures.xml index 23339737b..801cc7647 100644 --- a/test-data/musicxml-testsuite/11a-TimeSignatures.xml +++ b/test-data/musicxml-testsuite/11a-TimeSignatures.xml @@ -1,12 +1,12 @@ - - + - Various time signatures: 2/2 - (alla breve), 4/4 (C), 2/2, 3/2, 2/4, 3/4, 4/4, 5/4, 3/8, 6/8, - 12/8 + Various time signatures: 2/2 + (alla breve), 4/4 (C), 2/2, 3/2, 2/4, 3/4, 4/4, 5/4, 3/8, 6/8, + 12/8. diff --git a/test-data/musicxml-testsuite/11b-TimeSignatures-NoTime.png b/test-data/musicxml-testsuite/11b-TimeSignatures-NoTime.png new file mode 100644 index 000000000..6eb95f3a3 Binary files /dev/null and b/test-data/musicxml-testsuite/11b-TimeSignatures-NoTime.png differ diff --git a/test-data/musicxml-testsuite/11b-TimeSignatures-NoTime.xml b/test-data/musicxml-testsuite/11b-TimeSignatures-NoTime.xml index a70af96c9..70a4f3747 100644 --- a/test-data/musicxml-testsuite/11b-TimeSignatures-NoTime.xml +++ b/test-data/musicxml-testsuite/11b-TimeSignatures-NoTime.xml @@ -1,42 +1,99 @@ - - - - - - A score without - a time signature (but with a key and clefs) - - - - - - - - - - - 1 - 0 - 2 - G2 - F4 - - - F4 - 4 - 1 - whole - 1 - - 384 - - B2 - 4 - 2 - whole - 2 - - - + + + + + + A score without + a time signature (but with a key and clefs). The first bar misses a + <time> element altogether, the second bar sets a 2/2 time with + ‘print-object="no"’ for both staves, and the third bar sets a 4/4 time + with ‘print-object="no"’ only for the lower + staff. + + + + + + + + + + + + 1 + 0 + 2 + G2 + F4 + + + F4 + 4 + 1 + whole + 1 + + 384 + + B2 + 4 + 2 + whole + 2 + + + + + + + + + F4 + 4 + 1 + whole + 1 + + 384 + + B2 + 4 + 2 + whole + 2 + + + + + + + + + + F4 + 4 + 1 + whole + 1 + + 384 + + B2 + 4 + 2 + whole + 2 + + + diff --git a/test-data/musicxml-testsuite/11c-TimeSignatures-CompoundSimple.png b/test-data/musicxml-testsuite/11c-TimeSignatures-CompoundSimple.png new file mode 100644 index 000000000..3c25580eb Binary files /dev/null and b/test-data/musicxml-testsuite/11c-TimeSignatures-CompoundSimple.png differ diff --git a/test-data/musicxml-testsuite/11c-TimeSignatures-CompoundSimple.xml b/test-data/musicxml-testsuite/11c-TimeSignatures-CompoundSimple.xml index e0c5cb53f..144824999 100644 --- a/test-data/musicxml-testsuite/11c-TimeSignatures-CompoundSimple.xml +++ b/test-data/musicxml-testsuite/11c-TimeSignatures-CompoundSimple.xml @@ -1,10 +1,10 @@ - - + - Compound time signatures with + Compound time signatures with same denominator: (3+2)/8 and (5+3+1)/4. diff --git a/test-data/musicxml-testsuite/11d-TimeSignatures-CompoundMultiple.png b/test-data/musicxml-testsuite/11d-TimeSignatures-CompoundMultiple.png new file mode 100644 index 000000000..8a7dbaa25 Binary files /dev/null and b/test-data/musicxml-testsuite/11d-TimeSignatures-CompoundMultiple.png differ diff --git a/test-data/musicxml-testsuite/11d-TimeSignatures-CompoundMultiple.xml b/test-data/musicxml-testsuite/11d-TimeSignatures-CompoundMultiple.xml index 37a5fa3c0..f6686a6b3 100644 --- a/test-data/musicxml-testsuite/11d-TimeSignatures-CompoundMultiple.xml +++ b/test-data/musicxml-testsuite/11d-TimeSignatures-CompoundMultiple.xml @@ -1,10 +1,10 @@ - - + - Compound time signatures with + Compound time signatures with separate fractions displayed: 3/8+2/8+3/4 and 5/2+1/8. diff --git a/test-data/musicxml-testsuite/11e-TimeSignatures-CompoundMixed.png b/test-data/musicxml-testsuite/11e-TimeSignatures-CompoundMixed.png new file mode 100644 index 000000000..58098609e Binary files /dev/null and b/test-data/musicxml-testsuite/11e-TimeSignatures-CompoundMixed.png differ diff --git a/test-data/musicxml-testsuite/11e-TimeSignatures-CompoundMixed.xml b/test-data/musicxml-testsuite/11e-TimeSignatures-CompoundMixed.xml index 8d8cf5f91..e7f484f95 100644 --- a/test-data/musicxml-testsuite/11e-TimeSignatures-CompoundMixed.xml +++ b/test-data/musicxml-testsuite/11e-TimeSignatures-CompoundMixed.xml @@ -1,7 +1,7 @@ - - + Compound time signatures of diff --git a/test-data/musicxml-testsuite/11f-TimeSignatures-SymbolMeaning.png b/test-data/musicxml-testsuite/11f-TimeSignatures-SymbolMeaning.png new file mode 100644 index 000000000..de413751c Binary files /dev/null and b/test-data/musicxml-testsuite/11f-TimeSignatures-SymbolMeaning.png differ diff --git a/test-data/musicxml-testsuite/11f-TimeSignatures-SymbolMeaning.xml b/test-data/musicxml-testsuite/11f-TimeSignatures-SymbolMeaning.xml index 4787a7114..045f86d32 100644 --- a/test-data/musicxml-testsuite/11f-TimeSignatures-SymbolMeaning.xml +++ b/test-data/musicxml-testsuite/11f-TimeSignatures-SymbolMeaning.xml @@ -1,12 +1,12 @@ - - + - A time signature of 3/8 with the - symbol="cut" attribute and two symbol="single-number" attributes with - compound time signatures. Shall the symbol be ignored in this + A time signature of 3/8 with the + ‘symbol="cut"’ attribute and two ‘symbol="single-number"’ attributes + with compound time signatures. Shall the symbol be ignored in this case? @@ -44,7 +44,7 @@ - + - + + + + + + 6 + 1 + + + + + + + B + 4 + + 1 + 1 + eighth + begin + + + + B + 4 + + 1 + 1 + eighth + continue + + + + B + 4 + + 1 + 1 + eighth + continue + + + + B + 4 + + 1 + 1 + eighth + end + light-heavy diff --git a/test-data/musicxml-testsuite/12a-Clefs.png b/test-data/musicxml-testsuite/12a-Clefs.png new file mode 100644 index 000000000..275a5e668 Binary files /dev/null and b/test-data/musicxml-testsuite/12a-Clefs.png differ diff --git a/test-data/musicxml-testsuite/12a-Clefs.xml b/test-data/musicxml-testsuite/12a-Clefs.xml index 85be49ec1..2b251dc38 100644 --- a/test-data/musicxml-testsuite/12a-Clefs.xml +++ b/test-data/musicxml-testsuite/12a-Clefs.xml @@ -1,15 +1,15 @@ - - + - Various clefs: G, C, F, percussion, - TAB and none; some are also possible with octavation and on other - staff lines than their default (e.g. soprano/alto/tenor/bariton C - clefs); Each measure shows a different clef (measure 17 has the "none" - clef), only measure 18 has the same treble clef as measure - 1. + Various clefs: G, C, F, + percussion, TAB, and ‘none’ (in measure 17). Some clefs are also + shown with transposition and on other staff lines than their default. + + Each measure shows a different clef; only measure 18 has the same + treble clef as the first measure. diff --git a/test-data/musicxml-testsuite/12b-Clefs-NoKeyOrClef.png b/test-data/musicxml-testsuite/12b-Clefs-NoKeyOrClef.png new file mode 100644 index 000000000..4ac3595fe Binary files /dev/null and b/test-data/musicxml-testsuite/12b-Clefs-NoKeyOrClef.png differ diff --git a/test-data/musicxml-testsuite/12b-Clefs-NoKeyOrClef.xml b/test-data/musicxml-testsuite/12b-Clefs-NoKeyOrClef.xml index d0ad799e8..97223f55d 100644 --- a/test-data/musicxml-testsuite/12b-Clefs-NoKeyOrClef.xml +++ b/test-data/musicxml-testsuite/12b-Clefs-NoKeyOrClef.xml @@ -1,47 +1,48 @@ - - - - - - A score without - any key or clef defined. The default (4/4 in treble - clef) should be used. - - - - - - - - - - - 1 - - - - - C - 4 - - 4 - 1 - whole - - - - - - C - 4 - - 4 - 1 - whole - - - + + + + + + A score without a <key> or + <clef> element (but with <time>). The default (4/4 in + treble clef) should be used. + + + + + + + + + + + 1 + + + + + C + 4 + + 4 + 1 + whole + + + + + + C + 4 + + 4 + 1 + whole + + + diff --git a/test-data/musicxml-testsuite/13a-KeySignatures.png b/test-data/musicxml-testsuite/13a-KeySignatures.png new file mode 100644 index 000000000..83b7e553c Binary files /dev/null and b/test-data/musicxml-testsuite/13a-KeySignatures.png differ diff --git a/test-data/musicxml-testsuite/13a-KeySignatures.xml b/test-data/musicxml-testsuite/13a-KeySignatures.xml index 1279fd2d1..e6d2c0162 100644 --- a/test-data/musicxml-testsuite/13a-KeySignatures.xml +++ b/test-data/musicxml-testsuite/13a-KeySignatures.xml @@ -1,13 +1,13 @@ - - + Different Key signatures - Various key signature: from 11 - flats to 11 sharps (each one first one measure in major, then one - measure in minor) + Various key signatures: from 11 + flats to 11 sharps. Each signature is shown twice, with one measure + in major and the other measure in minor. diff --git a/test-data/musicxml-testsuite/13b-KeySignatures-ChurchModes.png b/test-data/musicxml-testsuite/13b-KeySignatures-ChurchModes.png new file mode 100644 index 000000000..1036f581d Binary files /dev/null and b/test-data/musicxml-testsuite/13b-KeySignatures-ChurchModes.png differ diff --git a/test-data/musicxml-testsuite/13b-KeySignatures-ChurchModes.xml b/test-data/musicxml-testsuite/13b-KeySignatures-ChurchModes.xml index 1f4852d51..de53f09d3 100644 --- a/test-data/musicxml-testsuite/13b-KeySignatures-ChurchModes.xml +++ b/test-data/musicxml-testsuite/13b-KeySignatures-ChurchModes.xml @@ -1,12 +1,13 @@ - - + - All different modes: major, - minor, ionian, dorian, phrygian, lydian, mixolydian, aeolian, and - locrian; All modes are given with 2 sharps. + All different modes: ‘major’, + ‘minor’, ‘ionian’, ‘dorian’, ‘phrygian’, ‘lydian’, ‘mixolydian’, + ‘aeolian’, ‘locrian’, and ‘none’. All modes are given with two + sharps. @@ -174,6 +175,22 @@ quarter locrian + + + 2 + none + + + + + G + 4 + + 1 + 1 + quarter + none + diff --git a/test-data/musicxml-testsuite/13c-KeySignatures-NonTraditional.png b/test-data/musicxml-testsuite/13c-KeySignatures-NonTraditional.png new file mode 100644 index 000000000..d760ec271 Binary files /dev/null and b/test-data/musicxml-testsuite/13c-KeySignatures-NonTraditional.png differ diff --git a/test-data/musicxml-testsuite/13c-KeySignatures-NonTraditional.xml b/test-data/musicxml-testsuite/13c-KeySignatures-NonTraditional.xml index fa7780389..5522fbe57 100644 --- a/test-data/musicxml-testsuite/13c-KeySignatures-NonTraditional.xml +++ b/test-data/musicxml-testsuite/13c-KeySignatures-NonTraditional.xml @@ -1,14 +1,14 @@ - - + Non-traditional key signatures, - where each alteration is separately given. Here we have (f sharp, - a flat, b flat) and (c flatflat, g sharp sharp, d flat, b sharp, f - natural), where in the second case an explicit octave is given for - each alteration. + where each alteration is separately given. The first signature is [f + sharp, a flat, b flat]. The second one is [c flatflat, g sharp sharp, + d flat, b sharp, f natural], with explicitly selected octaves for each + alteration. diff --git a/test-data/musicxml-testsuite/13d-KeySignatures-Microtones.png b/test-data/musicxml-testsuite/13d-KeySignatures-Microtones.png new file mode 100644 index 000000000..fce8b7a87 Binary files /dev/null and b/test-data/musicxml-testsuite/13d-KeySignatures-Microtones.png differ diff --git a/test-data/musicxml-testsuite/13d-KeySignatures-Microtones.xml b/test-data/musicxml-testsuite/13d-KeySignatures-Microtones.xml index 9505e1555..8f374ff75 100644 --- a/test-data/musicxml-testsuite/13d-KeySignatures-Microtones.xml +++ b/test-data/musicxml-testsuite/13d-KeySignatures-Microtones.xml @@ -1,13 +1,13 @@ - - + Non-traditional key signatures - with microtone alterations: (g flat-and-a-half, - a flat, b half-flat, c natural, d half-sharp, e sharp, f - sharp-and-a-half). + with microtone alterations: [g flat-and-a-half, a flat, b half-flat, c + natural, d half-sharp, e sharp, f + sharp-and-a-half]. diff --git a/test-data/musicxml-testsuite/13e-KeySignatures-Cancel.png b/test-data/musicxml-testsuite/13e-KeySignatures-Cancel.png new file mode 100644 index 000000000..bcf5257a5 Binary files /dev/null and b/test-data/musicxml-testsuite/13e-KeySignatures-Cancel.png differ diff --git a/test-data/musicxml-testsuite/13e-KeySignatures-Cancel.xml b/test-data/musicxml-testsuite/13e-KeySignatures-Cancel.xml new file mode 100644 index 000000000..147cc412b --- /dev/null +++ b/test-data/musicxml-testsuite/13e-KeySignatures-Cancel.xml @@ -0,0 +1,121 @@ + + + + + + Tests of key signature + cancellation: at default location, at right, and before barline, then + cancelling a key signature that does not exist. + + + + + MusicXML Part + + + + + + + 1 + + 3 + major + + + + G + 2 + + + + + C + 4 + + 2 + 1 + half + + + + + + 3 + -5 + major + + + + + C + 4 + + 2 + 1 + half + + + + + + -5 + -3 + major + + + + + C + 4 + + 2 + 1 + half + + + + + + -3 + 2 + major + + + + + C + 4 + + 2 + 1 + half + + + + + + 4 + -2 + major + + + + + C + 4 + + 2 + 1 + half + + + light-heavy + + + + diff --git a/test-data/musicxml-testsuite/13f-KeySignatures-Visible.png b/test-data/musicxml-testsuite/13f-KeySignatures-Visible.png new file mode 100644 index 000000000..32bbb2850 Binary files /dev/null and b/test-data/musicxml-testsuite/13f-KeySignatures-Visible.png differ diff --git a/test-data/musicxml-testsuite/13f-KeySignatures-Visible.xml b/test-data/musicxml-testsuite/13f-KeySignatures-Visible.xml new file mode 100644 index 000000000..203ac640f --- /dev/null +++ b/test-data/musicxml-testsuite/13f-KeySignatures-Visible.xml @@ -0,0 +1,101 @@ + + + + + + Test the ‘print-object’ attribute + of key signatures. The signature at the beginning of the second bar + is a flat major and should be invisible; the following notes d flat, e + flat, a flat, and b flat shouldn't have a flat + accidental. + + + + + MusicXML Part + + + + + + + 1 + + 4 + major + + + + G + 2 + + + + + D + 1 + 4 + + 4 + 1 + whole + + + + + + + -4 + major + + + + + D + -1 + 4 + + 1 + 1 + quarter + + + + E + -1 + 4 + + 1 + 1 + quarter + + + + A + -1 + 4 + + 1 + 1 + quarter + + + + B + -1 + 4 + + 1 + 1 + quarter + + + light-heavy + + + + diff --git a/test-data/musicxml-testsuite/14a-StaffDetails-LineChanges.png b/test-data/musicxml-testsuite/14a-StaffDetails-LineChanges.png new file mode 100644 index 000000000..e3465a58d Binary files /dev/null and b/test-data/musicxml-testsuite/14a-StaffDetails-LineChanges.png differ diff --git a/test-data/musicxml-testsuite/14a-StaffDetails-LineChanges.xml b/test-data/musicxml-testsuite/14a-StaffDetails-LineChanges.xml index e297d5c88..1b713bacb 100644 --- a/test-data/musicxml-testsuite/14a-StaffDetails-LineChanges.xml +++ b/test-data/musicxml-testsuite/14a-StaffDetails-LineChanges.xml @@ -1,16 +1,19 @@ - - + - The number of staff lines can be - modified by using the staff-lines child of the staff-details attribute. - This can happen globally (the first staff has one line globally) or - during the part at the beginning of a measure and even inside a measure - (the second part has 5 lines initially, 4 at the beginning of the - second measure, and 3 starting in the middle of the third - measure). + Testing staff line configurations + and pitched notes. The number of staff lines can be modified by using + the ‘staff-lines’ child of the ‘staff-details’ attribute. This can + happen globally (the first staff has one line globally) or during the + part at the beginning of a measure and even inside a measure (the + second part has 5 lines initially, 4 at the beginning of the second + measure, and 3 starting in the middle of the third measure). The + fourth measure in the lower staff has five lines again but uses + ‘print-object="no"’ in the ‘line-detail’ element to suppress the + second and fourth staff line. @@ -41,8 +44,8 @@ - D - 5 + G + 4 4 1 @@ -53,8 +56,8 @@ - D - 5 + G + 4 4 1 @@ -65,8 +68,20 @@ - D - 5 + G + 4 + + 4 + 1 + whole + + + + + + + G + 4 4 1 @@ -136,7 +151,7 @@ - 2 + 3 @@ -149,6 +164,25 @@ half + + + + + 5 + + + + + + + G + 4 + + 4 + 1 + whole + + diff --git a/test-data/musicxml-testsuite/21a-Chord-Basic.png b/test-data/musicxml-testsuite/21a-Chord-Basic.png new file mode 100644 index 000000000..f0861668c Binary files /dev/null and b/test-data/musicxml-testsuite/21a-Chord-Basic.png differ diff --git a/test-data/musicxml-testsuite/21a-Chord-Basic.xml b/test-data/musicxml-testsuite/21a-Chord-Basic.xml index 17464b874..90911dc4e 100644 --- a/test-data/musicxml-testsuite/21a-Chord-Basic.xml +++ b/test-data/musicxml-testsuite/21a-Chord-Basic.xml @@ -1,55 +1,56 @@ - - - - - - One simple chord - consisting of two notes. - - - - - MusicXML Part - - - - - - 960 - - - G - 2 - - - - - A - 4 - - 960 - 1 - quarter - - - - - F - 4 - - 960 - 1 - quarter - - - - 960 - 1 - quarter - - - + + + + + + One simple chord + consisting of two notes. + + + + + MusicXML Part + + + + + + 960 + + + G + 2 + + + + + A + 4 + + 960 + 1 + quarter + + + + + F + 4 + + 960 + 1 + quarter + + + + 960 + 1 + quarter + + + diff --git a/test-data/musicxml-testsuite/21b-Chords-TwoNotes.png b/test-data/musicxml-testsuite/21b-Chords-TwoNotes.png new file mode 100644 index 000000000..935339bdf Binary files /dev/null and b/test-data/musicxml-testsuite/21b-Chords-TwoNotes.png differ diff --git a/test-data/musicxml-testsuite/21b-Chords-TwoNotes.xml b/test-data/musicxml-testsuite/21b-Chords-TwoNotes.xml index 7991e247f..5b182fd21 100644 --- a/test-data/musicxml-testsuite/21b-Chords-TwoNotes.xml +++ b/test-data/musicxml-testsuite/21b-Chords-TwoNotes.xml @@ -1,185 +1,210 @@ - - - - - - Some subsequent - (identical) two-note chords. - - - - - MusicXML Part - - - - - - 960 - - - G - 2 - - - - - A - 4 - - 960 - 1 - quarter - - - - - F - 4 - - 960 - 1 - quarter - - - - A - 4 - - 960 - 1 - quarter - - - - - F - 4 - - 960 - 1 - quarter - - - - A - 4 - - 960 - 1 - quarter - - - - - F - 4 - - 960 - 1 - quarter - - - - A - 4 - - 960 - 1 - quarter - - - - - F - 4 - - 960 - 1 - quarter - - - - - - - A - 4 - - 960 - 1 - quarter - - - - - F - 4 - - 960 - 1 - quarter - - - - A - 4 - - 960 - 1 - quarter - - - - - F - 4 - - 960 - 1 - quarter - - - - A - 4 - - 960 - 1 - quarter - - - - - F - 4 - - 960 - 1 - quarter - - - - A - 4 - - 960 - 1 - quarter - - - - - F - 4 - - 960 - 1 - quarter - - - + + + + + + Some subsequent + (identical) two-note chords. In the second bar, the chords are tied + (top note, bottom note, both notes). + + + + + MusicXML Part + + + + + + + 960 + + + G + 2 + + + + + A + 4 + + 960 + 1 + quarter + + + + + F + 4 + + 960 + 1 + quarter + + + + A + 4 + + 960 + 1 + quarter + + + + + F + 4 + + 960 + 1 + quarter + + + + A + 4 + + 960 + 1 + quarter + + + + + F + 4 + + 960 + 1 + quarter + + + + A + 4 + + 960 + 1 + quarter + + + + + F + 4 + + 960 + 1 + quarter + + + + + + + A + 4 + + 960 + 1 + quarter + + + + + + + + F + 4 + + 960 + 1 + quarter + + + + A + 4 + + 960 + 1 + quarter + + + + + + + + F + 4 + + 960 + 1 + quarter + + + + + + + A + 4 + + 960 + 1 + quarter + + + + + + + + F + 4 + + 960 + 1 + quarter + + + + + + + + A + 4 + + 960 + 1 + quarter + + + + + + + + F + 4 + + 960 + 1 + quarter + + + + + + diff --git a/test-data/musicxml-testsuite/21c-Chords-ThreeNotesDuration.png b/test-data/musicxml-testsuite/21c-Chords-ThreeNotesDuration.png new file mode 100644 index 000000000..b23c39748 Binary files /dev/null and b/test-data/musicxml-testsuite/21c-Chords-ThreeNotesDuration.png differ diff --git a/test-data/musicxml-testsuite/21c-Chords-ThreeNotesDuration.xml b/test-data/musicxml-testsuite/21c-Chords-ThreeNotesDuration.xml index f47ef862d..aa3d90a8f 100644 --- a/test-data/musicxml-testsuite/21c-Chords-ThreeNotesDuration.xml +++ b/test-data/musicxml-testsuite/21c-Chords-ThreeNotesDuration.xml @@ -1,229 +1,240 @@ - - - - - - Some three-note - chords, with various durations. - - - - - MusicXML Part - - - - - - 960 - - - G - 2 - - - - - F - 4 - - 1440 - 1 - quarter - - - - - - A - 4 - - 1440 - 1 - quarter - - - - - - C - 5 - - 1440 - 1 - quarter - - - - - A - 4 - - 480 - 1 - eighth - - - - - G - 5 - - 480 - 1 - eighth - - - - A - 4 - - 960 - 1 - quarter - - - - - F - 4 - - 960 - 1 - quarter - - - - - C - 5 - - 960 - 1 - quarter - - - - A - 4 - - 960 - 1 - quarter - - - - - F - 4 - - 960 - 1 - quarter - - - - - C - 5 - - 960 - 1 - quarter - - + + + + + + Some three-note + chords, with various durations. + + + + + MusicXML Part + + + + + + 960 + + + G + 2 + + + + + F + 4 + + 1440 + 1 + quarter + + + + + + A + 4 + + 1440 + 1 + quarter + + + + + + C + 5 + + 1440 + 1 + quarter + + + + + A + 4 + + 480 + 1 + eighth + + + + + C + 5 + + 480 + 1 + eighth + + + + + G + 5 + + 480 + 1 + eighth + + + + A + 4 + + 960 + 1 + quarter + + + + + F + 4 + + 960 + 1 + quarter + + + + + C + 5 + + 960 + 1 + quarter + + + + A + 4 + + 960 + 1 + quarter + + + + + F + 4 + + 960 + 1 + quarter + + + + + C + 5 + + 960 + 1 + quarter + + - - - - A - 4 - - 960 - 1 - quarter - - - - - F - 4 - - 960 - 1 - quarter - - - - - E - 5 - - 960 - 1 - quarter - - - - A - 4 - - 960 - 1 - quarter - - - - - F - 4 - - 960 - 1 - quarter - - - - - F - 5 - - 960 - 1 - quarter - - - - A - 4 - - 1920 - 1 - half - - - - - F - 4 - - 1920 - 1 - half - - - - - D - 5 - - 1920 - 1 - half - - - + + + + A + 4 + + 960 + 1 + quarter + + + + + F + 4 + + 960 + 1 + quarter + + + + + E + 5 + + 960 + 1 + quarter + + + + A + 4 + + 960 + 1 + quarter + + + + + F + 4 + + 960 + 1 + quarter + + + + + F + 5 + + 960 + 1 + quarter + + + + A + 4 + + 1920 + 1 + half + + + + + F + 4 + + 1920 + 1 + half + + + + + D + 5 + + 1920 + 1 + half + + + diff --git a/test-data/musicxml-testsuite/21d-Chords-SchubertStabatMater.png b/test-data/musicxml-testsuite/21d-Chords-SchubertStabatMater.png new file mode 100644 index 000000000..b77a687a7 Binary files /dev/null and b/test-data/musicxml-testsuite/21d-Chords-SchubertStabatMater.png differ diff --git a/test-data/musicxml-testsuite/21d-Chords-SchubertStabatMater.xml b/test-data/musicxml-testsuite/21d-Chords-SchubertStabatMater.xml index a89acac99..c5523777a 100644 --- a/test-data/musicxml-testsuite/21d-Chords-SchubertStabatMater.xml +++ b/test-data/musicxml-testsuite/21d-Chords-SchubertStabatMater.xml @@ -1,156 +1,156 @@ - - - - - - Chords in the - second measure, after several ornaments in the first - measure and a p at the beginning of the second - measure. - - - - - MusicXML Part - - - - - - 8 - - -4 - major - - - - G - 2 - - - - - Largo - - - - - - - - - 3 - - - - F - 4 - - 32 - 1 - whole - - - - - - - - - - - - - -

- - - - - - F - 4 - - 12 - 1 - quarter - - - - - - A - -1 - 4 - - 12 - 1 - quarter - - - - - F - 4 - - 4 - 1 - eighth - - - - - A - -1 - 4 - - 4 - 1 - eighth - - - - G - 4 - - 8 - 1 - quarter - - - - - B - -1 - 4 - - 8 - 1 - quarter - - - - G - 4 - - 8 - 1 - quarter - - - - - B - -1 - 4 - - 8 - 1 - quarter - - - + + + + + + Chords in the second measure, + after several ornaments in the first measure and a ‘p’ at the + beginning of the second measure. + + + + + MusicXML Part + + + + + + 8 + + -4 + major + + + + G + 2 + + + + + Largo + + + + + + + + + 3 + + + + F + 4 + + 32 + 1 + whole + + + + + + + + + + + + + +

+ + + + + + F + 4 + + 12 + 1 + quarter + + + + + + A + -1 + 4 + + 12 + 1 + quarter + + + + + F + 4 + + 4 + 1 + eighth + + + + + A + -1 + 4 + + 4 + 1 + eighth + + + + G + 4 + + 8 + 1 + quarter + + + + + B + -1 + 4 + + 8 + 1 + quarter + + + + G + 4 + + 8 + 1 + quarter + + + + + B + -1 + 4 + + 8 + 1 + quarter + + + diff --git a/test-data/musicxml-testsuite/21e-Chords-PickupMeasures.png b/test-data/musicxml-testsuite/21e-Chords-PickupMeasures.png new file mode 100644 index 000000000..a389be3af Binary files /dev/null and b/test-data/musicxml-testsuite/21e-Chords-PickupMeasures.png differ diff --git a/test-data/musicxml-testsuite/21e-Chords-PickupMeasures.xml b/test-data/musicxml-testsuite/21e-Chords-PickupMeasures.xml index 23e971526..0c7d33b67 100644 --- a/test-data/musicxml-testsuite/21e-Chords-PickupMeasures.xml +++ b/test-data/musicxml-testsuite/21e-Chords-PickupMeasures.xml @@ -1,87 +1,85 @@ - - + + - Check for proper chord detection - after a pickup measure (i.e. the first beat of the measure is not - aligned with multiples of the time signature)! + Check for proper chord detection + after a pickup measure (i.e., the first beat of the measure is not + aligned with a multiple of the time signature)! - - - MusicXML Part - - - - - - - 1 - - - - C - 5 - - 1 - 1 - quarter - - - - - - - C - 5 - - 1 - 1 - quarter - - - - - A - 4 - - 1 - 1 - quarter - - - - - F - 4 - - 1 - 1 - quarter - - - - C - 5 - - 1 - 1 - quarter - - - - - A - 4 - - 1 - 1 - quarter - - - - - + + + MusicXML Part + + + + + + + 1 + + + + C + 5 + + 1 + 1 + quarter + + + + + + + C + 5 + + 1 + 1 + quarter + + + + + A + 4 + + 1 + 1 + quarter + + + + + F + 4 + + 1 + 1 + quarter + + + + C + 5 + + 1 + 1 + quarter + + + + + A + 4 + + 1 + 1 + quarter + + + diff --git a/test-data/musicxml-testsuite/21f-Chord-ElementInBetween.png b/test-data/musicxml-testsuite/21f-Chord-ElementInBetween.png new file mode 100644 index 000000000..3f2567477 Binary files /dev/null and b/test-data/musicxml-testsuite/21f-Chord-ElementInBetween.png differ diff --git a/test-data/musicxml-testsuite/21f-Chord-ElementInBetween.xml b/test-data/musicxml-testsuite/21f-Chord-ElementInBetween.xml index 6a7de1cd2..b15fab7e5 100644 --- a/test-data/musicxml-testsuite/21f-Chord-ElementInBetween.xml +++ b/test-data/musicxml-testsuite/21f-Chord-ElementInBetween.xml @@ -1,84 +1,86 @@ - - - - - - Between the individual notes of - a chord there can be direction or harmony elements, which should be - properly assigned to the chord (or the position of the - chord). - - - - - MusicXML Part - - - - - - 1 - - - G - 2 - - - - - A - 4 - - 1 - 1 - quarter - - - - - - - - - - F - 1 - 4 - - 1 - 1 - quarter - - - -

- - - - - - D - 4 - - 1 - 1 - quarter - - - - 1 - 1 - quarter - - - - 2 - 1 - half - - - + + + + + + Between the individual notes of a + chord there can be <direction> elements, which already belong to + the next <note> element after the current one. The segno and + the piano sign should be attached to the rest after the + chord. + + + + + MusicXML Part + + + + + + 1 + + + G + 2 + + + + + A + 4 + + 1 + 1 + quarter + + + + + + + + + + F + 1 + 4 + + 1 + 1 + quarter + + + +

+ + + + + + D + 4 + + 1 + 1 + quarter + + + + 1 + 1 + quarter + + + + 2 + 1 + half + + + diff --git a/test-data/musicxml-testsuite/21g-Chords-Tremolos.png b/test-data/musicxml-testsuite/21g-Chords-Tremolos.png new file mode 100644 index 000000000..364cf99e9 Binary files /dev/null and b/test-data/musicxml-testsuite/21g-Chords-Tremolos.png differ diff --git a/test-data/musicxml-testsuite/21g-Chords-Tremolos.xml b/test-data/musicxml-testsuite/21g-Chords-Tremolos.xml new file mode 100644 index 000000000..5b876c088 --- /dev/null +++ b/test-data/musicxml-testsuite/21g-Chords-Tremolos.xml @@ -0,0 +1,253 @@ + + + + + Tremolos on chords + + + + Different tremolos on different + chord notes. The tremolo on the last chord is of type + ‘unmeasured’. + + + + + + + + + + + 2 + + 0 + + + G + 2 + + + + + F + 3 + + 2 + 1 + quarter + + + 4 + + + + + + + C + 4 + + 2 + 1 + quarter + + + + + G + 4 + + 2 + 1 + quarter + + + + + D + 5 + + 2 + 1 + quarter + + + + A + 3 + + 1 + 1 + eighth + begin + + + + + D + 4 + + 1 + 1 + eighth + + + 2 + + + + + + + G + 4 + + 1 + 1 + eighth + + + + + C + 5 + + 1 + 1 + eighth + + + + B + 3 + + 1 + 1 + eighth + end + + + + + D + 4 + + 1 + 1 + eighth + + + + + F + 4 + + 1 + 1 + eighth + + + 1 + + + + + + + A + 4 + + 1 + 1 + eighth + + + + F + 5 + + 1 + 1 + eighth + + + + + A + 5 + + 1 + 1 + eighth + + + + + B + 5 + + 1 + 1 + eighth + + + + + C + 6 + + 1 + 1 + eighth + + + 3 + + + + + + G + 4 + + 2 + 1 + quarter + + + 0 + + + + + + + D + 5 + + 2 + 1 + quarter + + + + + A + 5 + + 2 + 1 + quarter + + + + 1 + 1 + eighth + + + + + diff --git a/test-data/musicxml-testsuite/21h-Chord-Accidentals.png b/test-data/musicxml-testsuite/21h-Chord-Accidentals.png new file mode 100644 index 000000000..a2dd8aa5c Binary files /dev/null and b/test-data/musicxml-testsuite/21h-Chord-Accidentals.png differ diff --git a/test-data/musicxml-testsuite/21h-Chord-Accidentals.xml b/test-data/musicxml-testsuite/21h-Chord-Accidentals.xml new file mode 100644 index 000000000..99d769c99 --- /dev/null +++ b/test-data/musicxml-testsuite/21h-Chord-Accidentals.xml @@ -0,0 +1,65 @@ + + + + + + A chord with normal, cautionary, + and editorial accidentals. + + + + + MusicXML Part + + + + + + 1 + + + G + 2 + + + + + D + -1 + 4 + + 1 + 1 + quarter + flat + + + + + F + 1 + 4 + + 1 + 1 + quarter + sharp + + + + + A + 4 + + 1 + 1 + quarter + natural + + + + diff --git a/test-data/musicxml-testsuite/22a-Noteheads.png b/test-data/musicxml-testsuite/22a-Noteheads.png new file mode 100644 index 000000000..44d456924 Binary files /dev/null and b/test-data/musicxml-testsuite/22a-Noteheads.png differ diff --git a/test-data/musicxml-testsuite/22a-Noteheads.xml b/test-data/musicxml-testsuite/22a-Noteheads.xml index 287488727..bfa6e18b9 100644 --- a/test-data/musicxml-testsuite/22a-Noteheads.xml +++ b/test-data/musicxml-testsuite/22a-Noteheads.xml @@ -1,15 +1,15 @@ - - + - Different note styles, using the - <notehead> element. First, each note head style is printed - with four quarter notes, two with filled heads, two with unfilled - heads, where first the stem is up and then the stem is down. After - that, each note head style is printed with a half note (should have - an unfilled head by default). Finally, the Aiken note head styles are + Different note styles, using the + <notehead> element. First, each note head style is printed + with four quarter notes, two with filled heads, two with unfilled + heads, where first the stem is up and then the stem is down. After + that, each note head style is printed with a half note (should have + an unfilled head by default). Finally, the Aiken note head styles are tested, once with stem up and once with stem down. @@ -309,7 +309,8 @@ 1 quarter circle-x - circle-x + circle- + x @@ -353,7 +354,8 @@ 1 quarter inverted triangle - inverted triangle + inverted + triangle @@ -397,7 +399,8 @@ 1 quarter arrow down - arrow down + arrow + down @@ -441,7 +444,8 @@ 1 quarter arrow up - arrow up + arrow + up @@ -529,7 +533,8 @@ 1 quarter back slashed - back slashed + back + slashed @@ -693,9 +698,13 @@ quarter none + + light-light + + A @@ -780,7 +789,8 @@ 1 half circle-x - circle-x + circle- + x @@ -791,7 +801,8 @@ 1 half inverted triangle - inverted triangle + inverted + triangle @@ -805,7 +816,8 @@ 1 half arrow down - arrow down + arrow + down @@ -816,7 +828,8 @@ 1 half arrow up - arrow up + arrow + up @@ -841,7 +854,8 @@ 1 half back slashed - back slashed + back + slashed @@ -868,9 +882,13 @@ cluster cluster + + light-light + + A diff --git a/test-data/musicxml-testsuite/22b-Staff-Notestyles.png b/test-data/musicxml-testsuite/22b-Staff-Notestyles.png new file mode 100644 index 000000000..f592aed00 Binary files /dev/null and b/test-data/musicxml-testsuite/22b-Staff-Notestyles.png differ diff --git a/test-data/musicxml-testsuite/22b-Staff-Notestyles.xml b/test-data/musicxml-testsuite/22b-Staff-Notestyles.xml index 1a15bc877..bf8c81818 100644 --- a/test-data/musicxml-testsuite/22b-Staff-Notestyles.xml +++ b/test-data/musicxml-testsuite/22b-Staff-Notestyles.xml @@ -1,12 +1,12 @@ - - + - Staff-connected note styles: - slash notation, hidden notes (with and without hidden staff - lines) + Staff-connected note styles: slash + notation, hidden notes (with and without hidden staff + lines). @@ -40,10 +40,43 @@ 1 1 quarter + normal + + + B + 4 + + 1 + 1 + quarter + + + + C + 5 + + 1 + 1 + quarter + + + + D + 5 + + 1 + 1 + quarter + + + + - + + quarter + @@ -54,7 +87,17 @@ 1 1 quarter - slash, no stem + slashes, + no stem + + + + B + 4 + + 1 + 1 + quarter @@ -65,12 +108,30 @@ 1 quarter + + + D + 5 + + 1 + 1 + quarter + - + + quarter + + + + + + - + + quarter + @@ -81,11 +142,18 @@ 1 1 quarter - slash, with stem + slashes, + with stem + + + + B + 4 + + 1 + 1 + quarter - - - C @@ -95,11 +163,26 @@ 1 quarter + + + D + 5 + + 1 + 1 + quarter + - + + quarter + + + + + A @@ -108,7 +191,17 @@ 1 1 quarter - hidden notes + hidden + notes + + + + B + 4 + + 1 + 1 + quarter @@ -119,6 +212,18 @@ 1 quarter + + + D + 5 + + 1 + 1 + quarter + + + + 0 @@ -126,25 +231,46 @@ - C + A 4 1 1 quarter - hidden notes, staff lines + hidden notes, + hidden + staff lines - - - D + B 4 - 2 + 1 + 1 + quarter + + + + C + 5 + + 1 + 1 + quarter + + + + D + 5 + + 1 1 - half + quarter + + + 5 @@ -152,13 +278,42 @@ - G + A 4 - 2 + 1 1 - half - normal settings restored + quarter + normal + settings + restored + + + + B + 4 + + 1 + 1 + quarter + + + + C + 5 + + 1 + 1 + quarter + + + + D + 5 + + 1 + 1 + quarter light-heavy diff --git a/test-data/musicxml-testsuite/22c-Noteheads-Chords.png b/test-data/musicxml-testsuite/22c-Noteheads-Chords.png new file mode 100644 index 000000000..ff5ddabf0 Binary files /dev/null and b/test-data/musicxml-testsuite/22c-Noteheads-Chords.png differ diff --git a/test-data/musicxml-testsuite/22c-Noteheads-Chords.xml b/test-data/musicxml-testsuite/22c-Noteheads-Chords.xml index 5196040ae..84ebb0a11 100644 --- a/test-data/musicxml-testsuite/22c-Noteheads-Chords.xml +++ b/test-data/musicxml-testsuite/22c-Noteheads-Chords.xml @@ -1,11 +1,11 @@ - - + - Different note styles for - individual notes inside a chord, using the + Different note styles for + individual notes inside a chord, using the <notehead> element. diff --git a/test-data/musicxml-testsuite/22d-Parenthesized-Noteheads.png b/test-data/musicxml-testsuite/22d-Parenthesized-Noteheads.png new file mode 100644 index 000000000..855e8a79d Binary files /dev/null and b/test-data/musicxml-testsuite/22d-Parenthesized-Noteheads.png differ diff --git a/test-data/musicxml-testsuite/22d-Parenthesized-Noteheads.xml b/test-data/musicxml-testsuite/22d-Parenthesized-Noteheads.xml index 297beed22..b1be0c8d0 100644 --- a/test-data/musicxml-testsuite/22d-Parenthesized-Noteheads.xml +++ b/test-data/musicxml-testsuite/22d-Parenthesized-Noteheads.xml @@ -1,13 +1,15 @@ - - + - Parenthesized note heads. First, - a single parenthesized note is tested, once with a normal and then - with a non-standard notehead, then two chords with some/all - parenthesized noteheads and finally a parenthesized rest. + Parenthesized note heads. A + normal parenthesized note, a parenthesized note with an ‘x’ note head, + a three-note chord with the middle note parenthesized, a three-note + chord with all notes parenthesized, a normal quarter rest in + parentheses, and a pitched quarter rest in + parentheses. diff --git a/test-data/musicxml-testsuite/23a-Tuplets.png b/test-data/musicxml-testsuite/23a-Tuplets.png new file mode 100644 index 000000000..8dc5bd4be Binary files /dev/null and b/test-data/musicxml-testsuite/23a-Tuplets.png differ diff --git a/test-data/musicxml-testsuite/23a-Tuplets.xml b/test-data/musicxml-testsuite/23a-Tuplets.xml index 4fb2a7c4b..3551582f6 100644 --- a/test-data/musicxml-testsuite/23a-Tuplets.xml +++ b/test-data/musicxml-testsuite/23a-Tuplets.xml @@ -1,12 +1,12 @@ - - + - Some tuplets (3:2, 3:2, 3:2, 4:2, - 4:1, 7:3, 6:2) with the default tuplet bracket displaying the number - of actual notes played. The second tuplet does not have a number + Some tuplets (3:2, 3:2, 3:2, 4:2, + 4:1, 7:3, 6:2) with the default tuplet bracket displaying the number + of actual notes played. The second tuplet does not have a number attribute set. diff --git a/test-data/musicxml-testsuite/23b-Tuplets-Styles.png b/test-data/musicxml-testsuite/23b-Tuplets-Styles.png new file mode 100644 index 000000000..09838b286 Binary files /dev/null and b/test-data/musicxml-testsuite/23b-Tuplets-Styles.png differ diff --git a/test-data/musicxml-testsuite/23b-Tuplets-Styles.xml b/test-data/musicxml-testsuite/23b-Tuplets-Styles.xml index c2a7678a8..da108ec41 100644 --- a/test-data/musicxml-testsuite/23b-Tuplets-Styles.xml +++ b/test-data/musicxml-testsuite/23b-Tuplets-Styles.xml @@ -1,12 +1,13 @@ - - + - Different tuplet styles: - default, none, x:y, x:y-note; Each with bracket, slur and none. - Finally, non-standard 4:3 and 17:2 tuplets are given. + Different tuplet styles: default, + none, x:y, x:y-note, and x-note:y-note; each with bracket, slur, and + without bracket. Finally, non-standard 4:3 and 17:2 tuplets are + given. @@ -260,6 +261,7 @@ + C @@ -488,6 +490,7 @@ + C @@ -716,6 +719,7 @@ + C diff --git a/test-data/musicxml-testsuite/23c-Tuplet-Display-NonStandard.png b/test-data/musicxml-testsuite/23c-Tuplet-Display-NonStandard.png new file mode 100644 index 000000000..a6e5a7298 Binary files /dev/null and b/test-data/musicxml-testsuite/23c-Tuplet-Display-NonStandard.png differ diff --git a/test-data/musicxml-testsuite/23c-Tuplet-Display-NonStandard.xml b/test-data/musicxml-testsuite/23c-Tuplet-Display-NonStandard.xml index c0949e4c4..3af9a250b 100644 --- a/test-data/musicxml-testsuite/23c-Tuplet-Display-NonStandard.xml +++ b/test-data/musicxml-testsuite/23c-Tuplet-Display-NonStandard.xml @@ -1,21 +1,26 @@ - - + - Displaying tuplet note types, - that might not coincide with the displayed note. The first two tuplets - take the type from the note, the second two from the - <time-modification> element, the remaining pair of tuplets from the - <tuplet> notation element. The tuplets in measure 3 specify both - a number of notes and a type inside the <tuplet-actual> and - <tuplet-normal> elements, the ones in measure 4 specify only a - note type (but no number), and the ones in measure 5 specify only a - number of tuplet-notes (but no type, which is deduced from the - note's type). The first tuplet of measures 3-5 uses - 'display-type="actual"', the second one 'display-type="both"'. - FIXME: The tuplet-normal should coincide with the real notes! + Displaying tuplet note types that + might not coincide with the displayed note. The first two tuplets + take the type from the note, the second two from the + <time-modification> element, the remaining pair of tuplets from + the <tuplet> notation element. + + The tuplets in measure 3 specify both a number of notes and a type + inside the <tuplet-actual> and <tuplet-normal> elements, + the ones in measure 4 specify only a note type (but no number), and + the ones in measure 5 specify only a number of tuplet notes (but no + type, which is deduced from the note's type). + + The first tuplet of measures 3 to 5 uses ‘display-type="actual"’, the + second one ‘display-type="both"’. + + FIXME: The tuplet-normal should coincide with the real + notes! @@ -259,7 +264,8 @@ breve - + 7 quarter @@ -321,7 +327,8 @@ - + 7 half @@ -374,6 +381,7 @@ + C @@ -388,7 +396,8 @@ breve - + quarter @@ -448,7 +457,8 @@ - + half @@ -565,7 +575,8 @@ 2 - + 7 eighth diff --git a/test-data/musicxml-testsuite/23d-Tuplets-Nested.png b/test-data/musicxml-testsuite/23d-Tuplets-Nested.png new file mode 100644 index 000000000..77992a6c0 Binary files /dev/null and b/test-data/musicxml-testsuite/23d-Tuplets-Nested.png differ diff --git a/test-data/musicxml-testsuite/23d-Tuplets-Nested.xml b/test-data/musicxml-testsuite/23d-Tuplets-Nested.xml index 8daf36345..3df5c4cbe 100644 --- a/test-data/musicxml-testsuite/23d-Tuplets-Nested.xml +++ b/test-data/musicxml-testsuite/23d-Tuplets-Nested.xml @@ -1,12 +1,14 @@ - - + - Tuplets can be nested. Here - there is a 5:2 tuplet inside a 3:2 tuple (all consisting of written - eighth notes). + Tuplets can be nested. The first + bar contains a 5:2 tuplet (with 16th notes) in the middle of a 3:2 + tuple (with eighth notes). The second bar has a 5:2 tuplet at the + beginning and at the end (with the tuplet number forced below) of a + 3:2 tuple (with the bracket forced above). @@ -47,7 +49,7 @@ begin - + @@ -72,21 +74,22 @@ 4 1 - eighth + 16th 15 4 begin + begin - + 5 - eighth + 16th - 2 - eighth + 4 + 16th @@ -98,7 +101,7 @@ 4 1 - eighth + 16th 15 4 @@ -112,7 +115,7 @@ 4 1 - eighth + 16th 15 4 @@ -126,7 +129,7 @@ 4 1 - eighth + 16th 15 4 @@ -140,12 +143,13 @@ 4 1 - eighth + 16th 15 4 end + end @@ -183,6 +187,230 @@ + + + + + + B + 4 + + 4 + 1 + 16th + + 15 + 4 + + begin + begin + + + + 3 + quarter + + + 2 + quarter + + + + + 5 + 16th + + + 4 + 16th + + + + + + + B + 4 + + 4 + 1 + 16th + + 15 + 4 + + continue + continue + + + + B + 4 + + 4 + 1 + 16th + + 15 + 4 + + continue + continue + + + + B + 4 + + 4 + 1 + 16th + + 15 + 4 + + continue + continue + + + + B + 4 + + 4 + 1 + 16th + + 15 + 4 + + end + end + + + + + + + B + 4 + + 10 + 1 + eighth + + 3 + 2 + quarter + + begin + + + + B + 4 + + 10 + 1 + eighth + + 3 + 2 + quarter + + end + + + + B + 4 + + 4 + 1 + 16th + + 15 + 4 + + begin + begin + + + + 5 + 16th + + + 4 + 16th + + + + + + + B + 4 + + 4 + 1 + 16th + + 15 + 4 + + continue + continue + + + + B + 4 + + 4 + 1 + 16th + + 15 + 4 + + continue + continue + + + + B + 4 + + 4 + 1 + 16th + + 15 + 4 + + continue + continue + + + + B + 4 + + 4 + 1 + 16th + + 15 + 4 + + end + end + + + + + light-heavy diff --git a/test-data/musicxml-testsuite/23e-Tuplets-Tremolo.png b/test-data/musicxml-testsuite/23e-Tuplets-Tremolo.png new file mode 100644 index 000000000..f27946712 Binary files /dev/null and b/test-data/musicxml-testsuite/23e-Tuplets-Tremolo.png differ diff --git a/test-data/musicxml-testsuite/23e-Tuplets-Tremolo.xml b/test-data/musicxml-testsuite/23e-Tuplets-Tremolo.xml index eee4d0f27..2cd076b8b 100644 --- a/test-data/musicxml-testsuite/23e-Tuplets-Tremolo.xml +++ b/test-data/musicxml-testsuite/23e-Tuplets-Tremolo.xml @@ -1,12 +1,15 @@ - - + - Tremolo tuplets are tuplets on - single notes with a tremolo ornament. The application shall correctly - import these notes with 2/3 or their time... + Tremolo tuplets. The first bar + contains normal eighth triplets with staccato points, the second bar + holds three tremolo tuplets, the third bar holds a sextuple followed + by a triplet, the third bar contains a sextuple (starting on the + second beat) with a ‘fp’ sign, and the fifth bar is identical to the + third bar. diff --git a/test-data/musicxml-testsuite/23f-Tuplets-DurationButNoBracket.png b/test-data/musicxml-testsuite/23f-Tuplets-DurationButNoBracket.png new file mode 100644 index 000000000..39b74f85b Binary files /dev/null and b/test-data/musicxml-testsuite/23f-Tuplets-DurationButNoBracket.png differ diff --git a/test-data/musicxml-testsuite/23f-Tuplets-DurationButNoBracket.xml b/test-data/musicxml-testsuite/23f-Tuplets-DurationButNoBracket.xml index 866d8dc9b..f29df2a3e 100644 --- a/test-data/musicxml-testsuite/23f-Tuplets-DurationButNoBracket.xml +++ b/test-data/musicxml-testsuite/23f-Tuplets-DurationButNoBracket.xml @@ -1,204 +1,310 @@ - - - - - - /usr/bin/vi - 2007-02-02 - - - Some "triplets" - on the end of the first and in the second staff, using only - <time-modification>, but not explicit tuplet - bracket. Thus, the duration of the notes in the - second staff should be scaled properly in comparison - to staff 1, but no visual indication about the - tuplets is given. - - - - MusicXML Part - - - - - 96 - 0 - - 2 - G2 - F4 - - - F4 - 96 - 1 - quarter - 1 - - - G4 - 96 - 1 - quarter - 1 - - - A4 - 64 - 1 - quarter - 32 - 1 - - - B4 - 64 - 1 - quarter - 32 - 1 - - - C5 - 64 - 1 - quarter - 32 - 1 - - 384 - - A2 - 48 - 2 - eighth - 2 - begin - - - B2 - 48 - 2 - eighth - 2 - end - - - C3 - 32 - 2 - eighth - 32 - 2 - begin - - - D3 - 32 - 2 - eighth - 32 - 2 - continue - - - E3 - 32 - 2 - eighth - 32 - 2 - end - - - A2 - 24 - 2 - 16th - 2 - begin - - - B2 - 24 - 2 - 16th - 2 - continue - - - C3 - 24 - 2 - 16th - 2 - continue - - - D3 - 24 - 2 - 16th - 2 - end - + + + + + + /usr/bin/vi + 2007-02-02 + + + Tuplets without brackets, using + only <time-modification>. The upper staff contains two quarters + followed by a quarter triplet. The lower staff holds two eighths, an + eighths triplet, four 16th notes, and a 16th + sextuplet. + + + + MusicXML Part + + + + + 96 + + 0 + + + 2 + + G + 2 + + + F + 4 + + + + + F + 4 + + 96 + 1 + quarter + 1 + + + + G + 4 + + 96 + 1 + quarter + 1 + + + + A + 4 + + 64 + 1 + quarter + + 3 + 2 + + 1 + + + + B + 4 + + 64 + 1 + quarter + + 3 + 2 + + 1 + + + + C + 5 + + 64 + 1 + quarter + + 3 + 2 + + 1 + - - E3 - 16 - 2 - 16th - 32 - 2 - begin - - - F3 - 16 - 2 - 16th - 32 - 2 - continue - - - G3 - 16 - 2 - 16th - 32 - 2 - continue - - - A3 - 16 - 2 - 16th - 32 - 2 - continue - - - B3 - 16 - 2 - 16th - 32 - 2 - continue - - - C4 - 16 - 2 - 16th - 32 - 2 - end - - - + 384 + + + + A + 2 + + 48 + 2 + eighth + 2 + begin + + + + B + 2 + + 48 + 2 + eighth + 2 + end + + + + C + 3 + + 32 + 2 + eighth + + 3 + 2 + + 2 + begin + + + + D + 3 + + 32 + 2 + eighth + + 3 + 2 + + 2 + continue + + + + E + 3 + + 32 + 2 + eighth + + 3 + 2 + + 2 + end + + + + A + 2 + + 24 + 2 + 16th + 2 + begin + + + + B + 2 + + 24 + 2 + 16th + 2 + continue + + + + C + 3 + + 24 + 2 + 16th + 2 + continue + + + + D + 3 + + 24 + 2 + 16th + 2 + end + + + + E + 3 + + 16 + 2 + 16th + + 3 + 2 + + 2 + begin + + + + F + 3 + + 16 + 2 + 16th + + 3 + 2 + + 2 + continue + + + + G + 3 + + 16 + 2 + 16th + + 3 + 2 + + 2 + continue + + + + A + 3 + + 16 + 2 + 16th + + 3 + 2 + + 2 + continue + + + + B + 3 + + 16 + 2 + 16th + + 3 + 2 + + 2 + continue + + + + C + 4 + + 16 + 2 + 16th + + 3 + 2 + + 2 + end + + + diff --git a/test-data/musicxml-testsuite/24a-GraceNotes.png b/test-data/musicxml-testsuite/24a-GraceNotes.png new file mode 100644 index 000000000..4e81d26e0 Binary files /dev/null and b/test-data/musicxml-testsuite/24a-GraceNotes.png differ diff --git a/test-data/musicxml-testsuite/24a-GraceNotes.xml b/test-data/musicxml-testsuite/24a-GraceNotes.xml index a194cc3b3..58fbefa9a 100644 --- a/test-data/musicxml-testsuite/24a-GraceNotes.xml +++ b/test-data/musicxml-testsuite/24a-GraceNotes.xml @@ -1,12 +1,17 @@ - - + - Different kinds of grace notes: - acciaccatura, appoggiatura; beamed grace notes; grace notes with - accidentals; different durations of the grace notes. + Different kinds of grace notes. + First bar: single 1/16 grace note, beamed 1/16 grace notes, + 1/16 appoggiatura, 1/8 appoggiatura. Second bar: slashed single 1/16 + grace note, beamed 1/16 grace notes (with both notes marked as + slashed), 1/16 acciaccatura, 1/16 grace note (without slash) right + before the measure bar. Third bar: no grace note before chord, 1/4 + grace note with sharp, two 1/4 grace notes with flats, 1/16 slashed + grace note before rest. @@ -33,7 +38,7 @@ - + D 5 @@ -51,7 +56,7 @@ quarter - + E 5 @@ -62,7 +67,7 @@ begin - + D 5 @@ -82,16 +87,15 @@ quarter - + D 5 - 1 16th - + @@ -102,15 +106,21 @@ 4 1 quarter + + + - + D 5 1 eighth + + + @@ -120,6 +130,9 @@ 4 1 quarter + + + @@ -143,7 +156,7 @@ quarter - + E 5 @@ -154,7 +167,7 @@ begin - + D 5 @@ -169,9 +182,9 @@ C 5 - 8 + 4 1 - half + quarter @@ -181,38 +194,33 @@ 1 16th + + + C 5 - 2 - 1 - eighth - begin - - - - - D - 5 - + 4 1 - 16th + quarter + + + C 5 - 2 + 4 1 - eighth - end + quarter - + E 5 @@ -223,15 +231,6 @@ - - - - E - 5 - - 1 - 16th - F @@ -303,10 +302,16 @@ quarter + - C + D 5 + 1 + 16th + + + 4 1 quarter diff --git a/test-data/musicxml-testsuite/24b-ChordAsGraceNote.png b/test-data/musicxml-testsuite/24b-ChordAsGraceNote.png new file mode 100644 index 000000000..85fe055e4 Binary files /dev/null and b/test-data/musicxml-testsuite/24b-ChordAsGraceNote.png differ diff --git a/test-data/musicxml-testsuite/24b-ChordAsGraceNote.xml b/test-data/musicxml-testsuite/24b-ChordAsGraceNote.xml index 1f00a6f2c..ef2d46d6e 100644 --- a/test-data/musicxml-testsuite/24b-ChordAsGraceNote.xml +++ b/test-data/musicxml-testsuite/24b-ChordAsGraceNote.xml @@ -1,10 +1,13 @@ - - + - Chords as grace notes. + Chords as grace notes. The last + (unslashed and beamed) grace group consists of two chords with one + tie between the two grace chords and another tie between the last + grace chord and the main chord. @@ -105,6 +108,79 @@ 1 quarter + + + + B + 4 + + 1 + 16th + begin + begin + + + + + + D + 5 + + 1 + 16th + + + + + + + + G + 4 + + 1 + 16th + end + end + + + + + + + + + D + 5 + + 1 + 16th + + + + + + + G + 4 + + 2 + 1 + quarter + + + + + + + + C + 5 + + 2 + 1 + quarter + light-heavy diff --git a/test-data/musicxml-testsuite/24c-GraceNote-MeasureEnd.png b/test-data/musicxml-testsuite/24c-GraceNote-MeasureEnd.png new file mode 100644 index 000000000..2366d6aad Binary files /dev/null and b/test-data/musicxml-testsuite/24c-GraceNote-MeasureEnd.png differ diff --git a/test-data/musicxml-testsuite/24c-GraceNote-MeasureEnd.xml b/test-data/musicxml-testsuite/24c-GraceNote-MeasureEnd.xml index ba2c165c4..f1e4ad079 100644 --- a/test-data/musicxml-testsuite/24c-GraceNote-MeasureEnd.xml +++ b/test-data/musicxml-testsuite/24c-GraceNote-MeasureEnd.xml @@ -1,11 +1,11 @@ - - + - A grace note that appears at the - measure end (without any steal-from-* attribute set). Some + A grace note that appears at the + measure end (without any steal-from-* attribute set). Some applications need to convert this into an after-grace. @@ -16,7 +16,7 @@ - + 32 @@ -53,7 +53,7 @@ 1 - + G 5 @@ -65,7 +65,7 @@ begin - + A 5 diff --git a/test-data/musicxml-testsuite/24d-AfterGrace.png b/test-data/musicxml-testsuite/24d-AfterGrace.png new file mode 100644 index 000000000..3ad6afe2f Binary files /dev/null and b/test-data/musicxml-testsuite/24d-AfterGrace.png differ diff --git a/test-data/musicxml-testsuite/24d-AfterGrace.xml b/test-data/musicxml-testsuite/24d-AfterGrace.xml index 9e5f3136c..2be74d4d7 100644 --- a/test-data/musicxml-testsuite/24d-AfterGrace.xml +++ b/test-data/musicxml-testsuite/24d-AfterGrace.xml @@ -1,11 +1,13 @@ - - + Some grace notes and after-graces - (indicated by steal-time-previous and steal-time-following). + indicated by ‘steal-time-previous’ (for the first grace note) and + ‘steal-time-following’ (for the second one). The remaining grace + notes have no such attribute. @@ -15,7 +17,7 @@ - + 32 @@ -42,7 +44,7 @@ 1 - + G 5 @@ -52,7 +54,7 @@ 1 - + A 5 @@ -62,7 +64,7 @@ 1 - + A 5 @@ -82,7 +84,7 @@ 1 - + G 5 @@ -94,7 +96,7 @@ begin - + A 5 diff --git a/test-data/musicxml-testsuite/24e-GraceNote-StaffChange.png b/test-data/musicxml-testsuite/24e-GraceNote-StaffChange.png new file mode 100644 index 000000000..175695a17 Binary files /dev/null and b/test-data/musicxml-testsuite/24e-GraceNote-StaffChange.png differ diff --git a/test-data/musicxml-testsuite/24e-GraceNote-StaffChange.xml b/test-data/musicxml-testsuite/24e-GraceNote-StaffChange.xml index 9470c0cb6..43ba1df4e 100644 --- a/test-data/musicxml-testsuite/24e-GraceNote-StaffChange.xml +++ b/test-data/musicxml-testsuite/24e-GraceNote-StaffChange.xml @@ -1,11 +1,11 @@ - - + - A grace note on a different - staff than the actual note. + Grace notes on a different + staff than the actual notes. @@ -15,7 +15,7 @@ - + 32 @@ -26,11 +26,22 @@ 4 4 + 2 G 2 + + + + G + 5 + + 1 + 16th + 2 + E @@ -42,7 +53,7 @@ 1 - + G 5 @@ -54,7 +65,7 @@ begin - + A 5 @@ -75,6 +86,15 @@ half 1 + + 128 + + + + 128 + 2 + 2 + diff --git a/test-data/musicxml-testsuite/24f-GraceNote-Slur.png b/test-data/musicxml-testsuite/24f-GraceNote-Slur.png new file mode 100644 index 000000000..ef059ad6a Binary files /dev/null and b/test-data/musicxml-testsuite/24f-GraceNote-Slur.png differ diff --git a/test-data/musicxml-testsuite/24f-GraceNote-Slur.xml b/test-data/musicxml-testsuite/24f-GraceNote-Slur.xml index 91d085ed3..ab3b42762 100644 --- a/test-data/musicxml-testsuite/24f-GraceNote-Slur.xml +++ b/test-data/musicxml-testsuite/24f-GraceNote-Slur.xml @@ -1,12 +1,14 @@ - - + A grace note with a slur to the - actual note. This can be interpreted as acciaccatura or appoggiatura, - depending on the existence of a slash. + actual note. The <grace> element has no ‘slash’ attribute; + since MusicXML does not provide a default value it is up to the + application to interpret the grace note as an acciaccatura or an + appoggiatura. diff --git a/test-data/musicxml-testsuite/24g-GraceNote-Dynamics.png b/test-data/musicxml-testsuite/24g-GraceNote-Dynamics.png new file mode 100644 index 000000000..f36c25f6b Binary files /dev/null and b/test-data/musicxml-testsuite/24g-GraceNote-Dynamics.png differ diff --git a/test-data/musicxml-testsuite/24g-GraceNote-Dynamics.xml b/test-data/musicxml-testsuite/24g-GraceNote-Dynamics.xml new file mode 100644 index 000000000..64bbd1dce --- /dev/null +++ b/test-data/musicxml-testsuite/24g-GraceNote-Dynamics.xml @@ -0,0 +1,124 @@ + + + + + + Grace notes in combination with + dynamics. The ‘f’ sign is located on the first grace note (using a + <direction> element), followed by a diminuendo wedge, and the + ‘p’ sign is on the main beat (again using + <direction>). + + + + + MusicXML Part + + + + + + + 4 + + 0 + major + + + + G + 2 + + + + + + + + + 1 + + + + + + 1 + + + + + G + 5 + + 1 + 16th + begin + begin + begin + + + + + F + 5 + + 1 + 16th + continue + continue + continue + + + + + E + 5 + + 1 + 16th + continue + continue + continue + + + + + D + 5 + + 1 + 16th + end + end + end + + + + + + + + + +

+ + + 1 + + + + C + 5 + + 4 + 1 + quarter + + + + + diff --git a/test-data/musicxml-testsuite/24h-GraceNote-Simultaneous.png b/test-data/musicxml-testsuite/24h-GraceNote-Simultaneous.png new file mode 100644 index 000000000..62d2ae556 Binary files /dev/null and b/test-data/musicxml-testsuite/24h-GraceNote-Simultaneous.png differ diff --git a/test-data/musicxml-testsuite/24h-GraceNote-Simultaneous.xml b/test-data/musicxml-testsuite/24h-GraceNote-Simultaneous.xml new file mode 100644 index 000000000..a50e0bbef --- /dev/null +++ b/test-data/musicxml-testsuite/24h-GraceNote-Simultaneous.xml @@ -0,0 +1,188 @@ + + + + + + Simultaneous grace notes and grace + note groups of different length starting a part or a voice. + + The topmost three staves are voices one to three of part ‘P1’, with no + grace notes in the third staff and music starting on the second beat. + There is also an ‘fp’ on the main note of the first staff. + + The bottommost two staves are voices one and two of part ‘P2’, with no + grace notes in the lowest staff. + + + + + Part 1 + + + Part 2 + + + + + + + 32 + + 0 + major + + + 3 + + G + 2 + + + G + 2 + + + G + 2 + + + + + + G + 5 + + 1 + 16th + 1 + + + + + + + + + + + E + 5 + + 64 + 1 + half + 1 + + + 64 + + + + + G + 5 + + 2 + 16th + 2 + begin + begin + + + + + A + 5 + + 2 + 16th + 2 + end + end + + + + E + 5 + + 64 + 2 + half + 2 + + + 32 + + + + E + 5 + + 32 + 3 + quarter + 3 + + + + + + + + 32 + + 0 + major + + + 2 + + G + 2 + + + G + 2 + + + + + + G + 5 + + 1 + quarter + 1 + + + + E + 5 + + 64 + 1 + half + 1 + + + 64 + + + + 64 + 2 + half + 2 + + + + + diff --git a/test-data/musicxml-testsuite/31a-Directions.png b/test-data/musicxml-testsuite/31a-Directions.png new file mode 100644 index 000000000..7e0ea1f30 Binary files /dev/null and b/test-data/musicxml-testsuite/31a-Directions.png differ diff --git a/test-data/musicxml-testsuite/31a-Directions.xml b/test-data/musicxml-testsuite/31a-Directions.xml index 4e1412426..6c7582142 100644 --- a/test-data/musicxml-testsuite/31a-Directions.xml +++ b/test-data/musicxml-testsuite/31a-Directions.xml @@ -1,13 +1,15 @@ - - + MusicXML directions (attached to staff) - All <direction> elements - defined in MusicXML. The lyrics for each note describes the direction - element assigned to that note. + All <direction> elements + defined in MusicXML. The lyrics for each note describes the direction + element assigned to that note. Not marked with lyrics is a + <scordatura> element at the very + beginning. @@ -18,13 +20,33 @@ - + rehearsal+ | segno+ | (words | symbol)+ | + coda+ | wedge | dynamics+ | dashes | bracket | pedal | + metronome | octave-shift | harp-pedals | damp | + damp-all | eyeglasses | string-mute | scordatura | image | + principal-voice | percussion+ | accordion-registration | + staff-divide | other-direction --> + + + + + + + C + 3 + + + G + 5 + + + E + 5 + + + + 1 @@ -50,7 +72,8 @@ 1 1 quarter - reh.A (def=sq.) + reh. A↓ + (def=square) @@ -62,11 +85,12 @@ 1 1 quarter - reh.B (none) + reh. B↑ + (none) - Test + Test @@ -74,7 +98,8 @@ 1 1 quarter - reh.Test (sq.) + reh. Test + (rect.) @@ -86,10 +111,11 @@ 1 1 quarter - reh.Crc (crc.) + reh. Crc + (circle) - + @@ -101,7 +127,7 @@ 1 1 quarter - Segno + segno @@ -113,11 +139,11 @@ 1 1 quarter - Coda + coda - + - words + \"words" @@ -125,11 +151,12 @@ 1 1 quarter - Words + words↑ + (oval) - + cClef @@ -137,14 +164,16 @@ 1 1 quarter - Eyegl. + symbol + ("cClef") + f | ff | fff | ffff | fffff | ffffff | + mp | mf | sf | sfp | sfpp | fp | rf | + rfz | sfz | sffz | fz | other-dynamics --> +

@@ -195,7 +224,7 @@ - + @@ -205,9 +234,9 @@ 1 1 quarter - ppppp + ppppp↓ - + @@ -217,7 +246,7 @@ 1 1 quarter - pppppp + pppppp↑ @@ -269,7 +298,7 @@ quarter ffff - + @@ -279,9 +308,9 @@ 1 1 quarter - fffff + fffff↓ - + @@ -291,10 +320,11 @@ 1 1 quarter - ffffff + ffffff↑ + @@ -433,7 +463,7 @@ - abc-ffz + ffz @@ -441,12 +471,14 @@ 1 1 quarter - abc-ffz (oth.) + other dyn. + ('ffz') + @@ -457,7 +489,8 @@ 1 1 quarter - beginhairpin + beginhair + begin(cre @@ -469,9 +502,10 @@ 1 1 quarter - endcresc + endpin + endscendo) - + @@ -493,13 +527,13 @@ 1 1 quarter - endes + endes↓ - + - + @@ -509,9 +543,9 @@ quarter beginbra - + - + @@ -519,7 +553,7 @@ 1 1 quarter - endcket + endcket↓ @@ -532,6 +566,7 @@ 1 quarter beginoct. + (8 @@ -544,12 +579,13 @@ 1 quarter endshift + up) - + @@ -561,7 +597,7 @@ - + @@ -579,7 +615,7 @@ - + @@ -594,7 +630,10 @@ - quarter60 + + quarter + 60 + @@ -602,7 +641,8 @@ 1 1 quarter - Metr. + metro- + nome @@ -643,7 +683,8 @@ 1 1 quarter - Harp ped. + harp + pedal @@ -655,7 +696,7 @@ 1 1 quarter - Damp + damp @@ -667,17 +708,18 @@ 1 1 quarter - Damp all + damp + all - - C3 - G5 - E5 - + + + 2 + + @@ -685,15 +727,12 @@ 1 1 quarter - Scord. + accordion + register - - - 2 - - + @@ -701,85 +740,111 @@ 1 1 quarter - Accordion reg. + string + mute on + + + + + - - 2 + C4 + 1 1 - half + quarter + string + mute off + + + + + + + + C4 + 1 + 1 + quarter + eye- + glasses - - light-light - - - - subito - - -   - + - -

- + + + - 2 C4 1 1 quarter - subp + perc. + (timpani) - - - - + - + - 2 C4 1 1 quarter - beginppp cresc + staff- + divide - + - + - - - - 2 C4 1 1 quarter - endto fff + beginprincipal + begin(Haupt + + + + + - + C4 1 1 quarter - subp + endvoice + endstimme) + + + + + + + + + + + C4 + 4 + 1 + whole + image light-heavy - - diff --git a/test-data/musicxml-testsuite/31b-Directions-Order.png b/test-data/musicxml-testsuite/31b-Directions-Order.png new file mode 100644 index 000000000..38739681d Binary files /dev/null and b/test-data/musicxml-testsuite/31b-Directions-Order.png differ diff --git a/test-data/musicxml-testsuite/31b-Directions-Order.xml b/test-data/musicxml-testsuite/31b-Directions-Order.xml new file mode 100644 index 000000000..cc3318f87 --- /dev/null +++ b/test-data/musicxml-testsuite/31b-Directions-Order.xml @@ -0,0 +1,102 @@ + + + + + + Using <offset> it is + possible to make successive <direction> elements look like being + concatenated. However, it is a bad idea in general to do that because + it makes the rendering dependent on a program's score formatting. + + In the first bar, the first <direction> element contains a tempo + mark and is directly followed by another <direction> element + containing a metronome mark that is moved to the right by a positive + <offset> element. + + In the second bar, the first <direction> element holds the start + of a diminuendo wedge; it is directly followed by another + <direction> element containing a dynamics mark. Since the + wedge has an <offset> element with a positive value while the + dynamics has no such element at all, the dynamics precedes the + wedge. + + + + + + MusicXML Part + + + + + + + 8 + + 0 + major + + + + G + 2 + + + + + Lento + + + + + + quarter + 56 + + + 4 + + + C4 + 32 + 1 + whole + + + + + + + + + 8 + + + + + + + + + + C4 + 32 + 1 + whole + + + + + + + + light-heavy + + + + diff --git a/test-data/musicxml-testsuite/31c-MetronomeMarks.png b/test-data/musicxml-testsuite/31c-MetronomeMarks.png new file mode 100644 index 000000000..3f16071ba Binary files /dev/null and b/test-data/musicxml-testsuite/31c-MetronomeMarks.png differ diff --git a/test-data/musicxml-testsuite/31c-MetronomeMarks.xml b/test-data/musicxml-testsuite/31c-MetronomeMarks.xml index b2b42aae3..e84ea483c 100644 --- a/test-data/musicxml-testsuite/31c-MetronomeMarks.xml +++ b/test-data/musicxml-testsuite/31c-MetronomeMarks.xml @@ -1,11 +1,12 @@ - - + - Tempo Markings: note=bpm, - text (note=bpm), note=note, (note=note), (note=bpm) + Tempo Markings: ‘quarter.=100’, + ‘quarter..=half.’, ‘(quarter.=half..)’, + ‘(quarter.=77)’. @@ -52,37 +53,18 @@ 1 quarter - - - Adagio - - - - long - 100 - - - C5 1 1 quarter - - C5 - 1 - 1 - quarter - - - - quarter + half @@ -94,21 +76,9 @@ 1 quarter - - C5 - 1 - 1 - quarter - - - - - long - 32nd - - - - + + + C5 1 @@ -121,9 +91,6 @@ 1 quarter - - - @@ -131,6 +98,7 @@ half + @@ -146,6 +114,15 @@ 1 quarter + + + + + C5 + 1 + 1 + quarter + @@ -167,6 +144,12 @@ 1 quarter + + C5 + 1 + 1 + quarter + light-heavy diff --git a/test-data/musicxml-testsuite/31d-Directions-Compounds.png b/test-data/musicxml-testsuite/31d-Directions-Compounds.png new file mode 100644 index 000000000..2a99ddf58 Binary files /dev/null and b/test-data/musicxml-testsuite/31d-Directions-Compounds.png differ diff --git a/test-data/musicxml-testsuite/31d-Directions-Compounds.xml b/test-data/musicxml-testsuite/31d-Directions-Compounds.xml new file mode 100644 index 000000000..64b4fb012 --- /dev/null +++ b/test-data/musicxml-testsuite/31d-Directions-Compounds.xml @@ -0,0 +1,266 @@ + + + + MusicXML compound directions + + + This tests various combinations of + <direction> children. The lyrics for each note describe the + compound elements assigned to that note. + + The first ‘molto f’ uses <words>molto <words>, i.e., it + omits the ‘xml:space’ attribute. This makes the rendering of the + space between ‘molto’ and ‘f’ implementation-dependent (and might be + thus omitted). The second ‘molto f’, together with ‘meno f’, uses + ‘xml:space="preserve"’. + + For demonstration purposes, there is no space between words ‘bold’ and + ‘italic’. + + + + + MusicXML Part + + + + + + + 1 + + 0 + major + + + + G + 2 + + + + + Adagio + + + + long + 100 + + + + + C4 + 2 + 1 + half + Adagio + long=100 + + + + molto + + + + + + + + + C4 + 2 + 1 + half + molto↓ + f + + + + + + + +

+ + + + subito + + + + C4 + 2 + 1 + half + p↓ + subito + + + + molto + + + + + + + + + C4 + 2 + 1 + half + molto f↑ + (rectangle) + + + + + + + + + + + + + + C4 + 2 + 1 + half + beginppp↓ + begincresc. + + + + + + + + + + + C4 + 2 + 1 + half + endto + endfff↓ + + + + + + + + cresc. + + + + + + + C4 + 2 + 1 + half + begincresc.↑ + begindashes + + + + + + + meno + + + + + + + + + C4 + 2 + 1 + half + endto + endmeno f↑ + + + + + + + 12 + bis + + + + C4 + 2 + 1 + half + reh. 12+bis + (square) + + + + bold + italic + + + + C4 + 2 + 1 + half + bold+ + italic + + + + + + + + + + + C4 + 2 + 1 + half + segno + + + + + + + + + C4 + 2 + 1 + half + coda + ×2 + + + light-heavy + + + + diff --git a/test-data/musicxml-testsuite/32a-Notations.png b/test-data/musicxml-testsuite/32a-Notations.png new file mode 100644 index 000000000..f3348d452 Binary files /dev/null and b/test-data/musicxml-testsuite/32a-Notations.png differ diff --git a/test-data/musicxml-testsuite/32a-Notations.xml b/test-data/musicxml-testsuite/32a-Notations.xml index ab92216ff..80b743bde 100644 --- a/test-data/musicxml-testsuite/32a-Notations.xml +++ b/test-data/musicxml-testsuite/32a-Notations.xml @@ -1,13 +1,16 @@ - - + MusicXML notations (attached to note) - All <notation> elements - defined in MusicXML. The lyrics show the notation assigned to each - note. + All <notation> elements + defined in MusicXML. The lyrics show the notation assigned to each + note. + + The third-last bar is a full-measure rest with a + fermata. @@ -41,7 +44,7 @@ - ferm. + fermata @@ -53,7 +56,8 @@ normal - normal ferm. + normal + fermata @@ -65,7 +69,8 @@ angled - angled ferm. + angled + fermata @@ -77,9 +82,11 @@ square - square ferm. + square + fermata + @@ -91,7 +98,8 @@ - inv.ferm. + inverted + fermata @@ -101,7 +109,7 @@ 1 quarter - arp. + arpeggio @@ -131,7 +139,8 @@ 1 quarter - non-arp. + non- + arpeggio @@ -162,14 +171,15 @@ double-sharp - acc.mark + accidental + mark light-light - @@ -235,7 +247,8 @@ - det.-leg. + detached + legato @@ -247,7 +260,8 @@ - stacc.ss + stacca- + tissimo @@ -259,7 +273,7 @@ - spicc. + spiccato @@ -274,6 +288,7 @@ scoop + @@ -322,8 +337,10 @@ breath + mark + @@ -335,7 +352,7 @@ - caes. + caesura @@ -359,7 +376,8 @@ - unstr. + un- + stress @@ -374,11 +392,11 @@ @@ -390,9 +408,12 @@ 1 quarter - + + + - tr. + trill + mark @@ -416,7 +437,8 @@ - del.turn + delayed + turn @@ -428,9 +450,11 @@ - inv.turn + inverted + turn + @@ -456,7 +480,7 @@ - beginwavy + beginwa @@ -467,11 +491,10 @@ quarter - - + - middlewavy + middlevy @@ -488,6 +511,7 @@ endline + @@ -499,7 +523,7 @@ - mord. + mordent @@ -511,7 +535,8 @@ - inv.mord. + inverted + mordent @@ -523,7 +548,7 @@ - schl. + schleifer @@ -535,9 +560,10 @@ 3 - trem. + tremolo + @@ -549,10 +575,11 @@ - natural + natural - turn+acc. + turn + acc. + mark ↑ @@ -566,16 +593,46 @@ sharp - three-quarters-flat + three-quarters-flat - turn+acc.(ab.+bel./rel to turn) + turn + acc. + marks ↑↓ - - 2 + + C + 5 + + 1 1 - half + quarter + + + + sharp + double-sharp + + + turn + acc. + marks ↑[↑] + + + + C5 + + 1 + 1 + quarter + + + + sharp + + + trill + acc. + mark ↑ light-light @@ -599,7 +656,8 @@ - up-b. + up- + bow @@ -611,119 +669,252 @@ - down-b. + down- + bow - C5 + G5 1 1 quarter - + + + - harm. + harmonic - C5 + G5 1 1 quarter - + + + - nat.harm. + natural + harmonic + - C5 + A5 1 1 quarter - + + + - art.harm. + artificial + harmonic - C5 + G3 1 1 quarter - + + + - nat.h./base + natural + harmonic + (base+touch) + - C5 + C4 1 1 quarter - + + + - nat.h./touching + + + + C4 + + 1 + 1 + quarter + + + + + + natural + harmonic + (touch) - C5 + C4 1 1 quarter - + + + + + natural + harmonic + (touch+sound) + + + + + G5 + + 1 + 1 + quarter + + + + - nat.h./sounding + - C5 + G3 1 1 quarter - + + + - open-str. + nat. harm. + (base+touch + +sound) + - C5 + C4 1 1 quarter - + + + - thumb-pos. + - C5 + G5 + + 1 + 1 + quarter + + + + + + + + + A3 + + 1 + 1 + quarter + + + + + + artificial + harmonic + (base+touch) + + + + + D4 + + 1 + 1 + quarter + + + + + + + + + A3 + + 1 + 1 + quarter + + + + + + art. harm. + (base+touch + +sound) + + + + + D4 + + 1 + 1 + quarter + + + + + + + + + + A5 1 1 quarter - + + + - empty fing. @@ -733,11 +924,13 @@ 1 quarter - 1 + - fing.1 + open + string + @@ -747,9 +940,10 @@ 1 quarter - 2 + - fing.2 + thumb- + position @@ -759,9 +953,10 @@ 1 quarter - 3 + 1 - fing.3 + fingering + 1 @@ -771,35 +966,46 @@ 1 quarter - 4 + 2 - fing.4 + fingering + 2,3,4,5 + - C5 + D5 1 1 quarter - 5 + 3 - fing.5 - - + - C5 + E5 1 1 quarter - something + 4 + + + + + + F5 + + 1 + 1 + quarter + + 5 - fing.sth. @@ -809,10 +1015,22 @@ 1 quarter - 532 + + 0 + 1 + 2 + 3 + 4 + 5 + - mult.fing. + fingering + 0,1,2↑ + 3,4,5↓ + + + C5 @@ -821,9 +1039,13 @@ 1 quarter - + + 2 + 3 + - empty pluck + fingering + 2, subst. 3 @@ -833,12 +1055,14 @@ 1 quarter - a + + 2 + 3 + - pluck a + fingering + 2, alt. 3 - - C5 @@ -847,9 +1071,10 @@ 1 quarter - + a - dbl.tng. + pluck + a @@ -859,10 +1084,18 @@ 1 quarter - + + a + m + i + - trpl.tng. + pluck + a,m,i↓ + + + C5 @@ -871,9 +1104,10 @@ 1 quarter - + - stopped + double + tongue @@ -883,12 +1117,11 @@ 1 quarter - + - snp.pizz. + triple + tongue - - C5 @@ -897,9 +1130,9 @@ 1 quarter - + - empty fret + stopped @@ -909,10 +1142,14 @@ 1 quarter - 0 + - fret0 + snap- + pizz. + + + C5 @@ -921,9 +1158,10 @@ 1 quarter - + 0 - empty str. + fret + 0 @@ -937,10 +1175,9 @@ 5 - str. 5 + string + 5 - - C5 @@ -969,6 +1206,9 @@ endon + + + C5 @@ -997,8 +1237,6 @@ endoff - - C5 @@ -1011,7 +1249,7 @@ 4 - bend + bend 4 @@ -1025,8 +1263,12 @@ 3 - b.3 with-bar + bend 3 + with bar + + + C5 @@ -1039,7 +1281,8 @@ -0.5 - pre-b. -0.5 + bend -0.5 + pre-bend @@ -1053,10 +1296,9 @@ 3.5 - b. release 3.5 + bend 3.5 + release - - C5 @@ -1079,8 +1321,12 @@ T - tap T + tap + T + + + C5 @@ -1105,8 +1351,6 @@ toe - - C5 @@ -1117,7 +1361,8 @@ - fingern. + finger- + nails @@ -1125,31 +1370,26 @@ 1 quarter - - - 2 - 1 - half - light-light - - - + + + - - C5 - - 1 + + 4 1 - quarter + whole - + - f + + + C5 @@ -1158,9 +1398,9 @@ 1 quarter - + - ppp + f @@ -1178,16 +1418,17 @@ C5 - 1 + 2 1 - quarter + half sfffz - Oth.dyn. + other + dynamics - + @@ -1204,7 +1445,8 @@ - both above + strong ↑ + stacc. ↑ @@ -1221,7 +1463,9 @@ - ab./bel./bel. + acc. ↓ + ten. ↓ + stacc. ↑ diff --git a/test-data/musicxml-testsuite/32b-Articulations-Texts.png b/test-data/musicxml-testsuite/32b-Articulations-Texts.png new file mode 100644 index 000000000..bc67f2ed2 Binary files /dev/null and b/test-data/musicxml-testsuite/32b-Articulations-Texts.png differ diff --git a/test-data/musicxml-testsuite/32b-Articulations-Texts.xml b/test-data/musicxml-testsuite/32b-Articulations-Texts.xml index 15dc26c8c..216c79787 100644 --- a/test-data/musicxml-testsuite/32b-Articulations-Texts.xml +++ b/test-data/musicxml-testsuite/32b-Articulations-Texts.xml @@ -1,96 +1,108 @@ - - - - - - Text markup: - different font sizes, weights and colors. - - - - - - - - - 96 - 0 - - 1 - G2 - - - - - Normal, Medium - - - - - F4 - 384 - 1 - eighth - - - - - Bold, Medium - - - - - - - - - Normal, Large - - - - - G4 - 384 - 1 - whole - - - - - Bold, Large - - - - - - - - - Normal, Small - - - - - F4 - 384 - 1 - whole - - - - - Bold, Small - - - - - - - Normal, Small, Colored, Below - - - - - + + + + + + Text markup with different CSS + font sizes, weights, horizontal positions (using ‘default-x’), and + vertical positions (using ‘default-y’). Strings below the staff are + positioned right before the <measure>; the last one is also + drawn in red. + + + + + + + + + + + 96 + + 0 + + + 1 + + G + 2 + + + + + (0,15) normal, medium ↑ + + + + + F + 4 + + 384 + 1 + whole + + + + (-50,-100) bold, medium ↓ + + + + + + + (50,35) normal, large ↑ + + + + + G + 4 + + 384 + 1 + whole + + + + (0,-120) bold, large ↓ + + + + + + + (0,55) normal, small ↑ + + + + + 384 + 1 + whole + + + + (50,-140) bold, small ↓ + + + + + (100,-160) normal, small, red ↓ + + + + diff --git a/test-data/musicxml-testsuite/32c-MultipleNotationChildren.png b/test-data/musicxml-testsuite/32c-MultipleNotationChildren.png new file mode 100644 index 000000000..5e1ae6103 Binary files /dev/null and b/test-data/musicxml-testsuite/32c-MultipleNotationChildren.png differ diff --git a/test-data/musicxml-testsuite/32c-MultipleNotationChildren.xml b/test-data/musicxml-testsuite/32c-MultipleNotationChildren.xml index 90a172772..6fe7af0ec 100644 --- a/test-data/musicxml-testsuite/32c-MultipleNotationChildren.xml +++ b/test-data/musicxml-testsuite/32c-MultipleNotationChildren.xml @@ -1,12 +1,12 @@ - - + It should not make any difference whether two articulations are given - inside two different notation elements, inside two different articulations + inside two different notation elements, inside two different articulations children of the same notation element or inside the same articulations element. Thus, all three notes should have a staccato and an accent. @@ -42,7 +42,6 @@ 4 1 quarter - sharp @@ -62,7 +61,6 @@ 4 1 quarter - sharp @@ -80,7 +78,6 @@ 4 1 quarter - sharp diff --git a/test-data/musicxml-testsuite/32d-Arpeggio.png b/test-data/musicxml-testsuite/32d-Arpeggio.png new file mode 100644 index 000000000..b7c52439a Binary files /dev/null and b/test-data/musicxml-testsuite/32d-Arpeggio.png differ diff --git a/test-data/musicxml-testsuite/32d-Arpeggio.xml b/test-data/musicxml-testsuite/32d-Arpeggio.xml index 17cea0b7d..b27bc54aa 100644 --- a/test-data/musicxml-testsuite/32d-Arpeggio.xml +++ b/test-data/musicxml-testsuite/32d-Arpeggio.xml @@ -1,11 +1,11 @@ - - + - Different Arpeggio directions - (normal, up, down, non-arpeggiate) + Different arpeggio kinds and + directions. @@ -148,6 +148,9 @@ quarter + + + C4 @@ -186,7 +189,8 @@ 1 quarter - non-arp. + arpeggio + bracket @@ -237,6 +241,70 @@ quarter + + + C4 + + 1 + 1 + quarter + partial + arpeggio + + + + + E5 + + 1 + 1 + quarter + + + + + + G5 + + 1 + 1 + quarter + + + + + + + + C4 + + 1 + 1 + quarter + partial + arpeggio + bracket + + + + + E5 + + 1 + 1 + quarter + + + + + + G5 + + 1 + 1 + quarter + + light-heavy diff --git a/test-data/musicxml-testsuite/33a-Spanners.png b/test-data/musicxml-testsuite/33a-Spanners.png new file mode 100644 index 000000000..e8fade5d7 Binary files /dev/null and b/test-data/musicxml-testsuite/33a-Spanners.png differ diff --git a/test-data/musicxml-testsuite/33a-Spanners.xml b/test-data/musicxml-testsuite/33a-Spanners.xml index dfcd0b2a3..949223470 100644 --- a/test-data/musicxml-testsuite/33a-Spanners.xml +++ b/test-data/musicxml-testsuite/33a-Spanners.xml @@ -1,16 +1,17 @@ - - + Several spanners defined in - MusicXML: tuplet, slur (solid, dashed), tie, wedge (cresc, dim), - tr + wavy-line, single-note trill spanner, octave-shift (8va,15mb), - bracket (solid down/down, dashed down/down, solid none/down, - dashed none/up, solid none/none), dashes, glissando (wavy), - bend-alter, slide (solid), grouping, two-note tremolo, hammer-on, - pull-off, pedal (down, change, up). + MusicXML: tuplet, slur (solid, dashed), wedge (cresc, dim), trill + with accidental mark and wavy-line (with another accidental mark on + the second beat), single-note trill spanner, octave-shift (8va,15mb), + bracket (solid down/down, dashed down/down, solid none/down, dashed + none/up, solid none/none), dashes, glissando (wavy), slide (solid), + grouping, two-note tremolo, hammer-on, pull-off, pedal line (down, + change, up), pedal text (down, up). @@ -99,7 +100,7 @@ 1 quarter - + @@ -202,7 +203,7 @@ - + @@ -253,6 +254,7 @@ + sharp @@ -265,6 +267,12 @@ 3 1 quarter + + + + natural + + @@ -293,6 +301,7 @@ quarter + @@ -427,7 +436,7 @@ - + @@ -450,7 +459,7 @@ 1 quarter - + @@ -507,7 +516,7 @@ - + @@ -530,7 +539,7 @@ 1 quarter - + @@ -587,7 +596,7 @@ - + @@ -610,7 +619,7 @@ 1 quarter - + @@ -660,47 +669,6 @@ - - - B - 4 - - 3 - 1 - quarter - - - - 6 - - - - - - - C - 5 - - 3 - 1 - quarter - - - - 0 - - - - - - - 3 - 1 - quarter - - - - B @@ -733,7 +701,7 @@ - + @@ -765,7 +733,7 @@ - + B @@ -773,9 +741,16 @@ 3 1 - quarter + half + + 2 + 1 + + begin - 2 + + 2 + @@ -785,9 +760,16 @@ 3 1 - quarter + half + + 2 + 1 + + end - 2 + + 2 + @@ -798,7 +780,7 @@ - + B4 @@ -833,7 +815,7 @@ - + B4 @@ -868,10 +850,10 @@ - + - + @@ -882,7 +864,7 @@ - + @@ -892,6 +874,37 @@ quarter + + + + + + B4 + 3 + 1 + quarter + + + + + + + + + + + B4 + 3 + 1 + quarter + + + B4 + 3 + 1 + quarter + + diff --git a/test-data/musicxml-testsuite/33b-Spanners-Tie.png b/test-data/musicxml-testsuite/33b-Spanners-Tie.png new file mode 100644 index 000000000..f41480834 Binary files /dev/null and b/test-data/musicxml-testsuite/33b-Spanners-Tie.png differ diff --git a/test-data/musicxml-testsuite/33b-Spanners-Tie.xml b/test-data/musicxml-testsuite/33b-Spanners-Tie.xml index 52e1ce9e2..f46bed1e5 100644 --- a/test-data/musicxml-testsuite/33b-Spanners-Tie.xml +++ b/test-data/musicxml-testsuite/33b-Spanners-Tie.xml @@ -1,42 +1,42 @@ - - - - - - Two simple tied whole notes - - - - - - - - - 1 - 0 - - 1 - G2 - - - F4 - 4 - - 1 - whole - - - - - - F4 - 4 - - 1 - whole - - - - + + + + + + Two simple tied whole notes + + + + + + + + + 1 + 0 + + 1 + G2 + + + F4 + 4 + + 1 + whole + + + + + + F4 + 4 + + 1 + whole + + + + diff --git a/test-data/musicxml-testsuite/33c-Spanners-Slurs.png b/test-data/musicxml-testsuite/33c-Spanners-Slurs.png new file mode 100644 index 000000000..18af07007 Binary files /dev/null and b/test-data/musicxml-testsuite/33c-Spanners-Slurs.png differ diff --git a/test-data/musicxml-testsuite/33c-Spanners-Slurs.xml b/test-data/musicxml-testsuite/33c-Spanners-Slurs.xml index b3d9c7f0a..186a340c6 100644 --- a/test-data/musicxml-testsuite/33c-Spanners-Slurs.xml +++ b/test-data/musicxml-testsuite/33c-Spanners-Slurs.xml @@ -1,13 +1,13 @@ - - + - A note can be the end of one - slur and the start of a new slur. Also, in MusicXML, nested slurs + A note can be the end of one + slur and the start of a new slur. Also, in MusicXML, nested slurs are possible like in the second measure where one slur goes over all - four notes, and another slur goes from the second to the third + four notes, and another slur goes from the second to the third note. diff --git a/test-data/musicxml-testsuite/33da-Spanners-OctaveShifts-before.png b/test-data/musicxml-testsuite/33da-Spanners-OctaveShifts-before.png new file mode 100644 index 000000000..f3d2fda68 Binary files /dev/null and b/test-data/musicxml-testsuite/33da-Spanners-OctaveShifts-before.png differ diff --git a/test-data/musicxml-testsuite/33da-Spanners-OctaveShifts-before.xml b/test-data/musicxml-testsuite/33da-Spanners-OctaveShifts-before.xml new file mode 100644 index 000000000..59efff5cc --- /dev/null +++ b/test-data/musicxml-testsuite/33da-Spanners-OctaveShifts-before.xml @@ -0,0 +1,203 @@ + + + + + + Finale + + + All types of octave shifts (15ma + on the third eighth note, 15mb on the fourth and fifth, 8va on the + sixth and seventh, and 8vb on the last two 16th notes). This test + file positions <octave-shift type="stop"/>> before the + associated note, as expected in MusicXML import of Finale, for + example. Consequently, it contains ‘Finale’ as the <software> + tag. + + Note that the end of the last octave shift is anchored at the + following bar line. + + + + + MusicXML Part + + + + + + + 8 + + 0 + major + + + + G + 2 + + + + + A + 4 + + 4 + 1 + eighth + begin + + + + C + 5 + + 4 + 1 + eighth + continue + + + + + + -1 + + + + + + 1 + + + + A + 6 + + 4 + 1 + eighth + continue + + + + + + -1 + + + + C + 3 + + 4 + 1 + eighth + end + + + + + + 1 + + + + B + 2 + + 4 + 1 + eighth + begin + + + + + + -1 + + + + A + 5 + + 4 + 1 + eighth + end + + + + + + 1 + + + + A + 5 + + 4 + 1 + eighth + begin + + + + + + -1 + + + + B + 3 + + 2 + 1 + 16th + continue + begin + + + + C + 4 + + 2 + 1 + 16th + end + end + + + + + + -1 + + + + + + + C + 5 + + 32 + 1 + whole + + + light-heavy + + + + + diff --git a/test-data/musicxml-testsuite/33db-Spanners-OctaveShifts-after.png b/test-data/musicxml-testsuite/33db-Spanners-OctaveShifts-after.png new file mode 100644 index 000000000..c0aea485f Binary files /dev/null and b/test-data/musicxml-testsuite/33db-Spanners-OctaveShifts-after.png differ diff --git a/test-data/musicxml-testsuite/33d-Spanners-OctaveShifts.xml b/test-data/musicxml-testsuite/33db-Spanners-OctaveShifts-after.xml similarity index 78% rename from test-data/musicxml-testsuite/33d-Spanners-OctaveShifts.xml rename to test-data/musicxml-testsuite/33db-Spanners-OctaveShifts-after.xml index f872d463b..b94802ce8 100644 --- a/test-data/musicxml-testsuite/33d-Spanners-OctaveShifts.xml +++ b/test-data/musicxml-testsuite/33db-Spanners-OctaveShifts-after.xml @@ -1,11 +1,21 @@ - - + + + MuseScore + - All types of octave shifts (15ma, - 15mb, 8va, 8vb) + All types of octave shifts (15ma + on the third eighth note, 15mb on the fourth and fifth, 8va on the + sixth and seventh, and 8vb on the last two 16th notes). This test + file positions <octave-shift type="stop"/>> after the associated + note, as expected in MusicXML import of MuseScore, for example. + Consequently, it contains ‘MuseScore’ as the <software> tag. + + Note that the end of the last octave shift is anchored at the + following bar line. @@ -55,7 +65,7 @@ - -4 + -1 @@ -71,12 +81,13 @@ - -4 + 1 + -1 @@ -102,12 +113,13 @@ - -4 + 1 + -1 @@ -133,12 +145,13 @@ - -3 + 1 + -1 @@ -166,8 +179,20 @@ - -2 + -1 + + + + + + C + 5 + + 32 + 1 + whole + light-heavy diff --git a/test-data/musicxml-testsuite/33e-Spanners-OctaveShifts-InvalidSize.png b/test-data/musicxml-testsuite/33e-Spanners-OctaveShifts-InvalidSize.png new file mode 100644 index 000000000..9f865b6a0 Binary files /dev/null and b/test-data/musicxml-testsuite/33e-Spanners-OctaveShifts-InvalidSize.png differ diff --git a/test-data/musicxml-testsuite/33e-Spanners-OctaveShifts-InvalidSize.xml b/test-data/musicxml-testsuite/33e-Spanners-OctaveShifts-InvalidSize.xml index a97088bb9..53d477ea5 100644 --- a/test-data/musicxml-testsuite/33e-Spanners-OctaveShifts-InvalidSize.xml +++ b/test-data/musicxml-testsuite/33e-Spanners-OctaveShifts-InvalidSize.xml @@ -1,7 +1,7 @@ - - + Invalid octave-shifts: 27 down, diff --git a/test-data/musicxml-testsuite/33f-Trill-EndingOnGraceNote.png b/test-data/musicxml-testsuite/33f-Trill-EndingOnGraceNote.png new file mode 100644 index 000000000..2b566c36d Binary files /dev/null and b/test-data/musicxml-testsuite/33f-Trill-EndingOnGraceNote.png differ diff --git a/test-data/musicxml-testsuite/33f-Trill-EndingOnGraceNote.xml b/test-data/musicxml-testsuite/33f-Trill-EndingOnGraceNote.xml index 368085011..f86d9ca37 100644 --- a/test-data/musicxml-testsuite/33f-Trill-EndingOnGraceNote.xml +++ b/test-data/musicxml-testsuite/33f-Trill-EndingOnGraceNote.xml @@ -1,11 +1,11 @@ - - + - A trill spanner that spans a - grace note and ends on an after-grace note at the end of the + A trill spanner that spans a + grace note and ends on an after-grace note at the end of the measure. diff --git a/test-data/musicxml-testsuite/33g-Slur-ChordedNotes.png b/test-data/musicxml-testsuite/33g-Slur-ChordedNotes.png new file mode 100644 index 000000000..efddfee42 Binary files /dev/null and b/test-data/musicxml-testsuite/33g-Slur-ChordedNotes.png differ diff --git a/test-data/musicxml-testsuite/33g-Slur-ChordedNotes.xml b/test-data/musicxml-testsuite/33g-Slur-ChordedNotes.xml index 4fa677342..872e9f736 100644 --- a/test-data/musicxml-testsuite/33g-Slur-ChordedNotes.xml +++ b/test-data/musicxml-testsuite/33g-Slur-ChordedNotes.xml @@ -1,13 +1,15 @@ - - + - Slurs on chorded notes: Only the - first note of the chord should get the slur notation. Some - applications print out the slur for all notes -- these should be - ignored. + Slurs on chorded notes. The upper + slur connects the first and third chord; for both the start and end, + the <slur> element is attached not to the first note of the + chord but to the second one (tagged with <chord>). The lower + slur connects the chord on the second beat and the note on fourth beat + and is attached in the normal way. @@ -41,9 +43,6 @@ 1 1 quarter - - - @@ -54,6 +53,9 @@ 1 1 quarter + + + @@ -83,6 +85,9 @@ 1 1 quarter + + + @@ -92,10 +97,6 @@ 1 1 quarter - - - - @@ -107,7 +108,7 @@ 1 quarter - + @@ -119,7 +120,7 @@ 1 quarter - + diff --git a/test-data/musicxml-testsuite/33h-Spanners-Glissando.png b/test-data/musicxml-testsuite/33h-Spanners-Glissando.png new file mode 100644 index 000000000..ed5cf0449 Binary files /dev/null and b/test-data/musicxml-testsuite/33h-Spanners-Glissando.png differ diff --git a/test-data/musicxml-testsuite/33h-Spanners-Glissando.xml b/test-data/musicxml-testsuite/33h-Spanners-Glissando.xml index ab3c99dca..5325a2141 100644 --- a/test-data/musicxml-testsuite/33h-Spanners-Glissando.xml +++ b/test-data/musicxml-testsuite/33h-Spanners-Glissando.xml @@ -1,10 +1,10 @@ - - + - All different types of + All different types of glissando defined in MusicXML diff --git a/test-data/musicxml-testsuite/33i-Ties-NotEnded.png b/test-data/musicxml-testsuite/33i-Ties-NotEnded.png new file mode 100644 index 000000000..dd3d243e4 Binary files /dev/null and b/test-data/musicxml-testsuite/33i-Ties-NotEnded.png differ diff --git a/test-data/musicxml-testsuite/33i-Ties-NotEnded.xml b/test-data/musicxml-testsuite/33i-Ties-NotEnded.xml index 7ce312c03..6dad2b85f 100644 --- a/test-data/musicxml-testsuite/33i-Ties-NotEnded.xml +++ b/test-data/musicxml-testsuite/33i-Ties-NotEnded.xml @@ -1,7 +1,7 @@ - - + Several ties that have their end tag missing. diff --git a/test-data/musicxml-testsuite/33j-Beams-Tremolos.png b/test-data/musicxml-testsuite/33j-Beams-Tremolos.png new file mode 100644 index 000000000..fe3f8ecf4 Binary files /dev/null and b/test-data/musicxml-testsuite/33j-Beams-Tremolos.png differ diff --git a/test-data/musicxml-testsuite/33j-Beams-Tremolos.xml b/test-data/musicxml-testsuite/33j-Beams-Tremolos.xml new file mode 100644 index 000000000..a059967a1 --- /dev/null +++ b/test-data/musicxml-testsuite/33j-Beams-Tremolos.xml @@ -0,0 +1,373 @@ + + + + + + Tests for double-note tremolo + beams. The first bar shows a half-note tremolo (one beam, two + strokes) followed by a dotted quarter-note tremolo with chords + (three strokes). The second bar shows a half-note triplet with + three tremolos (no beams, three strokes) followed by three beamed + eighths-note chords with a tremolo (two strokes) between the second + and third chord. + + + + + MusicXML Part + + + + + + + 12 + + 0 + major + + + + G + 2 + + + + + A + 4 + + 12 + 1 + half + + 2 + 1 + + begin + + + 2 + + + + + + C + 5 + + 12 + 1 + half + + 2 + 1 + + end + + + 2 + + + + + + F + 4 + + 9 + 1 + quarter + + + 2 + 1 + + begin + begin + begin + + + 0 + + + + + + + A + 4 + + 9 + 1 + quarter + + + 2 + 1 + + + + + C + 5 + + 9 + 1 + quarter + + + 2 + 1 + + end + end + end + + + 0 + + + + + + + E + 5 + + 9 + 1 + quarter + + + 2 + 1 + + + + + + + + A + 4 + + 4 + 1 + quarter + + 3 + 1 + + + + + 3 + + + + + + C + 5 + + 4 + 1 + quarter + + 3 + 1 + + + + 3 + + + + + + G + 4 + + 4 + 1 + quarter + + 3 + 1 + + + + 3 + + + + + + D + 5 + + 4 + 1 + quarter + + 3 + 1 + + + + 3 + + + + + + F + 4 + + 4 + 1 + quarter + + 3 + 1 + + + + 3 + + + + + + E + 5 + + 4 + 1 + quarter + + 3 + 1 + + + + + 3 + + + + + + F + 4 + + 6 + 1 + eighth + begin + + + + + A + 4 + + 6 + 1 + eighth + + + + E + 4 + + 3 + 1 + eighth + + 2 + 1 + + continue + + + 2 + + + + + + + G + 4 + + 3 + 1 + eighth + + 2 + 1 + + + + + D + 5 + + 3 + 1 + eighth + + 2 + 1 + + continue + + + 2 + + + + + + + F + 5 + + 3 + 1 + eighth + + 2 + 1 + + + + + E + 5 + + 6 + 1 + eighth + end + + + + + G + 5 + + 6 + 1 + eighth + + + + + diff --git a/test-data/musicxml-testsuite/34a-Print-Object-Spanners.png b/test-data/musicxml-testsuite/34a-Print-Object-Spanners.png new file mode 100644 index 000000000..e465bc28a Binary files /dev/null and b/test-data/musicxml-testsuite/34a-Print-Object-Spanners.png differ diff --git a/test-data/musicxml-testsuite/34a-Print-Object-Spanners.xml b/test-data/musicxml-testsuite/34a-Print-Object-Spanners.xml new file mode 100644 index 000000000..c56d62196 --- /dev/null +++ b/test-data/musicxml-testsuite/34a-Print-Object-Spanners.xml @@ -0,0 +1,618 @@ + + + + + + Test various spanner elements + (mostly from <notations>) starting from a <note> object + with ‘print-object’ set to ‘no’, then test spanners ending with such + a note object: beam, tuplet, slur, trill + wavy-line, glissando + (wavy), slide (solid), two-note tremolo, hammer-on, pull-off. + Spanners starting from an invisible object should be + suppressed. + + + + + MusicXML Part + + + + + + + 6 + + 0 + major + + + + G + 2 + + + + + B + 4 + + 3 + 1 + eighth + begin + + + + B + 4 + + 3 + 1 + eighth + continue + + + + B + 4 + + 3 + 1 + eighth + continue + + + + B + 4 + + 3 + 1 + eighth + end + + + + B + 4 + + 3 + 1 + eighth + begin + + + + B + 4 + + 3 + 1 + eighth + continue + + + + B + 4 + + 3 + 1 + eighth + continue + + + + B + 4 + + 3 + 1 + eighth + end + + + + + + + B + 4 + + 4 + 1 + quarter + + 3 + 2 + + + + + + + + B + 4 + + 4 + 1 + quarter + + 3 + 2 + + + + + B + 4 + + 4 + 1 + quarter + + 3 + 2 + + + + + + + + B + 4 + + 4 + 1 + quarter + + 3 + 2 + + + + + + + + B + 4 + + 4 + 1 + quarter + + 3 + 2 + + + + + B + 4 + + 4 + 1 + quarter + + 3 + 2 + + + + + + + + + + + A + 4 + + 6 + 1 + quarter + + + + + + + C + 5 + + 6 + 1 + quarter + + + + + + + A + 4 + + 6 + 1 + quarter + + + + + + + C + 5 + + 6 + 1 + quarter + + + + + + + + + + B + 4 + + 6 + 1 + quarter + + + + + + + + + + B + 4 + + 6 + 1 + quarter + + + + + + + + + B + 4 + + 6 + 1 + quarter + + + + + + + + + + B + 4 + + 6 + 1 + quarter + + + + + + + + + + + + E + 5 + + 6 + 1 + quarter + + + + + + + C + 4 + + 6 + 1 + quarter + + + + + + + E + 5 + + 6 + 1 + quarter + + + + + + + C + 4 + + 6 + 1 + quarter + + + + + + + + + + E + 5 + + 6 + 1 + quarter + + + + + + + C + 4 + + 6 + 1 + quarter + + + + + + + E + 5 + + 6 + 1 + quarter + + + + + + + C + 4 + + 6 + 1 + quarter + + + + + + + + + + A + 4 + + 6 + 1 + half + + 2 + 1 + + begin + + + 2 + + + + + + C + 5 + + 6 + 1 + half + + 2 + 1 + + end + + + 2 + + + + + + A + 4 + + 6 + 1 + half + + 2 + 1 + + begin + + + 2 + + + + + + C + 5 + + 6 + 1 + half + + 2 + 1 + + end + + + 2 + + + + + + + + + B4 + + 6 + 1 + quarter + + + + + + + + + B4 + + 6 + 1 + quarter + + + + + + + + + B4 + + 6 + 1 + quarter + + + + + + + + + B4 + + 6 + 1 + quarter + + + + + + + + + + + + B4 + + 6 + 1 + quarter + + + + + + + + + B4 + + 6 + 1 + quarter + + + + + + + + + B4 + + 6 + 1 + quarter + + + + + + + + + B4 + + 6 + 1 + quarter + + + + + + + + + + diff --git a/test-data/musicxml-testsuite/34b-Colors.png b/test-data/musicxml-testsuite/34b-Colors.png new file mode 100644 index 000000000..5478defd1 Binary files /dev/null and b/test-data/musicxml-testsuite/34b-Colors.png differ diff --git a/test-data/musicxml-testsuite/34b-Colors.xml b/test-data/musicxml-testsuite/34b-Colors.xml new file mode 100644 index 000000000..51aa3c777 --- /dev/null +++ b/test-data/musicxml-testsuite/34b-Colors.xml @@ -0,0 +1,1087 @@ + + + + + + Colors. The elements in the first + bar have the ‘color’ attribute set to red for <note>, + <notehead>, <stem>, <dot>, and <accidental>, + respectively. + + The elements in the second bar have the ‘color’ attribute set to red + for <down-bow>, <tremolo>, <accent>, and + <note> again (for the rest), respectively, followed by a red + unpitched note. + + The third and fourth bar consists of a red two-bar rest. + + The fifth bar has a red rehearsal mark on its starting bar line. The + first note has three fingerings, with the middle one in red; also + attached is a red ‘ff’ sign. The second note has three plucks, with + the first one in red. A red ‘Adagio’ tempo indication is on top of + the third beat, which consists of a quadruplet with a red number. The + fourth beat holds a red arpeggio, and the fifth beat demonstrates + lyrics in red. + + The sixth bar holds a red beamlet, a red beam, a red slur, a red pedal + marker that gets continued with a blue one, and a red octave shift. + + Measure seven contains a red trill with a black wavy line, a black + trill with a red wavy line, a red bracket, a red glissando, and a red + wedge. + + Bar eight starts with a red and black tie connecting two chords, + followed by ‘cresc.’ and dashes in red, followed by ‘dim.’ in black + with red dashes. + + The ninth measure demonstrates a red 6/8 time signature, followed by a + red two-stem tremolo, a red breath mark. + + Bar ten begins with a red, non-traditional key change, followed by a + red, traditional one. + + The eleventh bar starts with a red bass clef (actually, still in bar + seven), followed by a blue percussion clef on a red two-line staff + (where the middle line is omitted). + + Measures 12 to 14 holds a repeat structure with two endings, with red + bar lines at the beginning of measures 12 and 14, a blue bar line at + the beginning of measure 13, and a red prima-volta bracket and + number. + + + + + + + + + 8 + + 0 + + + 1 + + G + 2 + + + + + G + 1 + 4 + + 12 + 1 + quarter + + + + + + + 3 + + + + + + + + + G + -1 + 4 + + 12 + 1 + quarter + + normal + + + + + + 3 + + + + + + + + + F + 1 + 4 + + 12 + 1 + quarter + + up + + + + + + 3 + + + + + + + + + F + -1 + 4 + + 12 + 1 + quarter + + + + + + + 3 + + + + + + + + + E + 1 + 4 + + 12 + 1 + quarter + + sharp + + + + + + 3 + + + + + + + + + + + + G + 1 + 4 + + 12 + 1 + quarter + + + + + + + 3 + + + + + + + + + G + -1 + 4 + + 12 + 1 + quarter + + + + + + + 3 + + + + + + + + + F + 1 + 4 + + 12 + 1 + quarter + + + + + + + 3 + + + + + + + + + 12 + 1 + quarter + + + + + 12 + 1 + quarter + + + + + + + + 2 + + + + + 60 + 1 + + + + + + + 60 + 1 + + + + + + + + A + + + + + + + + + + F + 4 + + 12 + 1 + quarter + + + + 0 + 1 + 2 + + + + + + F + 4 + + 12 + 1 + quarter + + + + a + m + i + + + + + + Adagio + + + + + F + 4 + + 3 + 1 + eighth + + 4 + 3 + + begin + + + + 4 + + + + + + + F + 4 + + 3 + 1 + eighth + + 4 + 3 + + continue + + + + F + 4 + + 3 + 1 + eighth + + 4 + 3 + + continue + + + + F + 4 + + 3 + 1 + eighth + + 4 + 3 + + end + + + + + + + F4 + + 12 + 1 + quarter + + + + + + + + + C5 + + 12 + 1 + quarter + + + + + + + + + F5 + + 12 + 1 + quarter + + + + + + + + F4 + + 12 + 1 + quarter + + + lyrics + + + + + + + + F + 4 + + 4 + 1 + eighth + begin + + + + 4 + 1 + eighth + up + continue + + + + F + 4 + + 4 + 1 + eighth + end + + + + F + 4 + + 4 + 1 + eighth + begin + + + + F + 4 + + 4 + 1 + eighth + continue + + + + F + 4 + + 4 + 1 + eighth + end + + + + F + 4 + + 4 + 1 + eighth + begin + + + + + + + F + 4 + + 4 + 1 + eighth + continue + + + + F + 4 + + 4 + 1 + eighth + end + + + + + + + + + + + + F + 4 + + 4 + 1 + eighth + begin + + + + + + + + + F + 4 + + 4 + 1 + eighth + continue + + + + + + + + + F + 4 + + 4 + 1 + eighth + end + + + + + + + + + F + 5 + + 4 + 1 + eighth + begin + + + + F + 5 + + 4 + 1 + eighth + continue + + + + F + 5 + + 4 + 1 + eighth + end + + + + + + + + + + + + + F + 4 + + 12 + 1 + quarter + + + + + + + + + + + + F + 4 + + 12 + 1 + quarter + + + + + + + + + + + + + + + + + F + 4 + + 4 + 1 + eighth + begin + + + + F + 4 + + 4 + 1 + eighth + continue + + + + + + + + + F + 4 + + 4 + 1 + eighth + end + + + + B + 4 + + 8 + 1 + quarter + + + + + + + F + 4 + + 4 + 1 + eighth + + + + + + + + + + + + F + 4 + + 8 + 1 + quarter + + + + F + 4 + + 4 + 1 + eighth + + + + + + + + + + + + F + 4 + + 8 + 1 + quarter + + + + + + + + A + 4 + + 8 + 1 + quarter + + + + + + + F + 4 + + 4 + 1 + eighth + + + + + + + + A + 4 + + 4 + 1 + eighth + + + + + + + cresc. + + + + + + + + F + 4 + + 12 + 1 + quarter + + + + + F + 4 + + 12 + 1 + quarter + + + + + + + + dim. + + + + + + + + F + 4 + + 12 + 1 + quarter + + + + + F + 4 + + 12 + 1 + quarter + + + + + + + + + + + + + + + + + F + 4 + + 12 + 1 + half + + + 2 + 1 + + begin + + + 2 + + + + + + F + 5 + + 12 + 1 + half + + + 2 + 1 + + end + + + 2 + + + + + + + + + + + + D + 1 + A + 1 + C + 1 + + + + + F + 4 + + 12 + 1 + quarter + + + + + -2 + + + + + F + 4 + + 12 + 1 + quarter + + + + + + + + F + 4 + + + + + F + 3 + + 12 + 1 + quarter + + + + + percussion + + + 3 + + + + + + + + 12 + 1 + quarter + + + + + + + + G + 2 + + + 5 + + + + heavy-light + + + + + F + 4 + + 24 + 1 + half + + + + + + + regular + 1. + + + + F + 4 + + 24 + 1 + half + + + + light-heavy + + + + + + + + 2. + + + + F + 4 + + 24 + 1 + half + + + + light-heavy + + + + + diff --git a/test-data/musicxml-testsuite/34c-Font-Size.png b/test-data/musicxml-testsuite/34c-Font-Size.png new file mode 100644 index 000000000..d804079e4 Binary files /dev/null and b/test-data/musicxml-testsuite/34c-Font-Size.png differ diff --git a/test-data/musicxml-testsuite/34c-Font-Size.xml b/test-data/musicxml-testsuite/34c-Font-Size.xml new file mode 100644 index 000000000..e9993e347 --- /dev/null +++ b/test-data/musicxml-testsuite/34c-Font-Size.xml @@ -0,0 +1,597 @@ + + + + + + Font sizes. The elements in the + first bar have the ‘font-size’ attribute set to a larger value for + <note>, <notehead>, <trill-mark>, <dot>, and + <accidental>, respectively. + + The elements in the second bar have the ‘font-size’ attribute set to a + larger value for <down-bow>, <accidental-mark>, + <accent>, and <note> again (for the rest), respectively, + followed by a larger percussion clef and a larger unpitched note. + + The third and fourth bar consists of an oversized two-bar rest. + + The fifth bar has an oversized rehearsal mark on its starting bar + line. The first note has three fingerings, with the middle one + oversized; also attached is an oversized ‘ff’ sign. The second note + has three plucks, with the first one oversized. An oversized ‘Adagio’ + tempo indication is on top of the third and fourth beats, which + consist of a quadruplet with an oversized number. The fifth beat + demonstrates oversized lyrics. + + The sixth bar holds an oversized pedal marker with an oversized octave + shift, an oversized trill with a wavy line, and an oversized ‘cresc.’ + with dashes. + + The seventh measure demonstrates an oversized, non-traditional key + change, followed by an oversized 6/8 time signature, an oversized + breath mark, an oversized bass clef, and an oversized, traditional key + change. + + + + + + + + + 8 + + 0 + + + 1 + + G + 2 + + + + + G + 1 + 4 + + 12 + 1 + quarter + + + + + + + + double-sharp + + + + + + + + + G + -1 + 4 + + 12 + 1 + quarter + + normal + + + + + + + double-sharp + + + + + + + + + F + 1 + 4 + + 12 + 1 + quarter + + up + + + + + + + double-sharp + + + + + + + + + F + -1 + 4 + + 12 + 1 + quarter + + + + + + + + double-sharp + + + + + + + + + E + 1 + 4 + + 12 + 1 + quarter + + sharp + + + + + + + double-sharp + + + + + + + + + + + + G + 1 + 4 + + 12 + 1 + quarter + + + + + + + + double-sharp + + + + + + + + + G + -1 + 4 + + 12 + 1 + quarter + + + + + + + + double-sharp + + + + + + + + + F + 1 + 4 + + 12 + 1 + quarter + + + + + + + + double-sharp + + + + + + + + + 12 + 1 + quarter + + + + + percussion + + + + + 12 + 1 + quarter + + + + + + + + + 2 + + + + + 60 + 1 + + + + + + + 60 + 1 + + + + + + + G + 2 + + + + + A + + + + + + + + + + F + 4 + + 12 + 1 + quarter + + + + 0 + 1 + 2 + + + + + + F + 4 + + 12 + 1 + quarter + + + + a + m + i + + + + + + Adagio + + + + + F + 4 + + 6 + 1 + quarter + + 4 + 3 + + + + + 4 + quarter + + + 2 + quarter + + + + + + + + F + 4 + + 6 + 1 + quarter + + 4 + 3 + + + + + F + 4 + + 6 + 1 + quarter + + 4 + 3 + + + + + F + 4 + + 6 + 1 + quarter + + 4 + 3 + + + + + + + + F4 + + 12 + 1 + quarter + + + lyrics + + + + + + + + + + + + + + + + + F + 5 + + 4 + 1 + eighth + begin + + + + F + 5 + + 4 + 1 + eighth + continue + + + + F + 5 + + 4 + 1 + eighth + end + + + + + + + + + + + + F + 4 + + 12 + 1 + quarter + + + + + + + + + + + F + 4 + + 12 + 1 + quarter + + + + + + + + + + cresc. + + + + + + + + F + 4 + + 12 + 1 + quarter + + + + + F + 4 + + 12 + 1 + quarter + + + + + + + + D + 1 + A + 1 + C + 1 + + + + + + + + + + + F + 4 + + 12 + 1 + quarter + + + + + + + + + + -2 + + + F + 4 + + + + + F + 3 + + 12 + 1 + quarter + + + + light-heavy + + + + diff --git a/test-data/musicxml-testsuite/41a-MultiParts-Partorder.png b/test-data/musicxml-testsuite/41a-MultiParts-Partorder.png new file mode 100644 index 000000000..61a116d6c Binary files /dev/null and b/test-data/musicxml-testsuite/41a-MultiParts-Partorder.png differ diff --git a/test-data/musicxml-testsuite/41a-MultiParts-Partorder.xml b/test-data/musicxml-testsuite/41a-MultiParts-Partorder.xml index a41f34780..87f1c0b4e 100644 --- a/test-data/musicxml-testsuite/41a-MultiParts-Partorder.xml +++ b/test-data/musicxml-testsuite/41a-MultiParts-Partorder.xml @@ -1,186 +1,185 @@ - - - - - - A piece with - four parts (P0, P1, P2, P3; different from what - Finale creates!). Are they converted in the correct - order? - - - - - Part 1 - - - Part 2 - - - Part 3 - - - Part 4 - - - - - - 960 - - 1 - major - - - - G - 2 - - - - - C - 4 - - 960 - 1 - quarter - - - - 960 - 1 - quarter - - - - 1920 - 1 - half - - - - - - - 960 - - 1 - major - - - - G - 2 - - - - - E - 4 - - 960 - 1 - quarter - - - - 960 - 1 - quarter - - - - 1920 - 1 - half - - - - - - - 960 - - 1 - major - - - - G - 2 - - - - - G - 4 - - 960 - 1 - quarter - - - - 960 - 1 - quarter - - - - 1920 - 1 - half - - - - - - - 960 - - 1 - major - - - - G - 2 - - - - - B - 4 - - 960 - 1 - quarter - - - - 960 - 1 - quarter - - - - 1920 - 1 - half - - - + + + + + + A piece with four parts named + ‘P0’, ‘P1’, ‘P2’, and ‘P3’ (in that order). + + + + + Part 1 + + + Part 2 + + + Part 3 + + + Part 4 + + + + + + 960 + + 1 + major + + + + G + 2 + + + + + C + 4 + + 960 + 1 + quarter + + + + 960 + 1 + quarter + + + + 1920 + 1 + half + + + + + + + 960 + + 1 + major + + + + G + 2 + + + + + E + 4 + + 960 + 1 + quarter + + + + 960 + 1 + quarter + + + + 1920 + 1 + half + + + + + + + 960 + + 1 + major + + + + G + 2 + + + + + G + 4 + + 960 + 1 + quarter + + + + 960 + 1 + quarter + + + + 1920 + 1 + half + + + + + + + 960 + + 1 + major + + + + G + 2 + + + + + B + 4 + + 960 + 1 + quarter + + + + 960 + 1 + quarter + + + + 1920 + 1 + half + + + diff --git a/test-data/musicxml-testsuite/41b-MultiParts-MoreThan10.png b/test-data/musicxml-testsuite/41b-MultiParts-MoreThan10.png new file mode 100644 index 000000000..ec5129d9b Binary files /dev/null and b/test-data/musicxml-testsuite/41b-MultiParts-MoreThan10.png differ diff --git a/test-data/musicxml-testsuite/41b-MultiParts-MoreThan10.xml b/test-data/musicxml-testsuite/41b-MultiParts-MoreThan10.xml index e97bf3d46..803112653 100644 --- a/test-data/musicxml-testsuite/41b-MultiParts-MoreThan10.xml +++ b/test-data/musicxml-testsuite/41b-MultiParts-MoreThan10.xml @@ -1,494 +1,501 @@ - - - - - - A piece with - 20 parts to check whether an application supports - that many parts and whether they are - correctly sorted. - - - - - P0 - - - P1 - - - P2 - - - P3 - - - P4 - - - P5 - - - P6 - - - P7 - - - P8 - - - P9 - - - P10 - - - P11 - - - P12 - - - P13 - - - P14 - - - P15 - - - P16 - - - P17 - - - P18 - - - P19 - - - - - - 960 - - - G - 2 - - - - - 3840 - 1 - whole - - - - - - - 960 - - - G - 2 - - - - - 3840 - 1 - whole - - - - - - - 960 - - - G - 2 - - - - - 3840 - 1 - whole - - - - - - - 960 - - - G - 2 - - - - - 3840 - 1 - whole - - - - - - - 960 - - - G - 2 - - - - - 3840 - 1 - whole - - - - - - - 960 - - - G - 2 - - - - - 3840 - 1 - whole - - - - - - - 960 - - - G - 2 - - - - - 3840 - 1 - whole - - - - - - - 960 - - - G - 2 - - - - - 3840 - 1 - whole - - - - - - - 960 - - - G - 2 - - - - - 3840 - 1 - whole - - - - - - - 960 - - - G - 2 - - - - - 3840 - 1 - whole - - - - - - - 960 - - - G - 2 - - - - - 3840 - 1 - whole - - - - - - - 960 - - - G - 2 - - - - - 3840 - 1 - whole - - - - - - - 960 - - - G - 2 - - - - - 3840 - 1 - whole - - - - - - - 960 - - - G - 2 - - - - - 3840 - 1 - whole - - - - - - - 960 - - - G - 2 - - - - - 3840 - 1 - whole - - - - - - - 960 - - - G - 2 - - - - - 3840 - 1 - whole - - - - - - - 960 - - - G - 2 - - - - - 3840 - 1 - whole - - - - - - - 960 - - - G - 2 - - - - - 3840 - 1 - whole - - - - - - - 960 - - - G - 2 - - - - - 3840 - 1 - whole - - - - - - - 960 - - - G - 2 - - - - - 3840 - 1 - whole - - - + + + + + + A piece with 20 parts (called ‘P0’ + to ‘P19’) using a small global font size to check whether an + application supports that many parts and whether they are correctly + sorted. + + + + + 4 + 40 + + + + + P0 + + + P1 + + + P2 + + + P3 + + + P4 + + + P5 + + + P6 + + + P7 + + + P8 + + + P9 + + + P10 + + + P11 + + + P12 + + + P13 + + + P14 + + + P15 + + + P16 + + + P17 + + + P18 + + + P19 + + + + + + 960 + + + G + 2 + + + + + 3840 + 1 + whole + + + + + + + 960 + + + G + 2 + + + + + 3840 + 1 + whole + + + + + + + 960 + + + G + 2 + + + + + 3840 + 1 + whole + + + + + + + 960 + + + G + 2 + + + + + 3840 + 1 + whole + + + + + + + 960 + + + G + 2 + + + + + 3840 + 1 + whole + + + + + + + 960 + + + G + 2 + + + + + 3840 + 1 + whole + + + + + + + 960 + + + G + 2 + + + + + 3840 + 1 + whole + + + + + + + 960 + + + G + 2 + + + + + 3840 + 1 + whole + + + + + + + 960 + + + G + 2 + + + + + 3840 + 1 + whole + + + + + + + 960 + + + G + 2 + + + + + 3840 + 1 + whole + + + + + + + 960 + + + G + 2 + + + + + 3840 + 1 + whole + + + + + + + 960 + + + G + 2 + + + + + 3840 + 1 + whole + + + + + + + 960 + + + G + 2 + + + + + 3840 + 1 + whole + + + + + + + 960 + + + G + 2 + + + + + 3840 + 1 + whole + + + + + + + 960 + + + G + 2 + + + + + 3840 + 1 + whole + + + + + + + 960 + + + G + 2 + + + + + 3840 + 1 + whole + + + + + + + 960 + + + G + 2 + + + + + 3840 + 1 + whole + + + + + + + 960 + + + G + 2 + + + + + 3840 + 1 + whole + + + + + + + 960 + + + G + 2 + + + + + 3840 + 1 + whole + + + + + + + 960 + + + G + 2 + + + + + 3840 + 1 + whole + + + diff --git a/test-data/musicxml-testsuite/41c-StaffGroups.png b/test-data/musicxml-testsuite/41c-StaffGroups.png new file mode 100644 index 000000000..c705dd451 Binary files /dev/null and b/test-data/musicxml-testsuite/41c-StaffGroups.png differ diff --git a/test-data/musicxml-testsuite/41c-StaffGroups.xml b/test-data/musicxml-testsuite/41c-StaffGroups.xml index 1a6455174..0bba9e92f 100644 --- a/test-data/musicxml-testsuite/41c-StaffGroups.xml +++ b/test-data/musicxml-testsuite/41c-StaffGroups.xml @@ -1,19 +1,30 @@ - - + - A huge orchestra score with 28 - parts and different kinds of nested bracketed groups. Each part/group - is assigned a name and an abbreviation to be shown before the staff. - Also, most of the groups show unbroken barlines, while the barlines - are broken between the groups. + A huge orchestra score with + 28 parts and different kinds of nested, bracketed groups. Each + part/group is assigned a name and an abbreviation to be shown before + the staff. Also, most of the groups show unbroken bar lines, while + the bar lines are broken between the groups. + + Both the harp and the organ are multi-staff parts; the latter also + uses a <part-symbol> element to set up the + brace delimiter (and the non-contiguous bar line of the three + staves). + + + 3 + 40 + + - - bracket + + bracket yes @@ -23,33 +34,31 @@ Piccolo - - bracket + + + Flute + Fl. + square no - Flute 1 - Fl. 1 + 1 + 1 Flute 1 - Flute 2 - Fl. 2 + 2 + 2 Flute 2 - - - Oboe through Clarinet - O to Cl - bracket - yes - - - line + + + + square yes @@ -66,7 +75,8 @@ English Horn - + + Clarinet in Eb Eb Cl. @@ -74,26 +84,29 @@ Clarinet in Eb - - - bracket + + + Clarinet in Bb + Bb Cl. + square no - Clarinet in Bb 1 - Bb Cl. 1 + 1 + 1 Clarinet in Bb 1 - Clarinet in Bb 2 - Bb Cl. 2 + 2 + 2 Clarinet in Bb 2 - + + Bass Clarinet B. Cl. @@ -101,25 +114,29 @@ Bass Clarinet - - bracket + + + Bassoon + Bsn. + square no - Bassoon 1 - Bsn. 1 + 1 + 1 Bassoon 1 - Bassoon 2 - Bsn. 2 + 2 + 2 Bassoon 2 - + + Contrabassoon C. Bn. @@ -127,68 +144,79 @@ Contrabassoon - + + - bracket - no + bracket + yes + - bracket - yes + Horn in F + F Hn. + square + no - Horn in F 1 - Hn. 1 + 1 + 1 Horn in F 1 - Horn in F 2 - Hn. 2 + 2 + 2 Horn in F 2 - - - bracket + + + + Trumpet in C + C Tpt. + square no - Trumpet in C 1 - C Tpt. 1 + 1 + 1 Trumpet in C 1 - Trumpet in C 2 - C Tpt. 2 + 2 + 2 Trumpet in C 2 - - - bracket + + + + Trombone + Tbn. + square no - Trombone 1 - Tbn. 1 + 1 + 1 Trombone 1 - Trombone 2 - Tbn. 2 + 2 + 2 Trombone 2 - + + Tuba Tuba @@ -196,7 +224,8 @@ Tuba - + + Timpani Timp. @@ -218,31 +247,47 @@ Harp + + + bracket + no + - Piano - Pno. + Organ + Org. - Piano + Organ + + - bracket + bracket yes + + + Violin + Vln. + square + no + - Violin I - Vln. I + I + I Violin I - Violin II - Vln. II + II + II Violin II + + Viola Vla. @@ -1324,7 +1369,10 @@ 4 4 - 2 + 3 + brace G 2 @@ -1333,6 +1381,10 @@ F 4 + + F + 4 + @@ -1385,6 +1437,33 @@ half 2 + + 4 + + + + E + 3 + + 1 + 3 + quarter + 3 + + + + 1 + 3 + quarter + 3 + + + + 2 + 3 + half + 3 + light-heavy diff --git a/test-data/musicxml-testsuite/41d-StaffGroups-Nested.png b/test-data/musicxml-testsuite/41d-StaffGroups-Nested.png new file mode 100644 index 000000000..91c20075f Binary files /dev/null and b/test-data/musicxml-testsuite/41d-StaffGroups-Nested.png differ diff --git a/test-data/musicxml-testsuite/41d-StaffGroups-Nested.xml b/test-data/musicxml-testsuite/41d-StaffGroups-Nested.xml index 08f327f6d..92f36c765 100644 --- a/test-data/musicxml-testsuite/41d-StaffGroups-Nested.xml +++ b/test-data/musicxml-testsuite/41d-StaffGroups-Nested.xml @@ -1,39 +1,39 @@ - - + - Two properly nested part groups: - One group (with a square bracket) goes from staff 2 to 4) and another - group (with a curly bracket) goes from staff 3 to 4. + Two properly nested part groups: + One group (with a bracket) goes from staff 2 to 4, and another group + (with a brace) goes from staff 3 to 4. - MusicXML Part + - line + bracket yes - MusicXML Part + - bracket + brace yes - MusicXML Part + - MusicXML Part + - MusicXML Part + diff --git a/test-data/musicxml-testsuite/41e-StaffGroups-InstrumentNames-Linebroken.png b/test-data/musicxml-testsuite/41e-StaffGroups-InstrumentNames-Linebroken.png new file mode 100644 index 000000000..32dbb77b8 Binary files /dev/null and b/test-data/musicxml-testsuite/41e-StaffGroups-InstrumentNames-Linebroken.png differ diff --git a/test-data/musicxml-testsuite/41e-StaffGroups-InstrumentNames-Linebroken.xml b/test-data/musicxml-testsuite/41e-StaffGroups-InstrumentNames-Linebroken.xml index 9326768ac..e087b60d3 100644 --- a/test-data/musicxml-testsuite/41e-StaffGroups-InstrumentNames-Linebroken.xml +++ b/test-data/musicxml-testsuite/41e-StaffGroups-InstrumentNames-Linebroken.xml @@ -1,19 +1,26 @@ - - + - Part names and abbreviations can - contain line breaks. + The <part-name> and + <part-abbreviation> fields don't have an ‘xml:space’ attribute, + making the interpretation of whitespace in the element content + implementation-dependent. + + In this test, there is a line break after each word. It is expected + that some implementations show actual line breaks in the output, while + others do not, replacing the line breaks with + spaces. - Long -Staff + Long +Staff Name - St. + St. Nm. diff --git a/test-data/musicxml-testsuite/41f-StaffGroups-Overlapping.png b/test-data/musicxml-testsuite/41f-StaffGroups-Overlapping.png new file mode 100644 index 000000000..768f71f33 Binary files /dev/null and b/test-data/musicxml-testsuite/41f-StaffGroups-Overlapping.png differ diff --git a/test-data/musicxml-testsuite/41f-StaffGroups-Overlapping.xml b/test-data/musicxml-testsuite/41f-StaffGroups-Overlapping.xml index 9b6d2afe9..1d040ebc6 100644 --- a/test-data/musicxml-testsuite/41f-StaffGroups-Overlapping.xml +++ b/test-data/musicxml-testsuite/41f-StaffGroups-Overlapping.xml @@ -1,44 +1,44 @@ - - + - MusicXML allows for overlapping - part-groups, while many applications do not allow overlapping groups, - but require them to be properly nested. In this case, one group - (with a square bracket) goes from staff 2 to 4) and another group - (with a curly bracket) goes from staff 3 to 5. + MusicXML allows for overlapping + part groups, but many applications do not support that, requiring that + they are properly nested instead. In this case, ‘Group 1’ (with a + bracket) goes from staff 1 to 4, and ‘Group 2’ (also with a + bracket) goes from staff 3 to 5. Group 1 Gr1 - bracket + bracket yes - MusicXML Part + - MusicXML Part + Group 2 Grp2 - bracket + bracket yes - MusicXML Part + - MusicXML Part + - MusicXML Part + diff --git a/test-data/musicxml-testsuite/41g-PartNoId.xml b/test-data/musicxml-testsuite/41g-PartNoId.xml deleted file mode 100644 index 337b85160..000000000 --- a/test-data/musicxml-testsuite/41g-PartNoId.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - A part with no id attribute. - Since this piece has only one part, it is clear which part - is described by the one part element. - - - - - MusicXML Part - - - - - - - 4 - 1 - whole - - - - diff --git a/test-data/musicxml-testsuite/41g-StaffGroups-NestingOrder.png b/test-data/musicxml-testsuite/41g-StaffGroups-NestingOrder.png new file mode 100644 index 000000000..15ceace88 Binary files /dev/null and b/test-data/musicxml-testsuite/41g-StaffGroups-NestingOrder.png differ diff --git a/test-data/musicxml-testsuite/41g-StaffGroups-NestingOrder.xml b/test-data/musicxml-testsuite/41g-StaffGroups-NestingOrder.xml new file mode 100644 index 000000000..58c3d99e5 --- /dev/null +++ b/test-data/musicxml-testsuite/41g-StaffGroups-NestingOrder.xml @@ -0,0 +1,371 @@ + + + + + + The horizontal order of nested + group delimiters (brackets, braces, etc.) is unspecified in + MusicXML; however, it can be controlled by the ‘default-x’ attribute + of <group-symbol> in case the application's default positioning + produces unwanted results (and the application actually supports this + attribute). + + In the following, staves 1 to 4 have a four-staves brace on the left + and two two-staves braces to the right. On staves 4 to 8 it's exactly + the opposite (i.e., the four-staves brace is to the right), using the + same ‘number’ attribute values as before but different ‘default-x’ + values. + + Note also that the four-staves brace has the element + <group-barline> set to value ‘no’ while the two-staves braces + use value ‘Mensurstrich’. This means that the Mensurstrich bar lines + should be grouped into two staves each. + + + + + brace + no + + + brace + Mensurstrich + + + + + + + + + + brace + Mensurstrich + + + + + + + + + + + brace + no + + + brace + Mensurstrich + + + + + + + + + + brace + Mensurstrich + + + + + + + + + + + + + + + 1 + + 0 + major + + + + G + 2 + + + + + 4 + 1 + + + + + + + 4 + 1 + + + light-heavy + + + + + + + + 1 + + 0 + major + + + + G + 2 + + + + + 4 + 1 + + + + + + + 4 + 1 + + + light-heavy + + + + + + + + 1 + + 0 + major + + + + G + 2 + + + + + 4 + 1 + + + + + + + 4 + 1 + + + light-heavy + + + + + + + + 1 + + 0 + major + + + + G + 2 + + + + + 4 + 1 + + + + + + + 4 + 1 + + + light-heavy + + + + + + + + 1 + + 0 + major + + + + G + 2 + + + + + 4 + 1 + + + + + + + 4 + 1 + + + light-heavy + + + + + + + + 1 + + 0 + major + + + + G + 2 + + + + + 4 + 1 + + + + + + + 4 + 1 + + + light-heavy + + + + + + + + 1 + + 0 + major + + + + G + 2 + + + + + 4 + 1 + + + + + + + 4 + 1 + + + light-heavy + + + + + + + + 1 + + 0 + major + + + + G + 2 + + + + + 4 + 1 + + + + + + + 4 + 1 + + + light-heavy + + + + + diff --git a/test-data/musicxml-testsuite/41h-TooManyParts.png b/test-data/musicxml-testsuite/41h-TooManyParts.png new file mode 100644 index 000000000..282943170 Binary files /dev/null and b/test-data/musicxml-testsuite/41h-TooManyParts.png differ diff --git a/test-data/musicxml-testsuite/41h-TooManyParts.xml b/test-data/musicxml-testsuite/41h-TooManyParts.xml index 64b7dc90b..31a7a3d20 100644 --- a/test-data/musicxml-testsuite/41h-TooManyParts.xml +++ b/test-data/musicxml-testsuite/41h-TooManyParts.xml @@ -1,12 +1,13 @@ - - + + - This piece has more part elements - than the part-list section gives. One can either convert all - the parts present, but not listed in the part-list, or simply - not import / ignore them. + This piece has two more + <part> elements than the <part-list> section contains. + One can either convert all the parts present but not listed in the + part list, or simply not import or ignore them. diff --git a/test-data/musicxml-testsuite/41i-PartNameDisplay-Override.png b/test-data/musicxml-testsuite/41i-PartNameDisplay-Override.png new file mode 100644 index 000000000..059540f8a Binary files /dev/null and b/test-data/musicxml-testsuite/41i-PartNameDisplay-Override.png differ diff --git a/test-data/musicxml-testsuite/41i-PartNameDisplay-Override.xml b/test-data/musicxml-testsuite/41i-PartNameDisplay-Override.xml index bcc896303..71254f9ab 100644 --- a/test-data/musicxml-testsuite/41i-PartNameDisplay-Override.xml +++ b/test-data/musicxml-testsuite/41i-PartNameDisplay-Override.xml @@ -1,29 +1,42 @@ - - + - MusicXML allows part-name and - part-name-display in the score-part element. If part-name-display - is given, it overrides the part-name for display. + MusicXML allows <part-name> + and <part-name-display> in the <score-part> element. If + <part-name-display> is given, it overrides <part-name> for + display. - The first staff uses only part-name, while the second one (same - part-name) overrides it with a custom text. Similar for the - part-abbreviation used in subsequent staves. - + The first staff uses only <part-name>, while the second one + (with the same <part-name> value) overrides it with a custom + text. + + In a similar vein, <part-abbreviation> can be overridden with + <part-abbreviation-display>, shown in the second system. + + The multi-line entries are generated by using ‘xml:space="preserve"’ + as an attribute within a <display-text> child of the + <xxx-display> element. Part name - abbrv. + Abbrev. Part name - Overridden Part Name - abbrv. - Overr.abbrv. + + Part Name +Override + + Abbrev. + + Abbrv. +overr. + diff --git a/test-data/musicxml-testsuite/41j-PartNameDisplay-Multiple-DisplayText-Children.png b/test-data/musicxml-testsuite/41j-PartNameDisplay-Multiple-DisplayText-Children.png new file mode 100644 index 000000000..146e17f89 Binary files /dev/null and b/test-data/musicxml-testsuite/41j-PartNameDisplay-Multiple-DisplayText-Children.png differ diff --git a/test-data/musicxml-testsuite/41j-PartNameDisplay-Multiple-DisplayText-Children.xml b/test-data/musicxml-testsuite/41j-PartNameDisplay-Multiple-DisplayText-Children.xml new file mode 100644 index 000000000..deae0db0a --- /dev/null +++ b/test-data/musicxml-testsuite/41j-PartNameDisplay-Multiple-DisplayText-Children.xml @@ -0,0 +1,51 @@ + + + + + + This score has multiple + <display-text> elements in its <part-name-display> block: + the word ‘Player’ printed in red with a large font size, the word + ‘One’ printed in blue with a small, italic font + size. + + + + + Music + + Player + One + + + + + + + 1 + + 0 + + + + G + 2 + + + + + C + 4 + + 4 + whole + + + + diff --git a/test-data/musicxml-testsuite/41k-PartName-Print.png b/test-data/musicxml-testsuite/41k-PartName-Print.png new file mode 100644 index 000000000..3df4e392a Binary files /dev/null and b/test-data/musicxml-testsuite/41k-PartName-Print.png differ diff --git a/test-data/musicxml-testsuite/41k-PartName-Print.xml b/test-data/musicxml-testsuite/41k-PartName-Print.xml new file mode 100644 index 000000000..7b9a91eec --- /dev/null +++ b/test-data/musicxml-testsuite/41k-PartName-Print.xml @@ -0,0 +1,66 @@ + + + + + + The <part-name-display> + and <part-abbreviation-display> elements can also be children of + the <print> element; the former is used at the beginning of the + first bar, and the latter at the beginning of the second bar. + + The multi-line entries are generated by using ‘xml:space="preserve"’ + as an attribute within a <display-text> child of the + <xxx-display> element. There are two empty lines between ‘Part’ + and ‘Name’. + + + + + + + + + + + + + Part + + +Name + + + + 1 + + + + C + 4 + + 4 + 1 + whole + + + + + + + P. +N. + + + + + C + 4 + + 4 + 1 + whole + + + + diff --git a/test-data/musicxml-testsuite/41l-GroupNameDisplay-Override.png b/test-data/musicxml-testsuite/41l-GroupNameDisplay-Override.png new file mode 100644 index 000000000..86e996aae Binary files /dev/null and b/test-data/musicxml-testsuite/41l-GroupNameDisplay-Override.png differ diff --git a/test-data/musicxml-testsuite/41l-GroupNameDisplay-Override.xml b/test-data/musicxml-testsuite/41l-GroupNameDisplay-Override.xml new file mode 100644 index 000000000..b57aee2d9 --- /dev/null +++ b/test-data/musicxml-testsuite/41l-GroupNameDisplay-Override.xml @@ -0,0 +1,174 @@ + + + + + + If <group-name-display> is + given, it overrides <group-name> for display. + + The first two staves use only <group-name>, while the third and + fourth one (with the same <group-name> value) override it with + a custom text. + + In a similar vein, <group-abbreviation> can be overridden with + <group-abbreviation-display>, shown in the second system. + + The multi-line entries are generated by using ‘xml:space="preserve"’ + as an attribute within a <display-text> child of the + <xxx-display> element. + + + + + Group Name + G. N. + bracket + no + + + + + + + + + + Group Name + + Group Name +Override + + G. N. + + G. N. +Overr. + + bracket + no + + + + + + + + + + + + + + 1 + + + + C + 4 + + 4 + 1 + whole + + + + + + + C + 4 + + 4 + 1 + whole + + + + + + + + 1 + + + + C + 4 + + 4 + 1 + whole + + + + + + + C + 4 + + 4 + 1 + whole + + + + + + + + 1 + + + + C + 4 + + 4 + 1 + whole + + + + + + + C + 4 + + 4 + 1 + whole + + + + + + + + 1 + + + + C + 4 + + 4 + 1 + whole + + + + + + + C + 4 + + 4 + 1 + whole + + + + diff --git a/test-data/musicxml-testsuite/42a-MultiVoice-TwoVoicesOnStaff-Lyrics.png b/test-data/musicxml-testsuite/42a-MultiVoice-TwoVoicesOnStaff-Lyrics.png new file mode 100644 index 000000000..5eebdafe4 Binary files /dev/null and b/test-data/musicxml-testsuite/42a-MultiVoice-TwoVoicesOnStaff-Lyrics.png differ diff --git a/test-data/musicxml-testsuite/42a-MultiVoice-TwoVoicesOnStaff-Lyrics.xml b/test-data/musicxml-testsuite/42a-MultiVoice-TwoVoicesOnStaff-Lyrics.xml index 27f4b2aa7..a57ef41ae 100644 --- a/test-data/musicxml-testsuite/42a-MultiVoice-TwoVoicesOnStaff-Lyrics.xml +++ b/test-data/musicxml-testsuite/42a-MultiVoice-TwoVoicesOnStaff-Lyrics.xml @@ -1,11 +1,14 @@ - - + - Two voices share one staff. Each - voice is assigned some lyrics. + Two voices share one staff. To + each voice some lyrics is assigned (with the lyrics of voice one + positioned above the staff). In the last bar, the second voice is + empty, thus the full rest should be positioned on the staff's middle + line. @@ -42,11 +45,11 @@ up - + - + single This @@ -67,7 +70,7 @@ 1 quarter up - + single is @@ -81,7 +84,7 @@ 1 quarter up - + single the @@ -102,7 +105,7 @@ - + single @@ -158,7 +161,7 @@ 1 quarter up - + single lyrics @@ -176,7 +179,7 @@ - + single of @@ -193,7 +196,7 @@ - + single Voice1 @@ -256,7 +259,7 @@ single - Voice1 + Voice2 diff --git a/test-data/musicxml-testsuite/42b-MultiVoice-MidMeasureClefChange.png b/test-data/musicxml-testsuite/42b-MultiVoice-MidMeasureClefChange.png new file mode 100644 index 000000000..1eb531ce7 Binary files /dev/null and b/test-data/musicxml-testsuite/42b-MultiVoice-MidMeasureClefChange.png differ diff --git a/test-data/musicxml-testsuite/42b-MultiVoice-MidMeasureClefChange.xml b/test-data/musicxml-testsuite/42b-MultiVoice-MidMeasureClefChange.xml index b499bbaf5..a86bf9b3a 100644 --- a/test-data/musicxml-testsuite/42b-MultiVoice-MidMeasureClefChange.xml +++ b/test-data/musicxml-testsuite/42b-MultiVoice-MidMeasureClefChange.xml @@ -1,12 +1,16 @@ - - + - A multi-voice / multi-staff part - with a clef change in the middle of a measure and a <backward> - for voice 2 jumping back beyond that clef change. + A part with three voices; two on + the upper staff and one on the lower staff. There are two clef + changes in the upper staff, one in the middle of measure one and one + at the end. The third voice has a length of only three eights, + starting at the fourth eighth of the first bar. + + No voice contains <stem> elements. @@ -117,6 +121,49 @@ + + 504 + + + + 336 + 2 + quarter + 1 + + + + B + 3 + + 168 + 2 + eighth + 1 + + + + + D + 4 + + 168 + 2 + eighth + 1 + + + + + F + 4 + + 168 + 2 + eighth + natural + 1 + 1008 @@ -304,7 +351,7 @@ - F + E 4 336 @@ -391,7 +438,5 @@ - - diff --git a/test-data/musicxml-testsuite/43a-PianoStaff.png b/test-data/musicxml-testsuite/43a-PianoStaff.png new file mode 100644 index 000000000..90ae74c26 Binary files /dev/null and b/test-data/musicxml-testsuite/43a-PianoStaff.png differ diff --git a/test-data/musicxml-testsuite/43a-PianoStaff.xml b/test-data/musicxml-testsuite/43a-PianoStaff.xml index d68add6f7..dddb12e33 100644 --- a/test-data/musicxml-testsuite/43a-PianoStaff.xml +++ b/test-data/musicxml-testsuite/43a-PianoStaff.xml @@ -1,42 +1,63 @@ - - - - - - A simple piano staff - - - - - MusicXML Part - - - - - - 96 - 0 - - 2 - G2 - F4 - - - F4 - 384 - 1 - whole - 1 - - 384 - - B2 - 384 - 2 - whole - 2 - - - + + + + + + A simple piano + staff, i.e., two voices, each on a separate + staff. + + + + + MusicXML Part + + + + + + 96 + + 0 + + + 2 + + G + 2 + + + F + 4 + + + + + F + 4 + + 384 + 1 + whole + 1 + + + 384 + + + + B + 2 + + 384 + 2 + whole + 2 + + + diff --git a/test-data/musicxml-testsuite/43b-MultiStaff-DifferentKeys.png b/test-data/musicxml-testsuite/43b-MultiStaff-DifferentKeys.png new file mode 100644 index 000000000..976a8f5b1 Binary files /dev/null and b/test-data/musicxml-testsuite/43b-MultiStaff-DifferentKeys.png differ diff --git a/test-data/musicxml-testsuite/43b-MultiStaff-DifferentKeys.xml b/test-data/musicxml-testsuite/43b-MultiStaff-DifferentKeys.xml index 03a84a914..15863892c 100644 --- a/test-data/musicxml-testsuite/43b-MultiStaff-DifferentKeys.xml +++ b/test-data/musicxml-testsuite/43b-MultiStaff-DifferentKeys.xml @@ -1,46 +1,66 @@ - - - - - - A piano staff - with different keys and clefs for each of its - staves. The keys and clefs for both staves are given - at the very beginning of the measure. - - - - - MusicXML Part - - - - - - 96 - 0 - 2 - - 2 - G2 - F4 - - - F4 - 384 - 1 - whole - 1 - - 384 - - B2 - 384 - 2 - whole - 2 - - - + + + + + + A piano staff with different keys + and clefs for each of its staves. The keys and clefs for both staves + are given at the very beginning of the measure. + + + + + MusicXML Part + + + + + + 96 + + 0 + + + 2 + + + 2 + + G + 2 + + + F + 4 + + + + + F + 4 + + 384 + 1 + whole + 1 + + + 384 + + + + B + 2 + + 384 + 2 + whole + 2 + + + diff --git a/test-data/musicxml-testsuite/43c-MultiStaff-DifferentKeysAfterBackup.png b/test-data/musicxml-testsuite/43c-MultiStaff-DifferentKeysAfterBackup.png new file mode 100644 index 000000000..716de7b70 Binary files /dev/null and b/test-data/musicxml-testsuite/43c-MultiStaff-DifferentKeysAfterBackup.png differ diff --git a/test-data/musicxml-testsuite/43c-MultiStaff-DifferentKeysAfterBackup.xml b/test-data/musicxml-testsuite/43c-MultiStaff-DifferentKeysAfterBackup.xml index 7a20cadce..eb679f487 100644 --- a/test-data/musicxml-testsuite/43c-MultiStaff-DifferentKeysAfterBackup.xml +++ b/test-data/musicxml-testsuite/43c-MultiStaff-DifferentKeysAfterBackup.xml @@ -1,50 +1,70 @@ - - - - - - A piano staff - with different keys and clefs for each of its - staves. The key and clef for the second staff is - given only after a backward, just before the first - note of the second staff is given, but after the - whole measure for staff 1 has been given. - - - - - MusicXML Part - - - - - - 96 - 0 - - 2 - G2 - - - F4 - 384 - 1 - whole - 1 - - 384 - - 2 - F4 - - - B2 - 384 - 2 - whole - 2 - - - + + + + + + A piano staff with different keys + and clefs for each of its staves. The key and clef for the second + staff is given only after a <backup> element, just before the + first note of the second staff, but after the whole measure for staff + one has been output. + + + + + MusicXML Part + + + + + + 96 + + 0 + + + 2 + + G + 2 + + + + + F + 4 + + 384 + 1 + whole + 1 + + + 384 + + + + 2 + + + F + 4 + + + + + B + 2 + + 384 + 2 + whole + 2 + + + diff --git a/test-data/musicxml-testsuite/43d-MultiStaff-StaffChange.png b/test-data/musicxml-testsuite/43d-MultiStaff-StaffChange.png new file mode 100644 index 000000000..8047d2c00 Binary files /dev/null and b/test-data/musicxml-testsuite/43d-MultiStaff-StaffChange.png differ diff --git a/test-data/musicxml-testsuite/43d-MultiStaff-StaffChange.xml b/test-data/musicxml-testsuite/43d-MultiStaff-StaffChange.xml index e0071b91f..710a26be7 100644 --- a/test-data/musicxml-testsuite/43d-MultiStaff-StaffChange.xml +++ b/test-data/musicxml-testsuite/43d-MultiStaff-StaffChange.xml @@ -1,13 +1,14 @@ - - + - Staff changes in a piano staff. - The voice from the second staff has some notes/chords on the first - staff. The final two chords have some notes on the first, some on - the second staff. + Staff changes in a piano staff. + In the first measure, the voice from the second staff has some notes + on the first staff. In the second measure, the voice from the second + staff has a chord on the second eighth on the first + staff. @@ -34,8 +35,8 @@ 2 - F - 4 + G + 2 @@ -123,12 +124,18 @@ 1 2 eighth - 2 + 1 end + + + F + 4 + + 8 @@ -315,5 +322,4 @@ - diff --git a/test-data/musicxml-testsuite/43e-Multistaff-ClefDynamics.png b/test-data/musicxml-testsuite/43e-Multistaff-ClefDynamics.png new file mode 100644 index 000000000..d42786e0f Binary files /dev/null and b/test-data/musicxml-testsuite/43e-Multistaff-ClefDynamics.png differ diff --git a/test-data/musicxml-testsuite/43e-Multistaff-ClefDynamics.xml b/test-data/musicxml-testsuite/43e-Multistaff-ClefDynamics.xml index 9807fb4dc..5a4149229 100644 --- a/test-data/musicxml-testsuite/43e-Multistaff-ClefDynamics.xml +++ b/test-data/musicxml-testsuite/43e-Multistaff-ClefDynamics.xml @@ -1,12 +1,15 @@ - - + - A piano staff with dynamics and - clef changes, where each element (ffff, wedge and clef changes) - applies only to one voice or one staff, respectively. + A piano staff with dynamics and + clef changes, where each element (‘ffff’, a wedge, and clef changes) + applies only to one voice or one staff, respectively. + + The key change is given only once, not specifying a particular staff; + it should thus appear on both staves. diff --git a/test-data/musicxml-testsuite/43f-MultiStaff-Lyrics.png b/test-data/musicxml-testsuite/43f-MultiStaff-Lyrics.png new file mode 100644 index 000000000..061a8bdcc Binary files /dev/null and b/test-data/musicxml-testsuite/43f-MultiStaff-Lyrics.png differ diff --git a/test-data/musicxml-testsuite/43f-MultiStaff-Lyrics.xml b/test-data/musicxml-testsuite/43f-MultiStaff-Lyrics.xml new file mode 100644 index 000000000..9c26d1061 --- /dev/null +++ b/test-data/musicxml-testsuite/43f-MultiStaff-Lyrics.xml @@ -0,0 +1,281 @@ + + + + + + Two voices of a single part on two + staves, with lyrics. The lyrics of voice one is positioned above the + staff. + + + + + MusicXML Part + + + + + + + 8 + + 0 + major + + + 2 + + G + 2 + + + G + 2 + + + + + E + 5 + + 16 + 1 + half + down + 1 + + single + This + + + + + D + 5 + + 8 + 1 + quarter + down + 1 + + single + is + + + + + B + 4 + + 8 + 1 + quarter + down + 1 + + single + the + + + + 32 + + + + C + 5 + + 16 + 2 + half + down + 2 + + single + This + + + + + B + 4 + + 8 + 2 + quarter + down + 2 + + single + is + + + + + G + 4 + + 8 + 2 + quarter + up + 2 + + single + the + + + + + + + + 8 + 1 + quarter + 1 + + + + D + 5 + + 8 + 1 + quarter + down + 1 + + single + lyrics + + + + + B + 3 + + 12 + 1 + quarter + + up + 1 + + + + + single + of + + + + + C + 5 + + 4 + 1 + eighth + down + 1 + + + + + single + Voice1 + + + + 32 + + + + 8 + 2 + quarter + 2 + + + + B + 4 + + 8 + 2 + quarter + down + 2 + + single + lyrics + + + + + G + 3 + + 12 + 2 + quarter + + up + 2 + + + + + single + of + + + + + A + 4 + + 4 + 2 + eighth + up + 2 + + + + + single + Voice2 + + + + + + + + 32 + 1 + 1 + + + 32 + + + + 32 + 2 + 2 + + + light-heavy + + + + + diff --git a/test-data/musicxml-testsuite/43g-MultiStaff-PartSymbol.png b/test-data/musicxml-testsuite/43g-MultiStaff-PartSymbol.png new file mode 100644 index 000000000..65be99046 Binary files /dev/null and b/test-data/musicxml-testsuite/43g-MultiStaff-PartSymbol.png differ diff --git a/test-data/musicxml-testsuite/43g-MultiStaff-PartSymbol.xml b/test-data/musicxml-testsuite/43g-MultiStaff-PartSymbol.xml new file mode 100644 index 000000000..befde6ad8 --- /dev/null +++ b/test-data/musicxml-testsuite/43g-MultiStaff-PartSymbol.xml @@ -0,0 +1,121 @@ + + + + + + In this four-staves part, the + <part-symbol> element spans up a ‘square’ staff group delimiter + between staves 2 and 3. + + + + + Test + + + + + + 1 + + 0 + + + 4 + square + + G + 2 + + + G + 2 + + + F + 4 + + + F + 4 + + + + + 4 + 1 + 1 + + + 4 + + + + 4 + 2 + 2 + + + 4 + + + + 4 + 3 + 3 + + + 4 + + + + 4 + 4 + 4 + + + + + + + 4 + 1 + 1 + + + 4 + + + + 4 + 2 + 2 + + + 4 + + + + 4 + 3 + 3 + + + 4 + + + + 4 + 4 + 4 + + + light-heavy + + + + diff --git a/test-data/musicxml-testsuite/45a-SimpleRepeat.png b/test-data/musicxml-testsuite/45a-SimpleRepeat.png new file mode 100644 index 000000000..46b029840 Binary files /dev/null and b/test-data/musicxml-testsuite/45a-SimpleRepeat.png differ diff --git a/test-data/musicxml-testsuite/45a-SimpleRepeat.xml b/test-data/musicxml-testsuite/45a-SimpleRepeat.xml index 582621a9f..464477f00 100644 --- a/test-data/musicxml-testsuite/45a-SimpleRepeat.xml +++ b/test-data/musicxml-testsuite/45a-SimpleRepeat.xml @@ -1,11 +1,12 @@ - - + - A simple, repeated measure - (repeated 5 times) + A simple, repeated measure (to be + played five times), with an implicit start at the + beginning. diff --git a/test-data/musicxml-testsuite/45b-RepeatWithAlternatives.png b/test-data/musicxml-testsuite/45b-RepeatWithAlternatives.png new file mode 100644 index 000000000..4f3ca4035 Binary files /dev/null and b/test-data/musicxml-testsuite/45b-RepeatWithAlternatives.png differ diff --git a/test-data/musicxml-testsuite/45b-RepeatWithAlternatives.xml b/test-data/musicxml-testsuite/45b-RepeatWithAlternatives.xml index 329ac07ab..fcae0ff50 100644 --- a/test-data/musicxml-testsuite/45b-RepeatWithAlternatives.xml +++ b/test-data/musicxml-testsuite/45b-RepeatWithAlternatives.xml @@ -1,10 +1,10 @@ - - + - A simple repeat with two + A simple repeat with two alternative endings (volta brackets). diff --git a/test-data/musicxml-testsuite/45c-SimpleRepeat-Nested.png b/test-data/musicxml-testsuite/45c-SimpleRepeat-Nested.png new file mode 100644 index 000000000..f63b2acd2 Binary files /dev/null and b/test-data/musicxml-testsuite/45c-SimpleRepeat-Nested.png differ diff --git a/test-data/musicxml-testsuite/45c-RepeatMultipleTimes.xml b/test-data/musicxml-testsuite/45c-SimpleRepeat-Nested.xml similarity index 88% rename from test-data/musicxml-testsuite/45c-RepeatMultipleTimes.xml rename to test-data/musicxml-testsuite/45c-SimpleRepeat-Nested.xml index 3a5df794f..dbd486ab0 100644 --- a/test-data/musicxml-testsuite/45c-RepeatMultipleTimes.xml +++ b/test-data/musicxml-testsuite/45c-SimpleRepeat-Nested.xml @@ -1,10 +1,13 @@ - - + - Repeats can also be nested. + Repeats can also be nested. The + inner repeat spans from bar 2 to bar bar 3 (to be played five times). + The outer repeat spans implicitly from the beginning to bar 7 (to be + played one time, i.e., it doesn't get repeated). @@ -93,7 +96,7 @@ light-heavy - + diff --git a/test-data/musicxml-testsuite/45d-Repeats-MultipleEndings.png b/test-data/musicxml-testsuite/45d-Repeats-MultipleEndings.png new file mode 100644 index 000000000..423a0679f Binary files /dev/null and b/test-data/musicxml-testsuite/45d-Repeats-MultipleEndings.png differ diff --git a/test-data/musicxml-testsuite/45d-Repeats-Nested-Alternatives.xml b/test-data/musicxml-testsuite/45d-Repeats-MultipleEndings.xml similarity index 85% rename from test-data/musicxml-testsuite/45d-Repeats-Nested-Alternatives.xml rename to test-data/musicxml-testsuite/45d-Repeats-MultipleEndings.xml index c90afeb59..63c6fb26a 100644 --- a/test-data/musicxml-testsuite/45d-Repeats-Nested-Alternatives.xml +++ b/test-data/musicxml-testsuite/45d-Repeats-MultipleEndings.xml @@ -1,11 +1,13 @@ - - + - Nested repeats, each with - alternative endings. + Multiple alternative endings. The + first alternative starts and ends at bar 2; the second continues until + bar 5, the third until bar 9, the fourth until bar 10, and the fifth + implicitly until the end. @@ -80,7 +82,9 @@ 1 + light-heavy + @@ -93,9 +97,6 @@ 4 1 - - - @@ -120,11 +121,16 @@ 4 1 + + light-heavy + + + - + @@ -132,7 +138,9 @@ 1 - + light-heavy + + @@ -146,9 +154,7 @@ 1 - light-heavy - - + diff --git a/test-data/musicxml-testsuite/45e-Repeats-Combination.png b/test-data/musicxml-testsuite/45e-Repeats-Combination.png new file mode 100644 index 000000000..077702092 Binary files /dev/null and b/test-data/musicxml-testsuite/45e-Repeats-Combination.png differ diff --git a/test-data/musicxml-testsuite/45e-Repeats-Nested-Alternatives.xml b/test-data/musicxml-testsuite/45e-Repeats-Combination.xml similarity index 79% rename from test-data/musicxml-testsuite/45e-Repeats-Nested-Alternatives.xml rename to test-data/musicxml-testsuite/45e-Repeats-Combination.xml index b4d324ee3..2a416041e 100644 --- a/test-data/musicxml-testsuite/45e-Repeats-Nested-Alternatives.xml +++ b/test-data/musicxml-testsuite/45e-Repeats-Combination.xml @@ -1,12 +1,19 @@ - - + - Some more nested repeats with - alternatives. The barline between measure 7 and 8 will probably be - messed up! (Should be a repeat on both sides!) + A series of repeat elements. + + The first repeat starts implicitly at the beginning, with the first + alternative starting and ending at bar 2, and the second ending at + bar 3. The next repeat starts and ends at bar 5. Another repeat + starts at bar 6 (causing a back-to-back bar line between bars 5 + and 6), with the first alternative starting and ending at bar 7. Its + second alternative (starting and ending at bar 8) is the start of a + repeat at the same time (causing another back-to-back bar line between + bars 7 and 8), ending after bar 9. @@ -94,6 +101,10 @@ + + heavy-light + + 4 @@ -120,6 +131,7 @@ heavy-light + @@ -127,6 +139,9 @@ 4 1 + + + diff --git a/test-data/musicxml-testsuite/45f-Repeats-InvalidEndings.png b/test-data/musicxml-testsuite/45f-Repeats-InvalidEndings.png new file mode 100644 index 000000000..51341a57b Binary files /dev/null and b/test-data/musicxml-testsuite/45f-Repeats-InvalidEndings.png differ diff --git a/test-data/musicxml-testsuite/45f-Repeats-InvalidEndings.xml b/test-data/musicxml-testsuite/45f-Repeats-InvalidEndings.xml index a84052a0a..7e4b36e3e 100644 --- a/test-data/musicxml-testsuite/45f-Repeats-InvalidEndings.xml +++ b/test-data/musicxml-testsuite/45f-Repeats-InvalidEndings.xml @@ -1,13 +1,20 @@ - - + - Some more nested repeats with - alternatives, where the MusicXML file does not make sense in the - first place. How well are applications able to cope with improper - repeats and alternatives? + A stress test with a combination + of <repeat> and <ending> elements that don't make sense. + The displayed result depends on the sanitizing possibilities of the + application that handles the input. + + Bar 2 starts and ends with <ending number="1, 2, 3">. Bar 3 + starts and ends with <ending number="2"> (where the right + element is of type 'discontinue'); there is no <repeat> element + between bars 2 and 3. Finally, at the end of bar 4 there is a + both a <repeat direction="backward"> and a <ending + type="stop"> element. diff --git a/test-data/musicxml-testsuite/45g-Repeats-NotEnded.png b/test-data/musicxml-testsuite/45g-Repeats-NotEnded.png new file mode 100644 index 000000000..b2d27a65e Binary files /dev/null and b/test-data/musicxml-testsuite/45g-Repeats-NotEnded.png differ diff --git a/test-data/musicxml-testsuite/45g-Repeats-NotEnded.xml b/test-data/musicxml-testsuite/45g-Repeats-NotEnded.xml index c29f6cd38..1ac78cf20 100644 --- a/test-data/musicxml-testsuite/45g-Repeats-NotEnded.xml +++ b/test-data/musicxml-testsuite/45g-Repeats-NotEnded.xml @@ -1,10 +1,10 @@ - - + - A forward-repeating bar line + A forward-repeating bar line without an ending repeat bar. diff --git a/test-data/musicxml-testsuite/45h-Repeats-Partial.png b/test-data/musicxml-testsuite/45h-Repeats-Partial.png new file mode 100644 index 000000000..645300fe3 Binary files /dev/null and b/test-data/musicxml-testsuite/45h-Repeats-Partial.png differ diff --git a/test-data/musicxml-testsuite/45h-Repeats-Partial.xml b/test-data/musicxml-testsuite/45h-Repeats-Partial.xml new file mode 100644 index 000000000..4e7da3452 --- /dev/null +++ b/test-data/musicxml-testsuite/45h-Repeats-Partial.xml @@ -0,0 +1,104 @@ + + + + + + A repeat starting and ending at a + partial bar. The style of the back-to-back bar line is 'heavy-heavy' + (using the MusicXML encoding as exported by + Finale). + + + + + MusicXML Part + + + + + + + 1 + + 0 + major + + + + G + 2 + + + + + C + 5 + + 1 + 1 + quarter + + + + + + + C + 5 + + 4 + 1 + whole + + + + + + + C + 5 + + 3 + 1 + half + + + + heavy-heavy + + + + + + + + + + + C + 5 + + 1 + 1 + quarter + + + + + + + C + 5 + + 4 + 1 + whole + + + + + diff --git a/test-data/musicxml-testsuite/45i-Repeats-Nested.png b/test-data/musicxml-testsuite/45i-Repeats-Nested.png new file mode 100644 index 000000000..91b63a2af Binary files /dev/null and b/test-data/musicxml-testsuite/45i-Repeats-Nested.png differ diff --git a/test-data/musicxml-testsuite/45i-Repeats-Nested.xml b/test-data/musicxml-testsuite/45i-Repeats-Nested.xml new file mode 100644 index 000000000..0f63eb3fa --- /dev/null +++ b/test-data/musicxml-testsuite/45i-Repeats-Nested.xml @@ -0,0 +1,149 @@ + + + + + + A repeat with two + alternative endings. In the first one (enclosing bar 2 to bar 4), + there is a nested repeat enclosing bar 3. In the second one (from + bar 5 to bar 6), there is another nested repeat starting also at bar 5 + but ending already at the same bar. + + + + + MusicXML Part + + + + + + + 1 + + 0 + major + + + + G + 2 + + + + + C + 5 + + 4 + 1 + whole + + + + + + + + + + C + 5 + + 4 + 1 + whole + + + + + + heavy-light + + + + + C + 5 + + 4 + 1 + whole + + + light-heavy + + + + + + + + C + 5 + + 4 + 1 + whole + + + + + + + + + + + + + + + C + 5 + + 4 + 1 + whole + + + + + + + + + + C + 5 + + 4 + 1 + whole + + + + + + + + + + C + 5 + + 4 + 1 + whole + + + light-heavy + + + + + diff --git a/test-data/musicxml-testsuite/46a-Barlines.png b/test-data/musicxml-testsuite/46a-Barlines.png new file mode 100644 index 000000000..d280f0542 Binary files /dev/null and b/test-data/musicxml-testsuite/46a-Barlines.png differ diff --git a/test-data/musicxml-testsuite/46a-Barlines.xml b/test-data/musicxml-testsuite/46a-Barlines.xml index 814a5b425..617e96093 100644 --- a/test-data/musicxml-testsuite/46a-Barlines.xml +++ b/test-data/musicxml-testsuite/46a-Barlines.xml @@ -1,12 +1,12 @@ - - + - Different types of (non-repeat) + Different types of (non-repeat) barlines: default (no setting), regular, dotted, dashed, heavy, - light-light, light-heavy, heavy-light, heavy-heavy, tick, short, + light-light, light-heavy, heavy-light, heavy-heavy, tick, short, none. diff --git a/test-data/musicxml-testsuite/46b-MidmeasureBarline.png b/test-data/musicxml-testsuite/46b-MidmeasureBarline.png new file mode 100644 index 000000000..3e4077797 Binary files /dev/null and b/test-data/musicxml-testsuite/46b-MidmeasureBarline.png differ diff --git a/test-data/musicxml-testsuite/46b-MidmeasureBarline.xml b/test-data/musicxml-testsuite/46b-MidmeasureBarline.xml index c4517e6cc..15a3608f5 100644 --- a/test-data/musicxml-testsuite/46b-MidmeasureBarline.xml +++ b/test-data/musicxml-testsuite/46b-MidmeasureBarline.xml @@ -1,10 +1,10 @@ - - + + - Barlines can appear at + Barlines can appear at mid-measure positions, without using an implicit measure! @@ -13,9 +13,9 @@ - + - + 1 @@ -60,7 +60,7 @@ quarter - + - + diff --git a/test-data/musicxml-testsuite/46c-Midmeasure-Clef.png b/test-data/musicxml-testsuite/46c-Midmeasure-Clef.png new file mode 100644 index 000000000..9714c6e0a Binary files /dev/null and b/test-data/musicxml-testsuite/46c-Midmeasure-Clef.png differ diff --git a/test-data/musicxml-testsuite/46c-Midmeasure-Clef.xml b/test-data/musicxml-testsuite/46c-Midmeasure-Clef.xml index 548d105b3..ab47dd7e4 100644 --- a/test-data/musicxml-testsuite/46c-Midmeasure-Clef.xml +++ b/test-data/musicxml-testsuite/46c-Midmeasure-Clef.xml @@ -1,11 +1,11 @@ - - + - A clef change in the middle of a - measure, using either an implicit measure or simply placing + A clef change in the middle of a + measure, using either an implicit measure or simply placing the attributes in the middle of the measure. diff --git a/test-data/musicxml-testsuite/46d-PickupMeasure-ImplicitMeasures.png b/test-data/musicxml-testsuite/46d-PickupMeasure-ImplicitMeasures.png new file mode 100644 index 000000000..46b50b2a4 Binary files /dev/null and b/test-data/musicxml-testsuite/46d-PickupMeasure-ImplicitMeasures.png differ diff --git a/test-data/musicxml-testsuite/46d-PickupMeasure-ImplicitMeasures.xml b/test-data/musicxml-testsuite/46d-PickupMeasure-ImplicitMeasures.xml index 337fa9ed1..827e1c6c2 100644 --- a/test-data/musicxml-testsuite/46d-PickupMeasure-ImplicitMeasures.xml +++ b/test-data/musicxml-testsuite/46d-PickupMeasure-ImplicitMeasures.xml @@ -1,11 +1,11 @@ - - + - A 3/8 pickup measure, a measure - that is split into one (incomplete, only 2/4) measure and an implicit + A 3/8 pickup measure, a measure + that is split into one (incomplete, only 2/4) measure and an implicit measure, and an incomplete measure (containg 3/4). diff --git a/test-data/musicxml-testsuite/46e-PickupMeasure-SecondVoiceStartsLater.png b/test-data/musicxml-testsuite/46e-PickupMeasure-SecondVoiceStartsLater.png new file mode 100644 index 000000000..4cecb758b Binary files /dev/null and b/test-data/musicxml-testsuite/46e-PickupMeasure-SecondVoiceStartsLater.png differ diff --git a/test-data/musicxml-testsuite/46e-PickupMeasure-SecondVoiceStartsLater.xml b/test-data/musicxml-testsuite/46e-PickupMeasure-SecondVoiceStartsLater.xml index 4dd9631b1..47bad77e5 100644 --- a/test-data/musicxml-testsuite/46e-PickupMeasure-SecondVoiceStartsLater.xml +++ b/test-data/musicxml-testsuite/46e-PickupMeasure-SecondVoiceStartsLater.xml @@ -1,10 +1,10 @@ - - + + - Voice 2 should start at 2nd + Voice 2 should start at 2nd beat of first full measure. @@ -13,7 +13,7 @@ - + @@ -29,7 +29,7 @@ quarter - + 1 @@ -83,7 +83,7 @@ quarter - + - + diff --git a/test-data/musicxml-testsuite/46f-IncompleteMeasures.png b/test-data/musicxml-testsuite/46f-IncompleteMeasures.png new file mode 100644 index 000000000..7b75b14ad Binary files /dev/null and b/test-data/musicxml-testsuite/46f-IncompleteMeasures.png differ diff --git a/test-data/musicxml-testsuite/46f-IncompleteMeasures.xml b/test-data/musicxml-testsuite/46f-IncompleteMeasures.xml index d16a4638f..eb931c340 100644 --- a/test-data/musicxml-testsuite/46f-IncompleteMeasures.xml +++ b/test-data/musicxml-testsuite/46f-IncompleteMeasures.xml @@ -1,10 +1,11 @@ - - + + Measures can contain less notes - than the time signature says. Here, the first and third measures + than the time signature says. Here, the first and third measures contain only two quarters instead of four. diff --git a/test-data/musicxml-testsuite/46g-PickupMeasure-Chordnames-FiguredBass.png b/test-data/musicxml-testsuite/46g-PickupMeasure-Chordnames-FiguredBass.png new file mode 100644 index 000000000..d17d8ba05 Binary files /dev/null and b/test-data/musicxml-testsuite/46g-PickupMeasure-Chordnames-FiguredBass.png differ diff --git a/test-data/musicxml-testsuite/46g-PickupMeasure-Chordnames-FiguredBass.xml b/test-data/musicxml-testsuite/46g-PickupMeasure-Chordnames-FiguredBass.xml index 99af4c684..0adf85c66 100644 --- a/test-data/musicxml-testsuite/46g-PickupMeasure-Chordnames-FiguredBass.xml +++ b/test-data/musicxml-testsuite/46g-PickupMeasure-Chordnames-FiguredBass.xml @@ -1,9 +1,10 @@ - - + + - Pickup measure with chord names + Pickup measure with chord names and figured bass. diff --git a/test-data/musicxml-testsuite/51b-Header-Quotes.png b/test-data/musicxml-testsuite/51b-Header-Quotes.png new file mode 100644 index 000000000..c6fdb631e Binary files /dev/null and b/test-data/musicxml-testsuite/51b-Header-Quotes.png differ diff --git a/test-data/musicxml-testsuite/51b-Header-Quotes.xml b/test-data/musicxml-testsuite/51b-Header-Quotes.xml index 544bb5af1..ee4abfb29 100644 --- a/test-data/musicxml-testsuite/51b-Header-Quotes.xml +++ b/test-data/musicxml-testsuite/51b-Header-Quotes.xml @@ -1,7 +1,7 @@ - - + "Quotes" in header fields Some "Tester" Name @@ -11,8 +11,8 @@ 2008-02-06 - Several header fields and part - names can contain quotes ("). This test checks whether they are + Several header fields and part + names can contain quotes ("). This test checks whether they are converted/imported without problems (i.e. whether they are correctly escaped when converting). diff --git a/test-data/musicxml-testsuite/51c-MultipleRights.png b/test-data/musicxml-testsuite/51c-MultipleRights.png new file mode 100644 index 000000000..2f7de1c2e Binary files /dev/null and b/test-data/musicxml-testsuite/51c-MultipleRights.png differ diff --git a/test-data/musicxml-testsuite/51c-MultipleRights.xml b/test-data/musicxml-testsuite/51c-MultipleRights.xml index 40102cd09..1c66b8294 100644 --- a/test-data/musicxml-testsuite/51c-MultipleRights.xml +++ b/test-data/musicxml-testsuite/51c-MultipleRights.xml @@ -1,14 +1,15 @@ - - - + + + Copyright © XXXX by Y. ZZZZ. Released To The Public Domain. - There can be multiple - <rights> tags in the identification element of the score. The - conversion shall still work, ideally using both of - them. + There can be multiple + <rights> tags in the identification element of the score. The + conversion shall still work, ideally using both of + them. diff --git a/test-data/musicxml-testsuite/51d-EmptyTitle.png b/test-data/musicxml-testsuite/51d-EmptyTitle.png new file mode 100644 index 000000000..175502c94 Binary files /dev/null and b/test-data/musicxml-testsuite/51d-EmptyTitle.png differ diff --git a/test-data/musicxml-testsuite/51d-EmptyTitle.xml b/test-data/musicxml-testsuite/51d-EmptyTitle.xml index 49a089bf7..44d9e62ff 100644 --- a/test-data/musicxml-testsuite/51d-EmptyTitle.xml +++ b/test-data/musicxml-testsuite/51d-EmptyTitle.xml @@ -1,7 +1,7 @@ - - + diff --git a/test-data/musicxml-testsuite/52a-PageLayout.png b/test-data/musicxml-testsuite/52a-PageLayout.png new file mode 100644 index 000000000..ad1db4060 Binary files /dev/null and b/test-data/musicxml-testsuite/52a-PageLayout.png differ diff --git a/test-data/musicxml-testsuite/52a-PageLayout.xml b/test-data/musicxml-testsuite/52a-PageLayout.xml index 330b9713b..a439b36f3 100644 --- a/test-data/musicxml-testsuite/52a-PageLayout.xml +++ b/test-data/musicxml-testsuite/52a-PageLayout.xml @@ -1,12 +1,12 @@ - - + Layout options - Several page layout settings: - paper size, margins, system margins and distances, different fonts, + Several page layout settings: + paper size, margins, system margins and distances, different fonts, etc. @@ -78,6 +78,16 @@ + + + Medium size + + + + + Large size + + 4 diff --git a/test-data/musicxml-testsuite/52b-Breaks.png b/test-data/musicxml-testsuite/52b-Breaks.png new file mode 100644 index 000000000..529b0abad Binary files /dev/null and b/test-data/musicxml-testsuite/52b-Breaks.png differ diff --git a/test-data/musicxml-testsuite/52b-Breaks.xml b/test-data/musicxml-testsuite/52b-Breaks.xml index 623261829..1809794be 100644 --- a/test-data/musicxml-testsuite/52b-Breaks.xml +++ b/test-data/musicxml-testsuite/52b-Breaks.xml @@ -1,11 +1,11 @@ - - + - System and page breaks, given in - a <print> element + System and page breaks, given in + a <print> element diff --git a/test-data/musicxml-testsuite/61a-Lyrics.png b/test-data/musicxml-testsuite/61a-Lyrics.png new file mode 100644 index 000000000..d257a92cb Binary files /dev/null and b/test-data/musicxml-testsuite/61a-Lyrics.png differ diff --git a/test-data/musicxml-testsuite/61a-Lyrics.xml b/test-data/musicxml-testsuite/61a-Lyrics.xml index 69642ea87..a68e1b410 100644 --- a/test-data/musicxml-testsuite/61a-Lyrics.xml +++ b/test-data/musicxml-testsuite/61a-Lyrics.xml @@ -1,12 +1,12 @@ - - + - Some notes with simple lyrics: - Syllables, notes without a syllable, syllable - spanners. + Some notes with simple lyrics: + Syllables, notes without a syllable, syllable + spanners. diff --git a/test-data/musicxml-testsuite/61b-MultipleLyrics.png b/test-data/musicxml-testsuite/61b-MultipleLyrics.png new file mode 100644 index 000000000..e90c6ab8c Binary files /dev/null and b/test-data/musicxml-testsuite/61b-MultipleLyrics.png differ diff --git a/test-data/musicxml-testsuite/61b-MultipleLyrics.xml b/test-data/musicxml-testsuite/61b-MultipleLyrics.xml index 5f9334d2c..ba92e9605 100644 --- a/test-data/musicxml-testsuite/61b-MultipleLyrics.xml +++ b/test-data/musicxml-testsuite/61b-MultipleLyrics.xml @@ -1,11 +1,11 @@ - - + - Multiple (simple) lyrics. The - order of the exported stanzas is relevant (identified by the number + Multiple (simple) lyrics. The + order of the exported stanzas is relevant (identified by the number attribute in this test case) @@ -46,11 +46,11 @@ begin - 2.tra + 2.-4./5. tra - + begin - 3.TRA + 6., 7.TRA @@ -69,7 +69,7 @@ middle la - + middle LA @@ -90,7 +90,7 @@ end la, - + end LA, @@ -113,7 +113,7 @@ ja! - + single JA! @@ -147,7 +147,7 @@ begin Tra - + begin TRA @@ -177,7 +177,7 @@ end ra. - + end RA... diff --git a/test-data/musicxml-testsuite/61c-Lyrics-Pianostaff.png b/test-data/musicxml-testsuite/61c-Lyrics-Pianostaff.png new file mode 100644 index 000000000..b5ef034a5 Binary files /dev/null and b/test-data/musicxml-testsuite/61c-Lyrics-Pianostaff.png differ diff --git a/test-data/musicxml-testsuite/61c-Lyrics-Pianostaff.xml b/test-data/musicxml-testsuite/61c-Lyrics-Pianostaff.xml index ca5b8e6b5..59f7107e5 100644 --- a/test-data/musicxml-testsuite/61c-Lyrics-Pianostaff.xml +++ b/test-data/musicxml-testsuite/61c-Lyrics-Pianostaff.xml @@ -1,11 +1,11 @@ - - + - Lyrics assigned to the voices of - a piano staff containing two simple staves. Each staff is assigned + Lyrics assigned to the voices of + a piano staff containing two simple staves. Each staff is assigned exactly one lyrics line. diff --git a/test-data/musicxml-testsuite/61d-Lyrics-Melisma.png b/test-data/musicxml-testsuite/61d-Lyrics-Melisma.png new file mode 100644 index 000000000..34795e2d3 Binary files /dev/null and b/test-data/musicxml-testsuite/61d-Lyrics-Melisma.png differ diff --git a/test-data/musicxml-testsuite/61d-Lyrics-Melisma.xml b/test-data/musicxml-testsuite/61d-Lyrics-Melisma.xml index 9258058c0..442c77eef 100644 --- a/test-data/musicxml-testsuite/61d-Lyrics-Melisma.xml +++ b/test-data/musicxml-testsuite/61d-Lyrics-Melisma.xml @@ -1,11 +1,11 @@ - - + - How to treat lyrics and slurred - notes. Normally, a slurred group of notes is assigned only one lyrics + How to treat lyrics and slurred + notes. Normally, a slurred group of notes is assigned only one lyrics syllable. diff --git a/test-data/musicxml-testsuite/61e-Lyrics-Chords.png b/test-data/musicxml-testsuite/61e-Lyrics-Chords.png new file mode 100644 index 000000000..84ed763a3 Binary files /dev/null and b/test-data/musicxml-testsuite/61e-Lyrics-Chords.png differ diff --git a/test-data/musicxml-testsuite/61e-Lyrics-Chords.xml b/test-data/musicxml-testsuite/61e-Lyrics-Chords.xml index 945a31d43..bf39b989e 100644 --- a/test-data/musicxml-testsuite/61e-Lyrics-Chords.xml +++ b/test-data/musicxml-testsuite/61e-Lyrics-Chords.xml @@ -1,10 +1,10 @@ - - + - Assigning lyrics to chorded + Assigning lyrics to chorded notes. diff --git a/test-data/musicxml-testsuite/61f-Lyrics-GracedNotes.png b/test-data/musicxml-testsuite/61f-Lyrics-GracedNotes.png new file mode 100644 index 000000000..c6c6df912 Binary files /dev/null and b/test-data/musicxml-testsuite/61f-Lyrics-GracedNotes.png differ diff --git a/test-data/musicxml-testsuite/61f-Lyrics-GracedNotes.xml b/test-data/musicxml-testsuite/61f-Lyrics-GracedNotes.xml index b577b2e0b..4938fc126 100644 --- a/test-data/musicxml-testsuite/61f-Lyrics-GracedNotes.xml +++ b/test-data/musicxml-testsuite/61f-Lyrics-GracedNotes.xml @@ -1,11 +1,12 @@ - - + - Grace notes shall not mess up the - lyrics, and they shall not be assigned a syllable. + Grace notes shall not mess up the + lyrics, and they shall not be assigned to a + syllable. @@ -87,12 +88,8 @@ D 5 - 1 eighth - - - @@ -116,12 +113,8 @@ 5 2 - 1 quarter - - - single notes @@ -134,13 +127,9 @@ E 5 - 1 eighth begin - - - @@ -158,12 +147,8 @@ 5 2 - 1 quarter - - - diff --git a/test-data/musicxml-testsuite/61g-Lyrics-NameNumber.png b/test-data/musicxml-testsuite/61g-Lyrics-NameNumber.png new file mode 100644 index 000000000..24ffcf471 Binary files /dev/null and b/test-data/musicxml-testsuite/61g-Lyrics-NameNumber.png differ diff --git a/test-data/musicxml-testsuite/61g-Lyrics-NameNumber.xml b/test-data/musicxml-testsuite/61g-Lyrics-NameNumber.xml index 1999d07db..4425bce9f 100644 --- a/test-data/musicxml-testsuite/61g-Lyrics-NameNumber.xml +++ b/test-data/musicxml-testsuite/61g-Lyrics-NameNumber.xml @@ -1,15 +1,15 @@ - - + - A lyrics syllable can have both - a number and a name attribute. The question is: What should be used - to put syllables of the same voice together. This example uses - different number/name combinations to check how different - applications handle this unspecified case (The advice on the - MusicXML mailing list was "there is no correct way, each + A lyrics syllable can have both + a number and a name attribute. The question is: What should be used + to put syllables of the same voice together. This example uses + different number/name combinations to check how different + applications handle this unspecified case (The advice on the + MusicXML mailing list was "there is no correct way, each application can do what it thinks is best"). @@ -36,20 +36,20 @@ 1 quarter - begin + single Verse1A - begin + single Chorus1A - begin + single AnotherChorus1A - begin - Chorus1A + single + Chorus2A @@ -58,11 +58,11 @@ 1 quarter - begin + single 1B - begin + single 2B @@ -72,11 +72,11 @@ 1 quarter - begin + single Verse1C - begin + single Chorus2C @@ -86,7 +86,7 @@ 1 quarter - begin + single Chorus1D @@ -96,7 +96,7 @@ 1 quarter - begin + single VerseE @@ -106,7 +106,7 @@ 1 quarter - begin + single NoneF diff --git a/test-data/musicxml-testsuite/61h-Lyrics-BeamsMelismata.png b/test-data/musicxml-testsuite/61h-Lyrics-BeamsMelismata.png new file mode 100644 index 000000000..fab8ca9c2 Binary files /dev/null and b/test-data/musicxml-testsuite/61h-Lyrics-BeamsMelismata.png differ diff --git a/test-data/musicxml-testsuite/61h-Lyrics-BeamsMelismata.xml b/test-data/musicxml-testsuite/61h-Lyrics-BeamsMelismata.xml index 0edcc5f2c..8bc69a01b 100644 --- a/test-data/musicxml-testsuite/61h-Lyrics-BeamsMelismata.xml +++ b/test-data/musicxml-testsuite/61h-Lyrics-BeamsMelismata.xml @@ -1,12 +1,17 @@ - - + - Beaming or slurs can indicate - melismata for lyrics. Also make sure that notes without an explicit - syllable are treated as if they were part of a melisma. + Beaming or slurs can indicate + melismata for lyrics. Also make sure that notes without an explicit + syllable are treated as if they were part of a + melisma. + + In the second bar, ‘start’, ‘continue’, and ‘stop’ types are used for + <extend>, together with a red color for the extender + line. @@ -130,7 +135,7 @@ end ma - + @@ -138,12 +143,18 @@ 1 1 eighth + + + B4 1 1 eighth + + + diff --git a/test-data/musicxml-testsuite/61i-Lyrics-Chords.png b/test-data/musicxml-testsuite/61i-Lyrics-Chords.png new file mode 100644 index 000000000..55d016d16 Binary files /dev/null and b/test-data/musicxml-testsuite/61i-Lyrics-Chords.png differ diff --git a/test-data/musicxml-testsuite/61i-Lyrics-Chords.xml b/test-data/musicxml-testsuite/61i-Lyrics-Chords.xml index 8f3db1e1a..a26c5a6a8 100644 --- a/test-data/musicxml-testsuite/61i-Lyrics-Chords.xml +++ b/test-data/musicxml-testsuite/61i-Lyrics-Chords.xml @@ -1,14 +1,14 @@ - - + Each note of a chord can have - some lyrics attached. In this case, each note of the chord has lyrics - of the form "Lyrics [123]" attached, where each lyrics has a different - number attribute to distinguish them. These syllables should be - imported into three different stanzas and the timing should be + some lyrics attached. In this case, each note of the chord has lyrics + of the form "Lyrics [123]" attached, where each lyrics has a different + number attribute to distinguish them. These syllables should be + imported into three different stanzas and the timing should be correct. diff --git a/test-data/musicxml-testsuite/61j-Lyrics-Elisions.png b/test-data/musicxml-testsuite/61j-Lyrics-Elisions.png new file mode 100644 index 000000000..31e937445 Binary files /dev/null and b/test-data/musicxml-testsuite/61j-Lyrics-Elisions.png differ diff --git a/test-data/musicxml-testsuite/61j-Lyrics-Elisions.xml b/test-data/musicxml-testsuite/61j-Lyrics-Elisions.xml index fd76590df..e0cacf03c 100644 --- a/test-data/musicxml-testsuite/61j-Lyrics-Elisions.xml +++ b/test-data/musicxml-testsuite/61j-Lyrics-Elisions.xml @@ -1,16 +1,21 @@ - - + - Multiple lyrics syllables - assigned to a single note are implemented either using a space in - the lyrics or by using the <elision> lyrics element. This - testcase checks both of them. First, a note with on syllable is - given, then a note with two syllables separated by a spcae and finally - a note with two and one with three syllables implemented using - <elision> is given. + Multiple lyrics syllables assigned + to a single note are implemented either using a space in the lyrics' + <text> element or by using <elision>. + + The first note has a single syllable, the second note has two + syllables separated by a space, the third has two syllables with + <elision> set to an undertie, and the fourth has three + syllables (the first and third one in red, and the second one + being in italic and overriding the color with blue), with a green + undertie between the first and second syllable and an empty + <elision> element between the second and third syllable, causing + an application-specific elision glyph. @@ -41,51 +46,60 @@ C 5 - 1 + 4 1 - quarter + whole a + + + C 5 - 1 + 4 1 - quarter + whole b c + + + C 5 - 1 + 4 1 - quarter + whole d - + e + + + C 5 - 1 + 4 1 - quarter - + whole + f - - g + + g h diff --git a/test-data/musicxml-testsuite/61k-Lyrics-SpannersExtenders.png b/test-data/musicxml-testsuite/61k-Lyrics-SpannersExtenders.png new file mode 100644 index 000000000..d88ac9f59 Binary files /dev/null and b/test-data/musicxml-testsuite/61k-Lyrics-SpannersExtenders.png differ diff --git a/test-data/musicxml-testsuite/61k-Lyrics-SpannersExtenders.xml b/test-data/musicxml-testsuite/61k-Lyrics-SpannersExtenders.xml index 22354d82a..39522be26 100644 --- a/test-data/musicxml-testsuite/61k-Lyrics-SpannersExtenders.xml +++ b/test-data/musicxml-testsuite/61k-Lyrics-SpannersExtenders.xml @@ -1,13 +1,13 @@ - - + - Lyrics spanners: continued - syllables and extenders, possibly spanning multiple notes. The - intermediate notes do not have any <lyric> - element. + Lyrics spanners: continued + syllables and extenders, possibly spanning multiple notes. The + intermediate notes do not have any <lyric> + element. diff --git a/test-data/musicxml-testsuite/71a-Chordnames.png b/test-data/musicxml-testsuite/71a-Chordnames.png new file mode 100644 index 000000000..24e213547 Binary files /dev/null and b/test-data/musicxml-testsuite/71a-Chordnames.png differ diff --git a/test-data/musicxml-testsuite/71a-Chordnames.xml b/test-data/musicxml-testsuite/71a-Chordnames.xml index f7339048f..a2daa1e65 100644 --- a/test-data/musicxml-testsuite/71a-Chordnames.xml +++ b/test-data/musicxml-testsuite/71a-Chordnames.xml @@ -1,10 +1,10 @@ - - + - A normal staff with several + A normal staff with several (complex) chord names displayed. diff --git a/test-data/musicxml-testsuite/71c-ChordsFrets.png b/test-data/musicxml-testsuite/71c-ChordsFrets.png new file mode 100644 index 000000000..b3aa7143e Binary files /dev/null and b/test-data/musicxml-testsuite/71c-ChordsFrets.png differ diff --git a/test-data/musicxml-testsuite/71c-ChordsFrets.xml b/test-data/musicxml-testsuite/71c-ChordsFrets.xml index cb882c2c6..dde80bded 100644 --- a/test-data/musicxml-testsuite/71c-ChordsFrets.xml +++ b/test-data/musicxml-testsuite/71c-ChordsFrets.xml @@ -1,12 +1,12 @@ - - + - A staff with chord names and some - fretboards shown. The fretboards can have an arbitrary number of - frets/strings, can start at an arbitrary fret and can even contain + A staff with chord names and some + fretboards shown. The fretboards can have an arbitrary number of + frets/strings, can start at an arbitrary fret and can even contain fingering information. diff --git a/test-data/musicxml-testsuite/71d-ChordsFrets-Multistaff.png b/test-data/musicxml-testsuite/71d-ChordsFrets-Multistaff.png new file mode 100644 index 000000000..f47104a11 Binary files /dev/null and b/test-data/musicxml-testsuite/71d-ChordsFrets-Multistaff.png differ diff --git a/test-data/musicxml-testsuite/71d-ChordsFrets-Multistaff.xml b/test-data/musicxml-testsuite/71d-ChordsFrets-Multistaff.xml index 7b4eab254..5b6c72162 100644 --- a/test-data/musicxml-testsuite/71d-ChordsFrets-Multistaff.xml +++ b/test-data/musicxml-testsuite/71d-ChordsFrets-Multistaff.xml @@ -1,11 +1,11 @@ - - + - Chords and fretboards assigned to - the voices in a multi-voice, multi-staff part. There should be fret + Chords and fretboards assigned to + the voices in a multi-voice, multi-staff part. There should be fret diagrams above each of the two staves. diff --git a/test-data/musicxml-testsuite/71e-TabStaves.png b/test-data/musicxml-testsuite/71e-TabStaves.png new file mode 100644 index 000000000..ccd881980 Binary files /dev/null and b/test-data/musicxml-testsuite/71e-TabStaves.png differ diff --git a/test-data/musicxml-testsuite/71e-TabStaves.xml b/test-data/musicxml-testsuite/71e-TabStaves.xml index 79fc6131e..8a87f515f 100644 --- a/test-data/musicxml-testsuite/71e-TabStaves.xml +++ b/test-data/musicxml-testsuite/71e-TabStaves.xml @@ -1,7 +1,7 @@ - - + Some tablature staves, with diff --git a/test-data/musicxml-testsuite/71f-AllChordTypes.png b/test-data/musicxml-testsuite/71f-AllChordTypes.png new file mode 100644 index 000000000..2dd6c0b58 Binary files /dev/null and b/test-data/musicxml-testsuite/71f-AllChordTypes.png differ diff --git a/test-data/musicxml-testsuite/71f-AllChordTypes.xml b/test-data/musicxml-testsuite/71f-AllChordTypes.xml index d6abafbb1..885bc9c17 100644 --- a/test-data/musicxml-testsuite/71f-AllChordTypes.xml +++ b/test-data/musicxml-testsuite/71f-AllChordTypes.xml @@ -1,13 +1,13 @@ - - + All MusicXML chord names/types with <root> - All chord types defined in - MusicXML. The staff will only contain one c' note (NO chord) for - all of them, but the chord names should be properly + All chord types defined in + MusicXML. The staff will only contain one c’ note (NO chord) for + all of them, but the chord names should be properly printed. diff --git a/test-data/musicxml-testsuite/71g-MultipleChordnames.png b/test-data/musicxml-testsuite/71g-MultipleChordnames.png new file mode 100644 index 000000000..d49bfbe70 Binary files /dev/null and b/test-data/musicxml-testsuite/71g-MultipleChordnames.png differ diff --git a/test-data/musicxml-testsuite/71g-MultipleChordnames.xml b/test-data/musicxml-testsuite/71g-MultipleChordnames.xml index 6c42cdb2c..7c68275b3 100644 --- a/test-data/musicxml-testsuite/71g-MultipleChordnames.xml +++ b/test-data/musicxml-testsuite/71g-MultipleChordnames.xml @@ -1,6 +1,7 @@ - - + + There can be multiple subsequent diff --git a/test-data/musicxml-testsuite/72a-TransposingInstruments.png b/test-data/musicxml-testsuite/72a-TransposingInstruments.png new file mode 100644 index 000000000..efa7eaade Binary files /dev/null and b/test-data/musicxml-testsuite/72a-TransposingInstruments.png differ diff --git a/test-data/musicxml-testsuite/72a-TransposingInstruments.xml b/test-data/musicxml-testsuite/72a-TransposingInstruments.xml index bbd3ef8c6..e34add8af 100644 --- a/test-data/musicxml-testsuite/72a-TransposingInstruments.xml +++ b/test-data/musicxml-testsuite/72a-TransposingInstruments.xml @@ -1,11 +1,11 @@ - - + - Transposing instruments: Trumpet - in Bb, Horn in Eb, Piano; All of them show the C major scale (the + Transposing instruments: Trumpet + in Bb, Horn in Eb, Piano; All of them show the C major scale (the trumpet with 2 sharp, the horn with 3 sharp). diff --git a/test-data/musicxml-testsuite/72b-TransposingInstruments-Full.png b/test-data/musicxml-testsuite/72b-TransposingInstruments-Full.png new file mode 100644 index 000000000..e44f8dbff Binary files /dev/null and b/test-data/musicxml-testsuite/72b-TransposingInstruments-Full.png differ diff --git a/test-data/musicxml-testsuite/72b-TransposingInstruments-Full.xml b/test-data/musicxml-testsuite/72b-TransposingInstruments-Full.xml index 6a090be0e..948d992fc 100644 --- a/test-data/musicxml-testsuite/72b-TransposingInstruments-Full.xml +++ b/test-data/musicxml-testsuite/72b-TransposingInstruments-Full.xml @@ -1,13 +1,13 @@ - - + Various transposition. Each - part plays a c'', just displayed in different display pitches. - The second-to-last staff uses a transposition where the displayed c' - is an actual f''' concert pitch. The final staff is an untransposed + part plays a c’’, just displayed in different display pitches. + The second-to-last staff uses a transposition where the displayed c’ + is an actual f’’’ concert pitch. The final staff is an untransposed instrument. @@ -49,7 +49,7 @@ D Tpt. - displayed c'=fis''' + displayed c’=fis’’’ MusicXML Part @@ -169,10 +169,6 @@ 1 - - 2 - major - - Clarinet in Eb - Eb Cl. + + + Clarinet in E + flat + + + Cl. (E + flat + ) + @@ -63,8 +75,15 @@ - Clarinet in Bb - Bb Cl. + + Clarinet in B + flat + + + Cl. (B + flat + ) + @@ -77,7 +96,7 @@ - + C diff --git a/test-data/musicxml-testsuite/73a-Percussion.png b/test-data/musicxml-testsuite/73a-Percussion.png new file mode 100644 index 000000000..af708e198 Binary files /dev/null and b/test-data/musicxml-testsuite/73a-Percussion.png differ diff --git a/test-data/musicxml-testsuite/73a-Percussion.xml b/test-data/musicxml-testsuite/73a-Percussion.xml index 9b8d69ce5..573f4df75 100644 --- a/test-data/musicxml-testsuite/73a-Percussion.xml +++ b/test-data/musicxml-testsuite/73a-Percussion.xml @@ -1,12 +1,12 @@ - - + - Three types of percussion staves: - A five-line staff with bass clef for Timpani, a five-line staff with - percussion clef, and a one-line percussion staff with only unpitched + Three types of percussion staves: + A five-line staff with bass clef for Timpani, a five-line staff with + percussion clef, and a one-line percussion staff with only unpitched notes. diff --git a/test-data/musicxml-testsuite/74a-FiguredBass.png b/test-data/musicxml-testsuite/74a-FiguredBass.png new file mode 100644 index 000000000..271f0a8bc Binary files /dev/null and b/test-data/musicxml-testsuite/74a-FiguredBass.png differ diff --git a/test-data/musicxml-testsuite/74a-FiguredBass.xml b/test-data/musicxml-testsuite/74a-FiguredBass.xml index 9ffb8125e..ad00950e4 100644 --- a/test-data/musicxml-testsuite/74a-FiguredBass.xml +++ b/test-data/musicxml-testsuite/74a-FiguredBass.xml @@ -1,14 +1,11 @@ - - + - Some figured bass containing - alterated figures, bracketed figures and slashed figures. The last - note contains an empty <figured-bass> element, which is - invalid MusicXML, to check how well applications cope with malformed - files. + Some figured bass containing + alterated figures, bracketed figures and slashed figures. Note that this file does not contain any extenders! @@ -86,15 +83,6 @@ eighth - - - - - G4 - 8 - 1 - quarter - light-heavy diff --git a/test-data/musicxml-testsuite/75a-AccordionRegistrations.png b/test-data/musicxml-testsuite/75a-AccordionRegistrations.png new file mode 100644 index 000000000..02bc74a7f Binary files /dev/null and b/test-data/musicxml-testsuite/75a-AccordionRegistrations.png differ diff --git a/test-data/musicxml-testsuite/75a-AccordionRegistrations.xml b/test-data/musicxml-testsuite/75a-AccordionRegistrations.xml index 01893680b..af696a7a4 100644 --- a/test-data/musicxml-testsuite/75a-AccordionRegistrations.xml +++ b/test-data/musicxml-testsuite/75a-AccordionRegistrations.xml @@ -1,10 +1,10 @@ - - + - All possible accordion + All possible accordion registrations. @@ -17,8 +17,8 @@ @@ -267,7 +267,7 @@ quarter 1/3/1 - @@ -282,73 +282,6 @@ quarter empty - - - - - - - - - - - - - C4 - 1 - 1 - quarter - empty M - - - - - - test - - - - - - C4 - 1 - 1 - quarter - inval.M - - - - - - 0 - - - - - - C4 - 1 - 1 - quarter - M=0 - - - - - - 5 - - - - - - C4 - 1 - 1 - quarter - M=5 - - light-heavy diff --git a/test-data/musicxml-testsuite/90a-Compressed-MusicXML.mxl b/test-data/musicxml-testsuite/90a-Compressed-MusicXML.mxl new file mode 100644 index 000000000..d70909448 Binary files /dev/null and b/test-data/musicxml-testsuite/90a-Compressed-MusicXML.mxl differ diff --git a/test-data/musicxml-testsuite/90a-Compressed-MusicXML.png b/test-data/musicxml-testsuite/90a-Compressed-MusicXML.png new file mode 100644 index 000000000..4c5784169 Binary files /dev/null and b/test-data/musicxml-testsuite/90a-Compressed-MusicXML.png differ diff --git a/test-data/musicxml-testsuite/99a-Sibelius5-IgnoreBeaming.png b/test-data/musicxml-testsuite/99a-Sibelius5-IgnoreBeaming.png new file mode 100644 index 000000000..487786861 Binary files /dev/null and b/test-data/musicxml-testsuite/99a-Sibelius5-IgnoreBeaming.png differ diff --git a/test-data/musicxml-testsuite/99a-Sibelius5-IgnoreBeaming.xml b/test-data/musicxml-testsuite/99a-Sibelius5-IgnoreBeaming.xml index 1d30c280f..e1b68e41d 100644 --- a/test-data/musicxml-testsuite/99a-Sibelius5-IgnoreBeaming.xml +++ b/test-data/musicxml-testsuite/99a-Sibelius5-IgnoreBeaming.xml @@ -9,9 +9,9 @@ - Dolet 3 for - Sibelius (5.1) did not print out any closing beam - tags, only starting and continuing beam tags. For + Dolet 3 for + Sibelius (5.1) did not print out any closing beam + tags, only starting and continuing beam tags. For such files, one either needs to ignore all beaming information or close all beams @@ -21,7 +21,7 @@ - + @@ -116,7 +116,7 @@ - + - + diff --git a/test-data/musicxml-testsuite/99b-Lyrics-BeamsMelismata-IgnoreBeams.png b/test-data/musicxml-testsuite/99b-Lyrics-BeamsMelismata-IgnoreBeams.png new file mode 100644 index 000000000..fab8ca9c2 Binary files /dev/null and b/test-data/musicxml-testsuite/99b-Lyrics-BeamsMelismata-IgnoreBeams.png differ diff --git a/test-data/musicxml-testsuite/99b-Lyrics-BeamsMelismata-IgnoreBeams.xml b/test-data/musicxml-testsuite/99b-Lyrics-BeamsMelismata-IgnoreBeams.xml index a2626c0f2..d6bdab742 100644 --- a/test-data/musicxml-testsuite/99b-Lyrics-BeamsMelismata-IgnoreBeams.xml +++ b/test-data/musicxml-testsuite/99b-Lyrics-BeamsMelismata-IgnoreBeams.xml @@ -8,9 +8,9 @@ Dolet 3.4 for Sibelius - If we properly ignore all beaming - information from the Dolet 3 for Sibelius export file, make sure that - the lyrics syllables are still assigned to the correct + If we properly ignore all beaming + information from the Dolet 3 for Sibelius export file, make sure that + the lyrics syllables are still assigned to the correct notes. diff --git a/test-data/musicxml-testsuite/LICENSE b/test-data/musicxml-testsuite/LICENSE index b6cebc252..8d8744c30 100644 --- a/test-data/musicxml-testsuite/LICENSE +++ b/test-data/musicxml-testsuite/LICENSE @@ -2,7 +2,7 @@ An (unofficial) MusicXML Test Suite This test suite of MusicXML unit tests is licenced under the MIT license: -Copyright (c) 2008-2010, Reinhold Kainhofer +Copyright (c) 2008--2023, Reinhold Kainhofer Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/test-data/musicxml3/chord-diagram.png b/test-data/musicxml3/chord-diagram.png new file mode 100644 index 000000000..5ff9e30ab Binary files /dev/null and b/test-data/musicxml3/chord-diagram.png differ diff --git a/test-data/musicxml3/compressed.png b/test-data/musicxml3/compressed.png new file mode 100644 index 000000000..1ec61ae27 Binary files /dev/null and b/test-data/musicxml3/compressed.png differ diff --git a/test-data/musicxml3/first-bar-tempo.png b/test-data/musicxml3/first-bar-tempo.png new file mode 100644 index 000000000..f6d9def75 Binary files /dev/null and b/test-data/musicxml3/first-bar-tempo.png differ diff --git a/test-data/musicxml3/full-bar-rest.png b/test-data/musicxml3/full-bar-rest.png new file mode 100644 index 000000000..dc643e59d Binary files /dev/null and b/test-data/musicxml3/full-bar-rest.png differ diff --git a/test-data/musicxml3/tie-destination.png b/test-data/musicxml3/tie-destination.png new file mode 100644 index 000000000..df37c3673 Binary files /dev/null and b/test-data/musicxml3/tie-destination.png differ diff --git a/test-data/musicxml3/track-volume-balance.png b/test-data/musicxml3/track-volume-balance.png new file mode 100644 index 000000000..ed1876966 Binary files /dev/null and b/test-data/musicxml3/track-volume-balance.png differ diff --git a/test-data/musicxml4/bends.png b/test-data/musicxml4/bends.png new file mode 100644 index 000000000..20848de33 Binary files /dev/null and b/test-data/musicxml4/bends.png differ diff --git a/test-data/musicxml-testsuite/100a-Guitare-Bends.xml b/test-data/musicxml4/bends.xml similarity index 100% rename from test-data/musicxml-testsuite/100a-Guitare-Bends.xml rename to test-data/musicxml4/bends.xml diff --git a/test-data/test-results.html b/test-data/test-results.html index 6542120d7..b104158f8 100644 --- a/test-data/test-results.html +++ b/test-data/test-results.html @@ -11,6 +11,7 @@ body { padding: 1rem; font-family: 'Noto Sans', sans-serif; + min-height: 100vh; } .comparer { @@ -65,27 +66,59 @@ left: 0; top: 0; } + .accepted .diff, .accepted .expected, .accepted .actual { border-color: green; } + + .drop-area { + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; + background: rgba(255, 255, 255, 0.5); + display: flex; + justify-content: center; + align-items: center; + display: none; + pointer-events: none; + } + + body.drop .drop-area { + display: flex; + } + + .drop-message { + width: 200px; + height: 200px; + font-weight: bold; + border: 5px dashed #426d9d; + color: #426d9d; + display: flex; + text-align: center; + border-radius: 10px; + justify-content: center; + align-items: center; + padding: 1rem; + }

alphaTab - Visual Test Results

- This page contains any failing visual tests for comparison and acceptance. - Run the visualTests via npm run test or using Mocha for VS Code. + This page contains any failing visual tests for comparison and acceptance. + Run the visualTests via npm run test or using Mocha for VS Code.

- - + + +
+
+ Drop Test-Results Zip to page +
+
\ No newline at end of file diff --git a/test-data/visual-tests/bounds-lookup/onnotes-beat.png b/test-data/visual-tests/bounds-lookup/onnotes-beat.png index 12f4a1ac4..ef374b254 100644 Binary files a/test-data/visual-tests/bounds-lookup/onnotes-beat.png and b/test-data/visual-tests/bounds-lookup/onnotes-beat.png differ diff --git a/test-data/visual-tests/bounds-lookup/real-bar.png b/test-data/visual-tests/bounds-lookup/real-bar.png index 3a758ef79..f05ec1af9 100644 Binary files a/test-data/visual-tests/bounds-lookup/real-bar.png and b/test-data/visual-tests/bounds-lookup/real-bar.png differ diff --git a/test-data/visual-tests/bounds-lookup/real-beat.png b/test-data/visual-tests/bounds-lookup/real-beat.png index 05e8ab3e9..f5d2ae889 100644 Binary files a/test-data/visual-tests/bounds-lookup/real-beat.png and b/test-data/visual-tests/bounds-lookup/real-beat.png differ diff --git a/test-data/visual-tests/bounds-lookup/real-master.png b/test-data/visual-tests/bounds-lookup/real-master.png index bf43d2d2e..76a1c3c3d 100644 Binary files a/test-data/visual-tests/bounds-lookup/real-master.png and b/test-data/visual-tests/bounds-lookup/real-master.png differ diff --git a/test-data/visual-tests/bounds-lookup/real-note.png b/test-data/visual-tests/bounds-lookup/real-note.png index 11f134129..54d81a9d6 100644 Binary files a/test-data/visual-tests/bounds-lookup/real-note.png and b/test-data/visual-tests/bounds-lookup/real-note.png differ diff --git a/test-data/visual-tests/bounds-lookup/real-system.png b/test-data/visual-tests/bounds-lookup/real-system.png index 6e2feb2d8..85774ded0 100644 Binary files a/test-data/visual-tests/bounds-lookup/real-system.png and b/test-data/visual-tests/bounds-lookup/real-system.png differ diff --git a/test-data/visual-tests/bounds-lookup/visual-bar.png b/test-data/visual-tests/bounds-lookup/visual-bar.png index f33b28219..08c2a64ce 100644 Binary files a/test-data/visual-tests/bounds-lookup/visual-bar.png and b/test-data/visual-tests/bounds-lookup/visual-bar.png differ diff --git a/test-data/visual-tests/bounds-lookup/visual-beat.png b/test-data/visual-tests/bounds-lookup/visual-beat.png index c437eb880..f6643b421 100644 Binary files a/test-data/visual-tests/bounds-lookup/visual-beat.png and b/test-data/visual-tests/bounds-lookup/visual-beat.png differ diff --git a/test-data/visual-tests/bounds-lookup/visual-master.png b/test-data/visual-tests/bounds-lookup/visual-master.png index 4fa36d922..885d5a8d7 100644 Binary files a/test-data/visual-tests/bounds-lookup/visual-master.png and b/test-data/visual-tests/bounds-lookup/visual-master.png differ diff --git a/test-data/visual-tests/bounds-lookup/visual-note.png b/test-data/visual-tests/bounds-lookup/visual-note.png index 11f134129..54d81a9d6 100644 Binary files a/test-data/visual-tests/bounds-lookup/visual-note.png and b/test-data/visual-tests/bounds-lookup/visual-note.png differ diff --git a/test-data/visual-tests/bounds-lookup/visual-system.png b/test-data/visual-tests/bounds-lookup/visual-system.png index e8661fcb6..2e1331e22 100644 Binary files a/test-data/visual-tests/bounds-lookup/visual-system.png and b/test-data/visual-tests/bounds-lookup/visual-system.png differ diff --git a/test-data/visual-tests/effects-and-annotations/brush.png b/test-data/visual-tests/effects-and-annotations/brush.png index 58e5c262b..b6cb0755f 100644 Binary files a/test-data/visual-tests/effects-and-annotations/brush.png and b/test-data/visual-tests/effects-and-annotations/brush.png differ diff --git a/test-data/visual-tests/effects-and-annotations/chords.png b/test-data/visual-tests/effects-and-annotations/chords.png index 37bdf45bf..5f6bb8c56 100644 Binary files a/test-data/visual-tests/effects-and-annotations/chords.png and b/test-data/visual-tests/effects-and-annotations/chords.png differ diff --git a/test-data/visual-tests/effects-and-annotations/dynamics.png b/test-data/visual-tests/effects-and-annotations/dynamics.png index 6dff82296..df4db1f4f 100644 Binary files a/test-data/visual-tests/effects-and-annotations/dynamics.png and b/test-data/visual-tests/effects-and-annotations/dynamics.png differ diff --git a/test-data/visual-tests/effects-and-annotations/fade-in.png b/test-data/visual-tests/effects-and-annotations/fade-in.png index 14cec4e10..4791389a9 100644 Binary files a/test-data/visual-tests/effects-and-annotations/fade-in.png and b/test-data/visual-tests/effects-and-annotations/fade-in.png differ diff --git a/test-data/visual-tests/effects-and-annotations/fingering.png b/test-data/visual-tests/effects-and-annotations/fingering.png index d58a8e6f1..cb165ce0d 100644 Binary files a/test-data/visual-tests/effects-and-annotations/fingering.png and b/test-data/visual-tests/effects-and-annotations/fingering.png differ diff --git a/test-data/visual-tests/effects-and-annotations/legato.png b/test-data/visual-tests/effects-and-annotations/legato.png index 75d43cd24..67033306e 100644 Binary files a/test-data/visual-tests/effects-and-annotations/legato.png and b/test-data/visual-tests/effects-and-annotations/legato.png differ diff --git a/test-data/visual-tests/effects-and-annotations/let-ring.png b/test-data/visual-tests/effects-and-annotations/let-ring.png index f12a2b23b..9cc8cc088 100644 Binary files a/test-data/visual-tests/effects-and-annotations/let-ring.png and b/test-data/visual-tests/effects-and-annotations/let-ring.png differ diff --git a/test-data/visual-tests/effects-and-annotations/palm-mute.png b/test-data/visual-tests/effects-and-annotations/palm-mute.png index f25c7a1ad..6bc364144 100644 Binary files a/test-data/visual-tests/effects-and-annotations/palm-mute.png and b/test-data/visual-tests/effects-and-annotations/palm-mute.png differ diff --git a/test-data/visual-tests/effects-and-annotations/pick-stroke.png b/test-data/visual-tests/effects-and-annotations/pick-stroke.png index ee60035be..15f38f849 100644 Binary files a/test-data/visual-tests/effects-and-annotations/pick-stroke.png and b/test-data/visual-tests/effects-and-annotations/pick-stroke.png differ diff --git a/test-data/visual-tests/effects-and-annotations/slides-line-break.png b/test-data/visual-tests/effects-and-annotations/slides-line-break.png index 1edf87af7..f0282a201 100644 Binary files a/test-data/visual-tests/effects-and-annotations/slides-line-break.png and b/test-data/visual-tests/effects-and-annotations/slides-line-break.png differ diff --git a/test-data/visual-tests/effects-and-annotations/slides.png b/test-data/visual-tests/effects-and-annotations/slides.png index c887acfb0..5ceb687b1 100644 Binary files a/test-data/visual-tests/effects-and-annotations/slides.png and b/test-data/visual-tests/effects-and-annotations/slides.png differ diff --git a/test-data/visual-tests/effects-and-annotations/tap.png b/test-data/visual-tests/effects-and-annotations/tap.png index 67b358ab6..2172ec8ee 100644 Binary files a/test-data/visual-tests/effects-and-annotations/tap.png and b/test-data/visual-tests/effects-and-annotations/tap.png differ diff --git a/test-data/visual-tests/effects-and-annotations/tempo-text.png b/test-data/visual-tests/effects-and-annotations/tempo-text.png index 9d16acc22..8094488f2 100644 Binary files a/test-data/visual-tests/effects-and-annotations/tempo-text.png and b/test-data/visual-tests/effects-and-annotations/tempo-text.png differ diff --git a/test-data/visual-tests/effects-and-annotations/text.png b/test-data/visual-tests/effects-and-annotations/text.png index 5f4214285..a17a0cd3a 100644 Binary files a/test-data/visual-tests/effects-and-annotations/text.png and b/test-data/visual-tests/effects-and-annotations/text.png differ diff --git a/test-data/visual-tests/effects-and-annotations/timer.png b/test-data/visual-tests/effects-and-annotations/timer.png index f5e487172..533b81a0f 100644 Binary files a/test-data/visual-tests/effects-and-annotations/timer.png and b/test-data/visual-tests/effects-and-annotations/timer.png differ diff --git a/test-data/visual-tests/effects-and-annotations/tremolo-picking.png b/test-data/visual-tests/effects-and-annotations/tremolo-picking.png index 017b07e65..cc08e0814 100644 Binary files a/test-data/visual-tests/effects-and-annotations/tremolo-picking.png and b/test-data/visual-tests/effects-and-annotations/tremolo-picking.png differ diff --git a/test-data/visual-tests/effects-and-annotations/trill.png b/test-data/visual-tests/effects-and-annotations/trill.png index e2a7320a8..e2bb5c491 100644 Binary files a/test-data/visual-tests/effects-and-annotations/trill.png and b/test-data/visual-tests/effects-and-annotations/trill.png differ diff --git a/test-data/visual-tests/effects-and-annotations/triplet-feel.png b/test-data/visual-tests/effects-and-annotations/triplet-feel.png index 0a8eeebc2..159fff51d 100644 Binary files a/test-data/visual-tests/effects-and-annotations/triplet-feel.png and b/test-data/visual-tests/effects-and-annotations/triplet-feel.png differ diff --git a/test-data/visual-tests/effects-and-annotations/tuplets.png b/test-data/visual-tests/effects-and-annotations/tuplets.png index b2b1c176f..6fb79cea6 100644 Binary files a/test-data/visual-tests/effects-and-annotations/tuplets.png and b/test-data/visual-tests/effects-and-annotations/tuplets.png differ diff --git a/test-data/visual-tests/effects-and-annotations/vibrato.png b/test-data/visual-tests/effects-and-annotations/vibrato.png index 9d9b13f71..8c54a3682 100644 Binary files a/test-data/visual-tests/effects-and-annotations/vibrato.png and b/test-data/visual-tests/effects-and-annotations/vibrato.png differ diff --git a/test-data/visual-tests/general/alternate-endings.png b/test-data/visual-tests/general/alternate-endings.png index 180c6d21d..ab4328fdd 100644 Binary files a/test-data/visual-tests/general/alternate-endings.png and b/test-data/visual-tests/general/alternate-endings.png differ diff --git a/test-data/visual-tests/general/colors-disabled.png b/test-data/visual-tests/general/colors-disabled.png index 6ead03586..14be5bf92 100644 Binary files a/test-data/visual-tests/general/colors-disabled.png and b/test-data/visual-tests/general/colors-disabled.png differ diff --git a/test-data/visual-tests/general/colors.png b/test-data/visual-tests/general/colors.png index d10d13dd7..7fb3df3fa 100644 Binary files a/test-data/visual-tests/general/colors.png and b/test-data/visual-tests/general/colors.png differ diff --git a/test-data/visual-tests/layout/horizontal-layout.png b/test-data/visual-tests/layout/horizontal-layout.png index cb4825493..25a5297d2 100644 Binary files a/test-data/visual-tests/layout/horizontal-layout.png and b/test-data/visual-tests/layout/horizontal-layout.png differ diff --git a/test-data/visual-tests/layout/multi-track.png b/test-data/visual-tests/layout/multi-track.png index b56dadb72..49b1747ba 100644 Binary files a/test-data/visual-tests/layout/multi-track.png and b/test-data/visual-tests/layout/multi-track.png differ diff --git a/test-data/visual-tests/layout/multi-voice.png b/test-data/visual-tests/layout/multi-voice.png index c673b546d..cae8ed865 100644 Binary files a/test-data/visual-tests/layout/multi-voice.png and b/test-data/visual-tests/layout/multi-voice.png differ diff --git a/test-data/visual-tests/layout/page-layout-5barsperrow.png b/test-data/visual-tests/layout/page-layout-5barsperrow.png index 82e422357..26c35c1ad 100644 Binary files a/test-data/visual-tests/layout/page-layout-5barsperrow.png and b/test-data/visual-tests/layout/page-layout-5barsperrow.png differ diff --git a/test-data/visual-tests/layout/page-layout-justify-last-row.png b/test-data/visual-tests/layout/page-layout-justify-last-row.png index 8fa087dfc..ab70bbf6d 100644 Binary files a/test-data/visual-tests/layout/page-layout-justify-last-row.png and b/test-data/visual-tests/layout/page-layout-justify-last-row.png differ diff --git a/test-data/visual-tests/layout/page-layout.png b/test-data/visual-tests/layout/page-layout.png index f6a3719fe..b2ea066dd 100644 Binary files a/test-data/visual-tests/layout/page-layout.png and b/test-data/visual-tests/layout/page-layout.png differ diff --git a/test-data/visual-tests/layout/system-layout-tex.png b/test-data/visual-tests/layout/system-layout-tex.png index 858031459..cd61a6c84 100644 Binary files a/test-data/visual-tests/layout/system-layout-tex.png and b/test-data/visual-tests/layout/system-layout-tex.png differ diff --git a/test-data/visual-tests/music-notation/accidentals.png b/test-data/visual-tests/music-notation/accidentals.png index 11d22e518..720415152 100644 Binary files a/test-data/visual-tests/music-notation/accidentals.png and b/test-data/visual-tests/music-notation/accidentals.png differ diff --git a/test-data/visual-tests/music-notation/notes-rests-beams.png b/test-data/visual-tests/music-notation/notes-rests-beams.png index 412fc59ee..98d7e7236 100644 Binary files a/test-data/visual-tests/music-notation/notes-rests-beams.png and b/test-data/visual-tests/music-notation/notes-rests-beams.png differ diff --git a/test-data/visual-tests/notation-elements/chord-diagrams-off.png b/test-data/visual-tests/notation-elements/chord-diagrams-off.png index 56cb33f9b..8db8023b7 100644 Binary files a/test-data/visual-tests/notation-elements/chord-diagrams-off.png and b/test-data/visual-tests/notation-elements/chord-diagrams-off.png differ diff --git a/test-data/visual-tests/notation-elements/chord-diagrams-on.png b/test-data/visual-tests/notation-elements/chord-diagrams-on.png index cc0aac8c7..be119f30e 100644 Binary files a/test-data/visual-tests/notation-elements/chord-diagrams-on.png and b/test-data/visual-tests/notation-elements/chord-diagrams-on.png differ diff --git a/test-data/visual-tests/notation-elements/effects-off.png b/test-data/visual-tests/notation-elements/effects-off.png index 29c9f6225..731d747f6 100644 Binary files a/test-data/visual-tests/notation-elements/effects-off.png and b/test-data/visual-tests/notation-elements/effects-off.png differ diff --git a/test-data/visual-tests/notation-elements/effects-on.png b/test-data/visual-tests/notation-elements/effects-on.png index 8eb051765..9b77e2cc5 100644 Binary files a/test-data/visual-tests/notation-elements/effects-on.png and b/test-data/visual-tests/notation-elements/effects-on.png differ diff --git a/test-data/visual-tests/notation-elements/guitar-tuning-off.png b/test-data/visual-tests/notation-elements/guitar-tuning-off.png index 06eee1fee..3a231cd9e 100644 Binary files a/test-data/visual-tests/notation-elements/guitar-tuning-off.png and b/test-data/visual-tests/notation-elements/guitar-tuning-off.png differ diff --git a/test-data/visual-tests/notation-elements/guitar-tuning-on.png b/test-data/visual-tests/notation-elements/guitar-tuning-on.png index b18880d2f..81a18c126 100644 Binary files a/test-data/visual-tests/notation-elements/guitar-tuning-on.png and b/test-data/visual-tests/notation-elements/guitar-tuning-on.png differ diff --git a/test-data/visual-tests/notation-elements/parenthesis-on-tied-bends-off.png b/test-data/visual-tests/notation-elements/parenthesis-on-tied-bends-off.png index 29f893de4..23fde0190 100644 Binary files a/test-data/visual-tests/notation-elements/parenthesis-on-tied-bends-off.png and b/test-data/visual-tests/notation-elements/parenthesis-on-tied-bends-off.png differ diff --git a/test-data/visual-tests/notation-elements/parenthesis-on-tied-bends-on.png b/test-data/visual-tests/notation-elements/parenthesis-on-tied-bends-on.png index db59db82f..66d495b8e 100644 Binary files a/test-data/visual-tests/notation-elements/parenthesis-on-tied-bends-on.png and b/test-data/visual-tests/notation-elements/parenthesis-on-tied-bends-on.png differ diff --git a/test-data/visual-tests/notation-elements/score-info-album.png b/test-data/visual-tests/notation-elements/score-info-album.png index 1fd52a654..2c69c1a81 100644 Binary files a/test-data/visual-tests/notation-elements/score-info-album.png and b/test-data/visual-tests/notation-elements/score-info-album.png differ diff --git a/test-data/visual-tests/notation-elements/score-info-all.png b/test-data/visual-tests/notation-elements/score-info-all.png index 5adcf2bd6..b5ae106e0 100644 Binary files a/test-data/visual-tests/notation-elements/score-info-all.png and b/test-data/visual-tests/notation-elements/score-info-all.png differ diff --git a/test-data/visual-tests/notation-elements/score-info-artist.png b/test-data/visual-tests/notation-elements/score-info-artist.png index 29894bd2d..8d383f920 100644 Binary files a/test-data/visual-tests/notation-elements/score-info-artist.png and b/test-data/visual-tests/notation-elements/score-info-artist.png differ diff --git a/test-data/visual-tests/notation-elements/score-info-copyright.png b/test-data/visual-tests/notation-elements/score-info-copyright.png index d3df5b9f8..d61bf41a3 100644 Binary files a/test-data/visual-tests/notation-elements/score-info-copyright.png and b/test-data/visual-tests/notation-elements/score-info-copyright.png differ diff --git a/test-data/visual-tests/notation-elements/score-info-music.png b/test-data/visual-tests/notation-elements/score-info-music.png index fc83d78ae..d977e1ac7 100644 Binary files a/test-data/visual-tests/notation-elements/score-info-music.png and b/test-data/visual-tests/notation-elements/score-info-music.png differ diff --git a/test-data/visual-tests/notation-elements/score-info-subtitle.png b/test-data/visual-tests/notation-elements/score-info-subtitle.png index 7ca7060c1..80814531f 100644 Binary files a/test-data/visual-tests/notation-elements/score-info-subtitle.png and b/test-data/visual-tests/notation-elements/score-info-subtitle.png differ diff --git a/test-data/visual-tests/notation-elements/score-info-title.png b/test-data/visual-tests/notation-elements/score-info-title.png index ffcc08f4d..5f32ade69 100644 Binary files a/test-data/visual-tests/notation-elements/score-info-title.png and b/test-data/visual-tests/notation-elements/score-info-title.png differ diff --git a/test-data/visual-tests/notation-elements/score-info-words-and-music.png b/test-data/visual-tests/notation-elements/score-info-words-and-music.png index 24c1088e3..d46e0b525 100644 Binary files a/test-data/visual-tests/notation-elements/score-info-words-and-music.png and b/test-data/visual-tests/notation-elements/score-info-words-and-music.png differ diff --git a/test-data/visual-tests/notation-elements/score-info-words.png b/test-data/visual-tests/notation-elements/score-info-words.png index 1928c9ba2..72553e810 100644 Binary files a/test-data/visual-tests/notation-elements/score-info-words.png and b/test-data/visual-tests/notation-elements/score-info-words.png differ diff --git a/test-data/visual-tests/notation-elements/tab-notes-on-tied-bends-off.png b/test-data/visual-tests/notation-elements/tab-notes-on-tied-bends-off.png index 562f8f647..3838c3af1 100644 Binary files a/test-data/visual-tests/notation-elements/tab-notes-on-tied-bends-off.png and b/test-data/visual-tests/notation-elements/tab-notes-on-tied-bends-off.png differ diff --git a/test-data/visual-tests/notation-elements/tab-notes-on-tied-bends-on.png b/test-data/visual-tests/notation-elements/tab-notes-on-tied-bends-on.png index 29eca904f..bd530ca5c 100644 Binary files a/test-data/visual-tests/notation-elements/tab-notes-on-tied-bends-on.png and b/test-data/visual-tests/notation-elements/tab-notes-on-tied-bends-on.png differ diff --git a/test-data/visual-tests/notation-elements/track-names-off.png b/test-data/visual-tests/notation-elements/track-names-off.png index 65018dbf7..19290ad27 100644 Binary files a/test-data/visual-tests/notation-elements/track-names-off.png and b/test-data/visual-tests/notation-elements/track-names-off.png differ diff --git a/test-data/visual-tests/notation-elements/track-names-on.png b/test-data/visual-tests/notation-elements/track-names-on.png index 8df001a14..18f1af43b 100644 Binary files a/test-data/visual-tests/notation-elements/track-names-on.png and b/test-data/visual-tests/notation-elements/track-names-on.png differ diff --git a/test-data/visual-tests/notation-elements/zeros-on-dive-whammys-off.png b/test-data/visual-tests/notation-elements/zeros-on-dive-whammys-off.png index d4a9b88b2..c05c3be62 100644 Binary files a/test-data/visual-tests/notation-elements/zeros-on-dive-whammys-off.png and b/test-data/visual-tests/notation-elements/zeros-on-dive-whammys-off.png differ diff --git a/test-data/visual-tests/notation-elements/zeros-on-dive-whammys-on.png b/test-data/visual-tests/notation-elements/zeros-on-dive-whammys-on.png index bf545aa3f..839010e87 100644 Binary files a/test-data/visual-tests/notation-elements/zeros-on-dive-whammys-on.png and b/test-data/visual-tests/notation-elements/zeros-on-dive-whammys-on.png differ diff --git a/test-data/visual-tests/notation-legend/bends-default.png b/test-data/visual-tests/notation-legend/bends-default.png index 5ca5b0784..d6c9bcef5 100644 Binary files a/test-data/visual-tests/notation-legend/bends-default.png and b/test-data/visual-tests/notation-legend/bends-default.png differ diff --git a/test-data/visual-tests/notation-legend/bends-songbook.png b/test-data/visual-tests/notation-legend/bends-songbook.png index fc5bc74ef..4a40dc94c 100644 Binary files a/test-data/visual-tests/notation-legend/bends-songbook.png and b/test-data/visual-tests/notation-legend/bends-songbook.png differ diff --git a/test-data/visual-tests/notation-legend/dynamics-default.png b/test-data/visual-tests/notation-legend/dynamics-default.png index edeb709c9..cbf2ba896 100644 Binary files a/test-data/visual-tests/notation-legend/dynamics-default.png and b/test-data/visual-tests/notation-legend/dynamics-default.png differ diff --git a/test-data/visual-tests/notation-legend/dynamics-songbook.png b/test-data/visual-tests/notation-legend/dynamics-songbook.png index edeb709c9..cbf2ba896 100644 Binary files a/test-data/visual-tests/notation-legend/dynamics-songbook.png and b/test-data/visual-tests/notation-legend/dynamics-songbook.png differ diff --git a/test-data/visual-tests/notation-legend/fingering-default.png b/test-data/visual-tests/notation-legend/fingering-default.png index 10c8584da..245a841fe 100644 Binary files a/test-data/visual-tests/notation-legend/fingering-default.png and b/test-data/visual-tests/notation-legend/fingering-default.png differ diff --git a/test-data/visual-tests/notation-legend/fingering-songbook.png b/test-data/visual-tests/notation-legend/fingering-songbook.png index 395767ac3..63b97792c 100644 Binary files a/test-data/visual-tests/notation-legend/fingering-songbook.png and b/test-data/visual-tests/notation-legend/fingering-songbook.png differ diff --git a/test-data/visual-tests/notation-legend/full-default-large.png b/test-data/visual-tests/notation-legend/full-default-large.png index cbd7701b4..0193054e1 100644 Binary files a/test-data/visual-tests/notation-legend/full-default-large.png and b/test-data/visual-tests/notation-legend/full-default-large.png differ diff --git a/test-data/visual-tests/notation-legend/full-default-small.png b/test-data/visual-tests/notation-legend/full-default-small.png index d2513c90f..cc9520c41 100644 Binary files a/test-data/visual-tests/notation-legend/full-default-small.png and b/test-data/visual-tests/notation-legend/full-default-small.png differ diff --git a/test-data/visual-tests/notation-legend/full-default.png b/test-data/visual-tests/notation-legend/full-default.png index ba772dac5..736194939 100644 Binary files a/test-data/visual-tests/notation-legend/full-default.png and b/test-data/visual-tests/notation-legend/full-default.png differ diff --git a/test-data/visual-tests/notation-legend/full-songbook.png b/test-data/visual-tests/notation-legend/full-songbook.png index 2920eafe9..791ee14dc 100644 Binary files a/test-data/visual-tests/notation-legend/full-songbook.png and b/test-data/visual-tests/notation-legend/full-songbook.png differ diff --git a/test-data/visual-tests/notation-legend/mixed-default.png b/test-data/visual-tests/notation-legend/mixed-default.png index 03bef5c8e..d80f97ed7 100644 Binary files a/test-data/visual-tests/notation-legend/mixed-default.png and b/test-data/visual-tests/notation-legend/mixed-default.png differ diff --git a/test-data/visual-tests/notation-legend/mixed-songbook.png b/test-data/visual-tests/notation-legend/mixed-songbook.png index 3dc90f4be..8d5d1f6be 100644 Binary files a/test-data/visual-tests/notation-legend/mixed-songbook.png and b/test-data/visual-tests/notation-legend/mixed-songbook.png differ diff --git a/test-data/visual-tests/notation-legend/multi-voice-default.png b/test-data/visual-tests/notation-legend/multi-voice-default.png index 0bc90da45..9f258720a 100644 Binary files a/test-data/visual-tests/notation-legend/multi-voice-default.png and b/test-data/visual-tests/notation-legend/multi-voice-default.png differ diff --git a/test-data/visual-tests/notation-legend/multi-voice-songbook.png b/test-data/visual-tests/notation-legend/multi-voice-songbook.png index 0bc90da45..9f258720a 100644 Binary files a/test-data/visual-tests/notation-legend/multi-voice-songbook.png and b/test-data/visual-tests/notation-legend/multi-voice-songbook.png differ diff --git a/test-data/visual-tests/notation-legend/resize-sequence-1300.png b/test-data/visual-tests/notation-legend/resize-sequence-1300.png index 85ddb2bc9..67349dfa3 100644 Binary files a/test-data/visual-tests/notation-legend/resize-sequence-1300.png and b/test-data/visual-tests/notation-legend/resize-sequence-1300.png differ diff --git a/test-data/visual-tests/notation-legend/resize-sequence-1500.png b/test-data/visual-tests/notation-legend/resize-sequence-1500.png index 0758ac60c..86833d238 100644 Binary files a/test-data/visual-tests/notation-legend/resize-sequence-1500.png and b/test-data/visual-tests/notation-legend/resize-sequence-1500.png differ diff --git a/test-data/visual-tests/notation-legend/resize-sequence-500.png b/test-data/visual-tests/notation-legend/resize-sequence-500.png index 23ea60521..c0540d27b 100644 Binary files a/test-data/visual-tests/notation-legend/resize-sequence-500.png and b/test-data/visual-tests/notation-legend/resize-sequence-500.png differ diff --git a/test-data/visual-tests/notation-legend/resize-sequence-800.png b/test-data/visual-tests/notation-legend/resize-sequence-800.png index a638d1961..5c7eadd6b 100644 Binary files a/test-data/visual-tests/notation-legend/resize-sequence-800.png and b/test-data/visual-tests/notation-legend/resize-sequence-800.png differ diff --git a/test-data/visual-tests/notation-legend/sweep-default.png b/test-data/visual-tests/notation-legend/sweep-default.png index ce672852d..6a12940ae 100644 Binary files a/test-data/visual-tests/notation-legend/sweep-default.png and b/test-data/visual-tests/notation-legend/sweep-default.png differ diff --git a/test-data/visual-tests/notation-legend/sweep-songbook.png b/test-data/visual-tests/notation-legend/sweep-songbook.png index ce672852d..6a12940ae 100644 Binary files a/test-data/visual-tests/notation-legend/sweep-songbook.png and b/test-data/visual-tests/notation-legend/sweep-songbook.png differ diff --git a/test-data/visual-tests/notation-legend/trill-default.png b/test-data/visual-tests/notation-legend/trill-default.png index eaeb01858..cc2d6325e 100644 Binary files a/test-data/visual-tests/notation-legend/trill-default.png and b/test-data/visual-tests/notation-legend/trill-default.png differ diff --git a/test-data/visual-tests/notation-legend/trill-songbook.png b/test-data/visual-tests/notation-legend/trill-songbook.png index eaeb01858..cc2d6325e 100644 Binary files a/test-data/visual-tests/notation-legend/trill-songbook.png and b/test-data/visual-tests/notation-legend/trill-songbook.png differ diff --git a/test-data/visual-tests/special-notes/dead-notes.png b/test-data/visual-tests/special-notes/dead-notes.png index 8876dc716..aff2011ec 100644 Binary files a/test-data/visual-tests/special-notes/dead-notes.png and b/test-data/visual-tests/special-notes/dead-notes.png differ diff --git a/test-data/visual-tests/special-notes/ghost-notes.png b/test-data/visual-tests/special-notes/ghost-notes.png index 4fc8eeec7..db0459559 100644 Binary files a/test-data/visual-tests/special-notes/ghost-notes.png and b/test-data/visual-tests/special-notes/ghost-notes.png differ diff --git a/test-data/visual-tests/special-notes/grace-notes.png b/test-data/visual-tests/special-notes/grace-notes.png index 0b6ccca13..084c28c41 100644 Binary files a/test-data/visual-tests/special-notes/grace-notes.png and b/test-data/visual-tests/special-notes/grace-notes.png differ diff --git a/test-data/visual-tests/special-notes/tied-notes.png b/test-data/visual-tests/special-notes/tied-notes.png index 73a5e7987..ddac89414 100644 Binary files a/test-data/visual-tests/special-notes/tied-notes.png and b/test-data/visual-tests/special-notes/tied-notes.png differ diff --git a/test-data/visual-tests/special-tracks/grand-staff.png b/test-data/visual-tests/special-tracks/grand-staff.png index b300200d9..2023bbca9 100644 Binary files a/test-data/visual-tests/special-tracks/grand-staff.png and b/test-data/visual-tests/special-tracks/grand-staff.png differ diff --git a/test/importer/MusicXmlImporter.test.ts b/test/importer/MusicXmlImporter.test.ts index eefd5bf9d..aa6df3ba2 100644 --- a/test/importer/MusicXmlImporter.test.ts +++ b/test/importer/MusicXmlImporter.test.ts @@ -103,7 +103,7 @@ describe('MusicXmlImporterTests', () => { }); it('bend', async () => { let score: Score = await MusicXmlImporterTestHelper.testReferenceFile( - 'test-data/musicxml-testsuite/100a-Guitare-Bends.xml' + 'test-data/musicxml4/bends.xml' ); let note = score.tracks[0].staves[0].bars[0].voices[0].beats[0].notes[0]; expect(note.bendType).to.equal(BendType.Bend); diff --git a/test/importer/MusicXmlImporterTestHelper.ts b/test/importer/MusicXmlImporterTestHelper.ts index feb94d290..63d0a45b4 100644 --- a/test/importer/MusicXmlImporterTestHelper.ts +++ b/test/importer/MusicXmlImporterTestHelper.ts @@ -1,4 +1,3 @@ -import { LayoutMode } from '@src/LayoutMode'; import { MusicXmlImporter } from '@src/importer/MusicXmlImporter'; import { UnsupportedFormatError } from '@src/importer/UnsupportedFormatError'; import { ByteBuffer } from '@src/io/ByteBuffer'; @@ -19,9 +18,10 @@ import { TestPlatform } from '@test/TestPlatform'; import { JsonConverter } from '@src/model/JsonConverter'; import { ComparisonHelpers } from '@test/model/ComparisonHelpers'; import { assert, expect } from 'chai'; +import { VisualTestHelper, VisualTestOptions, VisualTestRun } from '@test/visualTests/VisualTestHelper'; +import { SystemsLayoutMode } from '@src/DisplaySettings'; export class MusicXmlImporterTestHelper { - public static async loadFile(file: string): Promise { const fileData = await TestPlatform.loadFile(file); const reader: MusicXmlImporter = new MusicXmlImporter(); @@ -29,21 +29,23 @@ export class MusicXmlImporterTestHelper { return reader.readScore(); } - public static prepareImporterWithBytes(buffer: Uint8Array): MusicXmlImporter { + public static prepareImporterWithBytes(buffer: Uint8Array, settings?: Settings): MusicXmlImporter { let readerBase: MusicXmlImporter = new MusicXmlImporter(); - readerBase.init(ByteBuffer.fromBuffer(buffer), new Settings()); + readerBase.init(ByteBuffer.fromBuffer(buffer), settings ?? new Settings()); return readerBase; } public static async testReferenceFile( file: string, - renderLayout: LayoutMode = LayoutMode.Page, - renderAllTracks: boolean = false + render: boolean = true, + renderAllTracks: boolean = true, + prepare: ((settings: Settings) => void) | null = null ): Promise { const fileData = await TestPlatform.loadFile(file); let score: Score; + const settings = new Settings(); try { - let importer: MusicXmlImporter = MusicXmlImporterTestHelper.prepareImporterWithBytes(fileData); + let importer: MusicXmlImporter = MusicXmlImporterTestHelper.prepareImporterWithBytes(fileData, settings); score = importer.readScore(); } catch (e) { if (e instanceof UnsupportedFormatError) { @@ -56,7 +58,7 @@ export class MusicXmlImporterTestHelper { try { const expectedJson = JsonConverter.scoreToJsObject(score); - const deserialized = JsonConverter.jsObjectToScore(expectedJson); + const deserialized = JsonConverter.jsObjectToScore(expectedJson, settings); const actualJson = JsonConverter.scoreToJsObject(deserialized); ComparisonHelpers.expectJsonEqual(expectedJson, actualJson, '<' + file + '>', null); @@ -64,6 +66,28 @@ export class MusicXmlImporterTestHelper { assert.fail((e as Error).message + (e as Error).stack); } + if (render) { + settings.display.justifyLastSystem = score.masterBars.length > 4; + if (score.tracks.some(t => t.systemsLayout.length > 0)) { + settings.display.systemsLayoutMode = SystemsLayoutMode.UseModelLayout; + } + + prepare?.(settings); + const testOptions = new VisualTestOptions( + score, + [ + new VisualTestRun(1300, TestPlatform.changeExtension(file, '.png')), + ], + settings + ); + + if (renderAllTracks) { + testOptions.tracks = score.tracks.map(t => t.index); + } + + await VisualTestHelper.runVisualTestFull(testOptions); + } + return score; } diff --git a/test/importer/MusicXmlImporterTestSuite.test.ts b/test/importer/MusicXmlImporterTestSuite.test.ts index d9abc0cc2..f8a3581ea 100644 --- a/test/importer/MusicXmlImporterTestSuite.test.ts +++ b/test/importer/MusicXmlImporterTestSuite.test.ts @@ -1,617 +1,796 @@ import { MusicXmlImporterTestHelper } from '@test/importer/MusicXmlImporterTestHelper'; describe('MusicXmlImporterTestSuiteTests', () => { - it('01a_Pitches_Pitches', async () => { + it('01a-Pitches-Pitches', async () => { await MusicXmlImporterTestHelper.testReferenceFile('test-data/musicxml-testsuite/01a-Pitches-Pitches.xml'); + // Forcing accidentals doesn't exist 100% in alphatab, its rather: "try to adjust the note to this accidental" + // once we have really forced accidentals (even if repeated or not needed) this will slightly change. }); - it('01b_Pitches_Intervals', async () => { + it('01b-Pitches-Intervals', async () => { await MusicXmlImporterTestHelper.testReferenceFile('test-data/musicxml-testsuite/01b-Pitches-Intervals.xml'); }); - it('01c_Pitches_NoVoiceElement', async () => { + it('01c-Pitches-NoVoiceElement', async () => { await MusicXmlImporterTestHelper.testReferenceFile( 'test-data/musicxml-testsuite/01c-Pitches-NoVoiceElement.xml' ); }); - it('01d_Pitches_Microtones', async () => { + it('01d-Pitches-Microtones', async () => { await MusicXmlImporterTestHelper.testReferenceFile('test-data/musicxml-testsuite/01d-Pitches-Microtones.xml'); + // not supported }); - it('01e_Pitches_ParenthesizedAccidentals', async () => { + it('01e-Pitches-ParenthesizedAccidentals', async () => { await MusicXmlImporterTestHelper.testReferenceFile( 'test-data/musicxml-testsuite/01e-Pitches-ParenthesizedAccidentals.xml' ); + // not supported }); - it('01f_Pitches_ParenthesizedMicrotoneAccidentals', async () => { + it('01f-Pitches-ParenthesizedMicrotoneAccidentals', async () => { await MusicXmlImporterTestHelper.testReferenceFile( 'test-data/musicxml-testsuite/01f-Pitches-ParenthesizedMicrotoneAccidentals.xml' ); + // not supported }); - it('02a_Rests_Durations', async () => { + it('02a-Rests-Durations', async () => { await MusicXmlImporterTestHelper.testReferenceFile('test-data/musicxml-testsuite/02a-Rests-Durations.xml'); + // Multibar rests are automatic, no support for individual bars forcing it. }); - it('02b_Rests_PitchedRests', async () => { + it('02b-Rests-PitchedRests', async () => { await MusicXmlImporterTestHelper.testReferenceFile('test-data/musicxml-testsuite/02b-Rests-PitchedRests.xml'); + // not supported }); - it('02c_Rests_MultiMeasureRests', async () => { + it('02c-Rests-MultiMeasureRests', async () => { await MusicXmlImporterTestHelper.testReferenceFile( 'test-data/musicxml-testsuite/02c-Rests-MultiMeasureRests.xml' ); + // not supported }); - it('02d_Rests_Multimeasure_TimeSignatures', async () => { + it('02d-Rests-Multimeasure-TimeSignatures', async () => { await MusicXmlImporterTestHelper.testReferenceFile( 'test-data/musicxml-testsuite/02d-Rests-Multimeasure-TimeSignatures.xml' ); + // not supported }); - it('02e_Rests_NoType', async () => { + it('02e-Rests-NoType', async () => { await MusicXmlImporterTestHelper.testReferenceFile('test-data/musicxml-testsuite/02e-Rests-NoType.xml'); }); - it('03a_Rhythm_Durations', async () => { + it('03a-Rhythm-Durations', async () => { await MusicXmlImporterTestHelper.testReferenceFile('test-data/musicxml-testsuite/03a-Rhythm-Durations.xml'); }); - it('03b_Rhythm_Backup', async () => { + it('03b-Rhythm-Backup', async () => { await MusicXmlImporterTestHelper.testReferenceFile('test-data/musicxml-testsuite/03b-Rhythm-Backup.xml'); }); - it('03c_Rhythm_DivisionChange', async () => { - await MusicXmlImporterTestHelper.testReferenceFile('test-data/musicxml-testsuite/03c-Rhythm-DivisionChange.xml'); + it('03c-Rhythm-DivisionChange', async () => { + await MusicXmlImporterTestHelper.testReferenceFile( + 'test-data/musicxml-testsuite/03c-Rhythm-DivisionChange.xml' + ); }); - it('03d_Rhythm_DottedDurations_Factors', async () => { + it('03d-Rhythm-DottedDurations-Factors', async () => { await MusicXmlImporterTestHelper.testReferenceFile( 'test-data/musicxml-testsuite/03d-Rhythm-DottedDurations-Factors.xml' ); }); - it('11a_TimeSignatures', async () => { + it('03e-Rhythm-No-Divisions', async () => { + await MusicXmlImporterTestHelper.testReferenceFile('test-data/musicxml-testsuite/03e-Rhythm-No-Divisions.xml'); + }); + + it('03f-Rhythm-Forward', async () => { + await MusicXmlImporterTestHelper.testReferenceFile('test-data/musicxml-testsuite/03f-Rhythm-Forward.xml'); + }); + + it('11a-TimeSignatures', async () => { await MusicXmlImporterTestHelper.testReferenceFile('test-data/musicxml-testsuite/11a-TimeSignatures.xml'); }); - it('11b_TimeSignatures_NoTime', async () => { - await MusicXmlImporterTestHelper.testReferenceFile('test-data/musicxml-testsuite/11b-TimeSignatures-NoTime.xml'); + it('11b-TimeSignatures-NoTime', async () => { + await MusicXmlImporterTestHelper.testReferenceFile( + 'test-data/musicxml-testsuite/11b-TimeSignatures-NoTime.xml' + ); + // hiding of time signatures not supported }); - it('11c_TimeSignatures_CompoundSimple', async () => { + it('11c-TimeSignatures-CompoundSimple', async () => { await MusicXmlImporterTestHelper.testReferenceFile( 'test-data/musicxml-testsuite/11c-TimeSignatures-CompoundSimple.xml' ); + // compound not supported, but we show the summed values }); - it('11d_TimeSignatures_CompoundMultiple', async () => { + it('11d-TimeSignatures-CompoundMultiple', async () => { await MusicXmlImporterTestHelper.testReferenceFile( 'test-data/musicxml-testsuite/11d-TimeSignatures-CompoundMultiple.xml' ); + // multiple time signatures not supported, initial one is shown as summed valued. }); - it('11e_TimeSignatures_CompoundMixed', async () => { + it('11e-TimeSignatures-CompoundMixed', async () => { await MusicXmlImporterTestHelper.testReferenceFile( 'test-data/musicxml-testsuite/11e-TimeSignatures-CompoundMixed.xml' ); + // multiple time signatures not supported, initial one is shown as summed valued. }); - it('11f_TimeSignatures_SymbolMeaning', async () => { + it('11f-TimeSignatures-SymbolMeaning', async () => { await MusicXmlImporterTestHelper.testReferenceFile( 'test-data/musicxml-testsuite/11f-TimeSignatures-SymbolMeaning.xml' ); + // unclear expectation }); - it('11g_TimeSignatures_SingleNumber', async () => { + it('11g-TimeSignatures-SingleNumber', async () => { await MusicXmlImporterTestHelper.testReferenceFile( 'test-data/musicxml-testsuite/11g-TimeSignatures-SingleNumber.xml' ); + // single number time signature not supported }); - it('11h_TimeSignatures_SenzaMisura', async () => { + it('11h-TimeSignatures-SenzaMisura', async () => { await MusicXmlImporterTestHelper.testReferenceFile( 'test-data/musicxml-testsuite/11h-TimeSignatures-SenzaMisura.xml' ); + // not supported }); - it('12a_Clefs', async () => { + it('12a-Clefs', async () => { await MusicXmlImporterTestHelper.testReferenceFile('test-data/musicxml-testsuite/12a-Clefs.xml'); + // mid-bar clef changes not supported + // there are also some clef variations we don't support. }); - it('12b_Clefs_NoKeyOrClef', async () => { + it('12b-Clefs-NoKeyOrClef', async () => { await MusicXmlImporterTestHelper.testReferenceFile('test-data/musicxml-testsuite/12b-Clefs-NoKeyOrClef.xml'); }); - it('13a_KeySignatures', async () => { + it('13a-KeySignatures', async () => { await MusicXmlImporterTestHelper.testReferenceFile('test-data/musicxml-testsuite/13a-KeySignatures.xml'); + // only classical key signatures (no double flat, double sharp) + // repeating time signatures hidden, no option to force display yet }); - it('13b_KeySignatures_ChurchModes', async () => { + it('13b-KeySignatures-ChurchModes', async () => { await MusicXmlImporterTestHelper.testReferenceFile( 'test-data/musicxml-testsuite/13b-KeySignatures-ChurchModes.xml' ); + // no mid-bar key signature changes. }); - it('13c_KeySignatures_NonTraditional', async () => { + it('13c-KeySignatures-NonTraditional', async () => { await MusicXmlImporterTestHelper.testReferenceFile( 'test-data/musicxml-testsuite/13c-KeySignatures-NonTraditional.xml' ); + // not supported. }); - it('13d_KeySignatures_Microtones', async () => { + it('13d-KeySignatures-Microtones', async () => { await MusicXmlImporterTestHelper.testReferenceFile( 'test-data/musicxml-testsuite/13d-KeySignatures-Microtones.xml' ); + // not supported. }); - it('14a_StaffDetails_LineChanges', async () => { + it('13e-KeySignatures-Cancel', async () => { + await MusicXmlImporterTestHelper.testReferenceFile('test-data/musicxml-testsuite/13e-KeySignatures-Cancel.xml'); + // not supported to force show cancellation + }); + + it('13f-KeySignatures-Visible', async () => { + await MusicXmlImporterTestHelper.testReferenceFile( + 'test-data/musicxml-testsuite/13f-KeySignatures-Visible.xml' + ); + // not supported + }); + + it('14a-StaffDetails-LineChanges', async () => { await MusicXmlImporterTestHelper.testReferenceFile( 'test-data/musicxml-testsuite/14a-StaffDetails-LineChanges.xml' ); + // not supported. }); - it('21a_Chord_Basic', async () => { + it('21a-Chord-Basic', async () => { await MusicXmlImporterTestHelper.testReferenceFile('test-data/musicxml-testsuite/21a-Chord-Basic.xml'); }); - it('21b_Chords_TwoNotes', async () => { + it('21b-Chords-TwoNotes', async () => { await MusicXmlImporterTestHelper.testReferenceFile('test-data/musicxml-testsuite/21b-Chords-TwoNotes.xml'); }); - it('21c_Chords_ThreeNotesDuration', async () => { + it('21c-Chords-ThreeNotesDuration', async () => { await MusicXmlImporterTestHelper.testReferenceFile( 'test-data/musicxml-testsuite/21c-Chords-ThreeNotesDuration.xml' ); }); - it('21d_Chords_SchubertStabatMater', async () => { + it('21d-Chords-SchubertStabatMater', async () => { await MusicXmlImporterTestHelper.testReferenceFile( 'test-data/musicxml-testsuite/21d-Chords-SchubertStabatMater.xml' ); + // fp dynamics not yet supported }); - it('21e_Chords_PickupMeasures', async () => { - await MusicXmlImporterTestHelper.testReferenceFile('test-data/musicxml-testsuite/21e-Chords-PickupMeasures.xml'); + it('21e-Chords-PickupMeasures', async () => { + await MusicXmlImporterTestHelper.testReferenceFile( + 'test-data/musicxml-testsuite/21e-Chords-PickupMeasures.xml' + ); }); - it('21f_Chord_ElementInBetween', async () => { + it('21f-Chord-ElementInBetween', async () => { await MusicXmlImporterTestHelper.testReferenceFile( 'test-data/musicxml-testsuite/21f-Chord-ElementInBetween.xml' ); + // mid-bar segno not supported }); - it('22a_Noteheads', async () => { + it('21g-Chords-Tremolos', async () => { + await MusicXmlImporterTestHelper.testReferenceFile('test-data/musicxml-testsuite/21g-Chords-Tremolos.xml'); + // 4 bar tremolo (not supported) + }); + + it('21h-Chord-Accidentals', async () => { + await MusicXmlImporterTestHelper.testReferenceFile('test-data/musicxml-testsuite/21h-Chord-Accidentals.xml'); + // natural not shown as not needed (forcing to show not available yet) + // brackets and braces on accidentals not supported + }); + + it('22a-Noteheads', async () => { await MusicXmlImporterTestHelper.testReferenceFile('test-data/musicxml-testsuite/22a-Noteheads.xml'); + // some slight stem alignment problems as we do not respect note head position yet + // part of https://github.com/CoderLine/alphaTab/issues/1949 }); - it('22b_Staff_Notestyles', async () => { + it('22b-Staff-Notestyles', async () => { await MusicXmlImporterTestHelper.testReferenceFile('test-data/musicxml-testsuite/22b-Staff-Notestyles.xml'); + // hiding stem not supported + // hiding staff line not supported }); - it('22c_Noteheads_Chords', async () => { + it('22c-Noteheads-Chords', async () => { await MusicXmlImporterTestHelper.testReferenceFile('test-data/musicxml-testsuite/22c-Noteheads-Chords.xml'); }); - it('22d_Parenthesized_Noteheads', async () => { + it('22d-Parenthesized-Noteheads', async () => { await MusicXmlImporterTestHelper.testReferenceFile( 'test-data/musicxml-testsuite/22d-Parenthesized-Noteheads.xml' ); }); - it('23a_Tuplets', async () => { + it('23a-Tuplets', async () => { await MusicXmlImporterTestHelper.testReferenceFile('test-data/musicxml-testsuite/23a-Tuplets.xml'); + // number is sometimes n:m }); - it('23b_Tuplets_Styles', async () => { + it('23b-Tuplets-Styles', async () => { await MusicXmlImporterTestHelper.testReferenceFile('test-data/musicxml-testsuite/23b-Tuplets-Styles.xml'); + // not supported }); - it('23c_Tuplet_Display_NonStandard', async () => { + it('23c-Tuplet-Display-NonStandard', async () => { await MusicXmlImporterTestHelper.testReferenceFile( 'test-data/musicxml-testsuite/23c-Tuplet-Display-NonStandard.xml' ); + // customizing display not supported }); - it('23d_Tuplets_Nested', async () => { + it('23d-Tuplets-Nested', async () => { await MusicXmlImporterTestHelper.testReferenceFile('test-data/musicxml-testsuite/23d-Tuplets-Nested.xml'); + // not supported }); - it('23e_Tuplets_Tremolo', async () => { + it('23e-Tuplets-Tremolo', async () => { await MusicXmlImporterTestHelper.testReferenceFile('test-data/musicxml-testsuite/23e-Tuplets-Tremolo.xml'); }); - it('23f_Tuplets_DurationButNoBracket', async () => { + it('23f-Tuplets-DurationButNoBracket', async () => { await MusicXmlImporterTestHelper.testReferenceFile( 'test-data/musicxml-testsuite/23f-Tuplets-DurationButNoBracket.xml' ); + // not supported }); - it('24a_GraceNotes', async () => { + it('24a-GraceNotes', async () => { await MusicXmlImporterTestHelper.testReferenceFile('test-data/musicxml-testsuite/24a-GraceNotes.xml'); + // not all styles are correct }); - it('24b_ChordAsGraceNote', async () => { + it('24b-ChordAsGraceNote', async () => { await MusicXmlImporterTestHelper.testReferenceFile('test-data/musicxml-testsuite/24b-ChordAsGraceNote.xml'); }); - it('24c_GraceNote_MeasureEnd', async () => { + it('24c-GraceNote-MeasureEnd', async () => { await MusicXmlImporterTestHelper.testReferenceFile('test-data/musicxml-testsuite/24c-GraceNote-MeasureEnd.xml'); }); - it('24d_AfterGrace', async () => { + it('24d-AfterGrace', async () => { await MusicXmlImporterTestHelper.testReferenceFile('test-data/musicxml-testsuite/24d-AfterGrace.xml'); }); - it('24e_GraceNote_StaffChange', async () => { - await MusicXmlImporterTestHelper.testReferenceFile('test-data/musicxml-testsuite/24e-GraceNote-StaffChange.xml'); + it('24e-GraceNote-StaffChange', async () => { + await MusicXmlImporterTestHelper.testReferenceFile( + 'test-data/musicxml-testsuite/24e-GraceNote-StaffChange.xml' + ); }); - it('24f_GraceNote_Slur', async () => { + it('24f-GraceNote-Slur', async () => { await MusicXmlImporterTestHelper.testReferenceFile('test-data/musicxml-testsuite/24f-GraceNote-Slur.xml'); }); - it('31a_Directions', async () => { + it('24g-GraceNote-Dynamics', async () => { + await MusicXmlImporterTestHelper.testReferenceFile('test-data/musicxml-testsuite/24g-GraceNote-Dynamics.xml'); + }); + + it('24h-GraceNote-Simultaneous', async () => { + await MusicXmlImporterTestHelper.testReferenceFile( + 'test-data/musicxml-testsuite/24h-GraceNote-Simultaneous.xml' + ); + }); + + it('31a-Directions', async () => { await MusicXmlImporterTestHelper.testReferenceFile('test-data/musicxml-testsuite/31a-Directions.xml'); + // many directions not supported yet. + }); + + it('31b-Directions-Order', async () => { + await MusicXmlImporterTestHelper.testReferenceFile('test-data/musicxml-testsuite/31b-Directions-Order.xml'); + // not supported }); - it('31c_MetronomeMarks', async () => { + it('31c-MetronomeMarks', async () => { await MusicXmlImporterTestHelper.testReferenceFile('test-data/musicxml-testsuite/31c-MetronomeMarks.xml'); + // only classical BPM tempo changes supported (no dots, brackets or combined annotations) + }); + + it('31d-Directions-Compounds', async () => { + await MusicXmlImporterTestHelper.testReferenceFile('test-data/musicxml-testsuite/31d-Directions-Compounds.xml'); }); - it('32a_Notations', async () => { + it('32a-Notations', async () => { await MusicXmlImporterTestHelper.testReferenceFile('test-data/musicxml-testsuite/32a-Notations.xml'); + // various annotations not supported, the ones we support seem fine }); - it('32b_Articulations_Texts', async () => { + it('32b-Articulations-Texts', async () => { await MusicXmlImporterTestHelper.testReferenceFile('test-data/musicxml-testsuite/32b-Articulations-Texts.xml'); + // no formatted text support }); - it('32c_MultipleNotationChildren', async () => { + it('32c-MultipleNotationChildren', async () => { await MusicXmlImporterTestHelper.testReferenceFile( 'test-data/musicxml-testsuite/32c-MultipleNotationChildren.xml' ); }); - it('32d_Arpeggio', async () => { + it('32d-Arpeggio', async () => { await MusicXmlImporterTestHelper.testReferenceFile('test-data/musicxml-testsuite/32d-Arpeggio.xml'); + // no partial or brackets. }); - it('33a_Spanners', async () => { + it('33a-Spanners', async () => { await MusicXmlImporterTestHelper.testReferenceFile('test-data/musicxml-testsuite/33a-Spanners.xml'); + // no general spanners + // pedal only with text }); - it('33b_Spanners_Tie', async () => { + it('33b-Spanners-Tie', async () => { await MusicXmlImporterTestHelper.testReferenceFile('test-data/musicxml-testsuite/33b-Spanners-Tie.xml'); + // only automatic placement }); - it('33c_Spanners_Slurs', async () => { + it('33c-Spanners-Slurs', async () => { await MusicXmlImporterTestHelper.testReferenceFile('test-data/musicxml-testsuite/33c-Spanners-Slurs.xml'); }); - it('33d_Spanners_OctaveShifts', async () => { - await MusicXmlImporterTestHelper.testReferenceFile('test-data/musicxml-testsuite/33d-Spanners-OctaveShifts.xml'); + it('33da-Spanners-OctaveShifts-before', async () => { + await MusicXmlImporterTestHelper.testReferenceFile( + 'test-data/musicxml-testsuite/33da-Spanners-OctaveShifts-before.xml' + ); + // not supported + }); + + it('33db-Spanners-OctaveShifts-after', async () => { + await MusicXmlImporterTestHelper.testReferenceFile( + 'test-data/musicxml-testsuite/33db-Spanners-OctaveShifts-after.xml' + ); + // not supported }); - it('33e_Spanners_OctaveShifts_InvalidSize', async () => { + it('33e-Spanners-OctaveShifts-InvalidSize', async () => { await MusicXmlImporterTestHelper.testReferenceFile( 'test-data/musicxml-testsuite/33e-Spanners-OctaveShifts-InvalidSize.xml' ); }); - it('33f_Trill_EndingOnGraceNote', async () => { + it('33f-Trill-EndingOnGraceNote', async () => { await MusicXmlImporterTestHelper.testReferenceFile( 'test-data/musicxml-testsuite/33f-Trill-EndingOnGraceNote.xml' ); + // not supported }); - it('33g_Slur_ChordedNotes', async () => { + it('33g-Slur-ChordedNotes', async () => { await MusicXmlImporterTestHelper.testReferenceFile('test-data/musicxml-testsuite/33g-Slur-ChordedNotes.xml'); + // slur starting on exact note. }); - it('33h_Spanners_Glissando', async () => { + it('33h-Spanners-Glissando', async () => { await MusicXmlImporterTestHelper.testReferenceFile('test-data/musicxml-testsuite/33h-Spanners-Glissando.xml'); + // only normal slide }); - it('33i_Ties_NotEnded', async () => { + it('33i-Ties-NotEnded', async () => { await MusicXmlImporterTestHelper.testReferenceFile('test-data/musicxml-testsuite/33i-Ties-NotEnded.xml'); }); - it('41a_MultiParts_Partorder', async () => { + it('33j-Beams-Tremolos', async () => { + await MusicXmlImporterTestHelper.testReferenceFile('test-data/musicxml-testsuite/33j-Beams-Tremolos.xml'); + // not supported + }); + + it('34a-Print-Object-Spanners', async () => { + await MusicXmlImporterTestHelper.testReferenceFile( + 'test-data/musicxml-testsuite/34a-Print-Object-Spanners.xml' + ); + }); + + it('34b-Colors', async () => { + await MusicXmlImporterTestHelper.testReferenceFile('test-data/musicxml-testsuite/34b-Colors.xml'); + }); + + it('34c-Font-Size', async () => { + await MusicXmlImporterTestHelper.testReferenceFile('test-data/musicxml-testsuite/34c-Font-Size.xml'); + }); + + it('41a-MultiParts-Partorder', async () => { await MusicXmlImporterTestHelper.testReferenceFile('test-data/musicxml-testsuite/41a-MultiParts-Partorder.xml'); }); - it('41b_MultiParts_MoreThan10', async () => { - await MusicXmlImporterTestHelper.testReferenceFile('test-data/musicxml-testsuite/41b-MultiParts-MoreThan10.xml'); + it('41b-MultiParts-MoreThan10', async () => { + await MusicXmlImporterTestHelper.testReferenceFile( + 'test-data/musicxml-testsuite/41b-MultiParts-MoreThan10.xml' + ); }); - it('41c_StaffGroups', async () => { + it('41c-StaffGroups', async () => { await MusicXmlImporterTestHelper.testReferenceFile('test-data/musicxml-testsuite/41c-StaffGroups.xml'); }); - it('41d_StaffGroups_Nested', async () => { + it('41d-StaffGroups-Nested', async () => { await MusicXmlImporterTestHelper.testReferenceFile('test-data/musicxml-testsuite/41d-StaffGroups-Nested.xml'); }); - it('41e_StaffGroups_InstrumentNames_Linebroken', async () => { + it('41e-StaffGroups-InstrumentNames-Linebroken', async () => { await MusicXmlImporterTestHelper.testReferenceFile( 'test-data/musicxml-testsuite/41e-StaffGroups-InstrumentNames-Linebroken.xml' ); }); - it('41f_StaffGroups_Overlapping', async () => { + it('41f-StaffGroups-Overlapping', async () => { await MusicXmlImporterTestHelper.testReferenceFile( 'test-data/musicxml-testsuite/41f-StaffGroups-Overlapping.xml' ); }); - it('41g_PartNoId', async () => { - await MusicXmlImporterTestHelper.testReferenceFile('test-data/musicxml-testsuite/41g-PartNoId.xml'); + it('41g-StaffGroups-NestingOrder', async () => { + await MusicXmlImporterTestHelper.testReferenceFile( + 'test-data/musicxml-testsuite/41g-StaffGroups-NestingOrder.xml' + ); }); - it('41h_TooManyParts', async () => { + it('41h-TooManyParts', async () => { await MusicXmlImporterTestHelper.testReferenceFile('test-data/musicxml-testsuite/41h-TooManyParts.xml'); }); - it('41i_PartNameDisplay_Override', async () => { + it('41i-PartNameDisplay-Override', async () => { await MusicXmlImporterTestHelper.testReferenceFile( 'test-data/musicxml-testsuite/41i-PartNameDisplay-Override.xml' ); }); - it('42a_MultiVoice_TwoVoicesOnStaff_Lyrics', async () => { + it('41j-PartNameDisplay-Multiple-DisplayText-Children', async () => { + await MusicXmlImporterTestHelper.testReferenceFile( + 'test-data/musicxml-testsuite/41j-PartNameDisplay-Multiple-DisplayText-Children.xml' + ); + // styling not supported + }); + + it('41k-PartName-Print', async () => { + await MusicXmlImporterTestHelper.testReferenceFile('test-data/musicxml-testsuite/41k-PartName-Print.xml'); + }); + + it('41l-GroupNameDisplay-Override', async () => { + await MusicXmlImporterTestHelper.testReferenceFile( + 'test-data/musicxml-testsuite/41l-GroupNameDisplay-Override.xml' + ); + }); + + it('42a-MultiVoice-TwoVoicesOnStaff-Lyrics', async () => { await MusicXmlImporterTestHelper.testReferenceFile( 'test-data/musicxml-testsuite/42a-MultiVoice-TwoVoicesOnStaff-Lyrics.xml' ); }); - it('42b_MultiVoice_MidMeasureClefChange', async () => { + it('42b-MultiVoice-MidMeasureClefChange', async () => { await MusicXmlImporterTestHelper.testReferenceFile( 'test-data/musicxml-testsuite/42b-MultiVoice-MidMeasureClefChange.xml' ); }); - it('43a_PianoStaff', async () => { + it('43a-PianoStaff', async () => { await MusicXmlImporterTestHelper.testReferenceFile('test-data/musicxml-testsuite/43a-PianoStaff.xml'); }); - it('43b_MultiStaff_DifferentKeys', async () => { + it('43b-MultiStaff-DifferentKeys', async () => { await MusicXmlImporterTestHelper.testReferenceFile( 'test-data/musicxml-testsuite/43b-MultiStaff-DifferentKeys.xml' ); + // not supported }); - it('43c_MultiStaff_DifferentKeysAfterBackup', async () => { + it('43c-MultiStaff-DifferentKeysAfterBackup', async () => { await MusicXmlImporterTestHelper.testReferenceFile( 'test-data/musicxml-testsuite/43c-MultiStaff-DifferentKeysAfterBackup.xml' ); + // not supported }); - it('43d_MultiStaff_StaffChange', async () => { + it('43d-MultiStaff-StaffChange', async () => { await MusicXmlImporterTestHelper.testReferenceFile( 'test-data/musicxml-testsuite/43d-MultiStaff-StaffChange.xml' ); + // filling with rests where needed, cross staff beams not supported }); - it('43e_Multistaff_ClefDynamics', async () => { + it('43e-Multistaff-ClefDynamics', async () => { await MusicXmlImporterTestHelper.testReferenceFile( 'test-data/musicxml-testsuite/43e-Multistaff-ClefDynamics.xml' ); }); - it('45a_SimpleRepeat', async () => { - await MusicXmlImporterTestHelper.testReferenceFile('test-data/musicxml-testsuite/45a-SimpleRepeat.xml'); + it('43f-MultiStaff-Lyrics', async () => { + await MusicXmlImporterTestHelper.testReferenceFile('test-data/musicxml-testsuite/43f-MultiStaff-Lyrics.xml'); }); - it('45b_RepeatWithAlternatives', async () => { + it('43g-MultiStaff-PartSymbol', async () => { await MusicXmlImporterTestHelper.testReferenceFile( - 'test-data/musicxml-testsuite/45b-RepeatWithAlternatives.xml' + 'test-data/musicxml-testsuite/43g-MultiStaff-PartSymbol.xml' ); }); - it('45c_RepeatMultipleTimes', async () => { - await MusicXmlImporterTestHelper.testReferenceFile('test-data/musicxml-testsuite/45c-RepeatMultipleTimes.xml'); + it('45a-SimpleRepeat', async () => { + await MusicXmlImporterTestHelper.testReferenceFile('test-data/musicxml-testsuite/45a-SimpleRepeat.xml'); }); - it('45d_Repeats_Nested_Alternatives', async () => { + it('45b-RepeatWithAlternatives', async () => { await MusicXmlImporterTestHelper.testReferenceFile( - 'test-data/musicxml-testsuite/45d-Repeats-Nested-Alternatives.xml' + 'test-data/musicxml-testsuite/45b-RepeatWithAlternatives.xml' ); }); - it('45e_Repeats_Nested_Alternatives', async () => { + it('45c-SimpleRepeat-Nested', async () => { + await MusicXmlImporterTestHelper.testReferenceFile('test-data/musicxml-testsuite/45c-SimpleRepeat-Nested.xml'); + }); + + it('45d-Repeats-MultipleEndings', async () => { await MusicXmlImporterTestHelper.testReferenceFile( - 'test-data/musicxml-testsuite/45e-Repeats-Nested-Alternatives.xml' + 'test-data/musicxml-testsuite/45d-Repeats-MultipleEndings.xml' ); }); - it('45f_Repeats_InvalidEndings', async () => { + it('45e-Repeats-Combination', async () => { + await MusicXmlImporterTestHelper.testReferenceFile('test-data/musicxml-testsuite/45e-Repeats-Combination.xml'); + }); + + it('45f-Repeats-InvalidEndings', async () => { await MusicXmlImporterTestHelper.testReferenceFile( 'test-data/musicxml-testsuite/45f-Repeats-InvalidEndings.xml' ); }); - it('45g_Repeats_NotEnded', async () => { + it('45g-Repeats-NotEnded', async () => { await MusicXmlImporterTestHelper.testReferenceFile('test-data/musicxml-testsuite/45g-Repeats-NotEnded.xml'); }); - it('46a_Barlines', async () => { + it('45h-Repeats-Partial', async () => { + await MusicXmlImporterTestHelper.testReferenceFile('test-data/musicxml-testsuite/45h-Repeats-Partial.xml'); + }); + + it('45i-Repeats-Nested', async () => { + await MusicXmlImporterTestHelper.testReferenceFile('test-data/musicxml-testsuite/45i-Repeats-Nested.xml'); + }); + + it('46a-Barlines', async () => { await MusicXmlImporterTestHelper.testReferenceFile('test-data/musicxml-testsuite/46a-Barlines.xml'); + // only double bar }); - it('46b_MidmeasureBarline', async () => { + it('46b-MidmeasureBarline', async () => { await MusicXmlImporterTestHelper.testReferenceFile('test-data/musicxml-testsuite/46b-MidmeasureBarline.xml'); + // not supported }); - it('46c_Midmeasure_Clef', async () => { + it('46c-Midmeasure-Clef', async () => { await MusicXmlImporterTestHelper.testReferenceFile('test-data/musicxml-testsuite/46c-Midmeasure-Clef.xml'); + // not supported }); - it('46d_PickupMeasure_ImplicitMeasures', async () => { + it('46d-PickupMeasure-ImplicitMeasures', async () => { await MusicXmlImporterTestHelper.testReferenceFile( 'test-data/musicxml-testsuite/46d-PickupMeasure-ImplicitMeasures.xml' ); }); - it('46e_PickupMeasure_SecondVoiceStartsLater', async () => { + it('46e-PickupMeasure-SecondVoiceStartsLater', async () => { await MusicXmlImporterTestHelper.testReferenceFile( 'test-data/musicxml-testsuite/46e-PickupMeasure-SecondVoiceStartsLater.xml' ); }); - it('46f_IncompleteMeasures', async () => { + it('46f-IncompleteMeasures', async () => { await MusicXmlImporterTestHelper.testReferenceFile('test-data/musicxml-testsuite/46f-IncompleteMeasures.xml'); }); - it('46g_PickupMeasure_Chordnames_FiguredBass', async () => { + it('46g-PickupMeasure-Chordnames-FiguredBass', async () => { await MusicXmlImporterTestHelper.testReferenceFile( 'test-data/musicxml-testsuite/46g-PickupMeasure-Chordnames-FiguredBass.xml' ); }); - it('51b_Header_Quotes', async () => { + it('51b-Header-Quotes', async () => { await MusicXmlImporterTestHelper.testReferenceFile('test-data/musicxml-testsuite/51b-Header-Quotes.xml'); }); - it('51c_MultipleRights', async () => { + it('51c-MultipleRights', async () => { await MusicXmlImporterTestHelper.testReferenceFile('test-data/musicxml-testsuite/51c-MultipleRights.xml'); }); - it('51d_EmptyTitle', async () => { + it('51d-EmptyTitle', async () => { await MusicXmlImporterTestHelper.testReferenceFile('test-data/musicxml-testsuite/51d-EmptyTitle.xml'); }); - it('52a_PageLayout', async () => { + it('52a-PageLayout', async () => { await MusicXmlImporterTestHelper.testReferenceFile('test-data/musicxml-testsuite/52a-PageLayout.xml'); }); - it('52b_Breaks', async () => { + it('52b-Breaks', async () => { await MusicXmlImporterTestHelper.testReferenceFile('test-data/musicxml-testsuite/52b-Breaks.xml'); }); - it('61a_Lyrics', async () => { + it('61a-Lyrics', async () => { await MusicXmlImporterTestHelper.testReferenceFile('test-data/musicxml-testsuite/61a-Lyrics.xml'); + // no syllables }); - it('61b_MultipleLyrics', async () => { + it('61b-MultipleLyrics', async () => { await MusicXmlImporterTestHelper.testReferenceFile('test-data/musicxml-testsuite/61b-MultipleLyrics.xml'); }); - it('61c_Lyrics_Pianostaff', async () => { + it('61c-Lyrics-Pianostaff', async () => { await MusicXmlImporterTestHelper.testReferenceFile('test-data/musicxml-testsuite/61c-Lyrics-Pianostaff.xml'); }); - it('61d_Lyrics_Melisma', async () => { + it('61d-Lyrics-Melisma', async () => { await MusicXmlImporterTestHelper.testReferenceFile('test-data/musicxml-testsuite/61d-Lyrics-Melisma.xml'); }); - it('61e_Lyrics_Chords', async () => { + it('61e-Lyrics-Chords', async () => { await MusicXmlImporterTestHelper.testReferenceFile('test-data/musicxml-testsuite/61e-Lyrics-Chords.xml'); }); - it('61f_Lyrics_GracedNotes', async () => { + it('61f-Lyrics-GracedNotes', async () => { await MusicXmlImporterTestHelper.testReferenceFile('test-data/musicxml-testsuite/61f-Lyrics-GracedNotes.xml'); }); - it('61g_Lyrics_NameNumber', async () => { + it('61g-Lyrics-NameNumber', async () => { await MusicXmlImporterTestHelper.testReferenceFile('test-data/musicxml-testsuite/61g-Lyrics-NameNumber.xml'); }); - it('61h_Lyrics_BeamsMelismata', async () => { - await MusicXmlImporterTestHelper.testReferenceFile('test-data/musicxml-testsuite/61h-Lyrics-BeamsMelismata.xml'); + it('61h-Lyrics-BeamsMelismata', async () => { + await MusicXmlImporterTestHelper.testReferenceFile( + 'test-data/musicxml-testsuite/61h-Lyrics-BeamsMelismata.xml' + ); }); - it('61i_Lyrics_Chords', async () => { + it('61i-Lyrics-Chords', async () => { await MusicXmlImporterTestHelper.testReferenceFile('test-data/musicxml-testsuite/61i-Lyrics-Chords.xml'); }); - it('61j_Lyrics_Elisions', async () => { + it('61j-Lyrics-Elisions', async () => { await MusicXmlImporterTestHelper.testReferenceFile('test-data/musicxml-testsuite/61j-Lyrics-Elisions.xml'); }); - it('61k_Lyrics_SpannersExtenders', async () => { + it('61k-Lyrics-SpannersExtenders', async () => { await MusicXmlImporterTestHelper.testReferenceFile( 'test-data/musicxml-testsuite/61k-Lyrics-SpannersExtenders.xml' ); }); - it('71a_Chordnames', async () => { + it('71a-Chordnames', async () => { await MusicXmlImporterTestHelper.testReferenceFile('test-data/musicxml-testsuite/71a-Chordnames.xml'); }); - it('71c_ChordsFrets', async () => { + it('71c-ChordsFrets', async () => { await MusicXmlImporterTestHelper.testReferenceFile('test-data/musicxml-testsuite/71c-ChordsFrets.xml'); }); - it('71d_ChordsFrets_Multistaff', async () => { + it('71d-ChordsFrets-Multistaff', async () => { await MusicXmlImporterTestHelper.testReferenceFile( 'test-data/musicxml-testsuite/71d-ChordsFrets-Multistaff.xml' ); }); - it('71e_TabStaves', async () => { + it('71e-TabStaves', async () => { await MusicXmlImporterTestHelper.testReferenceFile('test-data/musicxml-testsuite/71e-TabStaves.xml'); }); - it('71f_AllChordTypes', async () => { + it('71f-AllChordTypes', async () => { await MusicXmlImporterTestHelper.testReferenceFile('test-data/musicxml-testsuite/71f-AllChordTypes.xml'); }); - it('71g_MultipleChordnames', async () => { + it('71g-MultipleChordnames', async () => { await MusicXmlImporterTestHelper.testReferenceFile('test-data/musicxml-testsuite/71g-MultipleChordnames.xml'); }); - it('72a_TransposingInstruments', async () => { + it('72a-TransposingInstruments', async () => { await MusicXmlImporterTestHelper.testReferenceFile( 'test-data/musicxml-testsuite/72a-TransposingInstruments.xml' ); }); - it('72b_TransposingInstruments_Full', async () => { + it('72b-TransposingInstruments-Full', async () => { await MusicXmlImporterTestHelper.testReferenceFile( 'test-data/musicxml-testsuite/72b-TransposingInstruments-Full.xml' ); }); - it('72c_TransposingInstruments_Change', async () => { + it('72c-TransposingInstruments-Change', async () => { await MusicXmlImporterTestHelper.testReferenceFile( 'test-data/musicxml-testsuite/72c-TransposingInstruments-Change.xml' ); + // broken }); - it('73a_Percussion', async () => { + it('73a-Percussion', async () => { await MusicXmlImporterTestHelper.testReferenceFile('test-data/musicxml-testsuite/73a-Percussion.xml'); }); - it('74a_FiguredBass', async () => { + it('74a-FiguredBass', async () => { await MusicXmlImporterTestHelper.testReferenceFile('test-data/musicxml-testsuite/74a-FiguredBass.xml'); + // not supported }); - it('75a_AccordionRegistrations', async () => { + it('75a-AccordionRegistrations', async () => { await MusicXmlImporterTestHelper.testReferenceFile( 'test-data/musicxml-testsuite/75a-AccordionRegistrations.xml' ); + // not supported }); - it('99a_Sibelius5_IgnoreBeaming', async () => { - await MusicXmlImporterTestHelper.testReferenceFile( - 'test-data/musicxml-testsuite/99a-Sibelius5-IgnoreBeaming.xml' - ); + it('90a-Compressed-MusicXML', async () => { + await MusicXmlImporterTestHelper.testReferenceFile('test-data/musicxml-testsuite/90a-Compressed-MusicXML.mxl'); }); - it('99b_Lyrics_BeamsMelismata_IgnoreBeams', async () => { + it('99a-Sibelius5-IgnoreBeaming', async () => { await MusicXmlImporterTestHelper.testReferenceFile( - 'test-data/musicxml-testsuite/99b-Lyrics-BeamsMelismata-IgnoreBeams.xml' + 'test-data/musicxml-testsuite/99a-Sibelius5-IgnoreBeaming.xml' ); }); - it('100a_Guitare_Bends', async () => { + it('99b-Lyrics-BeamsMelismata-IgnoreBeams', async () => { await MusicXmlImporterTestHelper.testReferenceFile( - 'test-data/musicxml-testsuite/100a-Guitare-Bends.xml' + 'test-data/musicxml-testsuite/99b-Lyrics-BeamsMelismata-IgnoreBeams.xml' ); }); - - }); diff --git a/test/importer/__snapshots__/musicxmlimporter.test.ts.snap b/test/importer/__snapshots__/musicxmlimporter.test.ts.snap index ce1a7ae49..2276b24f6 100644 --- a/test/importer/__snapshots__/musicxmlimporter.test.ts.snap +++ b/test/importer/__snapshots__/musicxmlimporter.test.ts.snap @@ -150,7 +150,7 @@ Map { "volume" => 0, "secondarychannel" => 1, }, - "name" => "Track 1", + "name" => "Track 1", "shortname" => "T1", }, Map { @@ -272,10 +272,13 @@ Map { "primarychannel" => 2, "secondarychannel" => 3, }, - "name" => "Track 2", + "name" => "Track 2", "shortname" => "T2", }, ], + "stylesheet" => Map { + "hidedynamics" => true, + }, } `; @@ -382,7 +385,7 @@ Map { "volume" => 0, "secondarychannel" => 1, }, - "name" => "Track 1", + "name" => "Track 1", "shortname" => "T1", }, Map { @@ -466,7 +469,7 @@ Map { "primarychannel" => 2, "secondarychannel" => 3, }, - "name" => "Track 2", + "name" => "Track 2", "shortname" => "T2", }, Map { @@ -550,10 +553,13 @@ Map { "primarychannel" => 4, "secondarychannel" => 5, }, - "name" => "Track 3", + "name" => "Track 3", "shortname" => "T3", }, ], + "stylesheet" => Map { + "hidedynamics" => true, + }, } `; @@ -908,8 +914,8 @@ Map { "playbackinfo" => Map { "secondarychannel" => 1, }, - "name" => "Track 1", - "shortname" => "Track 1", + "name" => "Track 1", + "shortname" => "Track 1", }, Map { "__kind" => "Track", @@ -1147,10 +1153,13 @@ Map { "primarychannel" => 2, "secondarychannel" => 3, }, - "name" => "Track 2", - "shortname" => "Track 2", + "name" => "Track 2", + "shortname" => "Track 2", }, ], + "stylesheet" => Map { + "hidedynamics" => true, + }, } `; @@ -1760,8 +1769,8 @@ Map { "playbackinfo" => Map { "secondarychannel" => 1, }, - "name" => "Track 1", - "shortname" => "Track 1", + "name" => "Track 1", + "shortname" => "Track 1", }, Map { "__kind" => "Track", @@ -2174,10 +2183,13 @@ Map { "primarychannel" => 2, "secondarychannel" => 3, }, - "name" => "Track 2", - "shortname" => "Track 2", + "name" => "Track 2", + "shortname" => "Track 2", }, ], + "stylesheet" => Map { + "hidedynamics" => true, + }, } `; @@ -2331,7 +2343,7 @@ Map { "volume" => 0, "secondarychannel" => 1, }, - "name" => "Track 1", + "name" => "Track 1", "shortname" => "T1", }, Map { @@ -2453,10 +2465,13 @@ Map { "primarychannel" => 2, "secondarychannel" => 3, }, - "name" => "Track 2", + "name" => "Track 2", "shortname" => "T2", }, ], + "stylesheet" => Map { + "hidedynamics" => true, + }, } `; @@ -2563,7 +2578,7 @@ Map { "volume" => 0, "secondarychannel" => 1, }, - "name" => "Track 1", + "name" => "Track 1", "shortname" => "T1", }, Map { @@ -2647,7 +2662,7 @@ Map { "primarychannel" => 2, "secondarychannel" => 3, }, - "name" => "Track 2", + "name" => "Track 2", "shortname" => "T2", }, Map { @@ -2731,9 +2746,12 @@ Map { "primarychannel" => 4, "secondarychannel" => 5, }, - "name" => "Track 3", + "name" => "Track 3", "shortname" => "T3", }, ], + "stylesheet" => Map { + "hidedynamics" => true, + }, } `; diff --git a/test/model/ComparisonHelpers.ts b/test/model/ComparisonHelpers.ts index 171a72d36..13a62a7cf 100644 --- a/test/model/ComparisonHelpers.ts +++ b/test/model/ComparisonHelpers.ts @@ -70,6 +70,8 @@ export class ComparisonHelpers { 'tiedestinationnoteid', 'sluroriginnoteid', 'slurdestinationnoteid', + 'slidetargetnoteid', + 'slideoriginnoteid', 'systemslayout', 'defaultsystemslayout', 'displayscale', diff --git a/test/visualTests/VisualTestHelper.ts b/test/visualTests/VisualTestHelper.ts index 06a442dfc..494127c61 100644 --- a/test/visualTests/VisualTestHelper.ts +++ b/test/visualTests/VisualTestHelper.ts @@ -71,7 +71,8 @@ export class VisualTestHelper { settings?: Settings, configure?: (o: VisualTestOptions) => void ): Promise { - const inputFileData = await TestPlatform.loadFile(`test-data/visual-tests/${inputFile}`); + inputFile = `test-data/visual-tests/${inputFile}`; + const inputFileData = await TestPlatform.loadFile(inputFile); const referenceFileName = TestPlatform.changeExtension(inputFile, '.png'); let score: Score = ScoreLoader.loadScoreFromBytes(inputFileData, settings); @@ -99,7 +100,7 @@ export class VisualTestHelper { let referenceFileData: Uint8Array[] = []; for (const run of runs) { try { - referenceFileData.push(await TestPlatform.loadFile(`test-data/visual-tests/${run.referenceFileName}`)); + referenceFileData.push(await TestPlatform.loadFile(run.referenceFileName)); } catch (e) { referenceFileData.push(new Uint8Array(0)); } @@ -313,7 +314,7 @@ export class VisualTestHelper { let errorMessage = ''; const oldActual = actual; - const tolerancePercent = options.tolerancePercent ?? 1; + const tolerancePercent = options.tolerancePercent ?? 0; if (expected) { const sizeMismatch = expected.width !== actual.width || expected.height !== actual.height; @@ -395,7 +396,6 @@ export class VisualTestHelper { actual: AlphaSkiaImage, diff: AlphaSkiaImage | undefined ): Promise { - expectedFilePath = TestPlatform.joinPath('test-data', 'visual-tests', expectedFilePath); if (diff) { const diffData = diff.toPng()!; @@ -409,8 +409,6 @@ export class VisualTestHelper { } static async deleteFiles(expectedFilePath: string): Promise { - expectedFilePath = TestPlatform.joinPath('test-data', 'visual-tests', expectedFilePath); - const diffFileName = TestPlatform.changeExtension(expectedFilePath, '.diff.png'); await TestPlatform.deleteFile(diffFileName); diff --git a/test/visualTests/features/BoundsLookup.test.ts b/test/visualTests/features/BoundsLookup.test.ts index 2684d104c..f67488dd4 100644 --- a/test/visualTests/features/BoundsLookup.test.ts +++ b/test/visualTests/features/BoundsLookup.test.ts @@ -16,7 +16,7 @@ describe('BoundsLookupRenderingTests', () => { \\track "Guitar 2" 3.3 `, - referenceFileName + `test-data/visual-tests/${referenceFileName}` ); o.tracks = [0, 1]; o.prepareFullImage = (_run, api, img) => { diff --git a/test/visualTests/features/EffectsAndAnnotations.test.ts b/test/visualTests/features/EffectsAndAnnotations.test.ts index c4495c5e2..e409f5b67 100644 --- a/test/visualTests/features/EffectsAndAnnotations.test.ts +++ b/test/visualTests/features/EffectsAndAnnotations.test.ts @@ -24,7 +24,7 @@ describe('EffectsAndAnnotationsTests', () => { . :4 3.3*4 | 3.3 3.3 {v f tempo 120 "Other" } 3.3 6.3 `, - `effects-and-annotations/tempo-text.png` + `test-data/visual-tests/effects-and-annotations/tempo-text.png` ); }); @@ -105,7 +105,7 @@ describe('EffectsAndAnnotationsTests', () => { await VisualTestHelper.runVisualTestFull( new VisualTestOptions( score, - [new VisualTestRun(400, 'effects-and-annotations/slides-line-break.png')], + [new VisualTestRun(400, 'test-data/visual-tests/effects-and-annotations/slides-line-break.png')], settings ) ); @@ -160,9 +160,9 @@ describe('EffectsAndAnnotationsTests', () => { it('sustain-pedal', async () => { await VisualTestHelper.runVisualTestFull( await VisualTestOptions.file('effects-and-annotations/sustain.gp', [ - new VisualTestRun(1200, 'effects-and-annotations/sustain-1200.png'), - new VisualTestRun(850, 'effects-and-annotations/sustain-850.png'), - new VisualTestRun(600, 'effects-and-annotations/sustain-600.png') + new VisualTestRun(1200, 'test-data/visual-tests/effects-and-annotations/sustain-1200.png'), + new VisualTestRun(850, 'test-data/visual-tests/effects-and-annotations/sustain-850.png'), + new VisualTestRun(600, 'test-data/visual-tests/effects-and-annotations/sustain-600.png') ]) ); }); @@ -190,9 +190,9 @@ describe('EffectsAndAnnotationsTests', () => { new VisualTestOptions( score, [ - new VisualTestRun(1200, 'effects-and-annotations/sustain-1200.png'), - new VisualTestRun(850, 'effects-and-annotations/sustain-850.png'), - new VisualTestRun(600, 'effects-and-annotations/sustain-600.png') + new VisualTestRun(1200, 'test-data/visual-tests/effects-and-annotations/sustain-1200.png'), + new VisualTestRun(850, 'test-data/visual-tests/effects-and-annotations/sustain-850.png'), + new VisualTestRun(600, 'test-data/visual-tests/effects-and-annotations/sustain-600.png') ], settings ) @@ -268,7 +268,7 @@ describe('EffectsAndAnnotationsTests', () => { await VisualTestHelper.runVisualTestFull( new VisualTestOptions( score, - [new VisualTestRun(-1, 'effects-and-annotations/bend-vibrato-default.png')], + [new VisualTestRun(-1, 'test-data/visual-tests/effects-and-annotations/bend-vibrato-default.png')], settings ) ); @@ -285,7 +285,7 @@ describe('EffectsAndAnnotationsTests', () => { await VisualTestHelper.runVisualTestFull( new VisualTestOptions( score, - [new VisualTestRun(-1, 'effects-and-annotations/bend-vibrato-songbook.png')], + [new VisualTestRun(-1, 'test-data/visual-tests/effects-and-annotations/bend-vibrato-songbook.png')], settings ) ); @@ -304,6 +304,6 @@ describe('EffectsAndAnnotationsTests', () => { }); it('legato', async () => { - await VisualTestHelper.runVisualTestTex(`3.3.4{ legatoOrigin } 10.3.4`, 'effects-and-annotations/legato.png'); + await VisualTestHelper.runVisualTestTex(`3.3.4{ legatoOrigin } 10.3.4`, 'test-data/visual-tests/effects-and-annotations/legato.png'); }); }); diff --git a/test/visualTests/features/General.test.ts b/test/visualTests/features/General.test.ts index 59f42d6c2..54ca472f1 100644 --- a/test/visualTests/features/General.test.ts +++ b/test/visualTests/features/General.test.ts @@ -163,7 +163,7 @@ describe('GeneralTests', () => { let defaultStart: number = 0; await VisualTestHelper.runVisualTest('general/colors.gp', undefined, o => { - o.runs[0].referenceFileName = 'general/colors-disabled.png'; + o.runs[0].referenceFileName = 'test-data/visual-tests/general/colors-disabled.png'; defaultStart = performance.now(); }); const defaultEnd = performance.now(); diff --git a/test/visualTests/features/Layout.test.ts b/test/visualTests/features/Layout.test.ts index c94d6a149..a235f81a6 100644 --- a/test/visualTests/features/Layout.test.ts +++ b/test/visualTests/features/Layout.test.ts @@ -15,7 +15,7 @@ describe('LayoutTests', () => { await VisualTestHelper.runVisualTestFull( await VisualTestOptions.file( 'layout/page-layout.gp', - [new VisualTestRun(-1, 'layout/page-layout-justify-last-row.png')], + [new VisualTestRun(-1, 'test-data/visual-tests/layout/page-layout-justify-last-row.png')], settings ) ); @@ -134,7 +134,7 @@ describe('LayoutTests', () => { \\scale 0.5 c4 | \\scale 2 c4 | \\scale 0.5 c4 | c4 | c4 `, - 'layout/system-layout-tex.png', + 'test-data/visual-tests/layout/system-layout-tex.png', settings ); }); @@ -142,21 +142,21 @@ describe('LayoutTests', () => { it('multibar-rests-single-track', async () => { await VisualTestHelper.runVisualTest('layout/multibar-rest.gp', undefined, o => { o.tracks = [0]; - o.runs[0].referenceFileName = 'layout/multibar-rest-single-track.png'; + o.runs[0].referenceFileName = 'test-data/visual-tests/layout/multibar-rest-single-track.png'; }); }); it('multibar-rests-multi-track', async () => { await VisualTestHelper.runVisualTest('layout/multibar-rest.gp', undefined, o => { o.tracks = [0, 1]; - o.runs[0].referenceFileName = 'layout/multibar-rest-multi-track.png'; + o.runs[0].referenceFileName = 'test-data/visual-tests/layout/multibar-rest-multi-track.png'; }); }); it('multibar-rests-all-tracks', async () => { await VisualTestHelper.runVisualTest('layout/multibar-rest.gp', undefined, o => { o.tracks = [0, 1, 2]; - o.runs[0].referenceFileName = 'layout/multibar-rest-all-tracks.png'; + o.runs[0].referenceFileName = 'test-data/visual-tests/layout/multibar-rest-all-tracks.png'; }); }); }); diff --git a/test/visualTests/features/MusicNotation.test.ts b/test/visualTests/features/MusicNotation.test.ts index 438cb2028..2b61a8e95 100644 --- a/test/visualTests/features/MusicNotation.test.ts +++ b/test/visualTests/features/MusicNotation.test.ts @@ -174,7 +174,7 @@ describe('MusicNotationTests', () => { // score.stylesheet.bracketExtendMode = BracketExtendMode.NoBrackets; await VisualTestHelper.runVisualTestFull( - new VisualTestOptions(score, [new VisualTestRun(-1, 'music-notation/accidentals-advanced.png')], settings) + new VisualTestOptions(score, [new VisualTestRun(-1, 'test-data/visual-tests/music-notation/accidentals-advanced.png')], settings) ); }); }); diff --git a/test/visualTests/features/NotationElements.test.ts b/test/visualTests/features/NotationElements.test.ts index 64950ba79..6b65dd2bc 100644 --- a/test/visualTests/features/NotationElements.test.ts +++ b/test/visualTests/features/NotationElements.test.ts @@ -32,7 +32,7 @@ describe('NotationElements', () => { } await VisualTestHelper.runVisualTestFull( - VisualTestOptions.tex(tex, `notation-elements/score-info-${referenceName}.png`, settings) + VisualTestOptions.tex(tex, `test-data/visual-tests/notation-elements/score-info-${referenceName}.png`, settings) ); } @@ -81,7 +81,7 @@ describe('NotationElements', () => { settings.display.layoutMode = LayoutMode.Page; settings.notation.elements.set(NotationElement.GuitarTuning, true); - await VisualTestHelper.runVisualTestTex(tex, `notation-elements/guitar-tuning-on.png`, settings); + await VisualTestHelper.runVisualTestTex(tex, `test-data/visual-tests/notation-elements/guitar-tuning-on.png`, settings); }); it('guitar-tuning-off', async () => { @@ -91,7 +91,7 @@ describe('NotationElements', () => { settings.display.layoutMode = LayoutMode.Page; settings.notation.elements.set(NotationElement.GuitarTuning, false); - await VisualTestHelper.runVisualTestTex(tex, `notation-elements/guitar-tuning-off.png`, settings); + await VisualTestHelper.runVisualTestTex(tex, `test-data/visual-tests/notation-elements/guitar-tuning-off.png`, settings); }); it('track-names-off', async () => { @@ -101,7 +101,7 @@ describe('NotationElements', () => { settings.display.layoutMode = LayoutMode.Page; settings.notation.elements.set(NotationElement.TrackNames, false); - await VisualTestHelper.runVisualTestTex(tex, `notation-elements/track-names-off.png`, settings); + await VisualTestHelper.runVisualTestTex(tex, `test-data/visual-tests/notation-elements/track-names-off.png`, settings); }); it('track-names-on', async () => { @@ -111,7 +111,7 @@ describe('NotationElements', () => { settings.display.layoutMode = LayoutMode.Page; settings.notation.elements.set(NotationElement.TrackNames, true); - await VisualTestHelper.runVisualTestTex(tex, `notation-elements/track-names-on.png`, settings); + await VisualTestHelper.runVisualTestTex(tex, `test-data/visual-tests/notation-elements/track-names-on.png`, settings); }); it('chord-diagrams-off', async () => { @@ -121,7 +121,7 @@ describe('NotationElements', () => { settings.display.layoutMode = LayoutMode.Page; settings.notation.elements.set(NotationElement.ChordDiagrams, false); - await VisualTestHelper.runVisualTestTex(tex, `notation-elements/chord-diagrams-off.png`, settings); + await VisualTestHelper.runVisualTestTex(tex, `test-data/visual-tests/notation-elements/chord-diagrams-off.png`, settings); }); it('chord-diagrams-on', async () => { @@ -131,7 +131,7 @@ describe('NotationElements', () => { settings.display.layoutMode = LayoutMode.Page; settings.notation.elements.set(NotationElement.ChordDiagrams, true); - await VisualTestHelper.runVisualTestTex(tex, `notation-elements/chord-diagrams-on.png`, settings); + await VisualTestHelper.runVisualTestTex(tex, `test-data/visual-tests/notation-elements/chord-diagrams-on.png`, settings); }); it('parenthesis-on-tied-bends-off', async () => { @@ -141,7 +141,7 @@ describe('NotationElements', () => { settings.display.layoutMode = LayoutMode.Page; settings.notation.elements.set(NotationElement.ParenthesisOnTiedBends, false); - await VisualTestHelper.runVisualTestTex(tex, `notation-elements/parenthesis-on-tied-bends-off.png`, settings); + await VisualTestHelper.runVisualTestTex(tex, `test-data/visual-tests/notation-elements/parenthesis-on-tied-bends-off.png`, settings); }); it('parenthesis-on-tied-bends-on', async () => { @@ -151,7 +151,7 @@ describe('NotationElements', () => { settings.display.layoutMode = LayoutMode.Page; settings.notation.elements.set(NotationElement.ParenthesisOnTiedBends, true); - await VisualTestHelper.runVisualTestTex(tex, `notation-elements/parenthesis-on-tied-bends-on.png`, settings); + await VisualTestHelper.runVisualTestTex(tex, `test-data/visual-tests/notation-elements/parenthesis-on-tied-bends-on.png`, settings); }); it('tab-notes-on-tied-bends-off', async () => { @@ -161,7 +161,7 @@ describe('NotationElements', () => { settings.display.layoutMode = LayoutMode.Page; settings.notation.elements.set(NotationElement.TabNotesOnTiedBends, false); - await VisualTestHelper.runVisualTestTex(tex, `notation-elements/tab-notes-on-tied-bends-off.png`, settings); + await VisualTestHelper.runVisualTestTex(tex, `test-data/visual-tests/notation-elements/tab-notes-on-tied-bends-off.png`, settings); }); it('tab-notes-on-tied-bends-on', async () => { @@ -171,7 +171,7 @@ describe('NotationElements', () => { settings.display.layoutMode = LayoutMode.Page; settings.notation.elements.set(NotationElement.TabNotesOnTiedBends, true); - await VisualTestHelper.runVisualTestTex(tex, `notation-elements/tab-notes-on-tied-bends-on.png`, settings); + await VisualTestHelper.runVisualTestTex(tex, `test-data/visual-tests/notation-elements/tab-notes-on-tied-bends-on.png`, settings); }); it('zeros-on-dive-whammys-off', async () => { @@ -181,7 +181,7 @@ describe('NotationElements', () => { settings.display.layoutMode = LayoutMode.Page; settings.notation.elements.set(NotationElement.ZerosOnDiveWhammys, false); - await VisualTestHelper.runVisualTestTex(tex, `notation-elements/zeros-on-dive-whammys-off.png`, settings); + await VisualTestHelper.runVisualTestTex(tex, `test-data/visual-tests/notation-elements/zeros-on-dive-whammys-off.png`, settings); }); it('zeros-on-dive-whammys-on', async () => { @@ -191,7 +191,7 @@ describe('NotationElements', () => { settings.display.layoutMode = LayoutMode.Page; settings.notation.elements.set(NotationElement.ZerosOnDiveWhammys, true); - await VisualTestHelper.runVisualTestTex(tex, `notation-elements/zeros-on-dive-whammys-on.png`, settings); + await VisualTestHelper.runVisualTestTex(tex, `test-data/visual-tests/notation-elements/zeros-on-dive-whammys-on.png`, settings); }); it('effects-off', async () => { @@ -202,7 +202,7 @@ describe('NotationElements', () => { settings.notation.elements.set(NotationElement.EffectTempo, false); settings.notation.elements.set(NotationElement.EffectTripletFeel, false); - await VisualTestHelper.runVisualTestTex(tex, `notation-elements/effects-off.png`, settings); + await VisualTestHelper.runVisualTestTex(tex, `test-data/visual-tests/notation-elements/effects-off.png`, settings); }); it('effects-on', async () => { @@ -213,6 +213,6 @@ describe('NotationElements', () => { settings.notation.elements.set(NotationElement.EffectTempo, true); settings.notation.elements.set(NotationElement.EffectTripletFeel, true); - await VisualTestHelper.runVisualTestTex(tex, `notation-elements/effects-on.png`, settings); + await VisualTestHelper.runVisualTestTex(tex, `test-data/visual-tests/notation-elements/effects-on.png`, settings); }); }); diff --git a/test/visualTests/features/NotationLegend.test.ts b/test/visualTests/features/NotationLegend.test.ts index a3f787098..d1895f33f 100644 --- a/test/visualTests/features/NotationLegend.test.ts +++ b/test/visualTests/features/NotationLegend.test.ts @@ -19,7 +19,7 @@ describe('NotationLegend', () => { await VisualTestHelper.runVisualTestFull( await VisualTestOptions.file( 'notation-legend/notation-legend.gp', - [new VisualTestRun(-1, 'notation-legend/full-default-small.png')], + [new VisualTestRun(-1, 'test-data/visual-tests/notation-legend/full-default-small.png')], settings ) ); @@ -31,7 +31,7 @@ describe('NotationLegend', () => { await VisualTestHelper.runVisualTestFull( await VisualTestOptions.file( 'notation-legend/notation-legend.gp', - [new VisualTestRun(-1, 'notation-legend/full-default-large.png')], + [new VisualTestRun(-1, 'test-data/visual-tests/notation-legend/full-default-large.png')], settings ) ); @@ -250,10 +250,10 @@ describe('NotationLegend', () => { it('resize-sequence', async () => { await VisualTestHelper.runVisualTestFull( await VisualTestOptions.file('notation-legend/notation-legend.gp', [ - new VisualTestRun(1300, 'notation-legend/resize-sequence-1300.png'), - new VisualTestRun(800, 'notation-legend/resize-sequence-800.png'), - new VisualTestRun(1500, 'notation-legend/resize-sequence-1500.png'), - new VisualTestRun(500, 'notation-legend/resize-sequence-500.png') + new VisualTestRun(1300, 'test-data/visual-tests/notation-legend/resize-sequence-1300.png'), + new VisualTestRun(800, 'test-data/visual-tests/notation-legend/resize-sequence-800.png'), + new VisualTestRun(1500, 'test-data/visual-tests/notation-legend/resize-sequence-1500.png'), + new VisualTestRun(500, 'test-data/visual-tests/notation-legend/resize-sequence-500.png') ]) ); }); @@ -275,7 +275,7 @@ describe('NotationLegend', () => { const inputFileData = await TestPlatform.loadFile(`test-data/visual-tests/notation-legend/${fileName}`); let score: Score = ScoreLoader.loadScoreFromBytes(inputFileData, settings); - const o = new VisualTestOptions(score, [new VisualTestRun(-1, `notation-legend/${referenceFileName}`)], settings); + const o = new VisualTestOptions(score, [new VisualTestRun(-1, `test-data/visual-tests/notation-legend/${referenceFileName}`)], settings); await VisualTestHelper.runVisualTestFull(o); } }); diff --git a/test/visualTests/features/SpecialNotes.test.ts b/test/visualTests/features/SpecialNotes.test.ts index f3299e896..38dc27380 100644 --- a/test/visualTests/features/SpecialNotes.test.ts +++ b/test/visualTests/features/SpecialNotes.test.ts @@ -20,9 +20,9 @@ describe('SpecialNotesTests', () => { // grace notes flick around to wrong positions during resizes // due to wrong size registrations. (#604) const options = await VisualTestOptions.file('special-notes/grace-notes-advanced.gp', [ - new VisualTestRun(1300, 'special-notes/grace-notes-advanced-1300.png'), - new VisualTestRun(1300, 'special-notes/grace-notes-advanced-1300-2.png'), - new VisualTestRun(800, 'special-notes/grace-notes-advanced-800.png') + new VisualTestRun(1300, 'test-data/visual-tests/special-notes/grace-notes-advanced-1300.png'), + new VisualTestRun(1300, 'test-data/visual-tests/special-notes/grace-notes-advanced-1300-2.png'), + new VisualTestRun(800, 'test-data/visual-tests/special-notes/grace-notes-advanced-800.png') ]); options.tracks = [0, 1]; await VisualTestHelper.runVisualTestFull(options); diff --git a/test/visualTests/features/SystemsLayout.test.ts b/test/visualTests/features/SystemsLayout.test.ts index 7e2b62ee7..d3ebc7af9 100644 --- a/test/visualTests/features/SystemsLayout.test.ts +++ b/test/visualTests/features/SystemsLayout.test.ts @@ -13,7 +13,7 @@ describe('SystemsLayoutTests', () => { await VisualTestHelper.runVisualTestFull( await VisualTestOptions.file( 'systems-layout/bars-adjusted.gp', - [new VisualTestRun(-1, 'systems-layout/bars-adjusted-automatic.png')], + [new VisualTestRun(-1, 'test-data/visual-tests/systems-layout/bars-adjusted-automatic.png')], settings ) ); @@ -26,7 +26,7 @@ describe('SystemsLayoutTests', () => { await VisualTestHelper.runVisualTestFull( await VisualTestOptions.file( 'systems-layout/bars-adjusted.gp', - [new VisualTestRun(-1, 'systems-layout/bars-adjusted-model.png')], + [new VisualTestRun(-1, 'test-data/visual-tests/systems-layout/bars-adjusted-model.png')], settings ) ); @@ -39,7 +39,7 @@ describe('SystemsLayoutTests', () => { await VisualTestHelper.runVisualTestFull( await VisualTestOptions.file( 'systems-layout/multi-track-different.gp', - [new VisualTestRun(-1, 'systems-layout/multi-track-single-track.png')], + [new VisualTestRun(-1, 'test-data/visual-tests/systems-layout/multi-track-single-track.png')], settings ) ); @@ -51,7 +51,7 @@ describe('SystemsLayoutTests', () => { const options = await VisualTestOptions.file( 'systems-layout/multi-track-different.gp', - [new VisualTestRun(-1, 'systems-layout/multi-track-two-tracks.png')], + [new VisualTestRun(-1, 'test-data/visual-tests/systems-layout/multi-track-two-tracks.png')], settings ); options.tracks = [0, 1]; @@ -65,7 +65,7 @@ describe('SystemsLayoutTests', () => { await VisualTestHelper.runVisualTestFull( await VisualTestOptions.file( 'systems-layout/resized.gp', - [new VisualTestRun(-1, 'systems-layout/resized.png')], + [new VisualTestRun(-1, 'test-data/visual-tests/systems-layout/resized.png')], settings ) ); @@ -87,7 +87,7 @@ describe('SystemsLayoutTests', () => { await VisualTestHelper.runVisualTestFull( new VisualTestOptions( score, - [new VisualTestRun(-1, 'systems-layout/horizontal-fixed-sizes-single-track.png')], + [new VisualTestRun(-1, 'test-data/visual-tests/systems-layout/horizontal-fixed-sizes-single-track.png')], settings ) ); @@ -107,7 +107,7 @@ describe('SystemsLayoutTests', () => { const o = new VisualTestOptions( score, - [new VisualTestRun(-1, 'systems-layout/horizontal-fixed-sizes-two-tracks.png')], + [new VisualTestRun(-1, 'test-data/visual-tests/systems-layout/horizontal-fixed-sizes-two-tracks.png')], settings ); o.tracks = [0, 1];