Qman's Diary

多趣味人間の備忘録

2022-11-21(2023-01-23 更新)

【備忘録】SEGA音ゲー3機種の公式サイトの裏で流れてる楽曲リストJSONの解説

タグ
音楽ゲーム
技術
オンゲキ
CHUNITHM
maimai

【注】本記事は旧ブログからの移植記事です。


SEGA音ゲー3機種の公式サイトの裏には、楽曲リスト等のためのJSONが流れています。

エンドポイントさえ知っていれば、それらを取得して活用することも可能です。

ただ、正規で公開されているものではありませんし、いつ仕様が変更されたり使えなくなったりしても一切文句は言えません。

この情報を利用する際は、何があっても自己責任でお願いします。

CHUNITHM

楽曲リスト

▶エンドポイント: https://chunithm.sega.jp/storage/json/music.json

以前は著作権情報もこのJSONファイル内にあったが、現在はhttps://chunithm.sega.jp/storage/json/rightsInfo.jsonにまとめて全て入っている。


▼レスポンス例

[
    {
        "id": "2065",
        "catname": "ORIGINAL",
        "newflag": "0",
        "title": "創世のコンツェルティーナ",
        "reading": "ソウセイノコンツエルテイウナ",
        "artist": "大嶋啓之",
        "lev_bas": "3",
        "lev_adv": "7",
        "lev_exp": "10+",
        "lev_mas": "13",
        "lev_ult": "",
        "we_kanji": "",
        "we_star": "",
        "image": "ec89f55fcf6e1c66.jpg"
    },
    {
        "id": "107",
        "catname": "ORIGINAL",
        "newflag": "0",
        "title": "We Gonna Journey",
        "reading": "WEGONNAJOURNEY",
        "artist": "Queen P.A.L.",
        "lev_bas": "3",
        "lev_adv": "6",
        "lev_exp": "11",
        "lev_mas": "14",
        "lev_ult": "14+",
        "we_kanji": "",
        "we_star": "",
        "image": "b43fef626f5b88cd.jpg"
    },
    {
        "id": "8081",
        "catname": "VARIETY",
        "newflag": "0",
        "title": "檄!帝国華撃団",
        "reading": "ケキテイコクカケキタン",
        "artist": "真宮寺さくら(横山智佐)&帝国歌劇団「サクラ大戦」",
        "lev_bas": "",
        "lev_adv": "",
        "lev_exp": "",
        "lev_mas": "",
        "lev_ult": "",
        "we_kanji": "歌",
        "we_star": "3",
        "image": "b5570c700e7bbf75.jpg"
    }
]

実際は1つのリストの中にすべての楽曲が入っている。ここでは通常の楽曲とULTIMAの存在する楽曲、WORLD'S END楽曲1つずつを例として挙げた。

同一楽曲であっても、通常譜面とWORLD'S END譜面は別々でオブジェクトが存在する。さらに、同じ楽曲のWORLD'S END譜面が複数ある場合、その譜面の数だけオブジェクトがある。


ちなみに、クラス認定(旧コースモード)限定楽曲/譜面はここに含まれない。つまりCHUNITHM SUN時点ではクラス認定専用になっている「Trackless wilderness」「folern」「Trrricksters!!」の狂譜面(いずれもCLASS ∞コース「aWEsome!!!!」に登場)、Randomの分譜面6つ(CLASS EXTRAコース「RANDOM」に登場)は上記のJSONファイルには記載されていない。そもそも公式サイト上にクラス認定に関する項目がないので、情報を取りようがない。


▼各key/valueの説明

  • id: 楽曲ID
  • catname: カテゴリ名
  • newflag: 新曲か否かのフラグ。新曲なら1が、そうでなければ0が文字列として入っている
  • title: 楽曲タイトル
  • reading: 検索用の曲名。元のタイトルを一定のルールに従って変換したもので、濁点や小文字のないカタカナとアルファベット大文字のみで構成される
  • artist: 楽曲アーティスト
  • lev_baslev_mas: それぞれBASIC~MASTERの譜面レベル。WORLD'S END譜面の場合は空欄になる
  • lev_ult: ULTIMAの譜面レベル。ULTIMAが存在しないか、WORLD'S END譜面の場合は空欄になる
  • we_kanji: WORLD'S ENDの譜面属性。漢字1文字もしくは『!』『?』が入る。通常譜面の場合は空欄になる
  • we_star: WORLD'S ENDの譜面難易度。数字「1」「3」「5」「7」「9」が文字列として入り、それぞれ☆~☆☆☆☆☆に対応する。通常譜面の場合は空欄になる
  • image: ジャケット画像のファイル名。URLhttps://new.chunithm-net.com/chuni-mobile/html/mobile/img/に付け足すと画像を取得できる。

