0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

音のプログラミング

Last updated at Posted at 2025-07-15

第1章 音響学:各節ごとの代表的な式一覧


1.1 純音(Sine Wave)

y(t) = A × sin(2πft)
  • A:振幅(Amplitude)→ 音の大きさ
  • f:周波数(Frequency)→ 音の高さ
  • t:時間(Time)

➡ 単一周波数の正弦波。純粋な音色(例:音叉)


1.2 複合音(Complex Tone)

y(t) = ∑ Aₙ × sin(2πfₙt + φₙ)
  • Aₙ:各成分の振幅
  • fₙ:各成分の周波数(基本波 + 倍音)
  • φₙ:初期位相

➡ 複数の周波数成分の合成。音色の違いに影響


1.3 音の三要素(Three Elements of Sound)

  • 音の高さ(Pitch):周波数 f(Hz)
  • 音の大きさ(Loudness):振幅 A、または音圧レベル L
  • 音色(Timbre):波形の形=倍音構成=フーリエ成分

➡ 正式な式ではなく、各要素を物理的に分けて理解

🎵 音の三要素の数式定義


① 音の高さ(Pitch)

音の高さは周波数 $f$ [Hz] により定義されます:

y(t) = A * sin(2πft + φ)
  • $f$:周波数 [Hz]
  • $t$:時間 [s]
  • $A$:振幅(音の大きさに関与)
  • $φ$:初期位相

高い音 ⇒ 周波数 $f$ が大きい
低い音 ⇒ 周波数 $f$ が小さい


② 音の大きさ(Loudness)

音の大きさは振幅 $A$ または**音圧レベル(デシベル)**で表されます:

L = 20 * log₁₀(p / p₀)
  • $L$:音圧レベル [dB]
  • $p$:音の実効音圧 [Pa]
  • $p₀$:基準音圧(通常 $20 \mu Pa$)

③ 音色(Timbre)

音色は**波形の形・倍音構成(フーリエ級数)**で定義されます:

y(t) = a₁ * sin(2πf t) + a₂ * sin(2π(2f)t) + a₃ * sin(2π(3f)t) + ...
  • $aₙ$:n次倍音の振幅
  • $f$:基本周波数
  • 各倍音の構成が異なると、同じ高さ・大きさでも異なる音色に聞こえる


1.4 音の大きさ(Sound Level)

L = 20 × log₁₀(p / p₀) [dB]
  • L:音圧レベル(デシベル)
  • p:実際の音圧
  • p₀:基準音圧(通常は 2×10⁻⁵ Pa)

➡ 音の大きさは対数的に知覚される


1.5 音の高さ(Pitch and MIDI)

f = 440 × 2^((n - 69) / 12)
  • f:周波数(Hz)
  • n:MIDIノート番号(A4 = 69)

➡ 音階・MIDIとの関係を示す式。12平均律に基づく


1.6 音色(Timbre = 周波数スペクトル)

X(f) = ∫ x(t) × e^(–j2πft) dt
  • X(f):周波数成分(フーリエ変換)
  • x(t):時間領域の音
  • f:周波数

➡ 音色は波形の周波数構造=倍音構成で決まる

第2章 サウンドプログラミング:数式と理論一覧

2.1 サンプリング(Sampling)

ナイキストの定理(Nyquist Theorem)

f_s ≥ 2 × f_max
  • f_s:サンプリング周波数(Hz)
  • f_max:記録したい音の最大周波数(Hz)

➡ この条件を満たさないと**エイリアシング(折り返し)**が発生する


2.2 標本化(Discretization)

連続波形 x(t) を標本化して x[n] に:

x[n] = x(nT)
  • T = 1 / f_s:サンプリング周期
  • x[n]:離散信号(nサンプル目)

➡ 時間を等間隔に分けて記録する操作


2.3 量子化(Quantization)

連続値を有限ビットで表す操作:

Q(x) = Δ × round(x / Δ)
  • Δ:量子化ステップ幅(例:16bitなら Δ ≈ 最大振幅 / 65536)
  • Q(x):量子化された信号値

➡ 記録には誤差(量子化誤差)が生じる


2.4 WAVEファイル(PCMフォーマット構造)

WAVEファイルの典型的な構造:

[RIFFヘッダ] → [fmtチャンク] → [dataチャンク]
  • データ部はPCM(Pulse Code Modulation):
