aboutsummaryrefslogtreecommitdiffstats
path: root/src/engine/SMFDriver.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/engine/SMFDriver.cpp')
-rw-r--r--src/engine/SMFDriver.cpp24
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));