Androidのメモとか

ポキオの日記です。今日も遅延してない。

コンデジっていいよねっていう話

軽さ・小ささは正義。

ポキオ SONY ZV-1M2 DSC-HX60V

静止画機としてZV-1 IIを買ってから

Vlogカメラを買って、静止画機として使い始めました。

relativelayout.hatenablog.com

そこからというもの、コンデジの良さを改めて実感してしまったという話です。結論から言うと、最近はZV-1 IIとDSC-HX60Vの2台体勢でお出かけすることが多くなりました。

ポキオ SONY ZV-1M2 DSC-HX60V

もちろんしっかり撮る日は別ですが、普段はこの2台があればなんとかなるし、この2台を持ち歩いてもそこまで苦ではないです。

ポキオ SONY ZV-1M2 DSC-HX60V

というのも、2台とも同じようなサイズ・薄さなので、(すっごい雑ですが)SONYのFloat Runを買ったときについていた巾着に2台のカメラを入れて持ち歩いています。薄めのカバンでもちゃんと2台が収まるし、とにかく軽い。一眼を持ち歩くと、どうしてもレンズが飛び出ていいたり体積が大きいので、カバンを選ぶんですよねぇ。

ポキオ SONY ZV-1M2 DSC-HX60V

そして、ZV-1 IIとDSC-HX60Vがカバーする焦点距離も、それぞれ18-50mmと24-720mmで、この焦点距離カバレッジを一眼で実現しようとするとレンズを何本も持ち歩かないといけないわけです。もちろん写りはFFな一眼と比べ物にならないですが、いろいろな画角で写真を撮れるのでなかなかおもしろいわけです。

眠っていたDSC-HX60Vが面白い

10年前のモデルなので、最新機種に比べると色々劣るところはありますが、「まぁ、壊れても良いでしょう」みたいな軽い気持ちで持ち運べるので、それはそれで気が楽です。

ポキオ SONY ZV-1M2 DSC-HX60V

暗所は全くと言っていいほど使い物にならないですが、光量がある場面でのテレ側720mmは本当に武器になります。

ポキオ SONY ZV-1M2 DSC-HX60V

何と言っても小さいので、サイクリングの際もジップロックに入れたうえでサイクリングジャージの背中ポケットに入れることも可能。サイクリングのお供にちょうどいいいですし、もし落としてしまって壊れても、そのときはそのときと諦めがつくが良いですね。

酒クズとZV-1 II

一方で暗所はZV-1 IIにすべて一任。

ポキオ SONY ZV-1M2 DSC-HX60V

夜の飲酒の際に、サッと出してサッと撮れるのは良いですね。

ポキオ SONY ZV-1M2 DSC-HX60V

一眼ほど肩肘張らずに撮れて、スマホみたいにシャッター音はしないし、とにかく寄れて、とにかく軽い小さい威圧感ない。飲みすぎると手ブレが気になりますが、まぁそこはご愛嬌。

というわけで

コンデジって楽しいんだよなぁ。(小並感)

なかなかコンデジの最新機種が出なくて選択肢は少ないですが、だからこそ今持っているカメラをガンガン使っていきたいです。

静止画機としてSONY ZV-1 IIを買ってみた話

Vloggerじゃないけどね。

ポキオ SONY ZV-1 II

ZV-1 II買いました

久々のカメラ購入。ZV-1 II。

ポキオ SONY ZV-1 II

いわゆる「Vlogカメラ」ということで、動画用のカメラです。

ポキオ SONY ZV-1 II

付属品もこれだけ。すっごいシンプル。防風用のもふもふもついています。

そもそもなんで買ったの?

もともとメイン機にα7 IIを使っていて、サブ機としてNEX-C3・α57・HX60Vを使っていているんですが、α7 IIはやっぱり大きくて重たいので「気軽に持ち運べるコンデジ」が欲しかったわけです。

ポキオ SONY ZV-1 II

なんですが、昨今Vlog向けカメラがたくさん出ているなかで、静止画向けの良い感じのコンデジがあんまりなくて、ZV-1 IIにたどり着いたというわけ。なので、あくまでもVlog向けカメラとして最適化されている「ZV-1 II」なので、これを血迷って静止画機として使うとどうなるか?などをメモしておこうと思います。

まずは準備

転ばぬ先の杖。フィルムを貼りました。

ポキオ SONY ZV-1 II

毎回うまく貼れないけど、頑張った。

そしてカメラストラップ。やっぱりPeak Design。

ポキオ SONY ZV-1 II

無理やりアンカーを取り付けました。

動画は撮らないのでもふもふはつけてません。とりあえずこの状態で撮影にでかけました。

昼間の散歩に持っていてみました。写真はJPEG撮って出しをリサイズだけしています。

ポキオ SONY ZV-1 II

まずは広角側は換算18mm。やはり18mmなので、面白い画角で撮れるの良いですねぇ。

ポキオ SONY ZV-1 II

望遠側は換算50mm。すっごいズームするわけではないですが、こんだけズームできれば十分。

ポキオ SONY ZV-1 II

換算50mmはF4ですが、そこそこボケます。ただ、すごいボケるわけではないので、背景に何を持ってくるべきか、色々考えさせられます。

ポキオ SONY ZV-1 II

連写も最高24枚/秒なので、撮り鉄もはかどります。

ポキオ SONY ZV-1 II

なにげに接写も5cmまで寄れるので、なかなか調子良い。

夜も行ってみよー。

ポキオ SONY ZV-1 II

夜は光量に左右されがち。ある程度明るければ問題ないです。

ポキオ SONY ZV-1 II

静止画では手ぶれ補正機能がないので、気を抜くとブレます。なので、気を引き締めて撮影する必要があります。

ポキオ SONY ZV-1 II

フルオートで撮ってると、平気でISOがガンガン上がってくるので、ここも面倒を見てあげないといけない手がかかる子です。気づいたら6400になってたときの写真。

気づき

とにかく軽い。とにかく小さい。気軽に持ち運べるは正義。とにかく。

ポキオ SONY ZV-1 II

ストラップでぶら下げても軽い。ほぼ手ぶら。やっぱりこれが強いですね。ふとした瞬間に撮れる、っていうのは何にも代え難い長所だと思います。

ポキオ SONY ZV-1 II

あと、地味に嬉しいのは、液晶画面を裏返してしまっておけること。画面が傷つかずにすむのがうれしい、バリアングル液晶の棚ぼた案件。

ポキオ SONY ZV-1 II

日中散歩しながら静止画撮影するだけなら、思いの外バッテリーの持ちは問題ありませんでした。ガンガンWi-Fi機能を使ったり、動画を撮るとアレかもしれませんが。

ポキオ SONY ZV-1 II

操作性に関しては色々思うところはあります。Vlog向けということもあって、静止画向けのハードウェアスイッチ類はあまりなくて、メニューから変更したり、キーアサインでやりくりすることになります。が、フルオートメインで使う分には気にならなりません。あくまでもサブ機で、お気軽撮影用、と割り切れば問題ないように思いますし、それでも我慢できなければα7C IIとか買えば良いんですよねきっと。

フルオートで撮れと言いつつ、暗所ではやっぱりお手当が必要なのは正直な所。ISO感度を調整しつつ、手ぶれ補正がないので、筋肉でカバーするしかありません。そして、そこまでボケないので、見切れる景色にも気を使う必要があります。ただ、こういうお手当こそ写真の基礎だよなと、基本に立ち返らせてくれます。

(追記)

ポキオ SONY ZV-1 II

カメラの持ち方ですが、グリップ自体はコンデジなので小さめですが、ディスプレイを開くと右親指あたりを引っ掛けられる凹凸が出現するので、ここを持つとかなりホールドします。あとは基本的にPeak Designのカフリストストラップをつけているので、カメラを落とす心配もないです。

というわけで

やはり動画機を静止画機として使うには、どこかに無理があります。ただ、わかった上で使う分には、コンパクトで機動力のあるカメラだと思います。持って出かけて撮ってなんぼ。18mmと50mmが手のひらサイズに収まってて5cmまで寄れると考えれば、Everyday Cameraとしては選択肢の一つになりえるのではと思います。

酒クズ写真家、はじめました

ただ飲んでいるだけ(じゃない)

ポキオ 酒クズ写真家 Creators' Cloud

酒クズ写真家、ポキオです。

コロナ禍が明けて、飲酒の回数も増えて、日頃のストレスを酒で洗い流す日々を過ごしています。しかしながら、ただ飲んでいるだけではもったいないので、飲みに行った場所の写真を撮って記録していこうと思いました。

酒クズの軌跡はこちらです。

https://creatorscloud.sony.net/discover/mystudio/gp_4pQkmzxYkYfqhiLyzBDUub

写真を撮って気づいたこと

小並感で大変申し訳無いですが。

全然ピントが合わない

酔ってるのでそれどころじゃないです。撮った写真をあとから見返してチェックすれば良いんですが、ビールを飲む手が止まらない。そういうことです。

最短撮影距離がものを言う

マクロレンズである必要はないですが、いわゆるテーブルフォトになるので、ある程度最短撮影距離が短いほうが使い勝手がいいですね。

とにかく暗い

酒場は暗所です。カメラの性能が問われる、非常に厳しい環境です。

・・・という感じで、日々飲みながら撮影の鍛錬をしている次第であります。

反響の大きかった飲酒は?

3つほど。

大衆酒場スズランストア

煮込みが本当に美味しい。そして、メニューのネーミングに遊び心が感じられる。そんな立ち呑み所です。

https://creatorscloud.sony.net/discover/detail-project/5ea8f463-c99f-4d29-9ff4-0cf79600a9cb

SAISON bakery&coffee

こんなところで酒クズしちゃっていいの?って不安になってしまうオシャレなパン屋さん。いや、パンもすごく美味しくて、カレーパンとビールのマリアージュがががが。

https://creatorscloud.sony.net/discover/detail-project/0e34a453-2e0d-4aba-985f-f0cd5b12d3e6

きらく

おばんざいと聞くと、ちょっと敷居が高いような気がします。が、ここは本当にユーザーフレンドリーで、ちゃんと美味しいおばんざいがいただけます。瓶のサッポロ黒ラベルが染み渡ります。

https://creatorscloud.sony.net/discover/detail-project/d96eae2e-6a86-4270-bf3b-5b94962ca1e2

というわけで

これからも撮影(飲酒)を頑張ろうと思います。ご一緒していただける方がいらっしゃったら是非!

「子連れで飲める金沢区の飲食店」マップを作ってみました

酒しか勝たん。

ポキオ 横浜市 金沢区 子連れで飲める 飲食店 マップ

どうも、酒クズです。

夫婦共働きで、家事とか子育てとか仕事とか、日々色々とストレスを抱えながら生きていると、たまに息抜きをしたくなるわけです。息抜きのやり方はいろいろあると思いますが、私の場合はストレスを酒で洗い流すタイプの人間なわけです。

もちろん家で晩酌するのもいいんですが、家族と外食をして、そのついでに酒が飲めれば最高ですよね。ただ、飲食店によっては喫煙だったり子供NGだったりで、意外と子連れで行ける酒が飲める飲食店が少ないんですよねぇ。

子連れで飲める飲食店マップを作ろう

私みたいな酒クズは他にもいて、いろいろ情報交換をしているわけなんですが、情報があるならそれをデータ化すればいいのでは?と思い「子連れで飲める金沢区の飲食店」マップを作ってみました。