x[n] ∈ {−32768, ..., +32767}(16bit PCM の場合)

➡ サンプリング・量子化された整数列が格納される


2.5 サウンドプログラミング(Digital Sound Synthesis)

例:サイン波合成(Python等で使用)

x[n] = A × sin(2πf n / f_s)
  • n:サンプル番号
  • f_s:サンプリング周波数
  • f:再生したい周波数
  • A:振幅

➡ 離散時間での波形生成が可能になる


第3章 コンピュータミュージック

3.1 五線譜(Staff Notation)

五線譜の音高とMIDI番号の対応式:

f = 440 × 2^((n - 69)/12)
  • n:MIDIノート番号(A4 = 69)
  • f:音の周波数(Hz)

➡ 楽譜の高さ=周波数は指数関数的な関係


3.2 音階(Scale)

12平均律(Equal Temperament)における音階:

f_n = f₀ × 2^(n/12)
  • f₀:基準音(例:C4)
  • n:半音数(相対的な位置)

➡ 隣接する音の比は 2^(1/12) ≈ 1.0595


3.3 音符(Note Duration)

音符の長さ(拍数に対する時間):

t = (4 / d) × (60 / bpm)
  • d:音符の分母(例:4分音符→4、8分音符→8)
  • bpm:テンポ(拍数/分)

➡ 音符ごとの**演奏時間(秒)**が求まる


3.4 強弱(Dynamics)

MIDIベロシティの範囲:

Velocity ∈ [1, 127]
  • 1:極めて弱い
  • 127:最大強度

➡ 実際には0(ノートオフ)を含む128段階の音量制御


3.5 拍子(Time Signature)

1小節の拍数と単位音符:

[分子]:1小節に含まれる拍数  
[分母]:1拍あたりの音価(例:4=4分音符、8=8分音符)

➡ 例:4/4 は「4拍/1小節、1拍=4分音符」


3.6 テンポ(Tempo)

1拍の長さ(秒)を求める式:

1拍の長さ = 60 / bpm
  • bpm:テンポ(beats per minute)

➡ MIDIタイミング制御やループ生成に使われる


3.7 音楽の三要素(要素間の非数式的関係)

  • リズム(時間構造)→ 拍子・テンポ
  • メロディ(音高の連なり)→ 音階・旋律
  • ハーモニー(和音)→ 音程関係・和声進行

➡ 数式ではなく、時間軸・周波数軸の構造的捉え方


3.8 コンピュータミュージック

MIDIイベント(ノート情報)構造:

Event = [tick, note_on/off, note_number, velocity]
  • tick:時間位置(単位:クロック)
  • note_number:音高
  • velocity:強さ

➡ イベント列が曲を構成する


3.9 自動演奏(Algorithmic Playback)

時間制御:

実時間 = tick × (tempo / resolution)
  • tempo:μs/四分音符
  • resolution:PPQN(Pulse Per Quarter Note)

➡ MIDI演奏における再生タイミング計算に使用


第4章 MIDI

「第4章 MIDI」に対応する各項目の代表的な式・構造・概念モデルを示します。MIDI信号の仕組み、数値構造、タイミング制御に関する内容を中心に、音楽プログラミングやDTMへの応用にも活用できるよう設計されています。


4.1 MIDI(基本構造)

MIDIメッセージ基本フォーマット(3バイト構造):

[ステータスバイト] [データバイト1] [データバイト2]

例(ノートオン):

[1001nnnn] [0kkkkkkk] [0vvvvvvv]
  • nnnn:チャンネル(0〜15)
  • kkkkkkk:ノート番号(0〜127)
  • vvvvvvv:ベロシティ(0〜127)

4.2 ノートオンとノートオフ

ノートオンとオフの時系列制御:

Note On:  [0x90 + ch] [note_num] [velocity]
Note Off: [0x80 + ch] [note_num] [0]
  • ch:チャンネル番号
  • note_num:MIDIノート番号
  • velocity:0~127(0 = ノートオフとしても解釈可能)

4.3 ノートナンバー(音高と周波数)

f = 440 × 2^((n - 69)/12)
  • n:MIDIノート番号(A4 = 69)
  • f:周波数(Hz)

➡ MIDIノートと音の周波数の指数関数的対応


4.4 ベロシティ(音の強さ)

