Python
雑記
初心者
音楽
仮想通貨

ビットコイン株価の乱高下に合わせて音色を奏でるプログラム作ったんだよ

マンを持しての初投稿。
震災から7年目の今日、14時46分に黙祷を捧げて自分にも何かできることがあると7回目の自問をしながらQiitaを開くとトレンドに

という記事があって見るとびっくり超訳すると「馬鹿でも役に立つ、さあ書け」と書いてあったからタイトルのプログラムを投稿します。

作ろうと思ったきっかけ

先日、坂本龍一プロデュースの「Is Your Time」っていう音楽×テクノロジーの展示会があって色々と見ていたら思い浮かんだからです。

ソースコード

#!/usr/bin/env python
#-*- cording: utf-8 -*-

import requests
from bs4 import BeautifulSoup
from time import sleep
import IPython
import numpy as np
import pygame.mixer
import time

data = []

url = "https://cc.minkabu.jp/pair/BTC_JPY"

    # 音楽ファイルの読み込み
def beepSound(doremi):
    pygame.mixer.music.load(doremi)
    pygame.mixer.music.play(1)
    time.sleep(2)
    pygame.mixer.music.stop()

for i in range(10):
    res = requests.get(url)
    res.raise_for_status()
    soup = BeautifulSoup(res.text,"html.parser")


    elems = soup.select("#btc_jpy_top_bid")
    for elem in elems:
        data.append(elem.getText())

    #余分な配列の削除
    if len(data) > 2:
        data.pop(0)
    #取得した文字列の処理
    data[-1] = data[-1].replace(",","")
    data[-1] = float(data[-1])
    data[-1] = round(data[-1])
    rhythm = data[-1] - data[0]

    # mixerモジュールの初期化
    pygame.mixer.init()

    # 株価の高低差によって音階を変更
    if rhythm <= -501:
        beepSound("sound/do.ogg")
    elif rhythm <= -301 and rhythm > -500:
        beepSound("sound/re.ogg")
    elif rhythm <= -101 and rhythm > -300:
        beepSound("sound/mi.ogg")
    elif rhythm <= -1 and rhythm > -100:
        beepSound("sound/fa.ogg")
    elif rhythm >= 0 and rhythm < 100:
        beepSound("sound/so.ogg")
    elif rhythm >= 101 and rhythm < 300:
        beepSound("sound/ra.ogg")
    elif rhythm >= 301 and rhythm < 500:
        beepSound("sound/si.ogg")
    elif rhythm >= 501:
        beepSound("sound/do_h.ogg")

    print("現在のビットコイン:",data[-1],"円")
    print(rhythm)
    sleep(1)

リファクタリングもクソモネェカラキキナ状態なんですが動くっちゃ動くし動かないっちゃ動かないかもしれません。少なくとも僕のMACBOOKでは動いています。

音楽再生にはpygameを使用

pygameなんてもう何百年ぶりに聞いたんだくらいなもんだと思ってたんですが使えますね。
pygameが入ってない人は
pip install pygame
でpygameをインストールしてください。
SDL.hが見つかりませんというエラーが出る方は
brew install sdl sdl_image sdl_mixer sdl_ttf portmidi
を入力してsdlを入れてください。

def beepSound(doremi):
    pygame.mixer.music.load(doremi)
    pygame.mixer.music.play(1)
    time.sleep(2)
    pygame.mixer.music.stop()

このコードの
time.sleep(2)の2が「なぜ2なんだよ!」って思うかもしれませんが、音階の響きが最も良く聞こえるのが2だったのです。
それ以上でもそれ以下でもございません。

スクレイピングでは、beautifulsoup4を使用

あ、そういえばスクレイピングを扱っている記事ではネコも杓子も岡崎図書館のことがベターって貼り付けるのが慣習になってた気が、する。
岡崎市立中央図書館事件
スクレイピングするときは気をつけようねってことです。

で、どんな音鳴るの?

ソの音を中心に株価が下がれば下がるほど低い音が鳴り、株価が上がれば上がるほど高い音がなります。
場合によっちゃいい曲が出来上がります。
もし作曲に悩んでる方がいたらこのプログラムをヒントにしてくれたら幸甚です。

参考文献