diff options
Diffstat (limited to 'src/engine/SMFDriver.cpp')
-rw-r--r-- | src/engine/SMFDriver.cpp | 24 |
1 files changed, 15 insertions, 9 deletions
diff --git a/src/engine/SMFDriver.cpp b/src/engine/SMFDriver.cpp index a07f47d..da7fecb 100644 --- a/src/engine/SMFDriver.cpp +++ b/src/engine/SMFDriver.cpp @@ -55,7 +55,7 @@ SMFDriver::learn(const string& filename, unsigned track, double q, //assert(q.unit() == max_duration.unit()); SharedPtr<Machine> m(new Machine(max_duration.unit())); SharedPtr<MachineBuilder> builder = SharedPtr<MachineBuilder>( - new MachineBuilder(m, q, false)); + new MachineBuilder(m, q, false)); SMFReader reader; if (!reader.open(filename)) { @@ -87,7 +87,7 @@ SMFDriver::learn(const string& filename, double q, Raul::TimeStamp max_duration) { SharedPtr<Machine> m(new Machine(max_duration.unit())); SharedPtr<MachineBuilder> builder = SharedPtr<MachineBuilder>( - new MachineBuilder(m, q, false)); + new MachineBuilder(m, q, false)); SMFReader reader; if (!reader.open(filename)) { @@ -125,16 +125,22 @@ SMFDriver::learn_track(SharedPtr<MachineBuilder> builder, uint32_t ev_size; uint32_t ev_delta_time; - uint64_t t = 0; - double unquantized_t = 0; + Raul::TimeUnit unit = Raul::TimeUnit(TimeUnit::BEATS, MACHINA_PPQN); + + uint64_t t = 0; while (reader.read_event(4, buf, &ev_size, &ev_delta_time) >= 0) { - unquantized_t += ev_delta_time; - t = quantize(q, unquantized_t); + t += ev_delta_time; + + const uint32_t beats = t / (uint32_t)reader.ppqn(); + const uint32_t smf_ticks = t % (uint32_t)reader.ppqn(); + const double frac = smf_ticks / (double)reader.ppqn(); + const uint32_t ticks = frac * MACHINA_PPQN; - builder->set_time(TimeStamp(max_duration.unit(), (double)t)); + // TODO: quantize + builder->set_time(TimeStamp(unit, beats, ticks)); - if ((!max_duration.is_zero()) && ( t > max_duration.to_double()) ) { + if (!max_duration.is_zero() && t > max_duration.to_double()) { break; } @@ -151,7 +157,7 @@ SMFDriver::run(SharedPtr<Machine> machine, Raul::TimeStamp max_time) { // FIXME: unit kludge (tempo only) Context context(_forge, machine->time().unit().ppt(), - _writer->unit().ppt(), 120.0); + _writer->unit().ppt(), 120.0); context.set_sink(this); context.time().set_slice(TimeStamp(max_time.unit(), 0, 0), context.time().beats_to_ticks(max_time)); |