DJの選曲にもレコメンドがあると楽じゃないか?それTraktorでもできませんかね!? Vol.3
はい!KAI-YOUエンジニアのコウベ(@cabbagekobe)です。
というわけで前回の続き!
前回の記事はコチラ!
今回やっていくのは「Traktorで再生中の曲をどうやって取得していくのか」です。
とはいえTraktorには直接に再生中の曲情報などを取れるAPI、ましてやプラグインなどもありません!
なのでTraktorに用意されているbroadcasting機能を使っていきます。
これを使うと完全ではないですが、楽曲名、アーティスト名をjson形式で取得できます。
そしてそのやりかた
まずicecastをインストールします!
Icecastとは
Icecastは Xiph.Org Foundation が運営するストリーミングプロジェクトであり、その成果はフリーソフトウェアとしてリリースされている。特にプロジェクトの一部であるサーバプログラムを指すことがある。Icecast は1998年12月から1999年1月にかけて Jack Moffitt と Barath Raghavan が誰でも修正・利用・改変可能なオープンソースの音声ストリーミングサーバとして開発したのが最初である。バージョン2の開発は2001年に始まり、各種フォーマットをサポートしスケーラビリティを向上させるため完全に書き直された(それ以前は Ogg Vorbis だけを対象としていた)。
https://ja.wikipedia.org/wiki/Icecast より
本来的な役割としてはストリーミングサーバーを立てることが目的ですが、ここはとりあえずあまりなにも考えずインストールしましょう!(Homebrewで)
Icecast周りの準備
まずはインストール
brew install icecast
でインストールされます。
そしてicecastを起動しましょう!
$ icecast -c /usr/local/etc/icecast.xml
(/usr/local/etc/icecast.xml が設定ファイルになってまして今回は省きますが必要があればちゃんと設定しましょう)
そうしますとこちらにアクセスできるようになるはず!
http://127.0.0.1:8000/status-json.xsl
Traktor周りの準備!
次にTraktorから設定していきましょう。
設定を開きましてBroadcastingタブを開きまして、こんな感じに設定していきましょう!
パスワードは上記の/usr/local/etc/icecast.xml
のファイルに書いてありますが、初期設定は"hackme"になっているはず…
そうしましたらばこちらのボタンを押してBroadcast機能をオンにしましょう!
(ちなみに設定がキチンとしていましたらボタンは点灯状態になります。点滅してたらなんか設定がおかしいよ〜ってことなのでなにか見直しましょう)
情報を取得する!
上記のようにicecastの設定、Traktorの設定がキチンとされており、曲を再生してちょっと待ってから改めて下記URLにアクセスしますと、楽曲情報が吐き出されているはずです!
http://127.0.0.1:8000/status-json.xsl
こんな感じに!
楽曲が変わるごとに上記URLの情報も変わりますので、こちらのURLから定期的にアーティストと曲名を取得しつつ楽曲DBとかに投げて情報を取得していけるはずです!
というわけで次回は最終回(予定)!
spotify APIから取得した情報を入れたDBから今再生中の楽曲と似た曲をリストアップするぞ!です。
乞うご期待!!!!!
Adobe Dimension CCを使ってハッコウくんジュースの缶を3Dで作ってみる
こんにちは。KAI-YOU開発部わたはるです。
突然ですが、最近3Dの画像制作にハマってます。 blenderというモデリングソフトをご存知でしょうか?(おっとこんなブログが...)
実を言うとblenderのモデリングは挫折しました。だって難しいんだもの。 でも3D簡単に作りたい、作れた方が色々できる...。
そんな時にAdobe Creative Cloudに追加されたのが、Adobe Dimension CCです。
Adobe Dimension CCとは?
公式サイトを見るとこのような感じのことが。
ブランド、パッケージ、ロゴのデザインを、フォトリアリスティックレンダリングを使用して3Dデータに反映します。ロゴやベクターグラフィックをドラッグ&ドロップで3Dモデルに追加して、デザインコンセプトが実際にどのように表現されるのかを見ることができます。さらにアプリケーション内から、Adobe Stockを検索して、Dimension用に最適化された3D素材を探すことも可能です。
要するにPhotoshopやillustratorで作った素材を、すでに用意されているモデルに反映して3D画像を作ることができるってことですね。 そんなに簡単なんですか...?と半信半疑。私みたいなblenderのモデリングに挫折した人間にはぴったりなのでは。早速使ってみましょう。
3Dモデルを配置
まずは3Dモデルを配置していきます。 画面の左側にスターターアセットというものがすでに用意されています。
はじめに用意されてるアセットだけでもかなり量がありますね、ワクワクしてきました。これらの素材を好きに配置していきます。
右クリックで好きなアセットを画面まで引っ張ってきてドラッグ&ドロップで配置することができます。 左クリックをしながらマウスを動かすと視野の移動もできるで好きな視野から、好きなようにレイアウトをしていきます。 あ、これ必要なかった!となった時にはデリートキーで削除できるので、あまり考えずにポイポイ画面に追加していきましょう。
次に配置の時に使えるツールのご紹介を簡単にしていきます。
移動ツール
X軸、Y軸、Z軸それぞれの矢印をドラッグ&ドロップすることで移動することができます。 それぞれ矢印を選択した状態だと一方向にしか動きませんが自由に動かすこともできます。
拡大・縮小ツール
3D空間で、モデルを拡大・縮小することができます。 ただのドラッグだけだと、モデルの比率が変わってしまうので、変えたくない場合はShiftキーを押しながら。 右側に比率設定をするところもあるので数値で2倍にしたい、3倍にしたいの場合はそちらをお使いください。
回転ツール
移動ツールと同じく、X軸、Y軸、Z軸の矢印でぐるぐるモデルを回転させることができます。 立体に動きが出るのでこれぞ3Dの醍醐味って感じがしますね。
モデル配置ができました!
結果こんな感じになりました。いい感じですかね...? まあモデル配置の変更も気軽にできるのでとりあえず進めていきましょう。
マテリアルを設定
次にマテリアルを設定していきます。マテリアル、つまりは材質のことですね。こちらも左側のメニューから設定ができます。
スターターアセットのマテリアルもかなり充実してますね。 この材質の感じ2Dで出すの本当大変なんだよね...というところまで手が回ってるのでAdobe先生に大感謝。足を向けて寝ることができません。
今回は周りのスプラッシュと缶の結露した部分に「水」のマテリアルを適応しました。 色なども右側のメニューから変更できます。水なので青系または白系がいいかなと思います。
缶の表面に装飾を加える
モデルに貼りたい画像を用意します。 今回私はこんな感じのものにしました(なんかの清涼飲料水っぽいとは言わないでください) 弊社マスコットキャラクターのハッコウくんです。お見知り置きを。
こちらの素材を缶の3Dモデル直接ドラッグ&ドロップ! するとこのようにモデルに貼り付けられます。非常に簡単ですね。対象がうまく入らなかった場合はカーソルを動かすことで調整ができるのでそこは適宜やってみてください。
ライト、環境の設定
ここまできたらレンダリングまであと少しです! ライトと環境の設定をしていきましょう。こちらもまた左側のメニューからお好みのものを選んでください。
色々試してみてレンダリングした時に綺麗に発色してくれそうなライトを選びました! また、右側のメニューから日光(光点)の高さや曇り具合などの環境設定ができるので一緒にやってしまいましょう。
完成
ごにょごにょ設定してレンダリングした結果がこちら。
ハッコウくんのジュースの缶を作ってみようかな...と思いつきでやってみました。 ハッコウくんは深海魚がモデルに作られたキャラクターなのですがどんな味になるか私も想像がついていません。
他にも作ったもの
Adobe Dimension CCのもう一ついいところはレンダリングしたモデルをpngとpsd形式で書き出せるところです。 psd形式で書き出した場合はレイヤーごとPhotoshopにインポートが可能なので写真素材などと組み合わせたり、文字を組み合わせてあげたりがしやすいです。最近他に作ったものは以下の通り。
まとめ
Adobe Dimension CCはかなり感覚的に使えるソフトだなという印象でした。 というのもblenderを触った時にはかなり独特のUIで混乱してしまい、その時点で嫌になってしまったのですが Dimensionはそういうこともなくすんなり入っていけたなぁという感じです。AdobeのUIに慣れてる人は余計にかもしれません。
また、モデリングできないけどスターターアセット以外のものを使いたい!という人向けに、Adobe Stockでも3Dモデルを提供していますし、無料の3Dモデルもインターネット上にたくさん落ちているのでご安心ください。(拡張子がobjのものだと互換性があります)
使ってみると本当に簡単。習うより慣れよ、という感じなのでぜひぜひDimensionでなんとなくオシャレな3Dをサクッと作ってみてください。
お知らせ
「他に作ったもの」のところにしれっとフライヤーを載せておきましたが、KAI-YOUで第2回エンジニアミートアップを開催します。
「まだ転職は考えてないけど、なんとなくKAI-YOUに興味があるよ〜」って人、「Webメディアの開発チームが何やってるのか気になるよ〜」って人とかお気軽に遊びに来てください。堅苦しくやりませんので(私が耐えられない)
それでは、KAI-YOU開発部わたはるでした。
DJの選曲にもレコメンドがあると楽じゃないか?それTraktorでもできませんかね!? Vol.2
おはようございます
KAI-YOUエンジニアのコウベ(@cabbagekobe)です。
というわけで前回の記事の続きになります。 kai-you-tech.hatenablog.com
そして改めて10月29日にPOP TECH PARTYというイベントが開かれます。
POP TECH PARTYとは
今まで来たことある人も、行けなかったようという方も、第4回ポプテクへ、ぜひ1周年のお祝いにきてください! 参加DJは随時おしらせしまーす!
参加表明をFacebookからしていただけると超嬉しい!! https://www.facebook.com/poptechparty/
という感じのイベントです。私もやるぞ!
楽しいイベントになること間違いなし!みんな来てください!!
ということで続き…
前回はとりあえず楽曲とDjay上のMatchタブに出てきた楽曲を比べてみましたがデータが少なすぎてわからないというのが正直な気持ち。
ということでやっていきたいことはデータの収集です。
最終的にやりたいことの筋道としてはこのように考えています。
- Traktorにてデータを収集したいトラックのプレイリストを作る
- 上記プレイリストのトラックがSpotifyにあるのか検索する
- Spotifyに会った場合はAudio Featuresに楽曲IDを投げる
- 手に入ったデータをDBに入れる
- TraktorでのDJ中に上記のDBにアクセスして情報を取得する
1. プレイリスト作成
というわけで適当にプレイリストを作りました。前回も起点にしたIZ*ONEの日本デビューシングル、好きと言わせたいを含んだプレイリストを適当に作りました。
作ったプレイリストをExportしていく。
Copy Tracks To Destinationのチェックは外しましょうね。
2. NMLファイルの読み込み
Traktorのプレイリストなどに使われるnmlファイルを読み込みましょう。
こちらを使います。
Gemfileなり、gem installなりで上記をインストールして、こんな感じのコードを書きましょう。
require 'traktor/nml' require 'pp' Traktor::NML.parse File.open("path/to/playlist.nml") playlist = Traktor::NML.load "path/to/playlist.nml" pp playlist
はい。下記の出力が得られましたね。(出力データ整理済み)
#<Traktor::NML::Playlist:0x00007fb43b8aa740 @tracks= [ #<Traktor::NML::Track:0x00007fb43b896268 @album={:title=>"好きと言わせたい (Type B)", :track=>"1"}, @artist="IZ*ONE", @bpm=132.001007, @cues=[ #<Traktor::NML::Cue:0x00007fb43b8975a0 @hotcue=0, @length=0.0, @name="1.16.32. - 32.", @repeats=-1, @start=633.25578, @type=3>, #<Traktor::NML::Cue:0x00007fb43b896b78 @hotcue=4, @length=0.0, @name="n.n.", @repeats=-1, @start=1087.797767, @type=4>, #<Traktor::NML::Cue:0x00007fb43b8962b8 @hotcue=3, @length=0.0, @name="n.n.", @repeats=-1, @start=88359.859206, @type=0> ], @genre="J-POP", @key="9d", @label="", @musical_key="8", @playtime=239.0, @primarykey="Macintosh HD/:Users/:cabbagekobe/:Music/:iTunes/:iTunes Media/:Music/:IZ_ONE/:好きと言わせたい (Type B)/:01 好きと言わせたい.mp3", @release_date=#<Date: 2019-01-01 ((2458485j,0s,0n),+0s,2299161j)>, @title="好きと言わせたい" >, #<Traktor::NML::Track:0x00007fb43b8aaa10 @album={:title=>"ドレミソラシド [通常盤]", :track=>"1"}, @artist="日向坂46", @bpm=132.991379, @cues=[ #<Traktor::NML::Cue:0x00007fb43b8abd20 @hotcue=0, @length=0.0, @name="8.32. - 64. - 32", @repeats=-1, @start=7660.120709, @type=3>, #<Traktor::NML::Cue:0x00007fb43b8ab6e0 @hotcue=4, @length=0.0, @name="Beat Marker", @repeats=-1, @start=11269.377222, @type=4>, #<Traktor::NML::Cue:0x00007fb43b8ab0a0 @hotcue=2, @length=0.0, @name="n.n.", @repeats=-1, @start=92477.648756, @type=0>, #<Traktor::NML::Cue:0x00007fb43b8aaa60 @hotcue=3, @length=0.0, @name="n.n.", @repeats=-1, @start=124960.95737, @type=0> ], @genre="Pop", @key="9m", @label="", @musical_key="17", @playtime=305.0, @primarykey="Macintosh HD/:Users/:cabbagekobe/:Music/:iTunes/:iTunes Media/:Music/:日向坂46/:ドレミソラシド [通常盤]/:01 ドレミソラシド.mp3", @release_date=#<Date: 2019-01-01 ((2458485j,0s,0n),+0s,2299161j)>, @title="ドレミソラシド" >, #<Traktor::NML::Track:0x00007fb43d8b8d98 @album={:title=>"ぐるぐるカーテン", :track=>"1"}, @artist="乃木坂46", @bpm=132.0, @cues=[ #<Traktor::NML::Cue:0x00007fb43d8baa08 @hotcue=0, @length=0.0, @name="8.32.", @repeats=-1, @start=423.779091, @type=3>, #<Traktor::NML::Cue:0x00007fb43d8b8e60 @hotcue=4, @length=0.0, @name="Beat Marker", @repeats=-1, @start=4060.142727, @type=4> ], @genre="Pop", @key="3d", @label="", @musical_key="2", @playtime=245.0, @primarykey="Macintosh HD/:Users/:cabbagekobe/:Music/:iTunes/:iTunes Media/:Music/:乃木坂46/:ぐるぐるカーテン/:01 ぐるぐるカーテン.mp3", @release_date=#<Date: 2012-01-01 ((2455928j,0s,0n),+0s,2299161j)>, @title="ぐるぐるカーテン" >, #<Traktor::NML::Track:0x00007fb43b85cd60 @album={:title=>"ディスコの神様", :track=>"1"}, @artist="tofubeats Feat. 藤井隆", @bpm=119.995003, @cues=[ #<Traktor::NML::Cue:0x00007fb43b85f4c0 @hotcue=0, @length=0.0, @name="0.32 - 32.", @repeats=-1, @start=428.537, @type=3>, #<Traktor::NML::Cue:0x00007fb43b85d5f8 @hotcue=4, @length=0.0, @name="Beat Marker", @repeats=-1, @start=428.537, @type=4>, #<Traktor::NML::Cue:0x00007fb43b85cdd8 @hotcue=3, @length=0.0, @name="n.n.", @repeats=-1, @start=112433.201297, @type=0> ], @genre="Electronica", @key="9d", @label="", @musical_key="8", @playtime=294.0, @primarykey="Macintosh HD/:Users/:cabbagekobe/:Music/:iTunes/:iTunes Media/:Music/:tofubeats Feat. 藤井隆/:ディスコの神様/:01 ディスコの神様.mp3", @release_date=#<Date: 2013-01-01 ((2456294j,0s,0n),+0s,2299161j)>, @title="ディスコの神様" > ]>
3. SpotifyのAPIを使う
まずはSpotifyのAPIを利用するには、アカウント作ってclient_id
, client_secret
を発行する必要があります。
こちらから適当なアプリを作ってそこからclient_id
, client_secret
を取得して使いましょう。
RSpotifyを使う
RubyでのSpotify APIのラッパーとしてRSpotifyというものがあります。
これを使いましょう。
Gemfileなり、gem installなりで上記をインストール。
上記gemのREADMEを参考に下記コードを実行します。
またSpotify API はすべての API に authenticateが必要になっています。
(client_id
, client_secret
)は上記で取得したやつをいれてね。
require 'rspotify' require 'pp' RSpotify.authenticate(client_id, client_secret) tracks = RSpotify::Track.search('好きと言わせたい') track = tracks.first pp track
トラック情報取得できました!(出力データ整理済み)
#<RSpotify::Track:0x00007fe0f148ce28 @album= #<RSpotify::Album:0x00007fe0f1466d90 @album_type="single", @artists=[ #<RSpotify::Artist:0x00007fe0f1447a58 @external_urls={"spotify"=>"https://open.spotify.com/artist/5r1tUTxVSgvBHnoDuDODPH"}, @followers=nil, @genres=nil, @href="https://api.spotify.com/v1/artists/5r1tUTxVSgvBHnoDuDODPH", @id="5r1tUTxVSgvBHnoDuDODPH", @images=nil, @name="IZ*ONE", @popularity=nil, @top_tracks={}, @type="artist", @uri="spotify:artist:5r1tUTxVSgvBHnoDuDODPH" > ], @available_markets=[ "AD", "AE", "AR", "AT", "AU", "BE", "BG", "BH", "BO", "BR", "CA", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "DZ", "EC", "EE", "EG", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "ID", "IE", "IL", "IN", "IS", "IT", "JO", "KW", "LB", "LI", "LT", "LU", "LV", "MA", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "OM", "PA", "PE", "PH", "PL", "PS", "PT", "PY", "QA", "RO", "SA", "SE", "SG", "SK", "SV", "TH", "TN", "TR", "TW", "US", "UY", "VN", "ZA" ], @copyrights=nil, @external_ids=nil, @external_urls={"spotify"=>"https://open.spotify.com/album/6esOExMaYIWvttAQYdn3Gb"}, @genres=nil, @href="https://api.spotify.com/v1/albums/6esOExMaYIWvttAQYdn3Gb", @id="6esOExMaYIWvttAQYdn3Gb", @images=[ {"height"=>640, "url"=> "https://i.scdn.co/image/ab67616d0000b2732d7ca7730cc00d57bfdab861", "width"=>640}, {"height"=>300, "url"=> "https://i.scdn.co/image/ab67616d00001e022d7ca7730cc00d57bfdab861", "width"=>300}, {"height"=>64, "url"=> "https://i.scdn.co/image/ab67616d000048512d7ca7730cc00d57bfdab861", "width"=>64} ], @label=nil, @name="好きと言わせたい (Type A)", @popularity=nil, @release_date="2019-02-05", @release_date_precision="day", @total_tracks=nil, @tracks_cache=nil, @type="album", @uri="spotify:album:6esOExMaYIWvttAQYdn3Gb" >, @artists=[ #<RSpotify::Artist:0x00007fe0f1447760 @external_urls={"spotify"=>"https://open.spotify.com/artist/5r1tUTxVSgvBHnoDuDODPH"}, @followers=nil, @genres=nil, @href="https://api.spotify.com/v1/artists/5r1tUTxVSgvBHnoDuDODPH", @id="5r1tUTxVSgvBHnoDuDODPH", @images=nil, @name="IZ*ONE", @popularity=nil, @top_tracks={}, @type="artist", @uri="spotify:artist:5r1tUTxVSgvBHnoDuDODPH" > ], @available_markets=[ "AD", "AE", "AR", "AT", "AU", "BE", "BG", "BH", "BO", "BR", "CA", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "DZ", "EC", "EE", "EG", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "ID", "IE", "IL", "IN", "IS", "IT", "JO", "KW", "LB", "LI", "LT", "LU", "LV", "MA", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "OM", "PA", "PE", "PH", "PL", "PS", "PT", "PY", "QA", "RO", "SA", "SE", "SG", "SK", "SV", "TH", "TN", "TR", "TW", "US", "UY", "VN", "ZA" ], @context_type=nil, @disc_number=1, @duration_ms=239333, @explicit=false, @external_ids={"isrc"=>"JPPO01806807"}, @external_urls={"spotify"=>"https://open.spotify.com/track/7nimCdASI4W4j5C4zqvKO5"}, @href="https://api.spotify.com/v1/tracks/7nimCdASI4W4j5C4zqvKO5", @id="7nimCdASI4W4j5C4zqvKO5", @is_playable=nil, @linked_from=nil, @name="好きと言わせたい", @played_at=nil, @popularity=49, @preview_url=nil, @track_number=1, @type="track", @uri="spotify:track:7nimCdASI4W4j5C4zqvKO5" >
データは取れる!
取ったデータの曲idをもう一回SpotifyAPIに投げましょう。
下記のような感じ。
require 'rspotify' require 'pp' RSpotify.authenticate(client_id, client_secret) tracks = RSpotify::Track.search('好きと言わせたい') track = tracks.first audio_features = RSpotify::AudioFeatures.find(track.id) pp audio_features
うおー!という感じでデータが取得できたぞー!!!(出力データ整理済み)
#<RSpotify::AudioFeatures:0x00007fd388132f78 @acousticness=0.122, @analysis_url="https://api.spotify.com/v1/audio-analysis/7nimCdASI4W4j5C4zqvKO5", @danceability=0.532, @duration_ms=239333, @energy=0.938, @external_urls=nil, @href=nil, @id="7nimCdASI4W4j5C4zqvKO5", @instrumentalness=0, @key=8, @liveness=0.245, @loudness=-1.409, @mode=1, @speechiness=0.0568, @tempo=132.023, @time_signature=4, @track_href="https://api.spotify.com/v1/tracks/7nimCdASI4W4j5C4zqvKO5", @type="audio_features", @uri="spotify:track:7nimCdASI4W4j5C4zqvKO5", @valence=0.716 >
4. というわけでまとめたやつがこんな感じ。
require 'rspotify' require 'pp' require 'traktor/nml' RSpotify.authenticate(client_id, client_secret) Traktor::NML.parse File.open("path/to/playlist.nml") playlist = Traktor::NML.load "path/to/playlist.nml" playlist.each{|track, value| tracks = RSpotify::Track.search(track.title) audio_features = RSpotify::AudioFeatures.find(tracks.first.id) pp audio_features pp "--------------------------------------------" }
上記コードで、NMLファイルからSpotifyの楽曲情報を取得って感じになります。(エラー周りの処理は必要ですね…)
というわけで次回はこいつらをDBにいれてTraktorから参照していくぞ〜〜〜〜!!!