+ pattern->num_samples = last_end;
+ devc->analog_patterns[PATTERN_SQUARE] = pattern;
+
+ /* Readjusting num_samples for all other patterns */
+ while (num_samples % ANALOG_SAMPLES_PER_PERIOD != 0)
+ num_samples--;
+
+ /* PATTERN_SINE: */
+ sr_dbg("Generating %s pattern.", analog_pattern_str[PATTERN_SINE]);
+ pattern = g_malloc(sizeof(struct analog_pattern));
+ for (i = 0; i < num_samples; i++) {
+ t = (double) i / (double) devc->cur_samplerate;
+ pattern->data[i] = sin(2 * G_PI * frequency * t) * amplitude + offset;
+ }
+ pattern->num_samples = last_end;
+ devc->analog_patterns[PATTERN_SINE] = pattern;
+
+ /* PATTERN_TRIANGLE: */
+ sr_dbg("Generating %s pattern.", analog_pattern_str[PATTERN_TRIANGLE]);
+ pattern = g_malloc(sizeof(struct analog_pattern));
+ for (i = 0; i < num_samples; i++) {
+ t = (double) i / (double) devc->cur_samplerate;
+ pattern->data[i] = (2 / G_PI) * asin(sin(2 * G_PI * frequency * t)) *
+ amplitude + offset;
+ }
+ pattern->num_samples = last_end;
+ devc->analog_patterns[PATTERN_TRIANGLE] = pattern;
+
+ /* PATTERN_SAWTOOTH: */
+ sr_dbg("Generating %s pattern.", analog_pattern_str[PATTERN_SAWTOOTH]);
+ pattern = g_malloc(sizeof(struct analog_pattern));
+ for (i = 0; i < num_samples; i++) {
+ t = (double) i / (double) devc->cur_samplerate;
+ pattern->data[i] = 2 * ((t * frequency) - floor(0.5f + t * frequency)) *
+ amplitude + offset;
+ }
+ pattern->num_samples = last_end;
+ devc->analog_patterns[PATTERN_SAWTOOTH] = pattern;