CHUNITHM海外版

楽曲リスト

▶エンドポイント: https://chunithm.sega.com/assets/data/music.json

CHUNITHM NEWまでは日本版の古いJSONフォーマットと同一だったが、おそらくNEW PLUSになってからは現行日本版と完全に同一のフォーマットになった。

その他の差異は以下の通り。

  • 著作権表示のJSONファイルはhttps://chunithm.sega.com/assets/data/rightsInfo.jsonにある。
  • ジャケット画像のファイル名の前に付け足すURLはhttps://chunithm-net-eng.com/mobile/img/である。


なお、中国大陸版については、そもそも公式サイトが存在しないものと思われる。

WORLD'S ENDの譜面難易度に関する余談(クリック/タップして展開)

上記ファイル内において、WORLD'S ENDの難易度は5段階にもかかわらず何故か飛び飛びの奇数が設定されている。この理由については推測だが、WORLD'S END実装前はさらに細かい難易度分けをしようとしていたのではないかと推察できる。

CHUNITHM-NET上でWORLD'S ENDの楽曲が表示される画面では、譜面属性アイコンの横に難易度を表す星の画像があるが、この画像のURLにも上記と同様の数字が存在する。

例えば、「5」の画像はhttps://new.chunithm-net.com/chuni-mobile/html/mobile/images/icon_we_star5.pngである。


結論から言うと、この星の画像は全部で20枚ある。URLの番号部分を0~19に入れ替えて見てみると、その画像が姿を現す。

0・2・4・6・8には星が半分だけある画像が、10~19には黄色く塗りつぶされた星の画像がある。いずれも未使用である。

maimaiでらっくす

楽曲リスト

▶エンドポイント: https://maimai.sega.jp/data/maimai_songs.json

CHUNITHMと同じく、著作権情報はhttps://maimai.sega.jp/data/RightsInfoText.jsonに分けられている。


▼レスポンス例

[
    {
        "artist": "ツミキ feat.音楽的同位体 可不(KAFU)",
        "catcode": "niconico&ボーカロイド",
        "dx_lev_bas": "2",
        "dx_lev_adv": "6",
        "dx_lev_exp": "9+",
        "dx_lev_mas": "11",
        "dx_lev_remas": "13",
        "image_url": "e6f1a560ee4c29d9.png",
        "release": "220915",
        "sort": "110",
        "title": "フォニイ",
        "title_kana": "フオニイ",
        "version": "23000"
    },
    {
        "artist": "ナユタン星人",
        "catcode": "niconico&ボーカロイド",
        "dx_lev_bas": "3",
        "dx_lev_adv": "7",
        "dx_lev_exp": "9",
        "dx_lev_mas": "12+",
        "image_url": "dfd85cc1f0611a87.png",
        "release": "000000",
        "lev_bas": "6",
        "lev_adv": "8",
        "lev_exp": "11",
        "lev_mas": "13",
        "sort": "213",
        "title": "ダンスロボットダンス",
        "title_kana": "タンスロホツトタンス",
        "version": "19007"
    },
    {
        "artist": "HiTECH NINJA",
        "catcode": "オンゲキ&CHUNITHM",
        "date": "NEW",
        "dx_lev_bas": "5",
        "dx_lev_adv": "8",
        "dx_lev_exp": "12+",
        "dx_lev_mas": "14",
        "image_url": "74c92bac1b51a9c3.png",
        "key": "○",
        "release": "230120",
        "sort": "996",
        "title": "電光石火",
        "title_kana": "テンコウセツカ",
        "version": "23011"
    }
]

実際は1つのリストの中にすべての楽曲が入っている。

オブジェクトの中で譜面レベル部分以外のkeyが辞書順にソートされている。

また、CHUNITHMと違ってそのデータに該当するものが存在しない場合は空欄ではなくkeyそのものが存在しないようになっている。でらっくす/通常譜面の二種があり、空欄方式を採用するとファイルの文字数が増えてしまうからだろうか?


