差分
このページの2つのバージョン間の差分を表示します。
両方とも前のリビジョン 前のリビジョン 次のリビジョン | 前のリビジョン 次のリビジョン両方とも次のリビジョン | ||
of:ofxmaxim [2019/05/04 12:47] – [ofxMaximとは] baba | of:ofxmaxim [2019/05/05 07:06] – [PANを振る] baba | ||
---|---|---|---|
行 6: | 行 6: | ||
にて作者が詳しく発表している動画がありましたので,ここに共有しておきます.教育におけるツールキットとして考えているので | にて作者が詳しく発表している動画がありましたので,ここに共有しておきます.教育におけるツールキットとして考えているので | ||
- | Exampleが非常に基礎を抑えたいい内容になってるんですね. | + | Exampleが非常に基礎を抑えたいい内容になってるんですね.libpdに関しては,とてもusefulだけど幾らかのケースにおいて,over-engineered(過剰スペック)であるとも述べています.ofxPdもとても優れているので一長一短だと思います. |
===== ofxMaximとは ===== | ===== ofxMaximとは ===== | ||
ofxMaximはMaximillan をベースにしたopenframeworks用のaddonになります.Maximillan自体はC++のみで記載されてる波形生成ライブラリになります. | ofxMaximはMaximillan をベースにしたopenframeworks用のaddonになります.Maximillan自体はC++のみで記載されてる波形生成ライブラリになります. | ||
行 14: | 行 14: | ||
結構年代物の古いライブラリですが,C++で少ないファイル数で記述されているので環境構築も手軽です.ofxMaximのGitHubページを見てもらえればわかりますが,Exampleが同梱されていませんので,https:// | 結構年代物の古いライブラリですが,C++で少ないファイル数で記述されているので環境構築も手軽です.ofxMaximのGitHubページを見てもらえればわかりますが,Exampleが同梱されていませんので,https:// | ||
- | ===== 最もシンプルなExample ===== | + | ===== サイン波を鳴らすSimple |
- | 440Hzのサイン波を鳴らすだけのサンプルコードを記載します.ただし openframeworksの場合は音を再生するためにaudioOut関数と一緒に組み合わせて使うことになります. audioOutに関しては openframeworksのExamples/ | + | <WRAP group> |
+ | <WRAP half column> | ||
+ | 440Hzのサイン波を鳴らすだけのサンプルコードを記載します.ただし openframeworksの場合は音を再生するためにaudioOut関数と一緒に組み合わせて使うことになります. audioOutに関しては openframeworksのExamples/ | ||
+ | |||
+ | setup()では基本的にopenframeworksのサウンドデバイスに関する設定がほとんどです.少しこの設定のコードが長いですが,システム上のデフォルトスピーカを自動選択するようにしています.こうしておくと開発のときに楽ちんです.デフォルトスピーカに関してはmacの右上タスクバーにあるスピーカアイコンをクリックすると一覧表示されるサウンドデバイスで,チェックが入っている箇所です.ちなみにaltキーを押しながらクリックすると出力/ | ||
+ | </ | ||
+ | |||
+ | <WRAP half column> | ||
+ | {{: | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | <WRAP group> | ||
+ | <WRAP half column> | ||
+ | <code cpp ofApp.cpp> | ||
+ | #include " | ||
+ | |||
+ | void ofApp:: | ||
+ | ofSetFrameRate(60); | ||
+ | |||
+ | // set System Default Output Device | ||
+ | int sampling_rate; | ||
+ | int number_output_channels; | ||
+ | int number_input_channels; | ||
+ | int buffer_size = 512; | ||
+ | auto devices = soundStream.getDeviceList(); | ||
+ | for( int i = 0; i < devices.size(); | ||
+ | if( devices[i].isDefaultOutput ){ | ||
+ | cout << devices[i].name << endl; | ||
+ | settings.setOutDevice(devices[i]); | ||
+ | sampling_rate = devices[i].sampleRates[devices[i].sampleRates.size()-1]; | ||
+ | number_output_channels = devices[i].outputChannels; | ||
+ | number_input_channels = devices[i].inputChannels; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | settings.setOutListener(this); | ||
+ | settings.sampleRate = sampling_rate; | ||
+ | settings.numOutputChannels = number_output_channels; | ||
+ | settings.numInputChannels = number_input_channels; | ||
+ | settings.bufferSize = buffer_size; | ||
+ | soundStream.setup(settings); | ||
+ | |||
+ | // set Maximillian same as sound device setting. | ||
+ | maxiSettings:: | ||
+ | maxiSettings:: | ||
+ | } | ||
+ | |||
+ | |||
+ | |||
+ | void ofApp:: | ||
+ | } | ||
+ | |||
+ | void ofApp:: | ||
+ | ofBackground(50); | ||
+ | ofDrawBitmapString(" | ||
+ | } | ||
+ | |||
+ | void ofApp:: | ||
+ | { | ||
+ | int buffer_size = settings.bufferSize; | ||
+ | int number_channels = settings.numOutputChannels; | ||
+ | |||
+ | for( int i = 0; i < buffer_size; | ||
+ | wave = osc.sinewave(440); | ||
+ | mymix.stereo(wave, | ||
+ | |||
+ | buffer[i*number_channels | ||
+ | buffer[i*number_channels + 1] = outputs[1]; | ||
+ | } | ||
+ | |||
+ | |||
+ | } | ||
+ | |||
+ | </ | ||
+ | </ | ||
+ | |||
+ | <WRAP half column> | ||
+ | <code cpp ofApp.h> | ||
+ | #pragma once | ||
+ | |||
+ | #include " | ||
+ | #include " | ||
+ | |||
+ | class ofApp : public ofBaseApp{ | ||
+ | |||
+ | public: | ||
+ | void setup(); | ||
+ | void update(); | ||
+ | void draw(); | ||
+ | |||
+ | void audioOut(ofSoundBuffer & buffer); | ||
+ | |||
+ | ofxMaxiMix mymix; | ||
+ | ofxMaxiOsc osc; | ||
+ | |||
+ | double wave; | ||
+ | double outputs[2]; | ||
+ | ofSoundStream soundStream; | ||
+ | ofSoundStreamSettings settings; | ||
+ | |||
+ | }; | ||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | ===== PANを振る ===== | ||
+ | 上記サンプルを利用して,サイン波が右から左へ移動するプログラムに記述し直してみます.PANの設定は | ||
+ | mymix.stereo(wave, | ||
+ | の0.5の部分です.このパラメータを操作することで | ||
+ | * 0: 左のみ | ||
+ | * 0.5: 両方 | ||
+ | * 1.0: 右のみ | ||
+ | |||
+ | という具合に音の左右の鳴りを変更することができます.そこで,次のようにmymix.stereoを変更します. | ||
+ | mymix.stereo(wave, | ||
+ | | ||
+ | ofxMaxiOsc osc, osc_pan; | ||
+ | |||
+ | これにより,osc_pan を1Hzに設定し,その値を0.0, | ||