diff --git a/src/midi/AlphaSynthMidiFileHandler.ts b/src/midi/AlphaSynthMidiFileHandler.ts index 3252042aa..5163ea57e 100644 --- a/src/midi/AlphaSynthMidiFileHandler.ts +++ b/src/midi/AlphaSynthMidiFileHandler.ts @@ -30,7 +30,7 @@ export class AlphaSynthMidiFileHandler implements IMidiFileHandler { let denominatorIndex: number = 0; while(true) { timeSignatureDenominator = timeSignatureDenominator >> 1; - if(timeSignatureDenominator <= 0) { + if(timeSignatureDenominator > 0) { denominatorIndex++; } else { break; diff --git a/test/audio/MidiFileGenerator.test.ts b/test/audio/MidiFileGenerator.test.ts index 8bb2daa23..41bb80135 100644 --- a/test/audio/MidiFileGenerator.test.ts +++ b/test/audio/MidiFileGenerator.test.ts @@ -1,5 +1,5 @@ import { ControllerType } from '@src/midi/ControllerType'; -import { MidiEvent } from '@src/midi/MidiEvent'; +import { MidiEvent, MidiEventType } from '@src/midi/MidiEvent'; import { MidiFileGenerator } from '@src/midi/MidiFileGenerator'; import { MidiFile } from '@src/midi/MidiFile'; import { MidiUtils } from '@src/midi/MidiUtils'; @@ -28,6 +28,9 @@ import { RestEvent } from '@test/audio/FlatMidiEventGenerator'; import { TestPlatform } from '@test/TestPlatform'; +import { AlphaSynthMidiFileHandler } from '@src/midi/AlphaSynthMidiFileHandler'; +import { MetaEventType } from '@src/midi/MetaEvent'; +import { MetaDataEvent } from '@src/midi/MetaDataEvent'; describe('MidiFileGeneratorTest', () => { const parseTex: (tex: string) => Score = (tex: string): Score => { @@ -804,7 +807,7 @@ describe('MidiFileGeneratorTest', () => { let score: Score = parseTex(tex); expect(score.tracks[0].staves[0].bars[1].voices[0].beats[0].isFullBarRest).toBeTrue(); - let expectedNoteOnTimes:number[] = [ + let expectedNoteOnTimes: number[] = [ 0 * MidiUtils.QuarterTime, // note 1 1 * MidiUtils.QuarterTime, // note 2 2 * MidiUtils.QuarterTime, // note 3 @@ -813,7 +816,7 @@ describe('MidiFileGeneratorTest', () => { 7 * MidiUtils.QuarterTime, // note 5 8 * MidiUtils.QuarterTime, // note 6 ]; - let noteOnTimes:number[] = []; + let noteOnTimes: number[] = []; let beat: Beat | null = score.tracks[0].staves[0].bars[0].voices[0].beats[0]; while (beat != null) { noteOnTimes.push(beat.absolutePlaybackStart); @@ -826,14 +829,40 @@ describe('MidiFileGeneratorTest', () => { let generator: MidiFileGenerator = new MidiFileGenerator(score, null, handler); generator.generate(); noteOnTimes = []; - for(const evt of handler.midiEvents) { - if(evt instanceof NoteEvent) { + for (const evt of handler.midiEvents) { + if (evt instanceof NoteEvent) { noteOnTimes.push(evt.tick); - } else if(evt instanceof RestEvent) { + } else if (evt instanceof RestEvent) { noteOnTimes.push(evt.tick); } } expect(noteOnTimes.join(',')).toEqual(expectedNoteOnTimes.join(',')); }); + + it('time-signature', () => { + let tex: string = '\\ts 3 4 3.3.4 3.3.4 3.3.4'; + let score: Score = parseTex(tex); + + let file = new MidiFile(); + let handler: AlphaSynthMidiFileHandler = new AlphaSynthMidiFileHandler(file); + let generator: MidiFileGenerator = new MidiFileGenerator(score, null, handler); + generator.generate(); + + let timeSignature: MidiEvent | null = null; + for(const evt of file.events) { + if(evt.command === MidiEventType.Meta && evt.data1 === MetaEventType.TimeSignature) { + timeSignature = evt; + break; + } + } + + expect(timeSignature).toBeTruthy(); + const meta: MetaDataEvent = timeSignature as MetaDataEvent; + const timeSignatureNumerator: number = meta.data[0]; + const timeSignatureDenominator: number = Math.pow(2, meta.data[1]); + expect(timeSignatureNumerator).toEqual(3); + expect(timeSignatureDenominator).toEqual(4); + }); + });