velocity ∈ [1, 127]
  • 0:ノートオフ(または無音)
  • 1〜127:弱〜強

➡ 演奏の強弱、発音のアタック、フィルタ開度などに利用


4.5 プログラムチェンジ(音色切り替え)

構文:

[0xC0 + ch] [program_number]
  • program_number ∈ [0, 127](GM音源の128種類)

例:0 = Acoustic Grand Piano, 25 = Nylon Guitar


4.6 プログラムナンバー(GM音色一覧)

例:

プログラムナンバー 音色名
0 Grand Piano
24 Nylon Guitar
40 Violin
73 Flute

➡ GM(General MIDI)音源の標準番号規格に準拠


4.7 パーカッションマップ(チャンネル10専用)

例(MIDIノート番号 → 打楽器):

ノート番号 打楽器
35 Acoustic Bass Drum
38 Acoustic Snare
42 Closed Hi-Hat
46 Open Hi-Hat
49 Crash Cymbal

➡ チャンネル10は打楽器専用としてマッピングされる


4.8 MIDIファイル(SMF: Standard MIDI File)

基本構造:

[MThd] → ヘッダチャンク
[MTrk] → トラックチャンク(イベント列)

イベント例:

[デルタタイム] [ステータス] [データ1] [データ2]

➡ 時系列でノートイベントを記録するシーケンス構造


4.9 DTM(デスクトップミュージック)

MIDI + 音源 + DAW = DTM環境

➡ 明確な式ではなく、「MIDI信号の流れ+再生エンジン」という構成モデル


4.10 自動演奏(再生タイミングの計算)

タイミング式(MIDIクロック):

実時間 = tick × (tempo / resolution)
  • tick:イベントのデルタタイム
  • tempo:1拍の長さ(μ秒/四分音符)
  • resolution:分解能(PPQN)

➡ 精密な自動演奏にはこの式で「秒数換算」が必要


第5章 ディジタル信号処理

5.1 周波数分析(Fourier Analysis)

連続時間フーリエ変換(CTFT):

X(f) = ∫ x(t) × e^(–j2πft) dt

離散時間フーリエ変換(DTFT):

X(ω) = ∑ x[n] × e^(–jωn)

➡ 音信号の周波数成分(=倍音、音色)を求める


5.2 スペクトログラム(Spectrogram)

時間ごとの短時間フーリエ変換(STFT):

STFT{x[n]} = ∑ x[m] × w[n–m] × e^(–j2πkn/N)
  • w[n]:窓関数(ハミング、ハン等)
  • N:FFT点数
  • k:周波数ビン番号

➡ 時間 vs 周波数の2次元可視化(Pythonでlibrosaなどが使用可能)


5.3 楽器音の周波数分析

周期波形のフーリエ級数展開:

x(t) = ∑ Aₙ × sin(2πnf₀t + φₙ)
  • f₀:基本周波数
  • n:倍音番号
  • Aₙ:振幅
  • φₙ:位相

➡ 倍音構造を解析することで、音色(楽器の違い)を理解できる


5.4 フィルタ(Filter)

離散時間フィルタの一般式(差分方程式):

y[n] = ∑ (b_k × x[n–k]) – ∑ (a_k × y[n–k])
  • b_k:インパルス応答(フィルタ係数)
  • a_k:フィードバック係数(IIR型の場合)
  • x[n]:入力信号
  • y[n]:出力信号

FIR(有限インパルス応答)フィルタの例:

y[n] = (1/3) × (x[n] + x[n–1] + x[n–2])

➡ 簡易ローパス(移動平均)としてノイズ除去や音質調整に使える


第6章 シンセサイザ:数式とモデル一覧

6.1 音響合成のアプローチ(Synthesis Overview)

合成の基本分類:

  • 加算合成(Additive):波を「足す」
  • 減算合成(Subtractive):波から「引く/削る」
  • FM合成(Frequency Modulation):周波数を変調する
  • 物理モデル合成:現象の物理法則を模倣する(例:弦、管)

① 加算合成(Additive Synthesis)

複数の正弦波を重ね合わせて音を作る手法:

y(t) = a₁ * sin(2πf₁t) + a₂ * sin(2πf₂t) + ... + aₙ * sin(2πfₙt)
  • $a_i$:各成分の振幅
  • $f_i$:各成分の周波数
  • 倍音列(基本周波数とその整数倍)を足すことで音色を作る

