// Copyright (c) 2021 Weird Constructor // This file is a part of HexoDSP. Released under GPL-3.0-or-later. // See README.md and COPYING for details. mod common; use common::*; fn setup_vosc(matrix: &mut Matrix) { let vosc_1 = NodeId::VOsc(0); let amp_1 = NodeId::Amp(0); let out_1 = NodeId::Out(0); matrix.place( 0, 1, Cell::empty(vosc_1).input(vosc_1.inp("damt"), None, None).out( vosc_1.out("sig"), None, None, ), ); matrix.place( 1, 0, Cell::empty(amp_1).input(None, None, amp_1.inp("inp")).out(amp_1.out("sig"), None, None), ); matrix.place( 2, 0, Cell::empty(out_1).input(None, None, out_1.inp("ch1")).out(None, None, None), ); pset_n(matrix, vosc_1, "d", 0.500); pset_n(matrix, vosc_1, "v", 0.500); pset_n(matrix, vosc_1, "damt", 0.000); pset_n(matrix, vosc_1, "det", 0.000); pset_n(matrix, vosc_1, "freq", 0.000); pset_n(matrix, vosc_1, "vs", 0.000); } #[test] fn check_node_vosc_sine() { init_test!(matrix, node_exec, 3); setup_vosc(matrix); matrix.sync().unwrap(); let fft = run_and_get_fft4096_2(node_exec, 500); dump_table!(fft); assert_eq!(fft, vec![(431, 614), (441, 1012)]); } #[test] fn check_node_vosc_d_v() { init_test!(matrix, node_exec, 3); let vosc_1 = NodeId::VOsc(0); setup_vosc(matrix); matrix.sync().unwrap(); // d=0.25, v=0.5 pset_n_wait(matrix, node_exec, vosc_1, "d", 0.25); let fft = run_and_get_fft4096_2(node_exec, 50); //d// dump_table!(fft); assert_eq!( fft, vec![ (431, 589), (441, 972), (452, 395), (872, 178), (883, 244), (894, 79), (1314, 90), (1324, 103) ] ); // d=0.0, v=0.5 pset_n_wait(matrix, node_exec, vosc_1, "d", 0.0); let fft = run_and_get_fft4096_2(node_exec, 100); //d// dump_table!(fft); assert_eq!( fft, vec![ (431, 521), (441, 859), (452, 349), (872, 242), (883, 332), (894, 107), (1314, 176), (1324, 201), (1755, 143), (1766, 137), (2196, 122), (2638, 106) ] ); // d=1.0, v=0.5 (symmetric to above) pset_n_wait(matrix, node_exec, vosc_1, "d", 0.0); let fft = run_and_get_fft4096_2(node_exec, 100); //d// dump_table!(fft); assert_eq!( fft, vec![ (431, 521), (441, 859), (452, 349), (872, 242), (883, 332), (894, 107), (1314, 175), (1324, 201), (1755, 143), (1766, 137), (2196, 122), (2638, 106) ] ); // d=0.5, v=0.25 pset_n_wait(matrix, node_exec, vosc_1, "d", 0.5); pset_n_wait(matrix, node_exec, vosc_1, "v", 0.25); let fft = run_and_get_fft4096_2(node_exec, 100); dump_table!(fft); assert_eq!( fft, vec![(0, 434), (11, 217), (431, 554), (441, 913), (452, 371), (872, 215), (883, 294)] ); // d=0.25, v=0.25 pset_n_wait(matrix, node_exec, vosc_1, "d", 0.25); pset_n_wait(matrix, node_exec, vosc_1, "v", 0.25); let fft = run_and_get_fft4096_2(node_exec, 50); dump_table!(fft); assert_eq!(fft, vec![(431, 614), (441, 1012), (452, 411)]); // d=0.1, v=0.25 pset_n_wait(matrix, node_exec, vosc_1, "d", 0.1); pset_n_wait(matrix, node_exec, vosc_1, "v", 0.25); let fft = run_and_get_fft4096_2(node_exec, 50); dump_table!(fft); assert_eq!( fft, vec![ (0, 260), (11, 130), (431, 593), (441, 977), (452, 397), (872, 105), (883, 144), (1314, 64), (1324, 74) ] ); } #[test] fn check_node_vosc_ovrsmpl() { init_test!(matrix, node_exec, 3); let vosc_1 = NodeId::VOsc(0); setup_vosc(matrix); matrix.sync().unwrap(); // d=0.0, v=0.5, with oversampling pset_s(matrix, vosc_1, "ovrsmpl", 1); pset_n_wait(matrix, node_exec, vosc_1, "d", 0.0); pset_n_wait(matrix, node_exec, vosc_1, "v", 0.5); let fft = run_and_get_fft4096_2(node_exec, 25); dump_table!(fft); assert_eq!( fft, vec![ (431, 521), (441, 859), (452, 349), (872, 242), (883, 332), (894, 107), (1303, 27), (1314, 175), (1324, 201), (1335, 50), (1744, 30), (1755, 143), (1766, 137), (1776, 25), (2186, 34), (2196, 122), (2207, 98), (2627, 38), (2638, 106), (2649, 71), (3068, 41), (3079, 93), (3090, 51), (3510, 44), (3521, 81), (3531, 37), (3951, 46), (3962, 70), (3973, 25), (4393, 48), (4404, 60), (4834, 49), (4845, 51), (5276, 48), (5286, 43), (5717, 47), (5728, 35), (6158, 46), (6169, 28), (6600, 43), (7041, 40), (7472, 26), (7483, 36), (7913, 28), (7924, 32), (8355, 29), (8366, 28), (8796, 30), (9238, 30), (9679, 29), (10121, 28), (10562, 26), ] ); // d=0.0, v=0.5, without oversampling pset_s(matrix, vosc_1, "ovrsmpl", 0); pset_n_wait(matrix, node_exec, vosc_1, "d", 0.0); pset_n_wait(matrix, node_exec, vosc_1, "v", 0.5); let fft = run_and_get_fft4096_2(node_exec, 25); dump_table!(fft); assert_eq!( fft, vec![ (431, 521), (441, 859), (452, 349), (872, 242), (883, 332), (894, 108), (1303, 26), (1314, 175), (1324, 201), (1335, 51), (1744, 30), (1755, 143), (1766, 137), (1776, 26), (2186, 34), (2196, 122), (2207, 98), (2627, 38), (2638, 106), (2649, 71), (3068, 41), (3079, 93), (3090, 52), (3510, 44), (3521, 81), (3531, 37), (3951, 46), (3962, 70), (3973, 26), (4393, 48), (4404, 61), (4834, 48), (4845, 51), (5276, 48), (5286, 43), (5717, 47), (5728, 35), (6158, 45), (6169, 28), (6600, 43), (7041, 40), (7472, 26), (7483, 36), (7913, 28), (7924, 32), (8355, 29), (8366, 28), (8796, 30), (9238, 30), (9679, 29), (10121, 28), (10562, 26) ] ); } #[test] fn check_node_vosc_dist() { init_test!(matrix, node_exec, 3); let vosc_1 = NodeId::VOsc(0); setup_vosc(matrix); matrix.sync().unwrap(); // dist=TanH pset_s(matrix, vosc_1, "dist", 1); pset_n_wait(matrix, node_exec, vosc_1, "damt", 0.25); pset_n_wait(matrix, node_exec, vosc_1, "d", 0.5); pset_n_wait(matrix, node_exec, vosc_1, "v", 0.5); let fft = run_and_get_fft4096_2(node_exec, 100); //d// dump_table!(fft); assert_eq!( fft, vec![ (431, 781), (441, 1287), (452, 523), (1314, 340), (1324, 389), (2196, 238), (2207, 191), (3079, 179), (3962, 134) ] ); // dist=B.D.Jong (very similar to the TanH) pset_s(matrix, vosc_1, "dist", 2); pset_n_wait(matrix, node_exec, vosc_1, "damt", 0.25); pset_n_wait(matrix, node_exec, vosc_1, "d", 0.5); pset_n_wait(matrix, node_exec, vosc_1, "v", 0.5); let fft = run_and_get_fft4096_2(node_exec, 100); //d// dump_table!(fft); assert_eq!( fft, vec![ (431, 759), (441, 1251), (452, 509), (1314, 282), (1324, 323), (2196, 172), (2207, 138), (3079, 115) ] ); // dist=Fold pset_s(matrix, vosc_1, "dist", 3); pset_n_wait(matrix, node_exec, vosc_1, "damt", 0.25); pset_n_wait(matrix, node_exec, vosc_1, "d", 0.5); pset_n_wait(matrix, node_exec, vosc_1, "v", 0.5); let fft = run_and_get_fft4096_2(node_exec, 100); //d// dump_table!(fft); assert_eq!( fft, vec![ (0, 381), (11, 190), (431, 370), (441, 611), (452, 248), (872, 242), (883, 331), (894, 107), (1314, 313), (1324, 359), (1755, 221), (1766, 212), (2196, 250), (2207, 201), (2638, 129), (3079, 123) ] ); } #[test] fn check_node_vosc_vs() { init_test!(matrix, node_exec, 3); let vosc_1 = NodeId::VOsc(0); setup_vosc(matrix); matrix.sync().unwrap(); // d=0.3, vs=2.0 pset_n_wait(matrix, node_exec, vosc_1, "d", 0.3); pset_d_wait(matrix, node_exec, vosc_1, "vs", 2.0); let fft = run_and_get_fft4096_2(node_exec, 150); //d// dump_table!(fft); assert_eq!( fft, vec![ (872, 470), (883, 644), (894, 208), (1314, 356), (1324, 408), (1755, 194), (1766, 186), (2638, 190), (3079, 308), (3090, 171), (3510, 176), (3521, 322), (3951, 163), (3962, 247) ] ); // d=0.3, vs=3.0 pset_n_wait(matrix, node_exec, vosc_1, "d", 0.3); pset_d_wait(matrix, node_exec, vosc_1, "vs", 3.0); let fft = run_and_get_fft4096_2(node_exec, 150); //d// dump_table!(fft); assert_eq!( fft, vec![ (1314, 378), (1324, 433), (1755, 578), (1766, 554), (2638, 163), (3079, 168), (4393, 189), (4404, 237), (4834, 262), (4845, 276), (5276, 258), (5286, 228), (5717, 184) ] ); }