電子回路を作る時は何かと発振器が必要になります。
様々な信号発生器がありますが可聴範囲内であればパソコンでできそうです。
パソコンなら細かな波形をデザインできるのでかえって専用機のジェネレーターよりも良いかも。
例えばWindows PCで以下のようなコードを実行します。
#include <iostream>
#include <string>
#include <windows.h>
#include <MMSystem.h>
#include <math.h>
#pragma comment (lib, "winmm.lib")
int main() {
WAVEFORMATEX wfe;
static HWAVEOUT hWaveOut;
static WAVEHDR whdr;
static LPBYTE lpWave;
int i, len, start, end;
int terms = 1;
int sampling = 44100;
int frequency = 441;
wfe.wFormatTag = WAVE_FORMAT_PCM;
wfe.nChannels = 2;
wfe.wBitsPerSample = 8;
wfe.nBlockAlign = wfe.nChannels * wfe.wBitsPerSample / 8;
wfe.nSamplesPerSec = sampling;
wfe.nAvgBytesPerSec = wfe.nSamplesPerSec * wfe.nBlockAlign;
waveOutOpen(&hWaveOut, WAVE_MAPPER, &wfe, 0, 0, CALLBACK_NULL);
lpWave = (LPBYTE)calloc(wfe.nAvgBytesPerSec, terms * wfe.nChannels);
// 立ち上がりは出力を0にする
for (i = 0; i < sampling * terms * wfe.nChannels; i++) {
lpWave[i] = 128;
}
len = sampling / frequency;
// 最初の10サイクルは出力しない
start = sampling / frequency * 10;
// 8サイクル波形を出力する
end = start + sampling / frequency * 8 * wfe.nChannels;
double d = 360.0 / len;
double pi = 3.14159265359;
for (i = start; i < end; i++) {
if ((i % 2) == 0) {
// 方形波 Left
if ((i/2) % len < len / 2) {
lpWave[i] = 228;
}
else {
lpWave[i] = 28;
}
}
else {
// 正弦波 Right
lpWave[i] = (BYTE)(100.0 * sin(d * ((i / 2) % len) / 180.0 * pi) + 127.5);
}
}
whdr.lpData = (LPSTR)lpWave;
whdr.dwBufferLength = wfe.nAvgBytesPerSec * terms;
whdr.dwFlags = WHDR_BEGINLOOP | WHDR_ENDLOOP;
whdr.dwLoops = 1;
waveOutPrepareHeader(hWaveOut, &whdr, sizeof(WAVEHDR));
waveOutWrite(hWaveOut, &whdr, sizeof(WAVEHDR));
char str[128];
std::cout << "hello, world\n";
std::cin >> str;
}
パソコンのライン出力をそのままマイク入力に接続しAudacityで表示すると、
のようになります。
左チャンネルは、方形波、右チャンネルは正弦波の出力ができました。2CHファンクションジェネレータの完成です。