From ccb93a22ac2577fbfb0b3058298b787d53613aca Mon Sep 17 00:00:00 2001 From: Craig Sapp Date: Mon, 16 Apr 2018 11:22:32 -0700 Subject: [PATCH] Update SMPTE millisecond code. --- src-library/Binasc.cpp | 4 ++-- src-library/MidiFile.cpp | 24 +++++++++++------------- 2 files changed, 13 insertions(+), 15 deletions(-) diff --git a/src-library/Binasc.cpp b/src-library/Binasc.cpp index 5afa8a35..e9ee1079 100644 --- a/src-library/Binasc.cpp +++ b/src-library/Binasc.cpp @@ -1042,12 +1042,12 @@ int Binasc::outputStyleMidi(ostream& out, istream& input) { input.read((char*)&byte2, 1); if (byte1 & 0x80) { // SMPTE divisions - tempout << "1'-" << 0xff - (ulong)byte1 + 1; + tempout << "'-" << 0xff - (ulong)byte1 + 1; if (commentsQ) { tempout << "\t\t\t; SMPTE frames/second"; } tempout << endl; - tempout << "1'" << dec << (long)byte2; + tempout << "'" << dec << (long)byte2; if (commentsQ) { tempout << "\t\t\t; subframes per frame"; } diff --git a/src-library/MidiFile.cpp b/src-library/MidiFile.cpp index 9a702f48..f756915a 100644 --- a/src-library/MidiFile.cpp +++ b/src-library/MidiFile.cpp @@ -362,24 +362,22 @@ int MidiFile::read(istream& input) { // Header parameter #3: Ticks per quarter note shortdata = MidiFile::readLittleEndian2Bytes(input); if (shortdata >= 0x8000) { - int framespersecond = ((!(shortdata >> 8))+1) & 0x00ff; - int resolution = shortdata & 0x00ff; + int framespersecond = 255 - ((shortdata >> 8) & 0x00ff) + 1; + int subframes = shortdata & 0x00ff; switch (framespersecond) { - case 232: framespersecond = 24; break; - case 231: framespersecond = 25; break; - case 227: framespersecond = 29; break; - case 226: framespersecond = 30; break; + case 25: framespersecond = 25; break; + case 24: framespersecond = 24; break; + case 29: framespersecond = 29; break; // really 29.97 for color television + case 30: framespersecond = 30; break; default: cerr << "Warning: unknown FPS: " << framespersecond << endl; - framespersecond = 255 - framespersecond + 1; - cerr << "Setting FPS to " << framespersecond << endl; + cerr << "Using non-standard FPS: " << framespersecond << endl; } - // actually ticks per second (except for frame=29 (drop frame)): - ticksPerQuarterNote = shortdata; + ticksPerQuarterNote = framespersecond * subframes; - cerr << "SMPTE ticks: " << ticksPerQuarterNote << " ticks/sec" << endl; - cerr << "SMPTE frames per second: " << framespersecond << endl; - cerr << "SMPTE frame resolution per frame: " << resolution << endl; + // cerr << "SMPTE ticks: " << ticksPerQuarterNote << " ticks/sec" << endl; + // cerr << "SMPTE frames per second: " << framespersecond << endl; + // cerr << "SMPTE subframes per frame: " << subframes << endl; } else { ticksPerQuarterNote = shortdata; }