int main(int argc, char const *argv[]) { fa_set_log_tool(); fa_with_faudio() { BUFFER = ring_buffer((8L * 44100L * BUFFER_SIZE_MILLIS) / 1000L); // fa_signal_t left = fa_multiply(fa_signal_play_stream(BUFFER), constant(0.8)); fa_signal_t left = fa_multiply(fa_signal_random(), fa_signal_constant(0.0)); fa_signal_t right = fa_multiply(fa_signal_random(), fa_signal_constant(0.0)); fa_with_session_(session) { fa_with_default_devices(input, output, session) { fa_audio_set_parameter(fa_string("sample-rate"), fa_f64(44100), session); fa_audio_stream_t stream; if (fa_check(stream = fa_audio_open_output(input, output, list(left, right)))) { fa_error_log(stream, NULL); } else { request_audio(); // TODO some way to delay or toggle DSP thread reading from stream (give it a rate argument?) fa_thread_sleep(300 * 1000); } } } }
void helper_function() { fa_signal_custom_processor_t proc; proc.before = before_; proc.after = after_; proc.render = render_; proc.receive = receive_; proc.send = NULL; proc.data = NULL; proc.destroy = NULL; // printf("Sending custom proc %p!\n", &proc); fa_signal_t a = fa_multiply(fa_signal_sin(fa_signal_line(440)), fa_signal_input(32)); fa_signal_t b = fa_signal_custom(&proc, a); fa_mark_used(a); fa_mark_used(b); fa_signal_t r = b; if (RT) { fa_audio_session_t s = fa_audio_begin_session(); fa_audio_device_t i = fa_audio_default_input(s); fa_audio_device_t o = fa_audio_default_output(s); fa_list_t out = list(r, a); fa_audio_stream_t st = fa_audio_open_stream(i, o, just, out); if (fa_check(st)) { fa_error_log(st, NULL); } fa_audio_schedule( fa_hms(0, 0, 0), fa_action_send(fa_string("DLS"), fa_string("hello!")), st ); while (1) { fa_audio_schedule( fa_hms(0, 0, 0), fa_action_send(fa_string("DLS"), fa_string("hello!")), st ); fa_thread_sleep(1000 * 1); } fa_destroy(st); fa_destroy(s); } else { fa_signal_run_file(44100 * 10, list( fa_pair_create(fa_hms(0, 0, 0), fa_action_send(fa_string("DLS"), fa_string("hello!"))) ), r, fa_string("test.wav")); } }
void helper_function() { signal_t r = fa_signal_lift2(string("times"), times, NULL, constant(0.1), fa_signal_sin(line(440))); { fa_audio_session_t s = fa_audio_begin_session(); fa_audio_device_t i = fa_audio_default_input(s); fa_audio_device_t o = fa_audio_default_output(s); fa_audio_stream_t st = fa_audio_open_stream(i, o, just, list(r, r)); if (fa_check(st)) { fa_error_log(st, NULL); } else { while (1) { fa_thread_sleep(10000); } } fa_audio_end_session(s); } }
size_t _write(char *ptr, size_t size, size_t nmemb, void *userdata) { // printf("Ptr: %p, Size: %zu, Num elem: %zu\n", ptr, size, nmemb); // printf("Received %f seconds\n", ((float)size*(float)nmemb)/44100); size_t received_bytes = size * nmemb; size_t written_bytes = 0; // fa_thread_sleep(50); while (written_bytes < received_bytes) { if (fa_atomic_ring_buffer_write(BUFFER, ptr[written_bytes])) { written_bytes++; } else { // Spin until buffer can accept input fa_thread_sleep(1); continue; } } // return written; return written_bytes; }
void run_vst() { if (RT) { fa_audio_session_t s = fa_audio_begin_session(); fa_audio_device_t i = fa_audio_default_input(s); fa_audio_device_t o = fa_audio_default_output(s); fa_list_t vst = fa_signal_vst(fa_string("vst"), PATH, fa_list_empty()); fa_signal_t vst0 = fa_list_index(0, vst); fa_signal_t vst1 = fa_list_index(1, vst); fa_pair_t dls = fa_signal_dls(fa_string("dls")); fa_list_t out; fa_unpair(dls, dls0, dls1) { out = list(fa_add(vst0, dls0), fa_add(vst1, dls1)); } fa_audio_set_parameter(fa_string("sample-rate"), fa_f32(48000), s); fa_audio_set_parameter(fa_string("vector-size"), fa_i32(1024), s); fa_audio_stream_t st = fa_audio_open_stream(i, o, just, out); if (fa_check(st)) { fa_error_log(st, NULL); } #define kSynthName "dls" // fa_audio_schedule_relative(fa_hms(0, 0, 0), fa_action_send(fa_string(kSynthName), fa_pair_create(fa_string("open"), NULL)), st); fa_audio_schedule_relative(fa_hms(0, 0, 0), fa_action_send(fa_string(kSynthName), fa_midi_message_create_simple(0xc0, 60, 0)), st); for (int i = 0; i < 24; ++i) { fa_action_t chord = fa_action_send(fa_string(kSynthName), fa_midi_message_create_simple(0x90, 52 + ((i % 12) * 2), 90)); fa_audio_schedule_relative(fa_hms(0, 0, 0), chord, st); fa_thread_sleep(150); } fa_thread_sleep(5000); // { // // 201 109 !!! // int j = 200; // int k = 201; // // fa_action_t note1 = // fa_action_many(list( // fa_pair_create(fa_action_send(fa_string("midi"), fa_midi_message_create_simple(0x90, 60, 80)), fa_milliseconds(50)), // fa_pair_create(fa_action_send(fa_string("midi"), fa_midi_message_create_simple(0x90, 60, 0)), fa_milliseconds(3)) // )); // fa_action_t note2 = // fa_action_many(list( // fa_pair_create(fa_action_send(fa_string("midi"), fa_midi_message_create_simple(0x90, 61, 80)), fa_milliseconds(50)), // fa_pair_create(fa_action_send(fa_string("midi"), fa_midi_message_create_simple(0x90, 61, 0)), fa_milliseconds(3)) // )); // // fa_action_t notes1 = fa_action_many(fa_list_join(list( // list( // fa_pair_create(note1, fa_milliseconds(k)), // fa_pair_create(note1, fa_milliseconds(k)), // fa_pair_create(note1, fa_milliseconds(k - j)), // fa_pair_create(note1, fa_milliseconds(j)) // ), // list( // fa_pair_create(note1, fa_milliseconds(k)), // fa_pair_create(note1, fa_milliseconds(k)), // fa_pair_create(note1, fa_milliseconds(k - j)), // fa_pair_create(note1, fa_milliseconds(j)) // ), // list( // fa_pair_create(note1, fa_milliseconds(k)), // fa_pair_create(note1, fa_milliseconds(k)), // fa_pair_create(note1, fa_milliseconds(k - j)), // fa_pair_create(note1, fa_milliseconds(j)) // ), // list( // fa_pair_create(note1, fa_milliseconds(k)), // fa_pair_create(note1, fa_milliseconds(k)), // fa_pair_create(note1, fa_milliseconds(k - j)), // fa_pair_create(note1, fa_milliseconds(j)) // ), // list( // fa_pair_create(note1, fa_milliseconds(k)), // fa_pair_create(note1, fa_milliseconds(k)), // fa_pair_create(note1, fa_milliseconds(k - j)), // fa_pair_create(note1, fa_milliseconds(j)) // ) // ))); // fa_action_t notes2 = fa_action_many(list( // fa_pair_create(note2, fa_milliseconds(k * 3)), // fa_pair_create(note2, fa_milliseconds(k * 3)), // fa_pair_create(note2, fa_milliseconds(k * 3)), // fa_pair_create(note2, fa_milliseconds(k * 3)), // fa_pair_create(note2, fa_milliseconds(k * 3)) // )); // // // fa_audio_schedule_relative(seconds(0), notes1, s); // // fa_audio_schedule_relative(seconds(0), notes2, s); // // fa_audio_schedule_relative(seconds(0), fa_action_repeat(fa_milliseconds(3000), // fa_action_many(list( // fa_pair_create(notes1, fa_milliseconds(0)), // fa_pair_create(notes2, fa_milliseconds(0)) // ))), st); // // // 20 BE // // // int n = 200; // // fa_audio_schedule_relative(seconds(0), fa_action_repeat(fa_milliseconds(n), note1), s); // // fa_thread_sleep(100000); // } }