#include #include "FibonacciClock.hpp" namespace SynthDevKit { FibonacciClock::FibonacciClock (uint16_t count, float threshold) : Clock(count, threshold){ if (count > FIBONACCI_LIMIT) { throw CLK_ERROR_TOO_MANY; } // generate the Fibonacci numbers for up to Fibonacci_LIMIT generateFibonaccis(); } bool *FibonacciClock::update (float input) { cv->update(input); // only become ready after the first trigger has occurred. this allows for // an interval to be set up if (!ready) { if (cv->newTrigger()) { ready = true; } return states; } current++; if (cv->newTrigger()) { step++; current = 0; for (uint16_t i = 0; i < triggerCount; i++) { states[i] = (step == fibonaccis[i]) ? true : false; } } else if (current >= cv->triggerInterval() / 2) { for (uint16_t i = 0; i < triggerCount; i++) { states[i] = false; } } if (step >= fibonaccis[triggerCount - 1]) { step = 0; } return states; } void FibonacciClock::generateFibonaccis ( ) { fibonaccis.push_back(1); fibonaccis.push_back(2); fibonaccis.push_back(3); fibonaccis.push_back(5); fibonaccis.push_back(8); fibonaccis.push_back(13); fibonaccis.push_back(21); fibonaccis.push_back(34); } }