Jetson NanoでMIDIを使うためにカーネルビルド

![20190625224408.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81919/0b3aa04c-de4f-4dfc-0bd3-4f533856ac61.jpeg)


# Jetson NanoでMIDIを使いたいがためにカーネルビルドすることになった
　Jetson NanoでMIDIで演奏をしたいなと思い、[頑張ってPygameをインストールするところまではできた](https://qiita.com/karaage0703/items/5d43309bc688858e7c2a)のですが、MIDIを使うためには、更にカーネルビルドが必要なことが判明してしまいました。

　若干絶望したのですが、[以前ラズパイのカーネルビルドやったことある](https://karaage.hatenadiary.jp/entry/2015/10/07/073000)から、できないことは無いだろうとビルドしようとしたら全然ダメで絶望していました。

　そこで助けられたのは @yamamo-to さんの以下記事です。

https://qiita.com/yamamo-to/items/6fc622df7b5cce3eccfb

　この記事が無かったら、Jetson Nanoでカーネルビルドできませんでした。めちゃ感謝です。というわけで、ほとんど上記記事のままなのですが、MIDI使えるようにコンフィグファイルを弄ったのと、MIDI出力のサンプルスクリプトを用意したので、そちらを中心にメモを残しておこうと思います。

 本記事は「jetson-nano-sd-r32.1.1-2019-05-31.zip」を使用した例を記載していますが、JetPack4.5でも動作確認しています。操作が異なる箇所は、バージョンごとに操作方法を記載使用しました。

## 追記：最新（最後）のJetPackでのカーネルビルド方法
　以下記事が参考になりそうです。私は試せていません。すみません！

https://qiita.com/kitazaki/items/c85b4e917a6f74c9ccc9

## Jetson Nano初期セットアップ
　Jetson NanoのSDカードを[NVIDIAの開発者向けページ](https://developer.nvidia.com/embedded/learn/get-started-jetson-nano-devkit#write)からダウンロードして、SDを作成してJetson Nanoを起動します。

　イメージは「jetson-nano-sd-r32.1.1-2019-05-31.zip」を使用しました。対象のイメージが見つからないとｋは、以下の記事を参考にして下さい。

https://qiita.com/karaage0703/items/0583528f1f9c34911a31

　起動したら、スワップファイルの増大とパフォーマンスの最大化を行います。

　スワップファイルの増大は、以下コマンドで実施します。

```sh
$ git clone https://github.com/JetsonHacksNano/installSwapfile
$ cd installSwapfile
$ ./installSwapfile.sh
```

　パフォーマンスの最大化は、以下のコマンドを実行します。

```sh
$ sudo jetson_clocks
```

## カーネルソースのダウンロード
　以下コマンドで、ホームディレクトリ以下にkernelというディレクトリ作成して、その中で作業します。

```sh
$ cd && mkdir kernel && cd kernel
```

　ここからは、冒頭の参考サイトのままです。

　Jetson Nanoのカーネルのソースは、[NVIDIAのサイト](https://developer.nvidia.com/embedded/linux-tegra)のJetson NanoのBSP Sourcesというものになります。

　以下コマンドで、カーネルのソースをダウンロードして解凍します。


```sh
$ wget https://developer.nvidia.com/embedded/dlc/l4t-sources-32-1-jetson-nano -O l4t-sources-32-1-jetson-nano.tar.gz
$ tar xvf l4t-sources-32-1-jetson-nano.tar.gz
$ cd public_sources
$ tar xvf kernel_src.tbz2
$ cd kernel/kernel-4.9
```

　JetPack 4.5の場合は以下実行

```sh
$ wget https://developer.nvidia.com/embedded/L4T/r32_Release_v5.0/sources/T210/public_sources.tbz2
$ tar -xvjf public_sources.tbz2
$ cd Linux_for_Tegra/source/public/
$ tar -xvjf kernel_src.tbz2
$ cd kernel/kernel-4.9
```

## コンフィグファイル編集
　現在使用しているカーネルのコンフィグファイルを書き出します。

```sh
$ zcat /proc/config.gz  > .config
```

　コンフィグファイル（`.config`）を編集します。

```sh
$ vim .config
```

　ここでMIDIを有効にするために、コンフィグファイルに以下の項目を追記・修正します。

```
CONFIG_SOUND_OSS_CORE=y
CONFIG_SOUND_OSS_CORE_PRECLAIM=y
CONFIG_SND_SEQUENCER=y 
CONFIG_SND_SEQ_DUMMY=y 
CONFIG_SND_OSSEMUL=y 
CONFIG_SND_MIXER_OSS=y
CONFIG_SND_PCM_OSS=y
CONFIG_SND_PCM_OSS_PLUGINS=y
CONFIG_SND_RAWMIDI_SEQ=y
```

　編集済みのコンフィグファイルも用意しましたので、編集が大変でしたら以下コマンドでダウンロードしてもOKです。

```sh
$ wget -O .config https://raw.githubusercontent.com/karaage0703/jetson-nano-tools/master/kernel_config/config_midi
```

　JetPack 4.5の場合は以下実行

```sh
$ wget -O .config https://raw.githubusercontent.com/karaage0703/jetson-nano-tools/master/kernel_config/config_midi_v4.5
```


## カーネルビルド
　ビルドに関しても、冒頭の参考サイトのままです。

　以下コマンドでカーネルをビルドしてインストールします。必要に応じて `/boot/Image`のバックアップをとっておきましょう。

```sh
$ make oldconfig
$ make prepare
$ make modules_prepare
$ make -j4 Image && make -j4 modules
$ sudo make modules_install
$ sudo cp arch/arm64/boot/Image /boot/Image
```

　途中で、以下のような質問が出たら、全て`y`で回答してください。

```
OSS Sequencer API (SND_SEQUENCER_OSS) [N/y/?] (NEW)
Virtual MIDI soundcard (SND_VIRMIDI) [N/m/y/?] (NEW)
```

　一番時間かかるのは、`make -j4 Image && make -j4 modules`です（1時間以上かかります）。ゆっくりコーヒーでも飲みながら待つか、寝て待ちましょう。

　最初の3行は現状の設定を流用するためのお作法のようです（詳細分かっていません…）。後半3行は、ビルドしてできたイメージを、実際に使用するブートイメージに入れ替えている（のだと思います）。

## menuconfigを使用してGUIでコンフィグファイルを作成する場合
 GUIでコンフィグファイルを作成する場合は、以下コマンドで必要なインストールします。

```sh
$ sudo apt update
$ sudo apt install -y libncurses5-dev
```

　あとは、kernel/kernel-4.9以下で、以下menuconfigコマンド実行すれば、GUIでConfigを行います。

```sh
$ make menuconfig
```

![menuconfig.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81919/dcc281d2-3764-e723-5bad-eae6069149b8.jpeg)
 menuconfigの画面

　ラズパイではmenuconfigを使ってコンフィグファイルを作成しましたが、今回Jetson Nanoでは使いませんでした（というか使えませんでした）。参考までにメモとして残して置きます。

# Jetson NanoでのMIDIのテスト
　MIDI出力を確認します。お手元のMIDI機器（この記事を読んでいるということは、持っていると思っています）とJetson Nanoを接続してMIDIのテストを行いましょう。

　この記事の通りにカーネルビルドをした上で、以下の記事を参考にPygameを入れて下さい

[Jetson Nanoにpygameをインストールする方法（Python2/Python3）](https://qiita.com/karaage0703/items/5d43309bc688858e7c2a)

　今回は、MIDI機器としてポケット・ミクを使用しました。

![20190625224408.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81919/0b3aa04c-de4f-4dfc-0bd3-4f533856ac61.jpeg)

　テストプログラムを用意しました。以下コマンドでテストできます。

```sh
$ wget https://raw.githubusercontent.com/karaage0703/jetson-nano-tools/master/scripts/pocket_miku_test.py
$ python3 pocket_miku_test.py
```

　うまくいけば、ポケット・ミクが「[変デジ研究所](https://lab.hendigi.com)」と歌ってくれるはずです。

# 参考リンク
[Jetson Nanoのカーネル再コンパイル](https://qiita.com/yamamo-to/items/6fc622df7b5cce3eccfb)

[nVidia Jetson Nano: Desktop Use, Kernel Builds, and Deeper Analysis](https://syonyk.blogspot.com/2019/04/nvidia-jetson-nano-desktop-use-kernel-builds.html)

[/dev/snd/seq failed: no such file or directory](https://devtalk.nvidia.com/default/topic/1050933/jetson-nano/-dev-snd-seq-failed-no-such-file-or-directory/)

[Jetson JetPack4.4 DP のカーネルビルド](https://qiita.com/kitazaki/items/5fc6b2e8df2bfe03e9b5)

# 関連ページ

https://qiita.com/karaage0703/items/b14c249aa33112669ee4

Jetson Nano関係の情報は、上記ページにまとめていますのでよければ参照下さい。

# 変更履歴
- 2023/07/09 リンク追加、微修正
- 2020/11/04 参考リンク追記