② 減算合成(Subtractive Synthesis)

倍音を多く含む波形(ノコギリ波、矩形波など)を出発点にして、フィルターで削る

y(t) = Filter[RichWave(t)]

例:ノコギリ波(Sawtooth)

RichWave(t) = ∑_{n=1}^N (1/n) * sin(2πnft)

ローパスフィルタ(例:一次RCフィルタ)

H(ω) = 1 / sqrt(1 + (ωRC)^2)

③ FM合成(Frequency Modulation)

キャリア波の周波数を変調波で揺らす

y(t) = A * sin(2πf_ct + I * sin(2πf_mt))
  • $f_c$:キャリア周波数
  • $f_m$:変調周波数
  • $I$:変調指数(モジュレーションの深さ)

④ 物理モデル合成(Physical Modeling)

例:カープラス・ストロング法(Karplus-Strong)

y[n] = 0.5 * (y[n - N] + y[n - (N + 1)])
  • $N$:ディレイ長(弦の長さに相当)
  • 初期波形にランダムノイズを使うことで、撥弦楽器の音を模倣できる


6.2 アナログシンセサイザ(Analog Synth)

基本波形(理想オシレータ):

  • 正弦波:y(t) = A × sin(2πft)
  • 鋸波(ノコギリ波):周期的直線増加→折返し
  • 矩形波(Square):sgn(sin(2πft))
  • 三角波(Triangle):絶対値波形を階段状に加工

➡ アナログ合成は電圧変調でこれらを操作


6.3 オシレータ(Oscillator)

離散時間での波形生成:

x[n] = A × sin(2πfn / f_s)
  • f_s:サンプリング周波数
  • f:発音周波数
  • n:サンプル番号

➡ PythonやDAWで波形を直接合成可能


6.4 時間エンベロープ(Envelope)

ADSR(Attack, Decay, Sustain, Release)モデル:

E(t) = piecewise envelope of amplitude over time
  • Attack:立ち上がり
  • Decay:一時減衰
  • Sustain:一定音量
  • Release:放出

➡ 音の時間的な強度変化(実在楽器の特徴)


6.5 加算合成(Additive Synthesis)

複数の正弦波を足し合わせる:

y(t) = ∑ Aₙ × sin(2πfₙt + φₙ)
  • fₙ:倍音(n × 基本周波数)
  • Aₙ:強さ、φₙ:位相

➡ 音色を「倍音構成」として自由に設計可能


6.6 減算合成(Subtractive Synthesis)

豊かな波形(鋸波など)から周波数成分を削る:

y(t) = Filter(x(t))
  • x(t):元の波形(倍音を多く含む)
  • Filter:ローパス、バンドパスなど

➡ 音色を「ろ過」することで変える


6.7 FM合成(Frequency Modulation)

周波数を別の波で変調する:

y(t) = A × sin(2πf_ct + I × sin(2πf_mt))
  • f_c:キャリア周波数(基本音)
  • f_m:モジュレーター(変調周波数)
  • I:変調指数(倍音の豊かさ)

➡ 鉄琴・ベル・金属的音色に最適(YAMAHA DX7等)


6.8 カープラス・ストロング合成(Karplus-Strong)

物理モデル的な離散時間シンセ:

y[n] = 0.5 × (x[n] + x[n–1])
  • 初期波形 x[n]:ノイズ or パルス列
  • フィードバックして減衰と周期を形成

➡ 弦のような音響特性を簡単に模倣可能(ギター風)


6.9 音のリアリティ(Sound Realism)

複合モデル:

y(t) = Envelope(t) × [Additive + Filtered + FM + Reverb]

➡ 合成方式を組み合わせ、空間性(残響)・時間変化(エンベロープ)を加えることでリアリティを追求


第7章 エフェクタ:数式とモデル一覧


7.1 リバーブ(Reverb = 残響)

インパルス応答による畳み込み:

y[n] = ∑ h[k] × x[n - k]
  • x[n]:入力信号
  • h[k]:インパルス応答(IR)
  • y[n]:出力信号(残響付き)

➡ 実際の空間で録音されたIRを使うとリアルな残響になる(Convolution Reverb)


7.2 ディストーション(Distortion = 歪み)

非線形波形クリッピング:

