Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 2 additions & 4 deletions src.csharp/AlphaTab.Test/VisualTests/VisualTestHelper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,7 @@ public static async Task RunVisualTestScore(Score score, string referenceFileNam
{
Width = 1300
};
renderer.PreRender.On(isResize =>
renderer.PreRender.On(isResize =>
{
result = new AlphaTab.Core.List<RenderFinishedEventArgs>();
totalWidth = 0.0;
Expand Down Expand Up @@ -129,9 +129,7 @@ public static async Task RunVisualTestScore(Score score, string referenceFileNam
});
renderer.Error.On((e) => { task.SetException(e); });

var renderScore =
JsonConverter.JsObjectToScore(JsonConverter.ScoreToJsObject(score), settings);
renderer.RenderScore(renderScore, tracks);
renderer.RenderScore(score, tracks);

if (await Task.WhenAny(task.Task, Task.Delay(2000)) == task.Task)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -147,9 +147,8 @@ public void RenderScore(Score score, IList<double> trackIndexes)
}
else
{
var serialized = JsonConverter.ScoreToJsObject(score);
_workerQueue.Add(() =>
RenderScore(JsonConverter.JsObjectToScore(serialized, _renderer.Settings),
RenderScore(score,
trackIndexes));
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -159,9 +159,7 @@ class VisualTestHelperPartials {

val job = GlobalScope.launch {
try {
val renderScore =
JsonConverter.jsObjectToScore(JsonConverter.scoreToJsObject(score), settings);
renderer.renderScore(renderScore, actualTracks)
renderer.renderScore(score, actualTracks)
} catch (e: Throwable) {
error = e
waitHandle.release()
Expand Down
9 changes: 9 additions & 0 deletions src/model/Beat.ts
Original file line number Diff line number Diff line change
Expand Up @@ -802,8 +802,17 @@ export class Beat {
this.graceGroup = new GraceGroup();
this.graceGroup.addBeat(this);
this.graceGroup.isComplete = true;
this.graceGroup.finish();
this.updateDurations();
this.voice.insertBeat(this, cloneBeat);

// ensure cloned beat has also a grace simple grace group for itself
// (see Voice.finish where every beat gets one)
// this ensures later that grace rods are assigned correctly to this beat.
cloneBeat.graceGroup = new GraceGroup();
cloneBeat.graceGroup.addBeat(this);
cloneBeat.graceGroup.isComplete = true;
cloneBeat.graceGroup.finish();
}
}

Expand Down
11 changes: 7 additions & 4 deletions src/model/GraceGroup.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ export class GraceGroup {

/**
* true if the grace beat are followed by a normal beat within the same
* bar.
* bar.
*/
public isComplete: boolean = false;

Expand All @@ -25,11 +25,14 @@ export class GraceGroup {
* @param beat The beat to add
*/
public addBeat(beat: Beat) {
if (this.beats.length === 0) {
this.id = beat.absoluteDisplayStart + "_" + beat.voice.index;
}
beat.graceIndex = this.beats.length;
beat.graceGroup = this;
this.beats.push(beat);
}

public finish() {
if (this.beats.length > 0) {
this.id = this.beats[0].absoluteDisplayStart + '_' + this.beats[0].voice.index;
}
}
}
19 changes: 14 additions & 5 deletions src/model/Voice.ts
Original file line number Diff line number Diff line change
Expand Up @@ -141,7 +141,8 @@ export class Voice {
const lastGraceBeat = beat.graceGroup!.beats[beat.graceGroup!.beats.length - 1];
if (firstGraceBeat.graceType !== GraceType.BendGrace) {
// find out the stolen duration first
let stolenDuration: number = (lastGraceBeat.playbackStart + lastGraceBeat.playbackDuration) - firstGraceBeat.playbackStart;
let stolenDuration: number =
lastGraceBeat.playbackStart + lastGraceBeat.playbackDuration - firstGraceBeat.playbackStart;

switch (firstGraceBeat.graceType) {
case GraceType.BeforeBeat:
Expand All @@ -150,7 +151,8 @@ export class Voice {
firstGraceBeat.previousBeat.playbackDuration -= stolenDuration;
// place beats starting after new beat end
if (firstGraceBeat.previousBeat.voice == this) {
currentPlaybackTick = firstGraceBeat.previousBeat.playbackStart +
currentPlaybackTick =
firstGraceBeat.previousBeat.playbackStart +
firstGraceBeat.previousBeat.playbackDuration;
} else {
// stealing into the previous bar
Expand All @@ -170,7 +172,7 @@ export class Voice {

break;
case GraceType.OnBeat:
// steal duration from current beat
// steal duration from current beat
beat.playbackDuration -= stolenDuration;
if (lastGraceBeat.voice === this) {
// with changed durations, update current position to be after the last grace beat
Expand All @@ -184,18 +186,25 @@ export class Voice {
}
}

beat.displayStart = currentDisplayTick;
beat.playbackStart = currentPlaybackTick;

if (beat.fermata) {
this.bar.masterBar.addFermata(beat.playbackStart, beat.fermata);
} else {
beat.fermata = this.bar.masterBar.getFermata(beat);
}

this._beatLookup.set(beat.playbackStart, beat);
} else {
beat.displayStart = currentDisplayTick;
beat.playbackStart = currentPlaybackTick;
}

beat.displayStart = currentDisplayTick;
beat.playbackStart = currentPlaybackTick;
beat.finishTuplet();
if (beat.graceGroup) {
beat.graceGroup.finish();
}
currentDisplayTick += beat.displayDuration;
currentPlaybackTick += beat.playbackDuration;
}
Expand Down