Spotify APIで遊ぶ
Spotify APIを使ってちょっと遊んでみました。
70年代の音楽は2000年代の音楽と比較してまったりしているのか?
最近70年代の大物ミュージシャンが立て続けに旅立たれたので、70年代の音楽を聴くことが多かったせいかSpotifyのオススメにたくさん70年代の曲が出てます。そして、ちょっとまったりした気分になります。
なんでまったりするのかなと、ChatGPTに聞いてみました。
70年代と2000年代の音楽を比較すると、どんな違いがあるか教えて。
回答は以下のようなものでした。
70年代と2000年代の音楽は、いくつかの点で明確な違いがあります。以下に、BPM、曲調、旋法などの音楽的な観点からの比較を示します。
BPM(Beats Per Minute:1分間の拍数):
70年代の音楽は一般的にゆったりとしたテンポが特徴でした。ロックやフォークミュージックでは、中程度のテンポが一般的でしたが、ディスコやファンクの曲では一定のリズムに合わせて高いBPMが使用されることもありました。 2000年代の音楽では、より速いテンポが一般的になりました。ポップやエレクトロニックダンスミュージック(EDM)の曲では、高速でエネルギッシュなビートが支配的であり、より高いBPMが使用されることがよくあります。
(以下、省略)
本当なのか検証するために、Spotify APIを使って70年代と2000年代の音楽のテンポを比べてみました。
Spotify APIとは
Spotify API をSpotifyを他のアプリからアクセスするためのものです。Spotify Developerに登録するとアクセスできるようになります。
APIを使って、" Track's Audio Features "という情報を引っ張ってくると、曲のテンポやキー、調性、ダンス性、ライブ性などのSpotifyが局ごとに持っている情報が得る事が出来ます.
今回はAPIを直接叩くのは面倒なので、Spotipy というSpotifyのAPIをラッピングしてくれるPythonのライブラリを使用しました。
# サンプルコード
2つのプレイリストを指定して、プレイリスト内の曲の属性情報をAPI経由で取得してCSVに書き出すサンプルコードを書いてみました。GitLab に置いておきますが、コードも掲載しておきます。
import pandas as pd import spotipy from spotipy.oauth2 import SpotifyClientCredentials import time import os import sys import argparse from dotenv import load_dotenv # Spotify API credentials from .env load_dotenv() client_id = os.environ["SPOTIFY_CLIENT_ID"] client_secret = os.environ["SPOTIFY_CLIENT_SECRET"] # コマンドライン引数の設定 parser = argparse.ArgumentParser(description='Extract Music Data from Spotify') parser.add_argument('-p','--playlist',nargs='*', help='Spotify Playlist ID') args = parser.parse_args() # プレイリストIDの設定 playlist_ids = args.playlist print("プレイリストID: ", playlist_ids) # Spotify APIの設定 client_credentials_manager = SpotifyClientCredentials(client_id, client_secret) sp = spotipy.Spotify(client_credentials_manager=client_credentials_manager) # プレイリストからトラックIDを取得する関数 def getTrackIDs(playlist_ids): track_ids = [] for playlist_id in playlist_ids: playlist = sp.playlist(playlist_id) # トラック数が100以上の場合はnextが存在するので、whileで回す while playlist['tracks']['next']: for item in playlist['tracks']['items']: track = item['track'] if not track['id'] in track_ids: track_ids.append(track['id']) playlist['tracks'] = sp.next(playlist['tracks']) else: # 最後の100トラックの処理 for item in playlist['tracks']['items']: track = item['track'] if not track['id'] in track_ids: track_ids.append(track['id']) return track_ids # トラックIDからトラックの情報を取得する関数 def getTrackFeatures(id): meta = sp.track(id) features = sp.audio_features(id) name = meta['name'] album = meta['album']['name'] artist = meta['album']['artists'][0]['name'] release_date = meta['album']['release_date'] length = meta['duration_ms'] popularity = meta['popularity'] key = features[0]['key'] mode = features[0]['mode'] danceability = features[0]['danceability'] acousticness = features[0]['acousticness'] energy = features[0]['energy'] instrumentalness = features[0]['instrumentalness'] liveness = features[0]['liveness'] loudness = features[0]['loudness'] speechiness = features[0]['speechiness'] tempo = features[0]['tempo'] time_signature = features[0]['time_signature'] valence = features[0]['valence'] track = [name, album, artist, release_date, length, popularity, key, mode, danceability, acousticness, energy, instrumentalness, liveness, loudness, speechiness, tempo, time_signature, valence] return track # 処理の実行 print("プレイリストからトラックIDを取得中") track_ids = getTrackIDs(playlist_ids) print("取得した曲数: ", len(track_ids)) print("各トラックの情報を取得中") tracks = [] for track_id in track_ids: time.sleep(0.5) track = getTrackFeatures(track_id) tracks.append(track) # 配列をデータフレームに変換してヘッダ情報を追加 df = pd.DataFrame(tracks, columns = ['曲名', 'アルバム', 'アーティスト', 'リリース日', '長さ', '人気度', 'キー', '曲調', 'ダンス度', 'アコースティック度', 'エネルギー', 'インスト感', 'ライブ感', '音の大きさ', 'スピーチ度', 'BPM', '拍子', '曲のポジティブ度']) df.head() # CSVファイルとして出力 df.to_csv('spotify_music_extract.csv', sep = ',')
音楽のテンポは変わっていなかった
Spotifyのプレイリストから、" All Out 70s "と" All Out 2000s "というそれぞれの年代のヒットソングを集めたプレイリストからトータル300曲くらいの情報を集めて確認してみました。
下図がBPMごとに曲をプロットしたものグラフです。
グラフを見ると、2000年代のほうがテンポが速い曲が増えたようにも見えますが、平均BPMはどちらも120 BPMで、やっぱりヒットする曲ってそんなに極端なものは少ないことが分かります。人が心地よく感じるテンポって総変わらないですね。
関連記事
- 2023-09-10 04:11 NeoVimからDeepLを呼び出す
- 2023-06-12 20:20 OpenAI Whisper APIを試す
- 2023-06-04 11:16 OpenAIとStreamlitを活用したチャットBotを作ってみた
- 2023-05-09 21:54 SublimeText上でDeepLを呼び出す
- 2021-06-14 22:40 Pythonの言語環境管理をPyenvからASDFに