openframeworks:ofxmaxim

差分

このページの2つのバージョン間の差分を表示します。

この比較画面へのリンク

両方とも前のリビジョン 前のリビジョン
次のリビジョン
前のリビジョン
of:ofxmaxim [2019/05/05 06:45] – [サイン波を鳴らすSimple Example] babaopenframeworks:ofxmaxim [2019/06/06 08:53] (現在) – ↷ of:ofxmaxim から openframeworks:ofxmaxim へページを移動しました。 baba
行 17: 行 17:
 <WRAP group> <WRAP group>
 <WRAP half column> <WRAP half column>
-440Hzのサイン波を鳴らすだけのサンプルコードを記載します.ただし openframeworksの場合は音を再生するためにaudioOut関数と一緒に組み合わせて使うことになります. audioOutに関しては openframeworksのExamples/sound/audioOutputExample を参照してください.audioOut()関数はすでにopenframeworks上でサウンドバッファーのCallback関数として登録されているので,audioOutの名前でないといけません.setup()では基本的にopenframeworksのサウンドデバイスに関する設定のみです.少しこの設定のコードが長いですが,システム上のデフォルトスピーカを自動選択するようにしています.こうしておくと開発のときに楽ちんです.デフォルトスピーカに関してはmacの右上タスクバーにあるスピーカアイコンをクリックすると一覧表示されるサウンドデバイスで,チェックが入っている箇所です.ちなみにaltキーを押しながらクリックすると出力/入力が一緒に表示されます.右図を参照してください.+440Hzのサイン波を鳴らすだけのサンプルコードを記載します.ただし openframeworksの場合は音を再生するためにaudioOut関数と一緒に組み合わせて使うことになります. audioOutに関しては openframeworksのExamples/sound/audioOutputExample を参照してください.audioOut()関数はすでにopenframeworks上でサウンドバッファーのCallback関数として登録されているので,audioOutの名前でないといけません. 
 + 
 +setup()では基本的にopenframeworksのサウンドデバイスに関する設定がほとんどです.少しこの設定のコードが長いですが,システム上のデフォルトスピーカを自動選択するようにしています.こうしておくと開発のときに楽ちんです.デフォルトスピーカに関してはmacの右上タスクバーにあるスピーカアイコンをクリックすると一覧表示されるサウンドデバイスで,チェックが入っている箇所です.ちなみにaltキーを押しながらクリックすると出力/入力が一緒に表示されます.右図を参照してください.またデフォルトスピーカに対して設定可能な最も高いサンプリングレートと,設定可能な出力/入力チャンネルを設定しています.setup()最後の行では,設定されたサウンドデバイスと同じ設定にMaximillian側を合わせています
 </WRAP> </WRAP>
  
