メタラーまとんがハイソにやらかすようです

東大理系修士卒JTBCエンジニアのハイソサイエティ(上流階級)な日常

【マウスDJ】デビューしました。

ども!まとんです。

この度、マウスDJとしてデビューしました。

経緯:トラックボールマニアの上司

僕の会社の上司は、トラックボールのマウスにこだわりのある人でした。

トラックボールというのはあの、ボールをコロコロするタイプのマウスです。たまに使っている人を見かけますよね。

上司は「新幹線の中など、マウスを動かすスペースが無いところでは重宝する。慣れると快適になる。もはや普通のマウスでは満足できない。」 と言います。

僕は正直、めっちゃ使いづらいと思うのですが、まぁ好きな人にとっては好きなんでしょうね。

特に、Kinsingtonというメーカーのトラックボールが良いらしい。僕には違いよく分からんですが。

 まぁ確かに、トラックボールをくるくる転がすのは、気持ち良いです。

・・・と、ここで、ちょっと考えた。

イデア

マウスでDJプレイできたら、カッコよくね?

トラックボールをくるくる転がしたときに、DJみたいにキュ!キュキュッ!って音が鳴ったら、面白いのでは?

ていうか、マウスをころころしたときにDJサウンドが鳴ったら、面白いのでは?

マウスは世界中で、老若男女問わず使っているし、誰でも楽しめる!

これは絶対面白いに違いない!

しかも、Pythonで簡単に実装できそう!

マウスDJのムーブメントを起こしていくぞ!!!

マウスDJのコンセプト

f:id:highso:20190811192920j:plain

マウスDJのコンセプトは以下の通り。

  • いつも使っているあなたのマウスで
  • パソコンさえあれば
  • 誰でも簡単にDJになれる!

とりあえず作って動画公開してみた!!

まずはPythonでプロトタイプを作ってみました!

今回はノートPCのタッチパッドですが、マウスをくりくりしたときに、DJのスクラッチ音がキュキュッ!と鳴る仕組みができました!

必要なのは、マウスとPython環境だけ!!

誰でも簡単にマウスDJになれます!

実装

マウスDJの実装はシンプルです。

PyAutoGUIというライブラリで、画面内のマウスカーソルの位置を取得することができます。

これを使って、マウスをどれくらい動かしたかを測定し、動かした速さに応じた音(キュキュッ!というスクラッチ音)を鳴らすだけ!

GitHubソースコード公開

こちらからスクリプトをダウンロードしていただければ、どんなパソコンでもマウスDJができます!

(ただしPython環境は必要)

実装のフローチャート

  1. 10ミリ秒ごとにマウスが動いた距離を測定
  2. マウスが動いた距離=周波数として、sin波形を作成
  3. sin波形を10ミリ秒間再生
  4. 1に戻る

実装上の工夫:マウス感度を上げるためにマルチスレッド化

マウスを動かしたときに、すぐに「キュキュッ!」と鳴ってくれると、気持ちいいです。

これをマウス感度と名付けました。

マウス感度を上げるポイントは、マウスカーソルを測定する周期を早くする点です。早く取得するほど、マウスの感度が良くなります。

今回は10ミリ秒の周期で測定するように設定しました。

PCの処理速度にも依存するところですが、僕が使っているPC(i7-4500U, 1.8GHz, 2コア,仮想4コア)ではマウス測定と音の再生を1スレッドで回すと、10ミリ秒に間に合わなくなります。

なので、マウスカーソルの位置を測定するスレッドと、音を再生するスレッドを分けて、マルチスレッドにするのは必須でした。

数学的な工夫:sin波の周波数スイープと位相繋ぎ

数学的に頑張った点を紹介します。

f:id:highso:20190811201402p:plain

Fig.1 10ミリ秒のブロックごとに周波数が異なるsin波

Fig.1は、マウスDJのフローチャートをシンプルに実装したものです。

マウスを動かした速さに応じて、異なる周波数のsin波を、10ミリ秒のブロック長だけ鳴らします。

Fig.1では、周波数が90Hz→360Hz→1440Hzと変化しています。

この場合、10ミリ秒ごとに周波数が離散的に変化するので、この波形をスピーカーで再生すると、ピアノの鍵盤を順番に鳴らしたような「パパパ~」という聞こえ方をします。

これではDJらしくありません。

f:id:highso:20190811201557p:plain

Fig.2 ブロックの中で周波数が変化するsin波

Fig.2は、ブロックの中で周波数を変化させたsin波です。

10ミリ秒ごとに、「最初の周波数」から「終わりの周波数」を決めて、10ミリ秒のブロックの中で周波数が線形に変化していくsin波です。

いわゆる周波数スイープの波形ですね。

ブロック間で周波数が連続的に変化するので、スピーカーで再生すると「キュイ~ン」という音になって、DJらしいスクラッチ音になります。

Python上の実装では、以下のサイト様を参考にさせていただきました。

【Python】時間変化するサイン波を作る - 音楽プログラミングの超入門(仮)

ただし、これだけではまだ不十分です。

ブロックの変わり目で波形が切れており、不連続になっています。

このような不連続な波形をスピーカーで再生すると、「ブッブッブッ」というノイズ音が鳴ってしまいます。

10ミリ秒ごとにブッブッと鳴ると、「ブーーー」という雑音に聴こえて、非常に不愉快です。

f:id:highso:20190811201526p:plain

Fig.3 ブロックの変わり目で位相を揃えたsin波

Fig.3は、「ブロックの位相の初期値」を「前のブロックの終わりの位相」にして、位相を繋げたsin波です。

ブロック間で波形が連続的に移り変わるため、不連続な点がなくなりました。
これで、「ブーーー」という雑音は鳴らなくなりました!

位相を繋げただけで、驚くように雑音が消えたので、自分でも感動しました!

今後の展開

せっかくなので、マウスDJで、いけるところまで行こうと思います!

・プロモーション活動:マウスDJのプロモーション動画をYoutubeに公開

・楽器としての高機能化:波形をいじって音色を変える、マウスを動かす方向で音色を変える、クリックで音を変える、など

・パーカッション隊の実装:ソレノイドでリズム隊を作る

カッチョいいゲーミングマウスを買う

やはりLEDで光るゲーミングマウスを使いたいなぁ〜

 

以上、メタラーまとんでした。

ではでは。

続き:Youtube動画作りました

highso.hatenablog.com