Skip to content

Instantly share code, notes, and snippets.

@atakigawa
Last active August 29, 2015 14:05
Show Gist options
  • Select an option

  • Save atakigawa/1cdd3fec9cdec2d1ecf4 to your computer and use it in GitHub Desktop.

Select an option

Save atakigawa/1cdd3fec9cdec2d1ecf4 to your computer and use it in GitHub Desktop.
synthesizer-basic-with-overtone

basics-of-synthesizer

概要: overtoneをツールとして使いながら、シンセサイザーの仕組みの基本を学習してみる

overtoneのコードを用意してあるので、鳴らしながらやるとよいと思う

overtone

https://github.com/overtone/overtone
https://github.com/overtone/overtone/wiki

overtoneは、SuperColliderという音プログラミング環境及び言語のclojureラッパー

boot

to start server,

$> lein repl
(clojure repl starts)  

user=> (use 'overtone.live)

setup env

https://github.com/overtone/overtone/wiki に大体書いてある

others

vimのプラグインが割と充実
https://github.com/overtone/overtone/wiki/Overtone-in-vim

  • vim-clojure-static
    • clojureファイルを編集しやすい感じの設定にしてくれたり
  • vim-fireplace
    • ファイル開いたまま実行できたり(quickrunがすごくなった的な)
  • vim-classpath
    • classpathをleinのプロジェクトに合わせて適当に張ってくれる
  • rainbow_parentheses
    • カッコが虹色になる

basics

oscillator -> filter -> amplifier -> out

  • oscillator
    • 音の元ネタ
    • ピッチを決定する
  • filter
    • 音色を加工する
  • amplifier
    • 音量を決定する

Web AudioとかChuckとかでもこの流れは基本的に同じ

WebAudioの例(rampの部分はおまけ)

window.AudioContext = window.AudioContext||window.webkitAudioContext;
var context = new AudioContext();

var oscNode = context.createOscillator();
oscNode.type = "sawtooth";
oscNode.frequency.value = 440;

var filterNode = context.createBiquadFilter();
filterNode.type = "bandpass";
filterNode.Q.value = 3;

var gainNode = context.createGain();
gainNode.gain.value = 0.5; //adjust volume

oscNode.connect(filterNode);           //oscillator -> filter
filterNode.connect(gainNode);          //filter -> amplifier
gainNode.connect(context.destination); //amplifier -> out

var now = context.currentTime;
oscNode.start(0);
filterNode.frequency.exponentialRampToValueAtTime(40, now)
filterNode.frequency.exponentialRampToValueAtTime(3000, now + 3)
filterNode.frequency.exponentialRampToValueAtTime(100, now + 4)
oscNode.stop(5);

Oscillator

波形、ピッチ担当

Amplifier

音量担当

  • シンセでは、主にamp envelope generator (amp-eg)を使って音量を調節する

    • 音量が一定だと、ぽーーーってずっと同じでなんか面白く無い
    • 大抵、ワンワンさせるか、上げてから下げるかとかしたい
    • 例えばピアノの場合、打鍵の瞬間が一番音量が大きくて、あとは段々減衰してく
    • 音量のコントロールの概念として、ADSRがある
  • ADSR

    • Attack, Decay, Sustain, Release の略
      • Attack
        • 音が出始めてから、最大音量に達するまでの時間
      • Decay
        • ピークに達してから、Sustainレベルに達するまでの時間
      • Sustain
        • Decay完了時の音量レベル (これだけ時間のパラメータではない)
        • ノートオンの間、AttackとDecayが完了するとずっとこの音量で音が鳴る
        • Sustainが0の場合、音は単純に減衰する
      • Release
        • ノートオフになってから(鍵盤を離すとかして)音量が0になるまでの時間
    • 参考画像
  • おまけ

    • プログラム的に見ればamp-egは音量オブジェクトを引数に取ってそのvalueを時間に応じて決定する関数である
    • シンセでは、この音量を引数に取るegだけじゃなくて、oscillatorのピッチだとかfilterのQだとか、操作可能な様々 なパラメータを引数に取るegを設定することができる

Filter

音の加工を担当

  • 主なフィルターの種類
    • low pass filter (lpf)
      • 指定した周波数(カットオフ周波数)以下を通す
        • 指定した周波数を越える周波数より高くなればなるほどその部分は小さくなる
    • high pass filter (hpf)
      • lpfの逆
    • band pass filter (bpf)
      • 指定した周波数を中心としてその周辺を持ち上げる
      • Qというパラメータで、指定した周波数からのどのへんまでの範囲を持ち上げるか指定する
    • notch filter (notch)
      • bpfの逆
    • 参考画像
  • resonance
    • カットオフ周波数を中心として、その近辺をどのくらい持ちあげるか定義するパラメータ
    • 響きがいい感じになるw
    • 参考画像のピコっと盛り上がってるとこ

Modulation

相手を揺らす

  • modulationとは、ある波をインプットとして別の波もしくはパラメータを揺らすこと。(多分)

  • 今まで紹介した範囲だと、基本的に鳴り始めから鳴り終わりまで音質がずっと同じ音しか出ない

    • srcとなる音波が常に一定の周期を繰り返すだけだから
    • 例えば実際のCDでそういうシンセの音はほとんど無い
  • modulationする対象は、シンセの操作可能な波やパラメータであればなんでもいい。oscでもいいし、filterでもいいし panでもいいし、(大体)なんでも揺らすことができる. ここがシンセの中々面白いところだと思う

  • modulationの主なパターン

    • LFO
      • 低周波数のoscとsrcとなるoscを合成すると ウワンウワンみたいな感じになる LFO (Low Frequency Oscillator) と呼ぶ
      • LFOのdestination色々
        • oscillator -> vibrato
        • filter -> waw-waw
        • volume -> tremolo, pan
    • filter envelope
      • 開いてしばらくして閉じるみたいな音が作れる
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment