openframeworks:ofxmaxim

差分

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

この比較画面へのリンク

両方とも前のリビジョン 前のリビジョン
次のリビジョン
前のリビジョン
of:ofxmaxim [2019/05/05 09:05] – [PANを振る] babaopenframeworks:ofxmaxim [2019/06/06 08:53] (現在) – ↷ of:ofxmaxim から openframeworks:ofxmaxim へページを移動しました。 baba
行 137: 行 137:
      
 これにより,osc_pan を1Hzに設定し,その値を0.0, 1.0に変更してあげることで,0.5秒おきに音源が右から左,左から右へと移動する結果となります. これにより,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 のExampleで学習しましょう.先に紹介したMaximillianのGithubからファイル一式をダウンロードすると,ディレクトリ内にmaximilianTest.xcodeprojを見つけることができると思います.こちらをXcodeで開き,Source/main.cpp を修正することですぐに動作確認することができます.動作させる際はmaximilian_examplesディレクトリのコードをそのまま main.cpp にコピーすればOKです. 以上を抑えて,あとはMaximillian のExampleで学習しましょう.先に紹介したMaximillianのGithubからファイル一式をダウンロードすると,ディレクトリ内にmaximilianTest.xcodeprojを見つけることができると思います.こちらをXcodeで開き,Source/main.cpp を修正することですぐに動作確認することができます.動作させる際はmaximilian_examplesディレクトリのコードをそのまま main.cpp にコピーすればOKです.
-{{:of:スクリーンショット_2019-05-05_8.38.43.png?400|}}+ 
 +{{:of:スクリーンショット_2019-05-05_8.38.43.png|}}
  
 <WRAP center round tip 60%> <WRAP center round tip 60%>
行 146: 行 299:
 </WRAP> </WRAP>
  
-{{:of:スクリーンショット_2019-05-05_9.04.30.png?400|}}+{{:of:スクリーンショット_2019-05-05_9.04.30.png|}}
  
  
  • /home/users/2/lolipop.jp-4404d470cd64c603/web/ws/data/attic/openframeworks/ofxmaxim.1557014710.txt.gz
  • 最終更新: 2019/05/05 09:05
  • by baba