はじめに
■ 丸サ進行と「Just The Two of Us」の関係
- 「丸の内サディスティック」の4361進行(IVmaj7→III7→VIm7→I7)は、
もともとGrover Washington Jr. の《Just The Two of Us》(1980年)に端を発する。 - 同曲はR&B/ジャズ・フュージョン系のコード構造をポップスに定着させた先例。
- 以降、この進行は「トゥオブアス進行」としてセッション用語化した。
近年の日本では「丸サ進行」と呼ばれて再流行している。
■ コード理論の骨格(ディグリーネーム)
IVmaj7 → III7 → VIm7 → I7(または Vm7 → I7)
Cメジャーに移調すると:
Fmaj7 → E7 → Am7 → C7(Gm7 / C7)
別名:
4361進行 = 4度 → 3度 → 6度 → 1度
■ 理論構造(機能分析)
| コード | 機能 | 説明 |
|---|---|---|
| IVmaj7 | サブドミナント | 柔らかい導入。時に一時的トニックとして振る舞う。 |
| III7 | セカンダリードミナント(V7/vi) | 一時的トニック VIm7 へ進むための導音。 |
| VIm7 | トニック代理 | 終止感を持たず、曖昧な安定。 |
| I7 | ドミナントモーションの準備 | 次のIVmaj7に戻るためのドミナント。 |
→ 「V7→I」の完全終止(カデンツ)をあえて避けることで、
調性感を曖昧にし、浮遊感・無限ループ感を生む。
■ 音楽的効果
- 「終止感がない」= 調性の曖昧さ・永遠性・漂う感覚。
- ノンダイアトニックコード(III7, I7)によりブルースではなくジャズ的色彩を帯びる。
- I7の短7度はFキーのドミナントとして機能し、ブルーノート的には響かない。
■ 理論的背景:二重のセカンダリードミナント
-
E7 → Am7
- Am7を一時的トニックとする副次ドミナント(V7/vi)。
- Am7はC6と構成音が同じで、長短どちらにも傾かない曖昧さ。
-
C7 → Fmaj7
- Fmaj7を一時的トニックと見立てた副次ドミナント(V7/IV)。
- Fmaj7に解決するが完全終止には至らず、再び循環へ。
■ モーダル・インターチェンジとの関係
- トニック以外のスケール(例:平行調・隣接モード)からコードを借用。
- Cメジャー → Fメジャー(またはDマイナー)へ一瞬転調。
- この柔軟な借用が「ジャジーで漂う響き」を作る。
■ 「Just The Two of Us」の構造と影響
- 《Just The Two of Us》=ジャズ・R&B・ポップの融合。
- コード進行は滑らかなベースライン移動:
F → E → A → C → F ... - 本曲の成功により、この進行は世界的標準語法となった。
- 日本では椎名林檎《丸の内サディスティック》が再文脈化し、
現代ポップス、ボカロ、シティポップの基礎進行として再認識された。
🎵 MIDI動作と式のしくみ
(1) 音名 → 数値変換
note_to_midi(note) = 12*(octave+1) + note_map[note_name]
- MIDIでは「C4(中央ド)」が 60。
- 1オクターブ = 12半音。
- 例えば F3 → 12×(3+1)+5 = 53。
→ この計算で「音高」を整数値で表します。
(2) 時間制御(timeパラメータ)
track.append(Message('note_on', ..., time=0))
track.append(Message('note_off', ..., time=DURATION))
-
note_on:音を出すイベント -
note_off:音を止めるイベント -
DURATION:2つの間のディレイ(tick単位)
→ この差が「音の長さ」。
例:DURATION = 720 は 480tick × 1.5拍 ≒ 約0.75秒(テンポ120のとき)。
(3) 曲の構造
進行:
IVmaj7 → III7 → VIm7 → I7
Cメジャーの場合:
F3 → E3 → A3 → C3
→ 各ベース音が順番に再生されます。
(ここでは和音でなく、各コードの根音を鳴らしている。)
(4) 音声生成と再生
fs = FluidSynth(sf2_path)
fs.midi_to_audio("marunouchi_flexible.mid", "marunouchi_flexible.wav")
Audio("marunouchi_flexible.wav")
-
FluidSynth: MIDIイベントを**サウンドフォント(.sf2)**を使って波形化。 -
/usr/share/sounds/sf2/FluidR3_GM.sf2はColab標準のGeneral MIDI音源。 - 出力:
marunouchi_flexible.wav
💡MIDI信号の式的モデル(時間関数)
ベース音列 ( b(t) ) は次のように表せます:
b(t) = Σ A_i * sin(2π f_i t) * [u(t - T_i) - u(t - T_i - ΔT)]
- ( A_i ):音の強さ(velocity)
- ( f_i ):音高(例:F3 = 174.61 Hz)
- ( T_i ):開始時刻
- ( ΔT ):音の長さ(DURATIONに対応)
- ( u(t) ):ステップ関数(音のON/OFF)
→ MIDIイベントを波形関数に変換した理論式です。
!apt-get install -y fluidsynth -qq
!pip install midi2audio mido matplotlib -q
from midi2audio import FluidSynth
from IPython.display import Audio
from mido import MidiFile, MidiTrack, Message
import matplotlib.pyplot as plt
# -----------------------------
# 設定パラメータ
# -----------------------------
KEY = "C" # 例: "C", "A", "Bb"
DURATION = 720 # コード1つの長さ(240=短い, 480=標準, 960=長い)
OCTAVE = 3 # ベース音のオクターブ
VELOCITY = 100
sf2_path = "/usr/share/sounds/sf2/FluidR3_GM.sf2"
# -----------------------------
# 音名 → MIDI番号変換
# -----------------------------
note_map = {'C':0,'C#':1,'D':2,'Eb':3,'E':4,'F':5,'F#':6,'G':7,'Ab':8,'A':9,'Bb':10,'B':11}
def note_to_midi(note): return 12*(int(note[-1])+1)+note_map[note[:-1]]
# -----------------------------
# スケールと進行定義(4361)
# -----------------------------
major_scale = {
"C":["C","D","E","F","G","A","B"],
"A":["A","B","C#","D","E","F#","G#"],
"Bb":["Bb","C","D","Eb","F","G","A"],
"F":["F","G","A","Bb","C","D","E"],
}
deg_to_note = [3, 2, 5, 0] # 4→3→6→1
scale = major_scale[KEY]
roots = [scale[i] for i in deg_to_note]
print(f"Key = {KEY}, 進行 = {' → '.join(roots)}")
# -----------------------------
# MIDI作成
# -----------------------------
mid = MidiFile()
track = MidiTrack()
mid.tracks.append(track)
for root in roots:
n = note_to_midi(root + str(OCTAVE))
track.append(Message('note_on', note=n, velocity=VELOCITY, time=0))
track.append(Message('note_off', note=n, velocity=VELOCITY, time=DURATION))
mid.save("marunouchi_flexible.mid")
# -----------------------------
# MIDI → WAV変換と再生
# -----------------------------
fs = FluidSynth(sf2_path)
fs.midi_to_audio("marunouchi_flexible.mid", "marunouchi_flexible.wav")
# -----------------------------
# Matplotlib可視化
# -----------------------------
plt.figure(figsize=(6, 2))
plt.bar(range(len(roots)), [1]*len(roots), color="skyblue", width=0.6)
plt.xticks(range(len(roots)), roots, fontsize=12)
plt.title(f"{KEY} major 4361 progression", fontsize=14)
plt.ylabel("Chord Step (equal length)")
plt.grid(axis='y', linestyle=':')
plt.show()
# -----------------------------
# 再生
# -----------------------------
Audio("marunouchi_flexible.wav")