y[n] = tanh(G × x[n])
  • G:ゲイン(増幅率)
  • tanh:非線形関数(クリッピング代用)

➡ アナログアンプの飽和・真空管の歪みを模倣(sign(x)clip(x, –1, 1) でも近似)


7.3 コンプレッサ(Compressor)

動的レンジ制御:

y[n] = x[n] × G(t)

ゲイン関数(例:ソフトニー)

G(dB) = 
  { 1                   (入力 < 閾値)
  { (1 / R) × (x – T)   (入力 ≥ 閾値) 
  • T:スレッショルド(しきい値)
  • R:レシオ(圧縮比)

➡ 音量が一定値を超えると自動で抑える(例:声の飛び出し防止)


7.4 イコライザ(EQ)

周波数帯域ごとのゲイン調整(IIRフィルタ):

y[n] = ∑ b_k x[n–k] – ∑ a_k y[n–k]
  • ローパス、ハイパス、バンドパスなどのフィルタ係数を設計

➡ 指定した周波数成分を強調・抑制できる(3バンドEQ、パラメトリックEQなど)


7.5 モジュレーション(Modulation Effects)

① トレモロ(音量変調)

y[n] = (1 + m × sin(2πf_m n / f_s)) × x[n]
  • m:変調深度(0〜1)
  • f_m:変調周波数

② ビブラート(周波数変調)

y[n] = sin(2πf n / f_s + d × sin(2πf_m n / f_s))
  • d:周波数変調の深さ(ディチューン幅)

➡ コーラス、フランジャーなどの基礎となる


7.6 デチューン(Detune)

わずかに異なる周波数の波を重ねる:

y(t) = sin(2πf₁t) + sin(2πf₂t)
  • f₁ ≈ f₂(微小な差)

➡ うなり(ビート)を生み、音を太く・広がりのあるものにする


🎛 第8章 ミキシング(Mixing):式・モデル一覧


8.1 モノラル再生とステレオ再生

モノラル信号(1ch):

y[n] = x[n]

ステレオ信号(2ch):

L[n], R[n] = x[n] × (1 ± p)
  • p:パン(定位)パラメータ(例:–1〜+1)

➡ ステレオ定位はパンニング制御で表現される


8.2 音像定位(Panning)

等電力パンニング(Equal-power panning):

L = cos(θ),   R = sin(θ)
  • θ ∈ [0, π/2]:パン角(定位の左右)

➡ 左右の出力エネルギーを均等に保ちながら定位調整する


8.3 ミキシング(重ね合わせ)

多トラック音の加算:

y[n] = x₁[n] + x₂[n] + ... + xₖ[n]

➡ 各チャンネルは音量調整(ゲイン)してから合成される


8.4 音楽制作(マスタリング前の調整)

  • 正確な式よりもパン+フェーダー+エフェクト処理の連携
  • マスタリング:ピーク制限、コンプ、EQ補正(→前章参照)

8.5 ボーカルキャンセル(センターキャンセル)

LとRの差分:

y[n] = L[n] – R[n]

➡ 中央定位(= 同位相)の成分がキャンセルされ、ボーカル除去が可能


🥁 第9章 打楽器の音をつくる:合成モデル・式一覧


9.1〜9.2 グロッケン・トライアングルなど

金属系打楽器のモード合成:

y(t) = ∑ Aₖ × sin(2πfₖt) × e^(–αₖt)
  • fₖ:非整数倍の共振周波数(非調和)
  • αₖ:減衰率(音の消え方)

➡ グロッケン、トライアングル、チューブラーベルに使用


9.4〜9.6 マリンバ、シロフォン、ティンパニ

木・膜系:準整数倍の振動

fₖ ≈ k² × f₁(k = 1, 3, 5...)

➡ 板の形状による特定のモード合成が使われる


9.7 シンバル(非周期音)

ノイズベース+ランダム共振:

y(t) = noise(t) × ∑ sin(2πfₖt) × e^(–αₖt)

➡ 離散モードではなく連続スペクトルに近い


9.9〜9.12 バスドラム・タム・スネア等

Karplus-Strong法/鼓膜モデル:

y[n] = (x[n] + x[n–1]) / 2

または:

y[n] = comb-filter(x[n]) × ADSR

➡ 打面の反射・ノイズ・共鳴体の混合


第10章

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?