0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ギター数理

Posted at

📘 第1章:音階と振動数(12平均律の数学)

  • 音の高さ(周波数)と弦の振動
  • 周波数の公式:f_n = f_0 × 2^(n/12)
  • 音階EADGBEの理論構造
  • フレットごとの周波数表作成
    以下に、ギターの音の高さとフレット位置に関する周波数の数学的な式とその解説をまとめます。

🎼 音の高さと弦の振動(周波数の計算)

■ 基本式(12平均律の周波数)

f_n = f_0 × 2^(n/12)

【記号の意味】

  • f_n:開放弦から n フレット目の音の周波数 [Hz]
  • f_0:開放弦の周波数(例:6弦Eなら 82.41Hz)
  • n:フレット番号(例:5フレット → n=5)

【例】

6弦(低音E)の開放弦:f_0 = 82.41 Hz

12フレットの音:

f_12 = 82.41 × 2^(12/12) = 82.41 × 2 = 164.82 Hz

🎸 音階:EADGBE の構造と数値

ギターの各弦(6弦〜1弦)の開放弦周波数は以下の通りです。

音名 周波数 f₀ (Hz)
6弦 E2 82.41
5弦 A2 110.00
4弦 D3 146.83
3弦 G3 196.00
2弦 B3 246.94
1弦 E4 329.63


📏 第2章:フレットと指数関数

🧠 前提知識:スケール長とは?

  • L:スケール長(ナットからブリッジまでの弦長)
     → 一般的なエレキギターでは L = 648mm(ストラト系)L = 625mm(レスポール系)

📐 各フレットの位置を求める式

数式:

x_n = L × (1 - 2^(-n/12))

記号の意味:

  • x_n:ナット(0フレット)からnフレット目の位置 [mm]
  • L:スケール長(全弦長) [mm]
  • n:フレット番号(0, 1, 2, ..., 24 など)

🧮 この式の背景:12平均律と倍音構造

  • 12平均律では、1オクターブ = 12音階 = 周波数が2倍
  • 各フレットは前のフレットから 2^(-1/12) 倍だけ弦長を短くする
     → 1フレットごとに弦長が 2^(-1/12) 倍ずつ縮まる

📉 導出の流れ:

  1. n=0(開放弦):弦長は Lx₀ = 0

  2. n=1(1フレット)
      弦の長さを L × 2^(-1/12) にすれば音が半音上がる
      → 残った部分がナット〜1フレットの距離 = L × (1 - 2^(-1/12))

  3. n フレット全体に拡張:

x_n = L × (1 - 2^(-n/12))

🔊 第3章:波形とフーリエ解析

🎮 1. ファミコン音源の基本構成

チャンネル 波形 概要
CH1 / CH2 矩形波 デューティ比25%, 50%, 75%など切替可
CH3 三角波 ピッチは低め。主にベース音に使用される
CH4 ノイズ波 擬似乱数で生成。ドラム音や効果音に使用

| CH1 / CH2:矩形波(パルス波)

式(Duty比25%, 50%, 75%)

$$
x(t) =
\begin{cases}
1, & 0 \leq \text{mod}(t \cdot f, 1) < d \
-1, & \text{otherwise}
\end{cases}
$$

  • $f$:周波数(Hz)
  • $d$:デューティ比(0.25, 0.5, 0.75 など)

例:50%デューティ比の場合

$$
x(t) = \text{sign}(\sin(2\pi f t))
$$


| CH3:三角波(トライアングル)

式(基本周期波)

$$
x(t) = \frac{2}{\pi} \arcsin(\sin(2\pi f t))
$$

または以下の周期的直線波(ファミコン風)として:

$$
x(t) = \frac{2}{\pi} \cdot \left| \text{mod}(t \cdot f, 1) - 0.5 \right| - 1
$$

  • ピッチが低く、主にベース用に使われる。

| CH4:ノイズ波(擬似乱数)

式(LFSR擬似乱数の例)

$$
x[n] = (-1)^{b[n]}
$$

  • $b[n]$:線形フィードバックシフトレジスタ(LFSR)で生成されるビット列
  • 通常、長さ15のLFSRや7ビットLFSRで周期的なビット列を生成
  • $x[n]$ は +1 または -1 の疑似ランダム列としてドラムや効果音に利用

📐 2. 矩形波のフーリエ級数展開

矩形波(50%デューティ)の式:

$$
f(t) = \frac{4A}{\pi} \sum_{n=1,3,5...}^{\infty} \frac{1}{n} \sin(2\pi nft)
$$

  • 奇数次高調波のみ
  • 高調波強度は $\frac{1}{n}$ に比例
  • 音色が“ナロー”で“シャープ”に感じられる原因

🎼 3. 三角波のフーリエ級数展開

三角波の式(振幅A, 周波数f):

$$
f(t) = \frac{8A}{\pi^2} \sum_{n=1,3,5...}^{\infty} \frac{(-1)^{(n-1)/2}}{n^2} \sin(2\pi nft)
$$

  • 奇数次高調波のみ
  • 高調波強度は $\frac{1}{n^2}$ に比例(矩形波より急減)
  • より“やわらかい”・“鈍い”音色になる

📊 4. PythonコードでFFT解析(例:矩形波)

# Program Name: famicom_wave_fft.py
# Creation Date: 20250716
# Overview: Generate NES-style square wave and analyze via FFT
# Usage: Run to display time-domain and frequency-domain plots

!pip install numpy matplotlib scipy

import numpy as np
import matplotlib.pyplot as plt
from scipy.fft import fft, fftfreq

# --- Parameters ---
fs = 44100            # Sampling frequency [Hz]
f0 = 440              # Fundamental frequency (A4) [Hz]
T = 1.0               # Duration [s]
duty = 0.5            # Duty cycle (50%)

# --- Generate Square Wave ---
t = np.linspace(0, T, int(fs*T), endpoint=False)
square_wave = 1.0 * (t % (1/f0) < (1/f0)*duty) - 0.5

# --- FFT ---
N = len(square_wave)
yf = fft(square_wave)
xf = fftfreq(N, 1/fs)

# --- Plot ---
plt.figure(figsize=(12, 6))

# Time-domain
plt.subplot(2, 1, 1)
plt.plot(t[:1000], square_wave[:1000])
plt.title("Square Wave (Time Domain)")
plt.xlabel("Time [s]")
plt.ylabel("Amplitude")