pokiiio.github.io

Google Mapsでマイマップを作成し、それをラップする形でGithub PagesでWebページを作ってみました。もちろん、皆様からの情報をGoogle Formsでお待ちしていて、(現在手作業ですが)頂いた情報をマイマップに追加していければと思っています。

forms.gle

ご協力のほど、何卒宜しくお願いします。

おいおいは

GASなどを使って、マップ更新の自動化などができればなと思っています。

ポキオ 横浜市 金沢区 子連れで飲める 飲食店 マップ

ああ、酒しか勝たん。みなさん、KP!

Rakuten miniをキッズケータイにしたかったのでホームアプリを作ってみた

潔くキッズケータイを買えばいいのに。

ポキオ Rakuten mini キッズケータイ

娘に持たせる最初のスマホは?

スマホなんて家に何台も転がってるこのご時世、わざわざキッズケータイを買わなくてもなんとかなるのでは?と思ってしまった父です。

ただ、フツーのスマホをそのまま子供に持たせてしまうと、いろんなアプリにアクセスができてしまい、色々と良くないことが起こりそうで不安な訳です。

ポキオ Rakuten mini キッズケータイ

そこで、今回は家に転がってたRakuten mini向けにホームアプリ(いわゆるランチャーアプリ)を作成して、必要な機能だけをかんたんに実行できるようにしてみました。

作ったもの

こんな感じのアプリです。

ポキオ Rakuten mini キッズケータイ

ホームアプリとして実装しているため、ホームボタンを押すたびにこの画面が表示される感じになっています。ポイントは…

  • 画面要素は時計とボタン4つだけ
  • ボタンを押すと、父・母に電話、カメラの起動、ファイラーアプリ(Files)の起動が行える
  • ボタンは誤動作防止のため長押ししないと動作しない
  • それ以外のアプリや画面は(なるべく)起動できないようになっている

こんな感じです。

実際のコード

Githubで公開しています。

github.com

ポイントは…

  • Manifestで android:screenOrientation="portrait" と宣言して画面は縦固定とする
  • <category android:name="android.intent.category.LAUNCHER" /> と記載することでホームアプリとして動作するようにする
<activity
    android:screenOrientation="portrait"
    android:name=".MainActivity"
    android:exported="true">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
        <category android:name="android.intent.category.HOME" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

そして、メインのロジックとしては

  • setOnClickListener() ではなく setOnLongClickListener() を使って長押しイベントを検知
  • Intent.ACTION_CALL で直接電話発信を実施(要 android.permission.CALL_PHONE 権限、しかもRunTimePermissionが必要)
father.setOnLongClickListener(View.OnLongClickListener {
    val uri = Uri.parse("tel:08000000000")
    val intent = Intent(Intent.ACTION_CALL, uri)
    startActivity(intent)
    return@OnLongClickListener true
})
  • 起動するアプリはRakuten miniにプリインされているカメラアプリとFilesアプリを直打ち
val intent = packageManager.getLaunchIntentForPackage("com.myos.camera")
startActivity(intent)
val intent = packageManager.getLaunchIntentForPackage("com.google.android.apps.nbu.files")
startActivity(intent)

こんな感じです。かなりRakuten miniに全振りしてるので、決め打ちで値を入れているところも多いですが、他の端末でも似たようなことができるはずです。

ChatGPTの力を借りながらどんな写真も少し卑猥にするツールを作った

かがくのちからってすげー

ポキオ Chat GPT This video was uploaded to

巷で噂のChat GPT

AIしか勝たん、そういう世の中になってきましたよね。せっかくなので、くだらないことに活用してみようと思います。

話の発端はこれ。画像の右上に「This video was uploaded to ...」と書かれているとちょっと気になってしまう人って居ますよね?居ます。ただの文字列のくせに、ちょっと卑猥に思えてしまうので、すごい不思議。

