カテゴリー
電子技術

ジェネレーター2

 WindowsPCのサウンド出力を使って可聴範囲のジェネレーターを作ることができましたがチャンネルが二つでは足りないので追加してみました。

USB to 3.5mmオーディオケーブル
USB to 3.5mmオーディオケーブル

 USBのオーディオ出力を接続しPC本体の出力と合わせてステレオ出力×2=4チャンネルになります。

PC本体の出力
USBオーディオの出力(LとRを換えてみました)
#include <iostream>
#include <string>
#include <windows.h>
#include <MMSystem.h>

#pragma comment (lib, "winmm.lib")

int main() {

    WAVEFORMATEX wfe;
    static HWAVEOUT hWaveOut;
    static WAVEHDR whdr;
    static LPBYTE lpWave;
    WAVEFORMATEX wfe2;
    static HWAVEOUT hWaveOut2;
    static WAVEHDR whdr2;
    static LPBYTE lpWave2;
    int i, len, start, end;
    int terms = 1;
    int sampling = 192000;
    int frequency = 500;

    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, 0, &wfe, 0, 0, CALLBACK_NULL);
    lpWave = (LPBYTE)calloc(wfe.nAvgBytesPerSec, terms * wfe.nChannels);

    wfe2.wFormatTag = WAVE_FORMAT_PCM;
    wfe2.nChannels = 2;
    wfe2.wBitsPerSample = 8;
    wfe2.nBlockAlign = wfe2.nChannels * wfe2.wBitsPerSample / 8;
    wfe2.nSamplesPerSec = sampling;
    wfe2.nAvgBytesPerSec = wfe2.nSamplesPerSec * wfe2.nBlockAlign;
    waveOutOpen(&hWaveOut2, 2, &wfe2, 0, 0, CALLBACK_NULL);
    lpWave2 = (LPBYTE)calloc(wfe2.nAvgBytesPerSec, terms * wfe2.nChannels);

    // 立ち上がりは出力を0にする
    for (i = 0; i < sampling * terms * wfe.nChannels; i++) {
        lpWave[i] = 128;
        lpWave2[i] = 128;
    }

    len = sampling / frequency; 

    // 最初の8サイクルは出力しない
    start = len * 8 * wfe.nChannels;
    // 8サイクル波形を出力する
    end = start + len * 8 * wfe.nChannels;
    printf("start=%d, end=%d\n", start, end);

    for (i = start; i < end; i++) {
        if ((i % 2) == 0) {
            if ((i/2) % len < len / 2) { lpWave[i] = 228; }
            else { lpWave[i] = 28; }}}

    len /= 2;
    for (i = start; i < end; i++) {
        if ((i % 2) == 1) {
            if ((i / 2) % len < len / 2) { lpWave[i] = 228; }
            else { lpWave[i] = 28; }}}

    len *= 2;
    for (i = start; i < end; i++) {
        if ((i % 2) == 1) {
            if ((i / 2) % len < len / 2) { lpWave2[i] = 228; }
            else { lpWave2[i] = 28; }
        }
    }

    len /= 2;
    for (i = start; i < end; i++) {
        if ((i % 2) == 0) {
            if ((i / 2) % len < len / 2) { lpWave2[i] = 228; }
            else { lpWave2[i] = 28; }
        }
    }

    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));

    whdr2.lpData = (LPSTR)lpWave2;
    whdr2.dwBufferLength = wfe.nAvgBytesPerSec * terms;
    whdr2.dwFlags = WHDR_BEGINLOOP | WHDR_ENDLOOP;
    whdr2.dwLoops = 1;
    waveOutPrepareHeader(hWaveOut2, &whdr2, sizeof(WAVEHDR));
    waveOutWrite(hWaveOut2, &whdr2, sizeof(WAVEHDR));

    char str[128];
    std::cout << "hello, world\n";
    std::cin >> str;

}

 

4チャンネルあればデータに1CH、制御に3CH使えるのでUSBにマイコンをつながなくても様々なデジタル部品の制御ができそうです。