Files

copied
Last update 6 years 1 month by Olivier Gillet
Filestidestest
..
generator_test.cc
makefile
generator_test.cc
// Copyright 2013 Olivier Gillet. // // Author: Olivier Gillet (ol.gillet@gmail.com) // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. #include <cmath> #include <cstdio> #include <cstring> #include <cstdlib> #include "tides/generator.h" using namespace tides; using namespace stmlib; const uint32_t kSampleRate = 48000; struct StereoSample { uint16_t l, r; StereoSample(const GeneratorSample& s) { l = (s.unipolar >> 1); r = s.bipolar; } }; struct TriggerPair { uint16_t l, r; TriggerPair(const GeneratorSample& s) { l = (s.flags & FLAG_END_OF_ATTACK) ? 32767 : 0; r = (s.flags & FLAG_END_OF_RELEASE) ? 32767 : 0; } }; void write_wav_header(FILE* fp, int num_samples, int num_channels) { uint32_t l; uint16_t s; fwrite("RIFF", 4, 1, fp); l = 36 + num_samples * 2 * num_channels; fwrite(&l, 4, 1, fp); fwrite("WAVE", 4, 1, fp); fwrite("fmt ", 4, 1, fp); l = 16; fwrite(&l, 4, 1, fp); s = 1; fwrite(&s, 2, 1, fp); s = num_channels; fwrite(&s, 2, 1, fp); l = kSampleRate; fwrite(&l, 4, 1, fp); l = static_cast<uint32_t>(kSampleRate) * 2 * num_channels; fwrite(&l, 4, 1, fp); s = 2 * num_channels; fwrite(&s, 2, 1, fp); s = 16; fwrite(&s, 2, 1, fp); fwrite("data", 4, 1, fp); l = num_samples * 2 * num_channels; fwrite(&l, 4, 1, fp); } int main(void) { FILE* fp = fopen("lfo.wav", "wb"); write_wav_header(fp, kSampleRate * 10, 2); /*for (uint16_t i = 0; i < 128; ++i) { for (uint16_t j = 0; j < 128; ++j) { Generator g; g.Init(); g.set_range(GENERATOR_RANGE_HIGH); g.set_mode(GENERATOR_MODE_LOOPING); g.set_pitch(60 << 7); g.set_slope((j - 64) * 512); int32_t min = 0; int32_t max = 0; for (uint32_t k = 0; k < kSampleRate; ++k) { GeneratorSample s = g.Process(0); g.FillBufferSafe(); if (s.bipolar < min) { min = s.bipolar; } else if (s.bipolar > max) { max = s.bipolar; } } printf("%d\t%d\t%d\t%d\n", (i << 7), (j - 64) * 512, min, max); } }*/ Generator g; g.Init(); g.set_range(GENERATOR_RANGE_HIGH); g.set_mode(GENERATOR_MODE_AR); g.set_slope(-32768); g.set_shape(0); g.set_smoothness(0); g.set_sync(false); // uint16_t period_pattern[] = { 400, 400, 200, 800 }; // uint16_t step = 0; uint32_t counter = 0; // uint16_t period = period_pattern[step]; uint32_t period = 512; for (uint32_t i = 0; i < kSampleRate * 10; ++i) { ++counter; uint8_t control = 0; if (counter >= period) { // step = (step + 1) % (sizeof(period_pattern) / sizeof(uint16_t)); // period = period_pattern[step]; // control |= CONTROL_CLOCK_RISING; control |= CONTROL_GATE_RISING; counter = 0; //period = (rand() % 1024) + 2; } if (counter <= period / 4) { control |= CONTROL_GATE; } /*uint32_t pitch = (24 << 7) + (i >> 5); if (pitch > (115 << 7)) { pitch = 115 << 7; }*/ uint16_t tri = (i * 100); tri = tri > 32767 ? 65535 - tri : tri; //g.set_slope(tri); g.set_pitch((48 << 7)); // StereoSample s = StereoSample(g.Process(control * 0)); TriggerPair s = TriggerPair(g.Process(control)); fwrite(&s, sizeof(s), 1, fp); g.FillBufferSafe(); } }
Report a bug