ポキオ Chat GPT This video was uploaded to

というわけで、Chat GPTさんに任意の画像の上に文字を埋め込むやり方を聞いてみました。

こんな感じ

ちょっと手直しはしましたが、こんなコードをものの数十分で出力してくてました。

<!DOCTYPE html>
<html>

<head>
  <meta charset="UTF-8">
  <title>Bootstrap Example</title>
  <!-- Bootstrap CSS -->
  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css">
</head>

<body>
  <div class="container mt-5">
    <form>
      <div class="form-group">
        <label for="inputImage">画像を選択してください</label>
        <input type="file" class="form-control-file" id="inputImage" accept="image/*">
      </div>
    </form>

    <div class="card mt-3">
      <button id="download" class="btn btn-primary">画像を保存する</button>
    </div>

    <div class="card mt-3">
      <canvas class="card-img-top" id="outputCanvas"></canvas>
    </div>

  </div>

  <!-- jQuery -->
  <script src="https://code.jquery.com/jquery-3.2.1.slim.min.js"></script>
  <!-- Popper.js -->
  <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js"></script>
  <!-- Bootstrap JS -->
  <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js"></script>

  <script>
    const input = document.getElementById('inputImage');
    const canvas = document.getElementById('outputCanvas');
    const ctx = canvas.getContext('2d');
    const fontSize = 24;

    input.addEventListener('change', () => {
      const image = new Image();
      image.src = URL.createObjectURL(input.files[0]);
      image.onload = () => {
        var width = image.width;
        var height = image.height;
        if (width > 800) {
          height *= 800 / width;
          width = 800;
        }
        canvas.width = width;
        canvas.height = height;
        ctx.drawImage(image, 0, 0, width, height);

        ctx.font = "35px Arial";
        ctx.fillStyle = "grey";
        ctx.shadowColor = "black";
        ctx.shadowOffsetX = 3;
        ctx.shadowOffsetY = 3;
        ctx.shadowBlur = 1;
        ctx.fillText("This video was uploaded to", canvas.width - 400, 75);
      };
    });

    const downloadBtn = document.getElementById('download');
    downloadBtn.innerHTML = "画像を保存する";
    downloadBtn.addEventListener("click", function () {
      var imageData = canvas.toDataURL("image/png");
      var link = document.createElement('a');
      link.href = imageData;
      link.download = "image.png";
      link.click();
    });
  </script>
</body>

</html>

会話の履歴を覚えていて、「Bootstrapでかっこよくして」とか「文字の色はグレーで」とか色々注文をつけられて、従順に従ってくれるChat GPTさんは素敵です。

このコードをツールにしよう

せっかくいい感じにコードが出来たので、これをGoogle Apps ScriptでWebアプリとして公開してみます。

relativelayout.hatenablog.com

このあたりを参考に…。で、出来上がったページがこちら。

ポキオ Chat GPT This video was uploaded to

https://script.google.com/macros/s/AKfycbyBjLx6cTSgQmtJt746hX4dwSQwx9LB-qa4XioFdrN3I7qup2QwqwZnBquD0XZL_iyu/exec

たとえば、なんの変哲もない下記の画像をこのツールにくべると…。

ポキオ Chat GPT This video was uploaded to

こんな感じに、ちょっとアレな感じになります。

ポキオ Chat GPT This video was uploaded to

みなさんもぜひ使ってみてください。(使わないな)

【DJへの道】ArduinoでMIDIデバイスを作ってRaspberry Pi上のMixxxと連携させる

まずはボタンから。

ポキオ Arduino MIDI Raspberry Pi Mixxx

前回はMixxxをRaspberry Piにインストールしました

非力なRaspberry Pi 2Bでディスプレイも小さいですが、動作自体は問題なさそうです。

relativelayout.hatenablog.com

今回は、Mixxxを操作するハードウェアを作っていきます。

以前作ったデバイスを再利用