# Frequency-domain
plt.subplot(2, 1, 2)
plt.stem(xf[:N//2], np.abs(yf[:N//2]) * 2 / N, basefmt=" ", use_line_collection=True)
plt.title("FFT of Square Wave (Frequency Domain)")
plt.xlabel("Frequency [Hz]")
plt.ylabel("Amplitude")
plt.xlim(0, 5000)

plt.tight_layout()
plt.show()

🔍 5. 解析結果からわかること

  • 矩形波:奇数倍音が豊富 → 鋭く金属的な音
  • 三角波:高調波の減衰が早い → 柔らかく太い音
  • ノイズ:定常性なし・FFTでは広域に分布


🧮 第4章:リズムと周期関数


🎼 1. BPMと音符の周期


式:

$$
T = \frac{60}{\text{BPM}}
$$

  • T: 四分音符1拍の長さ(秒)
  • BPM: Beats Per Minute(1分間あたりの拍数)

音価の変換:

音符 長さ(秒)
四分音符 $T$
八分音符 $T / 2$
十六分音符 $T / 4$
二分音符 $T \times 2$
全音符 $T \times 4$

🎵 2. 三連符の周期:1拍を3分割


式:

$$
T_{\text{triplet}} = \frac{T}{3} = \frac{60}{3 \cdot \text{BPM}}
$$

  • 通常より細かく、グルーヴ感を出すのに使用
  • 例えば BPM=120 のとき三連符 = $0.167$ 秒

🕒 3. 付点音符:1.5倍の長さ


式:

$$
T_{\text{dotted}} = T \times \left(1 + \frac{1}{2}\right) = \frac{3T}{2}
$$

  • 付点四分音符 = 四分音符 $+$ 八分音符

🔀 4. 変拍子(複合拍子)のリズムモデル

例:7/8拍子(=7個の八分音符)
→ 通常 2+2+3 などのグループに分けて演奏される

時間構造:

$$
T_{\text{total}} = 7 \times \frac{T}{2}
$$

変拍子のロジックは、小節の総時間を奇数に分割することで多様な拍感を生む。


第5章:ディストーションと非線形性

🧮 1. 非線形クリッピングとは?

  • 音声波形(例:サイン波)を出力上限で制限する処理
  • 直線的な入力 → 非線形な出力へ
  • → 結果:波形が角ばる → フーリエ的に高調波が増える

🟨 2. ソフトクリッピング(Soft Clipping)

式:

$$
f(x) = \tanh(kx)
$$

  • tanh: 双曲線正接関数(滑らかなS字型)
  • k: 歪みの強さ(kが大きいほど急峻なクリップ)

特徴:

  • 緩やかな飽和
  • 高調波の出現はあるが滑らか
  • ジャズ・ブルース系のウォームな歪みに近い

グラフの例:

入力 x 出力 f(x)
0 0
±0.5 ±0.46
±1.0 ±0.76
±2.0 ±0.96
±∞ ±1.0

🟥 3. ハードクリッピング(Hard Clipping)

式:

$$
f(x) = \text{sgn}(x) \cdot \min(|x|, 1)
$$

または、分岐形式で:

$$
f(x) =
\begin{cases}
-1 & (x < -1) \
x & (-1 \leq x \leq 1) \
1 & (x > 1)
\end{cases}
$$

特徴:

  • 急峻な「断崖型」飽和
  • 多くの高調波(奇数次が強調される)
  • ハードロック・メタル向きの鋭い音

🎼 4. サイン波 vs 歪み波:波形とスペクトル比較

波形 波形の見た目 高調波の特性
サイン波 滑らか 基本波のみ
ソフトクリップ 丸い角が生じる 奇数次高調波が徐々に増加
ハードクリップ 四角く角ばる 高次の奇数高調波が急激に出現

第6章:電気回路とギターの音


🔌 1. パッシブトーン回路とは?

エレキギターのトーン回路における構成:

       ┌────────┬────────────┐
       │        │            │
      音源       R           │
       │        │            │
       └───────┬┴──────┐    出力
               │        │
              C        GND
  • R: ポット(可変抵抗)または固定抵抗
  • C: コンデンサ(トーンキャップ)
  • 構成としては**Low-Pass Filter(LPF)**に近い

📐 2. 周波数応答関数(Low-Pass Filter)

式:

$$
H(j\omega) = \frac{1}{1 + j\omega RC}
$$

各記号の意味:

  • $H(j\omega)$:複素周波数応答(周波数ごとのゲイン)
  • $\omega = 2\pi f$:角周波数([rad/s])
  • $R$:抵抗([Ω])
  • $C$:コンデンサ([F])

🧮 3. 特性の解釈

(1) 低周波域:

  • $\omega \to 0$ のとき:

$$
H(j\omega) \to 1
$$

→ 音がほぼそのまま通る(高音を削らずそのまま出力)


(2) 高周波域:

  • $\omega \to \infty$ のとき:

$$
H(j\omega) \to 0
$$

→ 高音が削られていく(ローパス特性)


(3) カットオフ周波数:

$$
f_c = \frac{1}{2\pi RC}
$$

  • ここでゲインは $|H(j\omega)| = \frac{1}{\sqrt{2}}$(−3dB)

🔧 4. BPFや他の構成例(応用)

フィルター 構成 役割
LPF 抵抗 + コンデンサ 高音をカット
HPF コンデンサ + 抵抗 低音をカット
BPF LPF + HPF を直列または並列で構成 特定の周波数帯だけ通す

🧮 第7章:デジタル信号処理(DSP)


📏 1. サンプリングとナイキスト周波数

サンプリング定理(Shannon-Nyquist):

アナログ信号 $x(t)$ をディジタル化するには、元の信号の最高周波数 $f_{\text{max}}$ の2倍以上でサンプリングすれば完全再構成可能。

数式:

$$
f_s > 2 f_{\text{max}}
$$

  • $f_s$:サンプリング周波数([Hz])
  • $f_{\text{max}}$:信号内に含まれる最大周波数成分

⚙️ 2. FIR / IIR フィルターによるトーン変化

FIR(有限インパルス応答):

出力は過去の入力の加重和で決まる

$$
y[n] = \sum_{k=0}^{N} b_k x[n - k]
$$

  • 安定で予測しやすい
  • 位相線形性が特徴

IIR(無限インパルス応答):

出力に過去の出力も含む

$$
y[n] = \sum_{k=0}^{N} b_k x[n - k] - \sum_{k=1}^{M} a_k y[n - k]
$$

  • 少ない係数で鋭いフィルタ特性
  • フィードバックがあるので発振に注意

🎸 3. ピッチシフトとタイムストレッチ


ピッチシフト(音の高さを変える)

基本アイデア:

再生速度を変えずに周波数のみ変える


周波数スケーリング式:

$$
x_{\text{pitch}}(t) = x(\alpha t)
\quad \Rightarrow \quad f_{\text{new}} = \frac{1}{\alpha} f_{\text{original}}
$$

  • $\alpha > 1$:ピッチアップ(高く)
  • $\alpha < 1$:ピッチダウン(低く)

タイムストレッチ(時間だけ伸縮)

時間軸操作式:

$$
x_{\text{stretch}}(t) = x(\beta t)
\quad \Rightarrow \quad \text{Duration changes, pitch unchanged}
$$

※ 実際には**位相補正(PSOLA, Phase Vocoder)**が必要


🤖 第8章:AIにおける代表的な数式・モデル解説(音楽やギター文脈にも対応)


AIは「入力 → モデル → 出力」という流れをとり、数式的には関数近似や確率的生成とみなされます。ここでは、AIが使う基本的な数式・理論を音楽応用の観点も交えて解説します。


1. 🎯 ニューラルネットワークの基本構造


🔢 単層パーセプトロン(Single Layer Perceptron)

入力 $x$ に対して、出力 $y$ は以下で与えられます:

$$
y = \sigma\left( \sum_{i=1}^n w_i x_i + b \right)
$$

  • $x_i$:入力(音の特徴やMIDI値など)
  • $w_i$:重み(学習されるパラメータ)
  • $b$:バイアス
  • $\sigma$:活性化関数(例:ReLU, tanh, sigmoid)

⚙ 活性化関数の例

  • ReLU: $\sigma(x) = \max(0, x)$
  • Sigmoid: $\sigma(x) = \frac{1}{1 + e^{-x}}$
  • tanh: $\sigma(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}}$

2. 🧠 多層ニューラルネットワーク(DNN)

複数の層を通して表現力を増す:

$$
h^{(1)} = \sigma(W^{(1)}x + b^{(1)}) \
h^{(2)} = \sigma(W^{(2)}h^{(1)} + b^{(2)}) \
\vdots \
\hat{y} = \text{softmax}(W^{(L)}h^{(L-1)} + b^{(L)})
$$

  • $h^{(l)}$:第 $l$ 層の出力(中間特徴)
  • 出力 $\hat{y}$:分類または予測(例:次に来る音、音色)

3. ⏱ RNN / LSTM(時系列モデリング)


音楽は「時系列データ」であり、RNNやLSTMが活躍します。

🔁 RNNの基本式

$$
h_t = \sigma(W_{xh} x_t + W_{hh} h_{t-1} + b_h) \
y_t = \sigma(W_{hy} h_t + b_y)
$$

  • $h_t$:時刻 $t$ の隠れ状態
  • $x_t$:時刻 $t$ の入力(ピッチ、リズム)
  • $y_t$:予測(次の音)

🧠 LSTM(長期記憶あり)式(簡略)

$$
f_t = \sigma(W_f x_t + U_f h_{t-1} + b_f) \quad \text{(忘却ゲート)} \
i_t = \sigma(W_i x_t + U_i h_{t-1} + b_i) \quad \text{(入力ゲート)} \
o_t = \sigma(W_o x_t + U_o h_{t-1} + b_o) \quad \text{(出力ゲート)} \
c_t = f_t \odot c_{t-1} + i_t \odot \tanh(W_c x_t + U_c h_{t-1} + b_c) \
h_t = o_t \odot \tanh(c_t)
$$

  • $\odot$:要素ごとの積(Hadamard積)
  • 記憶セル $c_t$ によって長期依存性を学習

4. 🧠 TransformerとSelf-Attention


🌐 Self-Attentionの数式

$$
\text{Attention}(Q, K, V) = \text{softmax}\left( \frac{QK^\top}{\sqrt{d_k}} \right)V
$$

  • $Q, K, V$:Query, Key, Value 行列
  • $d_k$:Keyベクトルの次元
  • 音列内の「どの音がどの音に注目するか」を学習する

🎼 応用:音楽Transformer (e.g., MusicBERT, MuseNet)

  • 音高、長さ、強さ、タイミング → トークン化
  • 自然言語と同様に音楽も「言語モデル化」して生成可能に

5. 🎵 損失関数と学習


📉 クロスエントロピー誤差(分類系)

$$
\mathcal{L} = - \sum_{i=1}^{n} y_i \log(\hat{y}_i)
$$

  • $y_i$:正解ラベル
  • $\hat{y}_i$:予測確率
  • 音のラベル(ドレミ、コード)分類などに使用

⏬ 勾配降下法(学習アルゴリズム)

$$
\theta \leftarrow \theta - \eta \frac{\partial \mathcal{L}}{\partial \theta}
$$

  • $\theta$:重み・パラメータ
  • $\eta$:学習率
  • 損失関数を最小化する方向に更新

0
1
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
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?