初めに
皆さんTextAliveAppAPI楽しんでますか? 生まれたばかりで文献が少ないですが、PVとかみてるといろいろ夢が広がりんぐで楽しいですよね。
しかしまぁほんとに文献がないので軽率に書き散らして行こうと思います。
言い換えると軽率に書き散らしているので薄い理解で書いてる可能性があるのであまり信じないでください。また、執筆時正しくても、バージョンアップで†破壊的変更†が行われて動かなくなる可能性もありますので、そこらへんよろしくおねがいします。
今回のテーマは「今いる区間の特徴を得る」です。
Segmentとは
Segment、つまり区間という情報があります。しかしこの説明がサビ区間だとか繰り返し区間だとか書いてあってイマイチピンときません。
Segments
にはサビかどうかの条件がありますが、これがSegment
になると失われてしまいます。
思うよにこの情報を取り出せないので、やや複雑な記述をしなければならなそうです。
Songleを知っていますか?
そもそも、サビだ何だの情報をどこから受け取っているのかと言えば、能動的音楽鑑賞サービスSongle(ソングル)です。
ざっくりいうと、YouTubeとかニコニコ動画とかピアプロとかに点在する楽曲を解析してサビ情報とかコード情報とか音階を取得・表示するサービスです。
自動解析に加え人間による手直しもできるっぽいです。
で、これには下みたいな感じで、楽曲全体について楽曲構造を区間表示しています。
上部には、楽曲の全体構造として、サビ区間がオレンジ・その他の繰り返し区間がブルーで表示されています。クリックするだけでその区間の先頭にジャンプできるので、興味のある区間の頭出しをしたり、複数の区間を素早く聴き比べることができます。(使い方 - Songle)
これの位置情報が、各段としてplayer.data.songMap.segments
にarray
で保存されているのです。
この各段はそれぞれが類似していることを示しているらしいです。
なんかこの辺にそんな感じのことが書いてあった。
サビ以外の各段の順番に意味は無く、自動生成の結果からどの段がサビか(サビ同士は類似しているだろうだから、サビがあるならこれらの段のいずれかを選ぶことになる)を判定しそれを0番にコピーし、chorus:true
をつけているようです。
(サビが二種類あるタイプの楽曲(どの曲がそれに該当するのかは知らない)とかあったらどういう扱いになっているのかは気になるところがありますね)
追記
どうやら上の話は自動生成の結果の場合みたいで、その後に手動で操作すればサビと別の段が一致しないような状態も作れるようです。イントロでしんみりverが流れる場合など、異なるという状況はありえます。
ちなみに、songleでは各段におけるsegmentsの長さが同一であるようになっていたのでテンポまで違うと思うようにはいきませんが……
指定された位置がサビのときだけサビの区間情報を返すplayer.findChorus(time)
はありますが、これでは類似区間というデータを活かしきれなさそうです。
この辺をいい感じに使って、何段目かを取得するコードを書いておきます。
function getSegNumber(time){
const ans=[];
for(let i=0; i<segments.length; i++){
Array.from(segments[i].segments, (z)=>{
if(z.contains(time)) ans.push(i);
});
}
return ans;
}
segments
はonVideoReady
あたりでのplayer.data.songMap.segments
です。
楽曲によっては、複数の段にSegmentがあることがあるので配列で返しました。
chorus(サビ)の段は元の段がコピーされるようで、常に複数帰ってきます。
区間の合計数は20かそこらだろうからそんなに重い処理ではないし、各段それぞれにおいてSegment同士のかぶりは無いはずなので、実装はこんな感じで大丈夫だと思います。多分。
これで値を得ておけば、ans[0]===0
でサビ判定もできます。(サビは常に0行目なので、一番最初にpushされます)
終わりに
こんな感じのやつがAPIにあっても良いと思うなぁ。(そんな実装手間じゃないから別に無いと困るほどじゃないけど)
追記
songleの編集操作をやっておくと理解がはかどります。