ハードウェアを作ると言っても、モノ自体は以前作ったデバイスを再利用していきます。

ポキオ Arduino MIDI Raspberry Pi Mixxx

こんな感じで、5つのボタンをGNDとデジタルIOピンにつないだものです。

ポキオ Arduino MIDI Raspberry Pi Mixxx

マイコン部分はArduino Leonardo互換機のSeeeduino Liteです。Atmega32U4が搭載されているのでUSBネイティブサポートも使えて、USBデバイスとしてエミュレーションも可能です。よって以て、USB接続できるMIDIバイスとしてもエミュレーション可能なはず…。

いざプログラミング

ハードウェアは再利用するので、それを制御するロジックを書き換えていきます。コーディングはArduino IDEで。 久しぶりのダウンロード・起動だったので、UIがガラッと変わっていたのでびっくりしました。

www.arduino.cc

さて、プログラミング自体は下記のArduinoのドキュメントを参考にコーディングしていきます。

docs.arduino.cc

ポイントは…

  • Native USB Port対応をしているボードを使う
  • MIDIを扱うためにMIDIUSBライブラリを使う

こんな感じ。MIDI系のライブラリは複数あってカオスですが、今回はArduinoドキュメントに従っていきます。

コードは最後の方に貼っておきますが、MIDIのやり取りとしてはノートオン・ノートオフを使っていきます。

void noteOn(byte channel, byte pitch, byte velocity) {
  Serial.println("noteOn");
  midiEventPacket_t noteOn = { 0x09, 0x90 | channel, pitch, velocity };
  MidiUSB.sendMIDI(noteOn);
}

void noteOff(byte channel, byte pitch, byte velocity) {
  Serial.println("noteOff");
  midiEventPacket_t noteOff = { 0x08, 0x80 | channel, pitch, velocity };
  MidiUSB.sendMIDI(noteOff);
}

こんな感じで、ノート(鍵盤)を押す・離すという情報をプログラム的に送信します。鍵盤なので、どの音階をどのくらいの速さ(強さ)で押すか、などの情報も送ります。今回は中央のド(C3)からソ(G3)までを5つのボタンに割り当てて、ノートオン・ノートオフで送信します。チャネルと速度は固定のものを使いました。

ドレミファソをMixxxのコントロールに割り当てる

今回ド〜ソまでの5つの音階が表現できるMIDIバイスが出来たので、それぞれDeck1/2のPlay・Cueに割り当てていきます。(5つのボタンのうち4つだけアサインしてみます)

ポキオ Arduino MIDI Raspberry Pi Mixxx

理想としてはこんな割り当て。実際にMixxxでマッピングしていきます。

ポキオ Arduino MIDI Raspberry Pi Mixxx

自作MIDIバイスRaspberry Piに接続してからMixxxを起動して、設定画面を開くとコントローラーというタブでデバイスが認識されているようです。

一応、プリセットという項目を覗いてみると、主要なDJコントローラーのマッピングには対応してそうですが、今回はプリセットは使わず、ラーニングウィザードを使って自力でマッピングしていきます。

ポキオ Arduino MIDI Raspberry Pi Mixxx

ラーニングウィザードを開くと、Mixxx上の要素が一覧で並んでいて、それぞれに信号のアサインが出来ます。

ポキオ Arduino MIDI Raspberry Pi Mixxx

とりあえず、Deck1/2のPlayとCueを探しては、実際にデバイスのボタンを押して、ボタンと制御の紐付けを行いました。

ポキオ Arduino MIDI Raspberry Pi Mixxx

こんな感じ。

いざDJ

4ボタンだけなので、凝ったことは出来ませんが、ちゃんとボタンと演奏がリンクしていました。

ポキオ Arduino MIDI Raspberry Pi Mixxx