行 120: 行 122:
 </WRAP> </WRAP>
 </WRAP> </WRAP>
 +
 +===== PANを振る =====
 +上記サンプルを利用して,サイン波が右から左へ移動するプログラムに記述し直してみます.PANの設定は
 +  mymix.stereo(wave, outputs, 0.5);
 +の0.5の部分です.このパラメータを操作することで
 +  * 0: 左のみ
 +  * 0.5: 両方
 +  * 1.0: 右のみ
 +
 +という具合に音の左右の鳴りを変更することができます.そこで,次のようにmymix.stereoを変更します.
 +  mymix.stereo(wave, outputs, ofMap(osc_pan.sinewave(1), -1.0, 1.0, 0.0, 1.0));
 + ただし,osc_pan はまだ宣言されていない変数なので,ofApp.h にこの変数を下記のように追記しておきましょう.
 +  ofxMaxiOsc osc, osc_pan;
 +  
 +これにより,osc_pan を1Hzに設定し,その値を0.0, 1.0に変更してあげることで,0.5秒おきに音源が右から左,左から右へと移動する結果となります.
 +
 +===== InputとOutputを同時に使う =====
 +先程のシンプルなプログラムはサイン波を再生しているだけでした.次に簡単な雛形Exampleとして,サウンドデバイスの入力と出力を同時に扱うプログラムを記述してみます.ふるまいとしては下記のようにします.
 +  - 出力:440Hzのサイン波
 +  - 入力:マイク入力のデータを画面に表示する
 +
 +ofxMaximの話というよりは,OF側の記述追加のみになります.最初のサウンドデバイス設定の際,入力デバイスに関しても同時に設定しておきます.
 +出力及び入力デバイスを別々に指定できますが,Sampling Rateは両方共同じ設定にしておく必要があります.少しだけ記述量が増えていますが,どれも基礎で重要なので下記コードはよく読んで十分理解してきましょう.なお,プログラムを実行した後,スペースキーを押すとサイン波の出力が停止するので,環境音を見てみたい場合にご利用ください.
 +
 +<WRAP group>
 +<WRAP half column>
 +<code cpp ofApp.cpp>
 +#include "ofApp.h"
 +
 +void ofApp::setup(){
 +    ofSetFrameRate(60);
 +    
 +    // set System Output/Input Device same as System Default
 +    int number_output_channels;
 +    int number_input_channels;
 +    auto devices = soundStream.getDeviceList();
 +    for( int i = 0; i < devices.size(); i++ ){
 +        if( devices[i].isDefaultOutput ){
 +            string_device_info += "Output Device: "+devices[i].name + "\n";
 +            settings.setOutDevice(devices[i]);
 +            string_device_info += " - Configurable Sampling Rate: ";
 +            for( int j = 0; j < devices[i].sampleRates.size(); j++){
 +                string_device_info += ofToString(devices[i].sampleRates[j])+",";
 +            }
 +            string_device_info += "\n";
 +            
 +            settings.sampleRate = devices[i].sampleRates[0];// lowest sampling rate
 +            number_output_channels = 2; // stereo
 +        }
 +        if( devices[i].isDefaultInput ){
 +            string_device_info += "Input Device: "+devices[i].name + "\n";
 +            settings.setInDevice(devices[i]);
 +            string_device_info += " - Configurable Sampling Rate: ";
 +            for( int j = 0; j < devices[i].sampleRates.size(); j++){
 +                string_device_info += ofToString(devices[i].sampleRates[j])+",";
 +            }
 +            string_device_info += "\n";
 +            number_input_channels = 1; // mono
 +        }
 +    }
 +    string_device_info += "Sampling Rate: " + ofToString(settings.sampleRate) +"\n";
 +    settings.setOutListener(this);
 +    settings.setInListener(this);
 +    settings.numOutputChannels = number_output_channels;
 +    settings.numInputChannels = number_input_channels;
 +    settings.bufferSize = 512;
 +    soundStream.setup(settings);
 +    
 +    // set Maximillian same as sound device setting.
 +    maxiSettings::sampleRate = settings.sampleRate;
 +    maxiSettings::bufferSize = settings.bufferSize;
 +    
 +
 +    flg_pause = false;
 +}
 +
 +
 +
 +void ofApp::update(){
 +}
 +
 +void ofApp::draw(){
 +    ofBackground(50);
 +    ofDrawBitmapString("Can you see and hear a 440Hz Sinewave?", 20,20);
 +    ofNoFill();
 +    ofBeginShape();
 +    {
 +        for( int i = 0 ; i < settings.bufferSize; i++){
 +            ofVertex(ofGetWidth()*(i/(float)settings.bufferSize),
 +                     ofGetHeight()/2 + 300*buf_input[i]);
 +        }
 +    }
 +    ofEndShape();
 +    
 +    ofDrawBitmapString(string_device_info, ofGetWidth()/2, 20);
 +}
 +
 +void ofApp::audioOut(ofSoundBuffer &buffer)
 +{
 +    if( flg_pause )return;
 +    
 +    int number_channels = settings.numOutputChannels;
 +    
 +    for( int i = 0; i < settings.bufferSize; i++ ){
 +        wave = osc.sinewave(440);
 +        mymix.stereo(wave, outputs, 0.5);
 +        buffer[i*number_channels    ] = outputs[0];
 +        buffer[i*number_channels + 1] = outputs[1];
 +    }
 +    
 +
 +}
 +
 +void ofApp::audioIn(ofSoundBuffer &buffer)
 +{
 +    for( int i = 0; i < settings.bufferSize; i++ ){
 +        buf_input[i] = buffer[i];
 +    }
 +}
 +
 +void ofApp::keyPressed(int key)
 +{
 +    if( key == ' ' ){
 +        flg_pause = !flg_pause;
 +    }
 +}
 +
 +</code>
 +</WRAP>
 +
 +<WRAP half column>
 +<code cpp ofApp.h>
 +#pragma once
 +
 +#include "ofMain.h"
 +#include "ofxMaxim.h"
 +
 +class ofApp : public ofBaseApp{
 +
 +public:
 +    void setup();
 +    void update();
 +    void draw();
 +    void keyPressed(int key);
 +    
 +    void audioIn(ofSoundBuffer &buffer);
 +    void audioOut(ofSoundBuffer & buffer);
 +    
 +    ofxMaxiMix mymix;
 +    ofxMaxiOsc osc;
 +    
 +    double wave;
 +    double outputs[2];
 +    double buf_input[512];
 +    ofSoundStream soundStream;
 +    ofSoundStreamSettings settings;
 +
 +    string string_device_info;
 +    bool flg_pause;
 +};
 +
 +</code>
 +</WRAP>
 +</WRAP>
 +
 +==== 実行時のスクリーンショット ====
 +{{ :of:スクリーンショット_2019-05-12_9.56.31.png |}}
 +
 +===== MaximillianのExampleで学習する =====
 +以上を抑えて,あとはMaximillian のExampleで学習しましょう.先に紹介したMaximillianのGithubからファイル一式をダウンロードすると,ディレクトリ内にmaximilianTest.xcodeprojを見つけることができると思います.こちらをXcodeで開き,Source/main.cpp を修正することですぐに動作確認することができます.動作させる際はmaximilian_examplesディレクトリのコードをそのまま main.cpp にコピーすればOKです.
 +
 +{{:of:スクリーンショット_2019-05-05_8.38.43.png|}}
 +
 +<WRAP center round tip 60%>
 +ビルドの際,32bit に関するエラーが出た場合は下の画像にある通り,valid architectureからi386を削除してください.
 +</WRAP>
 +
 +{{:of:スクリーンショット_2019-05-05_9.04.30.png|}}
 +
  
  • /home/users/2/lolipop.jp-4404d470cd64c603/web/ws/data/attic/openframeworks/ofxmaxim.1557006323.txt.gz
  • 最終更新: 2019/05/05 06:45
  • by baba