16 double freq,
double sample_rate)
18 assert(output !=
nullptr);
20 assert(sample_rate > 0.0);
21 double phase_step = 2.0 * M_PI * freq / sample_rate;
22 for (
unsigned i = 0; i < N; i++)
23 output[i] = amplitude * sin(phase_step * (
double)i);
29 assert(output !=
nullptr);
34 unsigned long long state = (
unsigned long long)seed;
45 state = state * 6364136223846793005ULL + 1442695040888963407ULL;
46 double u1 = (double)(state >> 11) * 0x1.0p-53;
47 if (u1 < DBL_MIN) u1 = DBL_MIN;
48 state = state * 6364136223846793005ULL + 1442695040888963407ULL;
49 double u2 = (double)(state >> 11) * 0x1.0p-53;
51 double r = sqrt(-2.0 * log(u1));
52 double theta = 2.0 * M_PI * u2;
53 output[i] = amplitude * r * cos(theta);
54 output[i + 1] = amplitude * r * sin(theta);
59 state = state * 6364136223846793005ULL + 1442695040888963407ULL;
60 double u1 = (double)(state >> 11) * 0x1.0p-53;
61 if (u1 < DBL_MIN) u1 = DBL_MIN;
62 state = state * 6364136223846793005ULL + 1442695040888963407ULL;
63 double u2 = (double)(state >> 11) * 0x1.0p-53;
64 output[i] = amplitude * sqrt(-2.0 * log(u1)) * cos(2.0 * M_PI * u2);
68void MD_impulse(
double *output,
unsigned N,
double amplitude,
unsigned position)
70 assert(output !=
nullptr);
73 memset(output, 0, N *
sizeof(
double));
74 output[position] = amplitude;
78 double f_start,
double f_end,
double sample_rate)
80 assert(output !=
nullptr);
82 assert(sample_rate > 0.0);
89 double T = (double)(N - 1) / sample_rate;
90 double chirp_rate = (f_end - f_start) / T;
92 for (
unsigned i = 0; i < N; i++) {
93 double t = (double)i / sample_rate;
94 double phase = 2.0 * M_PI * (f_start * t + 0.5 * chirp_rate * t * t);
95 output[i] = amplitude * sin(phase);
100 double f_start,
double f_end,
double sample_rate)
102 assert(output !=
nullptr);
104 assert(sample_rate > 0.0);
105 assert(f_start > 0.0);
107 assert(f_start != f_end);
114 double T = (double)(N - 1) / sample_rate;
115 double ratio = f_end / f_start;
116 double log_ratio = log(ratio);
118 for (
unsigned i = 0; i < N; i++) {
119 double t = (double)i / sample_rate;
120 double phase = 2.0 * M_PI * f_start * T
121 * (pow(ratio, t / T) - 1.0) / log_ratio;
122 output[i] = amplitude * sin(phase);
127 double freq,
double sample_rate)
129 assert(output !=
nullptr);
131 assert(sample_rate > 0.0);
132 double phase_step = 2.0 * M_PI * freq / sample_rate;
133 for (
unsigned i = 0; i < N; i++) {
134 double phase = fmod(phase_step * (
double)i, 2.0 * M_PI);
135 if (phase < 0.0) phase += 2.0 * M_PI;
136 if (phase == 0.0 || phase == M_PI)
138 else if (phase < M_PI)
139 output[i] = amplitude;
141 output[i] = -amplitude;
146 double freq,
double sample_rate)
148 assert(output !=
nullptr);
150 assert(sample_rate > 0.0);
151 double phase_step = 2.0 * M_PI * freq / sample_rate;
152 for (
unsigned i = 0; i < N; i++) {
153 double phase = fmod(phase_step * (
double)i, 2.0 * M_PI);
154 if (phase < 0.0) phase += 2.0 * M_PI;
155 output[i] = amplitude * (phase / M_PI - 1.0);
160 double base_freq,
double sample_rate,
161 double rate_octaves_per_sec,
unsigned num_octaves)
163 assert(output !=
nullptr);
165 assert(sample_rate > 0.0);
166 assert(base_freq > 0.0);
167 assert(num_octaves > 0);
169 double rate = rate_octaves_per_sec;
170 double center = (double)(num_octaves - 1) / 2.0;
171 double sigma = (double)num_octaves / 4.0;
172 double nyquist = sample_rate / 2.0;
173 double margin = 5.0 * sigma;
186 double duration = (N > 1) ? (
double)(N - 1) / sample_rate : 0.0;
187 double drift = rate * duration;
189 int k_min = (int)floor(center - margin - fmax(0.0, drift));
190 int k_max = (int)ceil(center + margin - fmin(0.0, drift));
191 unsigned total_layers = (unsigned)(k_max - k_min + 1);
194 double *phases = calloc(total_layers,
sizeof(
double));
195 assert(phases !=
nullptr);
196 memset(output, 0, N *
sizeof(
double));
198 for (
unsigned i = 0; i < N; i++) {
199 double t = (double)i / sample_rate;
200 for (
int k = k_min; k <= k_max; k++) {
202 double d = (double)k - center + rate * t;
205 if (fabs(d) > margin)
continue;
207 double freq = base_freq * pow(2.0, d);
208 unsigned idx = (unsigned)(k - k_min);
209 phases[idx] += 2.0 * M_PI * freq / sample_rate;
212 if (freq >= nyquist || freq < 20.0)
continue;
214 double gauss = exp(-0.5 * d * d / (sigma * sigma));
216 if (phases[idx] > 4.0 * M_PI)
217 phases[idx] = fmod(phases[idx], 2.0 * M_PI);
218 output[i] += gauss * sin(phases[idx]);
226 for (
unsigned i = 0; i < N; i++) {
227 double a = fabs(output[i]);
228 if (a > peak) peak = a;
231 double scale = amplitude / peak;
232 for (
unsigned i = 0; i < N; i++)
A mini library of DSP (Digital Signal Processing) routines.
void MD_chirp_linear(double *output, unsigned N, double amplitude, double f_start, double f_end, double sample_rate)
Generate a linear chirp (swept sine with linearly increasing frequency).
void MD_white_noise(double *output, unsigned N, double amplitude, unsigned seed)
Generate Gaussian white noise.
void MD_sine_wave(double *output, unsigned N, double amplitude, double freq, double sample_rate)
Generate a sine wave.
void MD_impulse(double *output, unsigned N, double amplitude, unsigned position)
Generate a discrete impulse (Kronecker delta).
void MD_shepard_tone(double *output, unsigned N, double amplitude, double base_freq, double sample_rate, double rate_octaves_per_sec, unsigned num_octaves)
Generate a Shepard tone — the auditory illusion of endlessly rising or falling pitch.
void MD_sawtooth_wave(double *output, unsigned N, double amplitude, double freq, double sample_rate)
Generate a sawtooth wave.
void MD_square_wave(double *output, unsigned N, double amplitude, double freq, double sample_rate)
Generate a square wave.
void MD_chirp_log(double *output, unsigned N, double amplitude, double f_start, double f_end, double sample_rate)
Generate a logarithmic chirp (swept sine with exponentially increasing frequency).