雑感として

  • 理論的にはボタンやスライダーを追加していけばDJコントローラーは自作できる
  • ボタンがチャタるので、何かしらの制御が必要そう
  • ハードウェアボタンを同時に押したり操作したりすると、処理が追いつくか(他の処理をブロッキングしないか)が心配
  • ボタンが増えるとマッピングが面倒

こんな感じですねぇ。自作あるあるですが、やっぱり製品ってすげぇ…ってなりますね(笑)

とりあえず、横フェーダー・縦フェーダー、イコライザ、できればジョグあたりも追加してみたいところ・・・。

コードはこちら

#include <MIDIUSB.h>
#include <MIDIUSB_Defs.h>
#include <frequencyToNote.h>
#include <pitchToFrequency.h>
#include <pitchToNote.h>

#define BUTTON1 3
#define BUTTON2 5
#define BUTTON3 7
#define BUTTON4 8
#define BUTTON5 10

#define C3 48
#define D3 50
#define E3 52
#define F3 53
#define G3 55

#define DELAY 100

void setup() {
  pinMode(BUTTON1, INPUT_PULLUP);
  pinMode(BUTTON2, INPUT_PULLUP);
  pinMode(BUTTON3, INPUT_PULLUP);
  pinMode(BUTTON4, INPUT_PULLUP);
  pinMode(BUTTON5, INPUT_PULLUP);

  Serial.begin(9600);
}

void loop() {
  if (digitalRead(BUTTON1) == 0) {
    Serial.println("BUTTON1");
    noteOn(5, C3, 64);
    MidiUSB.flush();
    delay(DELAY);
    noteOff(5, C3, 64);
    MidiUSB.flush();
  }

  if (digitalRead(BUTTON2) == 0) {
    Serial.println("BUTTON2");
    noteOn(5, D3, 64);
    MidiUSB.flush();
    delay(DELAY);
    noteOff(5, D3, 64);
    MidiUSB.flush();
  }

  if (digitalRead(BUTTON3) == 0) {
    Serial.println("BUTTON3");
    noteOn(5, E3, 64);
    MidiUSB.flush();
    delay(DELAY);
    noteOff(5, E3, 64);
    MidiUSB.flush();
  }

  if (digitalRead(BUTTON4) == 0) {
    Serial.println("BUTTON4");
    noteOn(5, F3, 64);
    MidiUSB.flush();
    delay(DELAY);
    noteOff(5, F3, 64);
    MidiUSB.flush();
  }

  if (digitalRead(BUTTON5) == 0) {
    Serial.println("BUTTON5");
    noteOn(5, G3, 64);
    MidiUSB.flush();
    delay(DELAY);
    noteOff(5, G3, 64);
    MidiUSB.flush();
  }
}

void noteOn(byte channel, byte pitch, byte velocity) {
  Serial.println("noteOn");
  midiEventPacket_t noteOn = { 0x09, 0x90 | channel, pitch, velocity };
  MidiUSB.sendMIDI(noteOn);
}

void noteOff(byte channel, byte pitch, byte velocity) {
  Serial.println("noteOff");
  midiEventPacket_t noteOff = { 0x08, 0x80 | channel, pitch, velocity };
  MidiUSB.sendMIDI(noteOff);
}

void controlChange(byte channel, byte control, byte value) {
  Serial.println("controlChange");
  midiEventPacket_t event = { 0x0B, 0xB0 | channel, control, value };
  MidiUSB.sendMIDI(event);
}

最後に…

誰かPCDJを私に恵んでください…。

www.amazon.jp

「Androidのメモとか」は、Amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、Amazonアソシエイト・プログラムの参加者です。

このブログは個人的なメモ書きであったり、考えを書く場所であります。執筆者の所属する団体や企業のコメントや意向とは無関係であります。また、このブログは必ずしも正しいことが書かれているとは限らず、誤字脱字や意図せず誤った情報を載せる場合がありえます。それが原因で読者が不利益を被ったとしても、執筆者はいかなる責任も負いません。ありがとうございます。