ども!まとんです。
この度、マウスDJとしてデビューしました。
経緯:トラックボールマニアの上司
僕の会社の上司は、トラックボールのマウスにこだわりのある人でした。
トラックボールというのはあの、ボールをコロコロするタイプのマウスです。たまに使っている人を見かけますよね。
ロジクール ワイヤレスマウス トラックボール 無線 SW-M570 Unifying 5ボタン 電池寿命最大18ケ月 国内正規品 1年間無償保証
- 出版社/メーカー: Logicool(ロジクール)
- 発売日: 2018/06/21
- メディア: Personal Computers
- この商品を含むブログ (2件) を見る
上司は「新幹線の中など、マウスを動かすスペースが無いところでは重宝する。慣れると快適になる。もはや普通のマウスでは満足できない。」 と言います。
僕は正直、めっちゃ使いづらいと思うのですが、まぁ好きな人にとっては好きなんでしょうね。
Kensington ExpertMouse ワイヤレストラックボール K72359JP 【日本語パッケージ】
- 出版社/メーカー: ケンジントン
- 発売日: 2016/02/19
- メディア: Personal Computers
- この商品を含むブログ (1件) を見る
特に、Kinsingtonというメーカーのトラックボールが良いらしい。僕には違いよく分からんですが。
まぁ確かに、トラックボールをくるくる転がすのは、気持ち良いです。
・・・と、ここで、ちょっと考えた。
アイデア
マウスでDJプレイできたら、カッコよくね?
トラックボールをくるくる転がしたときに、DJみたいにキュ!キュキュッ!って音が鳴ったら、面白いのでは?
ていうか、マウスをころころしたときにDJサウンドが鳴ったら、面白いのでは?
マウスは世界中で、老若男女問わず使っているし、誰でも楽しめる!
これは絶対面白いに違いない!
しかも、Pythonで簡単に実装できそう!
マウスDJのムーブメントを起こしていくぞ!!!
マウスDJのコンセプト
マウスDJのコンセプトは以下の通り。
- いつも使っているあなたのマウスで
- パソコンさえあれば
- 誰でも簡単にDJになれる!
とりあえず作って動画公開してみた!!
マウスDJを始めました。#マウスDJ #メタラーまとん pic.twitter.com/qumLkwVEgW
— メタラーまとん@はてなブログ (@Highso_ciety) August 4, 2019
まずはPythonでプロトタイプを作ってみました!
今回はノートPCのタッチパッドですが、マウスをくりくりしたときに、DJのスクラッチ音がキュキュッ!と鳴る仕組みができました!
必要なのは、マウスとPython環境だけ!!
誰でも簡単にマウスDJになれます!
実装
マウスDJの実装はシンプルです。
PyAutoGUIというライブラリで、画面内のマウスカーソルの位置を取得することができます。
これを使って、マウスをどれくらい動かしたかを測定し、動かした速さに応じた音(キュキュッ!というスクラッチ音)を鳴らすだけ!
GitHubにソースコード公開
こちらからスクリプトをダウンロードしていただければ、どんなパソコンでもマウスDJができます!
(ただしPython環境は必要)
実装のフローチャート
- 10ミリ秒ごとにマウスが動いた距離を測定
- マウスが動いた距離=周波数として、sin波形を作成
- sin波形を10ミリ秒間再生
- 1に戻る
実装上の工夫:マウス感度を上げるためにマルチスレッド化
マウスを動かしたときに、すぐに「キュキュッ!」と鳴ってくれると、気持ちいいです。
これをマウス感度と名付けました。
マウス感度を上げるポイントは、マウスカーソルを測定する周期を早くする点です。早く取得するほど、マウスの感度が良くなります。
今回は10ミリ秒の周期で測定するように設定しました。
PCの処理速度にも依存するところですが、僕が使っているPC(i7-4500U, 1.8GHz, 2コア,仮想4コア)ではマウス測定と音の再生を1スレッドで回すと、10ミリ秒に間に合わなくなります。
なので、マウスカーソルの位置を測定するスレッドと、音を再生するスレッドを分けて、マルチスレッドにするのは必須でした。
数学的な工夫:sin波の周波数スイープと位相繋ぎ
数学的に頑張った点を紹介します。
Fig.1は、マウスDJのフローチャートをシンプルに実装したものです。
マウスを動かした速さに応じて、異なる周波数のsin波を、10ミリ秒のブロック長だけ鳴らします。
Fig.1では、周波数が90Hz→360Hz→1440Hzと変化しています。
この場合、10ミリ秒ごとに周波数が離散的に変化するので、この波形をスピーカーで再生すると、ピアノの鍵盤を順番に鳴らしたような「パパパ~」という聞こえ方をします。
これではDJらしくありません。
Fig.2は、ブロックの中で周波数を変化させたsin波です。
10ミリ秒ごとに、「最初の周波数」から「終わりの周波数」を決めて、10ミリ秒のブロックの中で周波数が線形に変化していくsin波です。
いわゆる周波数スイープの波形ですね。
ブロック間で周波数が連続的に変化するので、スピーカーで再生すると「キュイ~ン」という音になって、DJらしいスクラッチ音になります。
Python上の実装では、以下のサイト様を参考にさせていただきました。
【Python】時間変化するサイン波を作る - 音楽プログラミングの超入門(仮)
ただし、これだけではまだ不十分です。
ブロックの変わり目で波形が切れており、不連続になっています。
このような不連続な波形をスピーカーで再生すると、「ブッブッブッ」というノイズ音が鳴ってしまいます。
10ミリ秒ごとにブッブッと鳴ると、「ブーーー」という雑音に聴こえて、非常に不愉快です。
Fig.3は、「ブロックの位相の初期値」を「前のブロックの終わりの位相」にして、位相を繋げたsin波です。
ブロック間で波形が連続的に移り変わるため、不連続な点がなくなりました。
これで、「ブーーー」という雑音は鳴らなくなりました!
位相を繋げただけで、驚くように雑音が消えたので、自分でも感動しました!
今後の展開
せっかくなので、マウスDJで、いけるところまで行こうと思います!
・プロモーション活動:マウスDJのプロモーション動画をYoutubeに公開
・楽器としての高機能化:波形をいじって音色を変える、マウスを動かす方向で音色を変える、クリックで音を変える、など
・パーカッション隊の実装:ソレノイドでリズム隊を作る
・カッチョいいゲーミングマウスを買う
やはりLEDで光るゲーミングマウスを使いたいなぁ〜
以上、メタラーまとんでした。
ではでは。
続き:Youtube動画作りました