これは何?
音でグラスを壊したいという破壊衝動に駆られたため,Vue.jsの勉強も兼ねて初めて作ったサイト「爆音グラス破壊」です.
グラスを弾いた音から固有周波数を分析し,その周波数のサイン波を再生してグラスを激しく共振させ破壊します.
爆音でワイングラスを破壊できるサイトを作りました()
— 電気野菜 (@YasaiDev) January 8, 2021
スマホの音でもそこそこ震えます.
爆音をお持ちの方はワイングラス破壊してみてくださいhttps://t.co/75E7k85l8i pic.twitter.com/JQLAFQUnHv
現状の手元環境では破壊できるだけの爆音がないので,悶々しています...助けて
使い方
https://hakai.yasaidev.work/usage
準備
- スマホもしくはパソコン
- 割れやすそうなワイングラス
- いい感じの長さのストロー
- できれば爆音スピーカー
(最悪スマホスピーカーでもOK)
破壊
- Analysisボタンを押す
(マイクの確認ダイアログがでたら許可) - もう一度Analysisボタンを押す
- カウントダウン後グラスをはじいて音を出す
- サイトが音を自動分析
- Playボタンは破壊音を再生!
破壊の仕組み
はじめにマイクからグラスを弾いた音をFFTして,周波数のピークをとり固有周波数として求めます.
次に,その固有周波数のサイン波を生成し再生します.
結果,グラスは共振し激しく揺れて限界を超えた際破壊されてしまいます.
Tech
- JS framework: Vue.js
- Design Framework: Vuetify
- オーディオ/描画周り: p5.js
開発周りの工夫点
Vercelの自動デプロイを導入
mainブランチにpushするたびに自動でvercelにデプロイするようにしました.といってもほとんどvercel君がやってくれたので30分で導入できたのは神です.
ちなみに,Vercel bot君はプルリクエストに対しても勝手に検証用デプロイまで行ってくれて感動しました.(神では?)
Google Analyticsの導入
興味半分でvue-gtag
で導入しました.クリックなどのイベントを事細かにGA側に送信することが可能といった知見を得れて便利だなと感じた一方,実際のサイトでもこれだけ事細かに情報が収集されているのかと感じ少し恐ろしくなりました.
かっこいい?OGPの導入
かっこいいね!
クソアプリなのにSNS映えを意識したそうです.今後のアプリ開発等にも役立つ知見を得れたのでヨシです.
私のグラスは1054.7Hzで破壊できそう😎
— 電気野菜 (@YasaiDev) January 7, 2021
#爆音グラス破壊 https://t.co/75E7k8mVZQ
- 参考: Twitter Doc
P5.jsとVue.jsの組み合わせ
ここが一番コーディングで苦労しました.多少知見がたまったのでそのうち記事にします.
P5.jsが何かというと,クリエイティブ向けコーディング(Ex.オーディオビジュアライザー,ゲームなど)に特化したライブラリです.これを活用したことで,Web Audio周りに関して抽象的に記述できたり,Audioと合わせた描画等をまとめて処理を行うことができました.
ページの軽量化に取り組んだ
当初はNetlifyにデプロイし,速さを求めVercelにデプロイした.
また,PageSpeed Insightsを使って原因が適切なmin.jsを使わずに生のjsを使っていたことに気づき修正しました.
(これが主たる低速度の原因,もしかしたらNetlifyは悪くなかったかも知れないです)
さらに,サイズの大きいcomponentを非同期ロードすることで見かけの表示速度を早めました.
const AsyncComponent = () => ({
// ロードすべきコンポーネント (Promiseであるべき)
component: import('./MyComponent.vue'),
// 非同期コンポーネントのロード中に使うコンポーネント
loading: LoadingComponent,
// ロード失敗時に使うコンポーネント
error: ErrorComponent,
// loading コンポーネントが表示されるまでの遅延時間。 デフォルト: 200ms
delay: 200,
// timeout が設定され経過すると、error コンポーネントが表示されます。
// デフォルト: Infinity
timeout: 3000
})
結果かなり当初よりは早くなりました.しかし,モバイル向けのスコアが低いのでもっと早めたいです.
やったけど取り消した点とか反省点
Github pagesにVue RouterのSPAサイトをデプロイした
当初はGithub Pagesに自動デプロイするようなworkflowを書いて動作させようとしましたが,Vue RouterのSPAのデフォルト設定とGithub pagesは少し相性が悪い.初学者でデプロイにハマりたくなかったのでnetlifyへと移行することを決心しました.
おそらくvueやreactなどはnetlifyやvercelのほうが脳死でデプロイできるので楽かもです.
Netlifyへデプロイした
Github workflowでGithub側でビルドしてNetlifyにデプロイする物を書きました.
参考: Qiita: GitHub Actions による GitHub Pages への自動デプロイ
こうすることでNetlify側のビルド時間制限を無視して好きなだけデプロイすることができるようにしました.
しかし,アクセスが遅い気がしたので,Vercelに移行しました.
(Pagespeed insightがモバイルで10点台)
これは後述するがp5.jsのminバージョンを使っていなかったことが大きいと思われます.このことに気づいていなかったです.
min.js を使わっていなかった
Vercelに移行後もやはりやけにページの読み込みが遅いと思ってGoogleのPageSpeed Insightsを使って確認したところP5.jsが大変ドデカサイズでありました(圧縮前5MB,説明不要でかい).
min.jsに切り替えたら600KiBぐらいになったのでサクサクになりました.
正直npm run build
したら勝手にmin.jsに切りかわるなどしてファイルサイズの最適化がされると思いこんでいました.反省.
Githubのブランチ名がmasterからmainになったことを忘れていた
GitHub Actions による GitHub Pages への自動デプロイを参考にworkflowを書いていたのですが,何故かpushしてもactionが動かないことがありめちゃくちゃ悩みました.
そうです,元記事ではactionのトリガーのブランチ名がmasterだったのです...泣きました.
みなさんもブランチ名が絡むもののコピペには気をつけてください.世界は変わってしまいました.
もろもろの所感
手元の音響設備ではワイングラスを破壊するほどの音量が確保できなかったのがすごく残念です.爆音をお持ちの方はグラスワインを破壊して僕に自慢してほしいです.
あと,普段はPython書いているのですがJavascript書いていると文法がごっちゃになって最近はSyntax Errorの量産機になりました.悲しいです.