▼各key/valueの説明

  • artist: 楽曲アーティスト
  • catname: カテゴリ名
  • date: 新曲か否か。このkeyが存在する場合はNEWという文字列のvalueが入る。そうでなければkeyそのものが存在しない
  • dx_lev_basdx_lev_mas: それぞれでらっくす譜面のBASIC~MASTERの譜面レベル。でらっくす譜面がなければkeyそのものが存在しない
  • dx_lev_remas: でらっくす譜面のRe:MASTERの譜面レベル。譜面がなければkeyそのものが存在しない
  • image_url: ジャケット画像のファイル名。URLhttps://maimaidx.jp/maimai-mobile/img/Music/に付け足すと画像を取得できる。
  • key: 解禁が必要か否かのフラグ。このkeyが存在する場合は(U+25CB)という文字列のvalueが入る。そうでなければkeyそのものが存在しない
  • release: 楽曲リリース日。YYMMDD形式の文字列。現在稼働しているバージョン以外で登場した楽曲のリリース日情報は全て000000にされている(maimai でらっくす FESTiVAL稼働時点では稼働開始日である2022/9/15以前の数字が存在しない)。さらには、後から譜面が追加された場合、その譜面の一般解禁日がこの値になることから、楽曲自体のリリース日にはならないこともある。
  • lev_baslev_mas: それぞれスタンダード譜面のBASIC~MASTERの譜面レベル。スタンダード譜面がなければ存在しない
  • lev_remas: スタンダード譜面のRe:MASTERの譜面レベル。譜面がなければkeyそのものが存在しない
  • sort: 楽曲ソート用の番号(文字列)だと思われる。JavaScriptソースコード上では後述のversionが同一値だった際のソート用の値として使用されている
  • title: 楽曲タイトル
  • title_kana: 検索用の曲名。元のタイトルを一定のルールに従って変換したもので、濁点や小文字のないカタカナとアルファベット大文字のみで構成される
  • version: バージョンを表す5桁の番号(文字列)。詳細は後述

versionについて

maimaiの楽曲リストJSONに存在するversionは、楽曲の追加されたゲームのバージョンを表す文字列である。ここで言うバージョンとは、2週間ごとにある楽曲追加ごとに変更される(内部的な)バージョンであり、名前のついたバージョンを意味しない。

この番号は上3桁・下2桁に分けることができ、それぞれ以下のような意味合いがある。

  • 上3桁: その楽曲が収録された名前付きバージョン(「maimai GreeN」「‍maimai でらっくす Splash PLUS」など)の識別番号。
  • 下2桁: その名前付きバージョンにおける更新の何回目で収録されたかを表す値。当該バージョン稼働日の00から始まり、1ずつ数字が増えていく。

これに従うと、例えば18015は「maimai MURASAKiの14回目の更新」であることがわかる。


以下は上3桁とどのバージョンが紐づいているかのリストである。

  • 100xx: maimai
  • 110xx: maimai PLUS
  • 120xx: maimai GreeN
  • 130xx: maimai GreeN PLUS
  • 140xx: maimai ORANGE
  • 150xx: maimai ORANGE PLUS
  • 160xx: maimai PiNK
  • 170xx: maimai PiNK PLUS
  • 180xx: maimai MURASAKi
  • 185xx: maimai MURASAKi PLUS
  • 190xx: maimai MiLK
  • 195xx: maimai MiLK PLUS
  • 200xx: maimai でらっくす
  • 205xx: maimai でらっくす PLUS
  • 210xx: maimai でらっくす Splash
  • 215xx: maimai でらっくす Splash PLUS
  • 220xx: maimai でらっくす UNiVERSE
  • 225xx: maimai でらっくす UNiVERSE PLUS
  • 230xx: maimai でらっくす FESTiVAL

今後もこの法則に従うと仮定するなら、バージョンごとに数値は5ずつ増えていくものと思われる。


なお、ゲーム自体が2週間毎に更新されるからといって、この値からリリース日を算出することはできない。

エイプリルフールの更新や新型コロナウイルスによる2020年の更新のブランクなどが存在するためである。

maimai海外版

楽曲リスト

▶エンドポイント: https://maimai.sega.com/assets/data/maimai_songs.json

フォーマットは現行日本版と同一。ただし、情報が最新でない可能性がある旨が表示されている。

おそらく、大型アップデートの際のみ更新されるものと思われる。

