You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

180 lines
3.9KB

  1. #include <assert.h>
  2. #include "asserts.h"
  3. #include "ClockMult.h"
  4. #include "TestComposite.h"
  5. #include "Tremolo.h"
  6. /**
  7. * During training, we should get no output.
  8. * On first ref-clock after training, should go high
  9. */
  10. static void test0()
  11. {
  12. ClockMult cm;
  13. cm.setMultiplier(1);
  14. const int period = 4;
  15. // printf("test0, 0\n");
  16. cm.refClock(); // give it an external clock
  17. // printf("test0, 1\n");
  18. // train with 4 ref clocks()
  19. for (int i = 0; i < period; ++i) {
  20. cm.sampleClock();
  21. assertEQ(cm.getSaw(), 0);
  22. assertEQ(cm.getMultipliedClock(), false);
  23. // printf("test0, 2\n");
  24. }
  25. // send ref-clock now to set period at 4 and start clocking
  26. cm.refClock();
  27. assertEQ(cm.getSaw(), 0);
  28. assertEQ(cm.getMultipliedClock(), true);
  29. assertClose(cm._getFreq(), .25f, .000001);
  30. }
  31. /**
  32. * Test synched saw output
  33. */
  34. static void test1()
  35. {
  36. ClockMult cm;
  37. cm.setMultiplier(1);
  38. const int period = 4;
  39. // printf("test0, 0\n");
  40. cm.refClock(); // give it an external clock
  41. // printf("test0, 1\n");
  42. // train with 4 ref clocks()
  43. for (int i = 0; i < period; ++i) {
  44. cm.sampleClock();
  45. assertEQ(cm.getSaw(), 0);
  46. assertEQ(cm.getMultipliedClock(), false);
  47. // printf("test0, 2\n");
  48. }
  49. // send ref-clock now to set period at 4 and start clocking
  50. cm.refClock();
  51. assertEQ(cm.getSaw(), 0);
  52. assertEQ(cm.getMultipliedClock(), true);
  53. assertClose(cm._getFreq(), .25f, .000001);
  54. for (int i = 0; i < period - 1; ++i) {
  55. cm.sampleClock();
  56. // printf("in loop, i=%d, saw=%f\n", i, cm.getSaw());
  57. assertEQ(cm.getSaw(), .25 * (i + 1));
  58. assertEQ(cm.getMultipliedClock(), true);
  59. }
  60. }
  61. /**
  62. * Test free running
  63. */
  64. static void test2()
  65. {
  66. ClockMult cm;
  67. cm.setMultiplier(0);
  68. cm.setFreeRunFreq(.1f);
  69. assertEQ(cm.getSaw(), 0);
  70. for (int i = 0; i < 9; ++i) {
  71. cm.sampleClock();
  72. assertClose(cm.getSaw(), (i + 1) * .1f, .0001);
  73. }
  74. cm.sampleClock();
  75. assertClose(cm.getSaw(), 0, .0001);
  76. for (int i = 0; i < 9; ++i) {
  77. cm.sampleClock();
  78. assertClose(cm.getSaw(), (i + 1) * .1f, .0001);
  79. }
  80. }
  81. /**
  82. * Test free running, no interference from ref clock
  83. */
  84. static void test4()
  85. {
  86. ClockMult cm;
  87. cm.setMultiplier(0);
  88. cm.setFreeRunFreq(.1f);
  89. assertEQ(cm.getSaw(), 0);
  90. for (int i = 0; i < 9; ++i) {
  91. cm.sampleClock();
  92. cm.refClock();
  93. assertClose(cm.getSaw(), (i + 1) * .1f, .0001);
  94. }
  95. cm.sampleClock();
  96. assertClose(cm.getSaw(), 0, .0001);
  97. for (int i = 0; i < 9; ++i) {
  98. cm.refClock();
  99. cm.sampleClock();
  100. assertClose(cm.getSaw(), (i + 1) * .1f, .0001);
  101. }
  102. }
  103. /**
  104. * Test synched saw output long term, no jitter
  105. */
  106. static void test3(int mult)
  107. {
  108. ClockMult cm;
  109. cm.setMultiplier(mult);
  110. // ref clock period.
  111. const int period = 4 * mult;
  112. cm.refClock(); // give it an external clock
  113. // train with period of ref clocks()
  114. for (int i = 0; i < period; ++i) {
  115. cm.sampleClock();
  116. assertEQ(cm.getSaw(), 0);
  117. assertEQ(cm.getMultipliedClock(), false);
  118. }
  119. for (int j = 0; j < 2; ++j) {
  120. // send ref-clock now to set period at 4 and start clocking
  121. cm.refClock();
  122. assertEQ(cm.getSaw(), 0);
  123. assertEQ(cm.getMultipliedClock(), true);
  124. assertClose(cm._getFreq(), .25f, .000001);
  125. for (int i = 0; i < period; ++i) {
  126. cm.sampleClock();
  127. //printf("in loop, i=%d saw = %f\n", i, cm.getSaw());
  128. float expectedSaw = .25f * (i + 1);
  129. while (expectedSaw >= 1) {
  130. expectedSaw -= 1.f;
  131. }
  132. assertClose(cm.getSaw(), expectedSaw, .0001);
  133. // clock out not working yet
  134. // assertEQ(cm.getMultipliedClock(), true);
  135. }
  136. }
  137. }
  138. void testClockMult()
  139. {
  140. test0();
  141. test1();
  142. test2();
  143. test4();
  144. test3(1);
  145. test3(2);
  146. test3(3);
  147. test3(4);
  148. }