#include #include "PrimeClock.hpp" namespace SynthDevKit { PrimeClock::PrimeClock (uint16_t count, float threshold) : Clock(count, threshold){ if (count > PRIME_LIMIT) { throw CLK_ERROR_TOO_MANY; } // generate the prime numbers for up to PRIME_LIMIT generatePrimes(); } bool *PrimeClock::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 == primes[i]) ? true : false; } } else if (current >= cv->triggerInterval() / 2) { for (uint16_t i = 0; i < triggerCount; i++) { states[i] = false; } } if (step >= primes[triggerCount - 1]) { step = 0; } return states; } void PrimeClock::generatePrimes ( ) { primes.push_back(2); primes.push_back(3); primes.push_back(5); primes.push_back(7); primes.push_back(11); primes.push_back(13); primes.push_back(17); primes.push_back(19); primes.push_back(23); primes.push_back(29); primes.push_back(31); primes.push_back(37); primes.push_back(41); primes.push_back(43); primes.push_back(47); primes.push_back(53); } }