|  | 
#include <benchmark/benchmark.h>
#include "dsp/oscillator.hpp"
using namespace bogaudio::dsp;
static void BM_Phasor(benchmark::State& state) {
  Phasor p(44100.0, 440.0);
  for (auto _ : state) {
    p.next();
  }
}
BENCHMARK(BM_Phasor);
static void BM_SineOscillator(benchmark::State& state) {
  SineOscillator o(44100.0, 440.0);
  for (auto _ : state) {
    o.next();
  }
}
BENCHMARK(BM_SineOscillator);
static void BM_SineTableOscillator(benchmark::State& state) {
  SineTableOscillator o(44100.0, 440.0);
  for (auto _ : state) {
    o.next();
  }
}
BENCHMARK(BM_SineTableOscillator);
static void BM_SineOscillatorFM(benchmark::State& state) {
  const float baseHz = 440.0;
  SineOscillator m(44100.0, baseHz);
  SineOscillator c(44100.0, baseHz);
  for (auto _ : state) {
    c.setFrequency(baseHz + m.next());
    c.next();
  }
}
BENCHMARK(BM_SineOscillatorFM);
static void BM_SineTableOscillatorPM(benchmark::State& state) {
  SineTableOscillator m(44100.0, 440.0);
  SineTableOscillator c(44100.0, 440.0);
  for (auto _ : state) {
    c.advancePhase();
    c.nextFromPhasor(c, Phasor::radiansToPhase(m.next()));
  }
}
BENCHMARK(BM_SineTableOscillatorPM);
static void BM_SawOscillator(benchmark::State& state) {
  SawOscillator o(44100.0, 440.0);
  for (auto _ : state) {
    o.next();
  }
}
BENCHMARK(BM_SawOscillator);
static void BM_SaturatingSawOscillator(benchmark::State& state) {
  SaturatingSawOscillator o(44100.0, 440.0);
  o.setSaturation(0.9);
  for (auto _ : state) {
    o.next();
  }
}
BENCHMARK(BM_SaturatingSawOscillator);
static void BM_BandLimitedSawOscillator(benchmark::State& state) {
  BandLimitedSawOscillator o(44100.0, 440.0);
  o.setQuality(12);
  for (auto _ : state) {
    o.next();
  }
}
BENCHMARK(BM_BandLimitedSawOscillator);
static void BM_SquareOscillator(benchmark::State& state) {
  SquareOscillator o(44100.0, 440.0);
  for (auto _ : state) {
    o.next();
  }
}
BENCHMARK(BM_SquareOscillator);
static void BM_BandLimitedSquareOscillator(benchmark::State& state) {
  BandLimitedSquareOscillator o(44100.0, 440.0);
  o.setQuality(12);
  for (auto _ : state) {
    o.next();
  }
}
BENCHMARK(BM_BandLimitedSquareOscillator);
static void BM_TriangleOscillator(benchmark::State& state) {
  TriangleOscillator o(44100.0, 440.0);
  for (auto _ : state) {
    o.next();
  }
}
BENCHMARK(BM_TriangleOscillator);
static void BM_SampledTriangleOscillator(benchmark::State& state) {
  TriangleOscillator o(44100.0, 440.0);
  o.setSampleWidth(Phasor::maxSampleWidth / 2.0);
  for (auto _ : state) {
    o.next();
  }
}
BENCHMARK(BM_SampledTriangleOscillator);
static void BM_SineBankOscillator100(benchmark::State& state) {
  SineBankOscillator o(44100.0, 100.0, 100);
  for (int i = 1, n = o.partialCount(); i <= n; ++i) {
    o.setPartial(i, i, 1.0 / (float)i);
  }
  for (auto _ : state) {
    o.next();
  }
}
BENCHMARK(BM_SineBankOscillator100);
static void BM_SineBankOscillator500(benchmark::State& state) {
  SineBankOscillator o(44100.0, 500.0, 100);
  for (int i = 1, n = o.partialCount(); i <= n; ++i) {
    o.setPartial(i, i, 1.0 / (float)i);
  }
  for (auto _ : state) {
    o.next();
  }
}
BENCHMARK(BM_SineBankOscillator500);
static void BM_SineBankOscillator5000(benchmark::State& state) {
  SineBankOscillator o(44100.0, 5000.0, 100);
  for (int i = 1, n = o.partialCount(); i <= n; ++i) {
    o.setPartial(i, i, 1.0 / (float)i);
  }
  for (auto _ : state) {
    o.next();
  }
}
BENCHMARK(BM_SineBankOscillator5000);
static void BM_SineBankOscillator15000(benchmark::State& state) {
  SineBankOscillator o(44100.0, 15000.0, 100);
  for (int i = 1, n = o.partialCount(); i <= n; ++i) {
    o.setPartial(i, i, 1.0 / (float)i);
  }
  for (auto _ : state) {
    o.next();
  }
}
BENCHMARK(BM_SineBankOscillator15000);
 |