あらゆる理論で音楽を作成・分析できるPythonライブラリ Neuma を作成する (2) - 音の表示方法 -
引き続き、Neuma の開発について書いていきます。
前回は Neuma の根幹について書きました。
今回は、Neuma の音の表示方法について書いていきます。
前回 ->
2023/9/28 追記
Scale 周りを大幅に変更したため、記事の内容を更新しました。
音の表示方法が分かれている理由
そもそも、 なぜ、Note クラスに音の表示方法が含まれていないのか という疑問があると思います。
これは前回の記事を踏まえると、自ずとわかってくることではあるのですが、 Neuma は 既存の音楽理論にとらわれない 音楽ライブラリです。
そのため、基本的に「#・b」だとか「移動ド」だとか「移調」だとか、そういったものは Neuma にとって本質的な情報ではありません。
ここでは、音の名前は音の高さを特定するものではなく、 音の表現方法にすぎない ということを前提としています。
楽譜で言うなら、ト音記号を使うのか、ヘ音記号を使うのか、それとも他の記号を使うのか、みたいなものです。
あくまで、見やすい・わかりやすい表現方法があるというだけです。
音の表示方法
Neuma では、音の表示方法を Scale
として表現しています。
さっそくですが、 Scale
抽象クラスのコードがこちらです。
from abc import ABC, abstractmethod
from fractions import Fraction
from typing import Self
from neuma.note import Note
class Scale(ABC):
"""調の規定クラス
Description:
調の規定クラス。
このクラスを継承して、調クラスを作成する。
"""
@abstractmethod
def note_to_str(self, note: Note) -> str:
raise NotImplementedError
@abstractmethod
def str_to_note(
self,
str_note: str,
duration: Fraction = Fraction(1),
) -> Note:
raise NotImplementedError
@abstractmethod
def check_note_tone(self, note: Note) -> Note:
raise NotImplementedError
def __eq__(self, other: Self) -> bool:
if not isinstance(other, Scale):
return False
return self.__dict__ == other.__dict__
Scale
は、 note_to_str
と str_to_note
と check_note_tone
の 3 つのメソッドを持つ必要があるようになっています。
言い換えれば、 Scale
を継承するクラスは、 Note
クラスと文字列の相互変換と、 Note
クラスの音程がその音階システムに適合するかどうかの確認ができるということです。
ちなみにこれらさえ守れば、新しい音階システムを作ることができます。
AGScale クラス
Scale
クラスを継承した A~G の音名を使う音階システムのクラスが AGScale
クラスです。
よく見る「A#3」や「C2」といった表記法で Note
クラスとやりとりできるクラスになっています。
キーとスケールを指定することで同じ Note
群でも、キーを変えればハ長調からイ長調にできたり、スケールを変えれば長調から短調にできたりします。
同じ Note
群でも、キーを変えればハ長調からイ長調にできたり、スケールを変えれば長調から短調にできたりします。
この動画は修正前なのでインターフェースが異なりますが、同様のことが可能です。
ここから
前回言っていたシンセサイザーはざっくりですが完成しました。
MusicXML 形式の読み込みを実装するのが次の課題です。 (優先順位を下げました。)
さて、次回は音の鳴らし方について書きます。
音楽を作成することも目的ではあるので、音を鳴らす必要があります。
これさえできれば、あとは楽器とエフェクターを作るだけで曲が作れるようになります。(それに2週間ぐらいかけたんですけどねえ……)
楽器とエフェクターについても、書くつもりなのでもうしばらくお付き合いください。
次回 ->
Discussion