【その3】Pythonでメロディーを奏でたい

f:id:nuakam:20170929172616j:plain



準備編 pythonでメロディーを作りたい - エンジニア戦記
第2回 【その2】pythonでメロディーを作りたい - エンジニア戦記←前回
第3回 ここ
第4回 【その4】Pythonでメロディーを奏でたい-モジュール化とwavファイル出力 - エンジニア戦記

目標

自作した音情報をファイルを読み込んで、音を鳴らしたい

環境

  • python3
  • windows10
  • anaconda

概要

前回、音を出すところまでやってみた。
今回は別ファイルに保存した音声データを流してみる。
といっても、ファイル入力を追加させるだけなのでそう難しくはなかったりする。


ソース

音楽ファイルといってもテキスト形式。
.pyがあるディレクトリに以下のようなファイルを作りmusic.txtとして保存します。

330,330,330,262,330,523,392,

カンマ[,]区切りでドレミファソラシドの周波数を書いてみる。

[262, 294, 330, 349, 392, 440, 494, 523]
左からドレミファソラシドの周波数。



音楽ファイルを作ったらソースに書き加え。


まずは前回のソースコードにimport sysを追加。

import sys


そしてファイルを開く関数を追加。

def openfile(argv):
    a_file = open (argv,encoding="utf-8")
    befor_music = a_file.read()
    a_file.close()

    return befor_music

引数にお馴染みargvを。
あとは普通にファイルオープン、読み込み、クローズを。
pythonだとファイルを変数にファイル入れるのもとても簡単。


戻り値は読み込んだファイル。
わざわざ別関数にするほどでもないかもしれない。



続いてこれまた別関数にする必要ないかもしれない。

def conversion(befor_music):
    befor_list = befor_music.split(',')

    return befor_list

先程のopenfileから結果を受取り、「,」を外してリストに保存させます。




前回のif __name__ == "__main__" :を少し改造。

if __name__ == "__main__" :
    freqList = [262, 294, 330, 349, 392, 440, 494, 523]# ドレミファの周波数[Hz]
    for f in freqList:
        data = createSinWave(1.0, f, 8000.0, 2.0)
        play(data, 8000, 16)

を以下のようにする。

if __name__ == "__main__" :
    freqList =conversion(openfile(sys.argv[1]))
    count = len(freqList)
    del freqList[count-1]

    freqList = [int(i) for i in freqList]

    for f in freqList:
        data = createSinWave(1.0, f, 8000.0, 2.0)
        play(data, 8000, 16)


freqList =conversion(openfile(sys.argv[1])) は難しくない。
引数のファイルをopenfileで開いてconversionに入れて 代入しているだけ。


ここからがちょっと詰まりやすいかな?ってところ。

   count = len(freqList)
    del freqList[count-1]

    freqList = [int(i) for i in freqList]

下からいきましょう。

freqList = [int(i) for i in freqList]

ファイル入力したデータは基本的にstring型。intに変換しなきゃならない。
そんなわけでforループで一つづつintに型変換しよう。

int(i)でfreqListの要素数分まわす。


ただ、読み込んだデータには改行コード【\n】が入っているので取り出そう。

    count = len(freqList)
    del freqList[count-1]

len(リスト) はリストの要素数を返してくれる関数。
delリスト[要素番号] は指定した要素をリストから削除してくれる関数。


countに要素数を代入し、delでcount-1番めの要素を削除させる。


ちなみに要素番号は0から数えるため、-1が必要。


実行

$ Python 作ったファイル.py  music.txt

これで君も音楽家だ!

さあ、ビープ音で作曲しよう!(リズム一定、音階5個だけ、音色ビープ音だけ。)


準備編 pythonでメロディーを作りたい - エンジニア戦記
第2回 【その2】pythonでメロディーを作りたい - エンジニア戦記←前回
第3回 ここ
第4回 【その4】Pythonでメロディーを奏でたい-モジュール化とwavファイル出力 - エンジニア戦記