その他の差異は以下の通り。

  • 著作権表示のJSONファイルはhttps://maimai.sega.com/assets/data/RightsInfoText.jsonにある。
  • ジャケット画像のファイル名の前に付け足すURLはhttps://maimaidx-eng.com/maimai-mobile/img/Music/である。


なお、中国大陸版については、CHUNITHM同様そもそも公式サイトが存在しないものと思われる。

オンゲキ

楽曲リスト

▶エンドポイント: https://ongeki.sega.jp/assets/json/music/music.json

▼レスポンス例

[
    {
        "new": "",
        "date": "20200930",
        "title": "STARTLINER -星咲 あかりソロver.-",
        "title_sort": "STARTLINERホシサキアカリソロVER",
        "artist": "曲:kz(livetune)/歌:星咲 あかり(CV:赤尾 ひかる)",
        "id": "709200",
        "chap_id": "01001",
        "chapter": "目指せ! いっぱいのエール!",
        "character": "星咲 あかり",
        "chara_id": "1010",
        "category": "オンゲキ",
        "category_id": "06",
        "lunatic": "",
        "bonus": "1",
        "copyright1": "-",
        "lev_bas": "2",
        "lev_adv": "5",
        "lev_exc": "8+",
        "lev_mas": "11",
        "lev_lnt": "",
        "image_url": "92bac6746c5cd534.png"
    },
    {
        "new": "",
        "date": "20201008",
        "title": "ロボットプラネットユートピア",
        "title_sort": "ロホツトフラネツトユトヒア",
        "artist": "lumo",
        "id": "913900",
        "chap_id": "04099",
        "chapter": "END CHAPTER(第4章)",
        "character": "みどニャン",
        "chara_id": "9030",
        "category": "チュウマイ",
        "category_id": "05",
        "lunatic": "1",
        "bonus": "",
        "copyright1": "-",
        "lev_bas": "",
        "lev_adv": "",
        "lev_exc": "",
        "lev_mas": "",
        "lev_lnt": "0",
        "image_url": "59fb1dc1b106d17f.png"
    }
]

実際は1つのリストの中にすべての楽曲が入っている。

ここでは通常楽曲とLUNATIC楽曲1つずつを例として挙げた。

同一楽曲であっても通常譜面とLUNATIC譜面で1つずつオブジェクトが存在する。


▼各key/valueの説明

  • new: 新曲か否か。新曲ならNEWが、そうでなければ空文字列がvalueとなる
  • date: 楽曲リリース日(YYYYMMDD形式)
  • title: 楽曲タイトル
  • title_sort: ソート用の曲名。元のタイトルを一定のルールに従って変換したもので、濁点や小文字のないカタカナとアルファベット大文字のみで構成される。形式自体はCHUNITHMやmaimaiと同一だが、こちらは検索には使用されていない
  • artist: 楽曲アーティスト
  • id: 楽曲ID
  • chap_id: 楽曲が属するチャプターのID
  • chapter: 楽曲が属するチャプター名
  • character: 楽曲での対戦相手の名前
  • chara_id: 楽曲での対戦相手のID
  • category: 楽曲カテゴリ名
  • category_id: 楽曲カテゴリのID。名前との紐付きはhttps://ongeki.sega.jp/assets/json/music/categories.jsonでも確認できる
  • lunatic: LUNATICか否か。LUNATIC楽曲なら1が、そうでなければ空文字列がvalueとなる
  • bonus: ボーナストラックか否か。ボーナストラックなら1が、そうでなければ空文字列がvalueとなる
  • copyright1: 著作権表示。内容が無い場合は-がvalueとなる
  • lev_baslev_mas: それぞれBASIC~MASTERの譜面レベル。LUNATIC楽曲の場合はいずれも空欄。『EXP』が『EXC』となっていることに注意
  • lev_lnt: LUNATICの譜面レベル。通常楽曲の場合は空欄となる
  • image_url: ジャケット画像のファイル名。URLhttps://ongeki-net.com/ongeki-mobile/img/music/に付け足すとジャケット画像を取得できる。

まとめ

ゲームによって結構仕様がバラバラになっている。さらに仕様やファイル名すらちょこちょこ変わるので定期的な確認が必要である。

Recent Articles
>> キューマンのコンテンツ置き場
Profile

オタクコンテンツで命を繋いでいる人間

Accounts
Category
Tweets