Python Music LabCompose As You Are

KNOWLEDGE LIBRARY

Python・自動作曲・DTMを
一つの地図として整理する

レッスン中に分からない言葉が出たとき、作品へ新しい考え方を加えたいときに使う参照ページです。

PYTHON

Pythonの基礎

レッスンで試す →
tempo = 108

変数と代入

右側の値を、左側の名前へ記憶します。数学の等号ではなく「入れる」操作です。

notes = ["C4", "E4", "G4"]

リストと添字

複数の値を順番にまとめます。最初の要素はnotes[0]です。

for i in range(8):

繰り返し

range(8)が0から7までを作り、字下げされた処理が8回実行されます。

if i % 4 == 3:

条件分岐

条件が真のときだけ処理を変えます。%は余りを求め、周期を作るのに便利です。

def motif(note, count):

関数

処理のまとまりへ名前を付けます。引数を変えれば、同じ仕組みから別の結果を作れます。

import random

import

別のモジュールに用意された機能を読み込みます。標準ライブラリや外部ライブラリを使う入口です。

random.seed(42)

乱数とseed

乱数は毎回違う候補を選べます。seedを固定すると、同じ選択列を再現できます。

IndentationError

エラーを読む

エラーは失敗の印ではなく、Pythonが見つけた問題の位置と種類を示す手掛かりです。

ALGORITHMIC COMPOSITION

自動作曲は「全部を機械に任せる」ことではない

自動作曲では、人が音の材料・制約・構造を決め、プログラムが規則に従って候補を組み立てます。乱数を使わなくても、繰り返しや数列だけで自動的な生成はできます。

1

材料

使う音、音の長さ、楽器、テンポを決める。

2

規則

繰り返し、条件、確率、数式で選び方を決める。

3

制約

音域、跳躍、反復回数を絞り、まとまりを作る。

4

構造

A–B–A、導入・展開・終結など時間の形を作る。

決定的な生成

同じ入力から必ず同じ結果を作ります。数列、セル・オートマトン、規則的なアルペジオなどが例です。

確率的な生成

候補から乱数で選びます。seed、重み、直前の音による制約を加えると、偶然を制御できます。

データの可聴化

温度、距離、明るさなどの数値を音高・長さ・強さへ変換し、データを音として調べます。

MUSIC BASICS

コードを書くための音楽の基礎

音名とオクターヴ

"C4"は中央付近のドです。末尾の数字が大きいほど高くなります。F#4はファのシャープ、Bb3はシのフラットです。

拍と長さ

この教材では1を1拍とします。0.5は半拍、1/3は三連符1個分、2は2拍です。

テンポ

BPMは1分間の拍数です。値を大きくすると速くなりますが、同じ旋律でも感じ方が変わります。

スケール

曲で主に使う音の集合です。五音音階は候補同士がぶつかりにくく、最初の自動作曲に向いています。

和音

複数の音を同時に鳴らします。["C4", "E4", "G4"]はCメジャーの三和音です。

velocity

音ごとの強さです。0から1の範囲で指定し、拍の頭だけ強くするとアクセントが生まれます。

DESKTOP MUSIC

DTMと編曲の考え方

シーケンサー時間上に音を並べる
トラック旋律・低音・和音・打楽器を分ける
音源音色を作る
ミキサー音量と左右位置を整える

まず8〜16小節ではなく、1〜4小節

短いループを作り、音の密度や役割を確かめてから長くします。

低音とキックを整理する

低い音が同時に多すぎると濁ります。どちらを主役にするか決めます。

変化は一度に一つ

音色、リズム、音高を一度に変えず、効果を耳で比較します。

反復と変化を両立する

同じモチーフを残しつつ、最後の音や強さだけを変えると統一感が生まれます。

余白を作る

全ての拍を埋める必要はありません。休符は次の音を目立たせます。

音量は小さめから

複数トラックを重ねると全体音量が上がります。安全な音量で確認してください。

作曲スタジオで試す

CODE PATTERNS

作品へ使えるコードの型

反復するモチーフ

motif = ["C4", "E4", "G4", "E4"]
for bar in range(4):
    for note in motif:
        add_note(note, 0.5)

三連符の反復

triplet = ["G4", "Bb4", "D5"]
for bar in range(4):
    for i in range(12):
        add_note(triplet[i % 3], 1/3)

条件で休符を入れる

for i in range(16):
    if i % 4 == 3:
        add_rest(0.5)
    else:
        add_note("C4", 0.5)

再現できる乱数

import random
random.seed(42)
for i in range(16):
    note = random.choice(scale)
    add_note(note, 0.5)