Skip to content

Commit 230bdd4

Browse files
authored
feat: Public API improvements for external cursor api (#2116)
1 parent 1f63422 commit 230bdd4

25 files changed

+324
-170
lines changed

src.compiler/csharp/CSharpAstTransformer.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -703,7 +703,7 @@ export default class CSharpAstTransformer {
703703
sourcePath,
704704
'..',
705705
'__snapshots__',
706-
`${path.basename(sourcePath).toLowerCase()}.snap`
706+
`${path.basename(sourcePath)}.snap`
707707
);
708708
if (fs.existsSync(snapshotFilePath)) {
709709
const relative = path.relative(path.resolve(this._context.compilerOptions.baseUrl!), snapshotFilePath);

src.csharp/AlphaTab.Windows/NAudioBackingTrackOutput.cs

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ internal class NAudioBackingTrackOutput : IBackingTrackSynthOutput, IDisposable
1818
/// <inheritdoc />
1919
public double SampleRate => PreferredSampleRate;
2020

21-
private TimeSpan _padding;
2221
private ISynthOutputDevice? _device;
2322
private StreamMediaFoundationReader? _audioFileReader;
2423
private DirectSoundOut? _context;
@@ -43,7 +42,7 @@ public NAudioBackingTrackOutput(Action<Action> invokeUi)
4342

4443
public void SeekTo(double time)
4544
{
46-
_audioFileReader!.CurrentTime = TimeSpan.FromMilliseconds(time) - _padding;
45+
_audioFileReader!.CurrentTime = TimeSpan.FromMilliseconds(time);
4746
}
4847

4948

@@ -52,8 +51,6 @@ public void LoadBackingTrack(BackingTrack backingTrack)
5251
_audioFileReader?.Dispose();
5352
_context?.Dispose();
5453

55-
_padding = TimeSpan.FromMilliseconds(backingTrack.Padding);
56-
5754
_audioFileReader = new StreamMediaFoundationReader(new System.IO.MemoryStream(
5855
backingTrack.RawAudioFile!.Buffer.Raw,
5956
(int)backingTrack.RawAudioFile!.ByteOffset,
@@ -102,7 +99,7 @@ private void Close()
10299

103100
private void UpdatePosition()
104101
{
105-
var timePos = (_context!.PlaybackPosition + _padding).TotalMilliseconds;
102+
var timePos = _context!.PlaybackPosition.TotalMilliseconds;
106103
_invokeUi(() => { ((EventEmitterOfT<double>)TimeUpdate).Trigger(timePos); });
107104
}
108105

src.csharp/AlphaTab/Platform/CSharp/AlphaSynthWorkerApiBase.cs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -190,9 +190,14 @@ public void SetChannelTranspositionPitch(double channel, double semitones)
190190
DispatchOnWorkerThread(() => { _player.SetChannelTranspositionPitch(channel, semitones); });
191191
}
192192

193-
public void LoadBackingTrack(Score score, IList<BackingTrackSyncPoint> syncPoints)
193+
public void LoadBackingTrack(Score score)
194194
{
195-
DispatchOnWorkerThread(() => { _player.LoadBackingTrack(score, syncPoints); });
195+
DispatchOnWorkerThread(() => { _player.LoadBackingTrack(score); });
196+
}
197+
198+
public void UpdateSyncPoints( IList<BackingTrackSyncPoint> syncPoints)
199+
{
200+
DispatchOnWorkerThread(() => { _player.UpdateSyncPoints(syncPoints); });
196201
}
197202

198203
public IEventEmitter Ready { get; } = new EventEmitter();

src.kotlin/alphaTab/android/src/main/java/alphaTab/platform/android/AndroidBackingTrackSynthOutput.kt

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,6 @@ class AndroidBackingTrackSynthOutput(
4747
_player.setVolume(value.toFloat(), value.toFloat())
4848
}
4949

50-
private var _padding: Int = 0
5150
private var _device: ISynthOutputDevice? = null
5251
private val _updateTimer: ScheduledExecutorService = Executors.newScheduledThreadPool(1)
5352
private var _updateSchedule: ScheduledFuture<*>? = null
@@ -72,7 +71,6 @@ class AndroidBackingTrackSynthOutput(
7271

7372
override fun loadBackingTrack(backingTrack: BackingTrack) {
7473
_player.reset()
75-
_padding = backingTrack.padding.toInt()
7674
_player.setAudioAttributes(
7775
AudioAttributes.Builder()
7876
.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
@@ -98,7 +96,7 @@ class AndroidBackingTrackSynthOutput(
9896
}
9997

10098
private fun updatePosition() {
101-
val timePos = _player.currentPosition + _padding
99+
val timePos = _player.currentPosition
102100
synthInvoke {
103101
(timeUpdate as EventEmitterOfT<Double>).trigger(timePos.toDouble())
104102
}

src.kotlin/alphaTab/android/src/main/java/alphaTab/platform/android/AndroidThreadAlphaSynthWorkerPlayer.kt

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -255,8 +255,12 @@ internal class AndroidThreadAlphaSynthWorkerPlayer : IAlphaSynth, Runnable {
255255
_workerQueue.add { _player?.setChannelTranspositionPitch(channel, semitones) }
256256
}
257257

258-
override fun loadBackingTrack(score: Score, syncPoints: List<BackingTrackSyncPoint>) {
259-
_workerQueue.add { _player?.loadBackingTrack(score, syncPoints) }
258+
override fun loadBackingTrack(score: Score) {
259+
_workerQueue.add { _player?.loadBackingTrack(score) }
260+
}
261+
262+
override fun updateSyncPoints(syncPoints: List<BackingTrackSyncPoint>) {
263+
_workerQueue.add { _player?.updateSyncPoints(syncPoints) }
260264
}
261265

262266
override val ready: IEventEmitter = EventEmitter()

src/AlphaTabApiBase.ts

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -721,16 +721,16 @@ export class AlphaTabApiBase<TSettings> {
721721

722722
private appendRenderResult(result: RenderFinishedEventArgs, isLast: boolean): void {
723723
// resizing the canvas and wrapper elements at the end is enough
724-
// it avoids flickering on resizes and re-renders.
724+
// it avoids flickering on resizes and re-renders.
725725
// the individual partials are anyhow sized correctly
726-
if(isLast) {
726+
if (isLast) {
727727
this.canvasElement.width = result.totalWidth;
728728
this.canvasElement.height = result.totalHeight;
729729
if (this._cursorWrapper) {
730730
this._cursorWrapper.width = result.totalWidth;
731731
this._cursorWrapper.height = result.totalHeight;
732732
}
733-
}
733+
}
734734

735735
if (result.width > 0 || result.height > 0) {
736736
this.uiFacade.beginAppendRenderResults(result);
@@ -1441,7 +1441,7 @@ export class AlphaTabApiBase<TSettings> {
14411441
}
14421442

14431443
/**
1444-
*
1444+
*
14451445
* @returns true if a new player was created, false if no player was created (includes destroy & reuse of the current one)
14461446
*/
14471447
private setupOrDestroyPlayer(): boolean {
@@ -1495,9 +1495,9 @@ export class AlphaTabApiBase<TSettings> {
14951495
}
14961496

14971497
/**
1498-
* Re-creates the midi for the current score and loads it.
1498+
* Re-creates the midi for the current score and loads it.
14991499
* @remarks
1500-
* This will result in the player to stop playback. Some setting changes require re-genration of the midi song.
1500+
* This will result in the player to stop playback. Some setting changes require re-genration of the midi song.
15011501
* @category Methods - Player
15021502
* @since 1.6.0
15031503
*/
@@ -1526,10 +1526,26 @@ export class AlphaTabApiBase<TSettings> {
15261526

15271527
const player = this._player;
15281528
player.loadMidiFile(midiFile);
1529-
player.loadBackingTrack(score, generator.syncPoints);
1529+
player.loadBackingTrack(score);
1530+
player.updateSyncPoints(generator.syncPoints);
15301531
player.applyTranspositionPitches(generator.transpositionPitches);
15311532
}
15321533

1534+
/**
1535+
* Triggers an update of the sync points for the current score after modification within the data model
1536+
* @category Methods - Player
1537+
* @since 1.6.0
1538+
*/
1539+
public updateSyncPoints() {
1540+
if (!this.score) {
1541+
return;
1542+
}
1543+
1544+
const score = this.score!;
1545+
const player = this._player;
1546+
player.updateSyncPoints(MidiFileGenerator.generateSyncPoints(score));
1547+
}
1548+
15331549
/**
15341550
* Changes the volume of the given tracks.
15351551
* @param tracks The tracks for which the volume should be changed.

src/generated/model/BackingTrackSerializer.ts

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,9 @@ export class BackingTrackSerializer {
1717
return null;
1818
}
1919
const o = new Map<string, unknown>();
20-
o.set("padding", obj.padding);
2120
return o;
2221
}
2322
public static setProperty(obj: BackingTrack, property: string, v: unknown): boolean {
24-
switch (property) {
25-
case "padding":
26-
obj.padding = v! as number;
27-
return true;
28-
}
2923
return false;
3024
}
3125
}

src/importer/GpifParser.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,7 @@ export class GpifParser {
127127
private _hasAnacrusis: boolean = false;
128128
private _articulationByName!: Map<string, InstrumentArticulation>;
129129
private _skipApplyLyrics: boolean = false;
130+
private _backingTrackPadding:number = 0;
130131

131132
private _doubleBars: Set<MasterBar> = new Set<MasterBar>();
132133
private _keySignatures: Map<number, [KeySignature, KeySignatureType]> = new Map<
@@ -377,7 +378,7 @@ export class GpifParser {
377378
assetId = c.innerText;
378379
break;
379380
case 'FramePadding':
380-
backingTrack.padding = GpifParser.parseIntSafe(c.innerText, 0) / GpifParser.SampleRate * 1000;
381+
this._backingTrackPadding = GpifParser.parseIntSafe(c.innerText, 0) / GpifParser.SampleRate * 1000;
381382
break;
382383
}
383384
}
@@ -2746,6 +2747,7 @@ export class GpifParser {
27462747
masterBar.tempoAutomations.push(automation);
27472748
break;
27482749
case AutomationType.SyncPoint:
2750+
automation.syncPointValue!.millisecondOffset -= this._backingTrackPadding;
27492751
masterBar.addSyncPoint(automation);
27502752
break;
27512753
}

src/midi/MasterBarTickLookup.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,14 @@ export class MasterBarTickLookup {
5656
*/
5757
public masterBar!: MasterBar;
5858

59+
/**
60+
* The first beat in the bar.
61+
*/
5962
public firstBeat: BeatTickLookup | null = null;
63+
64+
/**
65+
* The last beat in the bar.
66+
*/
6067
public lastBeat: BeatTickLookup | null = null;
6168

6269
/**

0 commit comments

Comments
 (0)