chakokuのブログ(rev4)

テック・コミック・DTM・・・ごくまれにチャリ

GoogleのAI Bardに作曲について質問してみた

テクノ音楽を作ってください

かしこまりました。テクノ音楽を作ってみますね。

**テンポ:128 BPM**

**ドラムトラック**

* キック:4分音符
* スネア:8分音符
* ハイハット:16分音符

**ベーストラック**

* 音色:シンセベース
* オクターブ:1オクターブ
* ピッチ:0

**リードトラック**

* 音色:シンセ
* ピッチ:1オクターブ
* コード:Cmaj

**エフェクト**

* ドラムトラック:リバーブ
* ベーストラック:フィルター
* リードトラック:ディストーション

**コード進行**

Cmaj - Dmaj - Emaj - Fmaj

**メロディー**

Cmaj - Dmaj - Emaj - Fmaj
このコードは、シンプルなテクノ音楽のテンプレートを表しています。テンプレートを元に、オリジナルのテクノ音楽を作ってみてください。

以下に、コードの説明をします。

テンポ
テンポは、音楽の速さを表します。128 BPMは、テクノ音楽の標準的なテンポです。

ドラムトラック
ドラムトラックは、テクノ音楽の重要な要素です。キック、スネア、ハイハットを組み合わせて、リズムを生み出します。

ベーストラック
ベーストラックは、テクノ音楽の低音を支える重要な要素です。シンセベース音色を使い、低音を響かせます。

リードトラック
リードトラックは、テクノ音楽のメインメロディーを奏でる重要な要素です。シンセ音色を使い、メロディーを奏でます。

エフェクト
エフェクトは、音色を変化させて、より個性的なサウンドにすることができます。リバーブ、フィルター、ディストーションなどのエフェクトを使い、音色を変化させます。

コード進行
コード進行は、音楽の進行を表現します。Cmaj、Dmaj、Emaj、Fmajのコード進行は、シンプルながらも、テクノ音楽らしい印象を与えます。

メロディー
メロディーは、音楽の旋律を表現します。Cmaj、Dmaj、Emaj、Fmajのコード進行に沿って、メロディーを作成します。

これらのコードを参考にして、オリジナルのテクノ音楽を作ってみてください。

Cmaj、Dmaj、Emaj、Fmajのコード進行って、ドレミファと和音を一音ずつ上げていくだけのことなのでは?
しかもメジャーコードなので、、単にめでたいだけの曲になるのではなかろうか。。

teenage engineeringのOP-Zを買った

teenage engineeringのOP-Zを買った*1。最初結構手ごろな値段と思っていたらそれはもう在庫がないと言われた。買いたい買いたいと思っていて、気持ちが抑えきれず、結構割高な値段になったが買った。
届いてふたを開けてちょっとボタンを押してみたが、これはなかなか厄介な装置だと気づいた(気づくまで30秒)。YouTubeでデモとか見ていたのだけど、想像以上に難しく、適当にボタンを押してどうにかなるものではないと認識した。それに、、なんかボタンの調子がおかしい。メトロノームのボタンが。購入したお店に問い合わせ中・・・本体も結構湾曲している。使っているうちに本体が湾曲してボタンが押しにくくなるという記事も読んだが、買った時点から若干湾曲して押しにくいとは。。

■追記
修理専門サイトには、OP-Zのボタン修理手順も掲載されている。ショップからの回答が思ったような内容でない場合は、自分で分解修理するか・・
Teenage Engineering OP-Z Function Key Plastic Buttons Replacement - iFixit Repair Guide

■追記
購入したショップのサポートに問い合わせしたら、保証期間中なので交換対応となった。交換後、届いたOP-Zを確認するとボタンの動作は全く問題ない(細かいこと言うと、ダブルトリガー?と思わせる症状は若干見られたが、ひどくなったら接点復活剤で治るらしい)。ボタンは問題ないが、やっぱり若干そっている。そりの度合いは1m以下なのでまぁめげるほどではないが。

■追記
3日ほど使った感想として、ボタンの鍵盤+音源付きの機械なので、スイッチ入れたらすぐに何か弾くことができる。センスのない自分がボタンをプチプチやって曲を作っても、面白みのない音楽しかできない(FL-Studioを使って曲作っても面白みのない曲しかできないのと同じ)。まあOP-Zの良さとしては、、作曲解説本等を読んですぐにOP-Zで試せるというところだろうか。シーケンサも付いてるのでOP-Zに記録することが可能。楽器?を触って曲のようなものを作ってる時間が増えた。一方で気になるのは、入ってる音源がどうも厚みに欠ける気がして、若干薄い音楽しか作れないのではないか*2・・・まあ音源差し替えたり、サンプリングができるそうなので、気に入った音源に入れ替えたらいいのだろうけど。メロディーは16トラックのうち4トラックしか使えない。思いついたモチーフや曲想をOP-Zでささっと記録しておいて、あとでゆっくりでかいシンセで作り直すという感じなんだろうか。当面の目標としては、ボタンでプチプチ入力するのはつらいので、MIDIキーボードから入力できるようにしたい。



Teenage Engineering OP-Z: The Best Guides, Tutorials & Reviews
OP-Z Tutorials
op1.fun - jungle pads by Glazed Brightmore

*1:残り人生は音や波に全振りポリシィに従い・・

*2:あんまり浸る感じではないというか

室内環境計測装置を改良する

背景:室内環境計測装置(仮)を作って、温度、湿度、CO2は計測していた。が、センサー(SCD41)の仕様により、気圧が計測できていなかった
やりたいこと:I2Cで接続できる気圧センサがあるのでこれをくっつけて気圧も計測する
詳細:

組み込みRustはビルドするまでが結構大変で、時間が経つとどこに環境を作ったのかとか、どうやってビルドしたか?とかかなり忘れている。しょうがないので、GitHubにある、Embedded Rust Trainings for Espressifからstd環境用の入門コードを落としてきて、WSL環境で展開、intro/hardware-checkに入って、cargo buildと打ってみた。大体はビルドできたが、cfg.tomlが無いと怒られたので、exampleからcfg.tomlを複製、自宅のWiFiSSID等を設定

cp cfg.toml.example cfg.toml
vi cfg.toml

再度トライ、最後のリンカー?のところで、ldproxyが無いと怒られた。これは入れてなかった。以下でインストール

cargo install ldproxy

再度ビルド

cargo build

これでビルドは通った。自分の環境はWSLなので、このままではUSBシリアルで焼けない。そこで、以下でWSLからUSBシリアルに接続できるようにする
PowerShellで実行

usbipd wsl list
usbipd wsl attach --busid 2-1

espflashを使って、Flashにプログラムを書き込む。 espflash monitorでデバッグ出力をウオッチ

cargo espflash board-info
cargo espflash erase-flash
cargo espflash flash
espflash monitor

以下がNeoPixelによるカラフルなLチカ(サンプルコードのまま)

次は、templateをベースにプロジェクトを作ってみる。プロジェクト名は、aq-sensorとする

$  cargo generate --git https://github.com/esp-rs/esp-idf-template cargo
🤷   Project Name: aq_sensor
⚠️   Renaming project called `aq_sensor` to `aq-sensor`...
$ cd aq-sensor/
$ cargo build

ビルドの途中でエラーになって中断。なぜか

  ERROR: rust/esp32-c3/aq-sensor/.embuild/espressif/espidf.constraints.v5.1.txt doesn't exist. Perhaps you've forgotten to run the install scripts. Please check the installation guide for more information.
  CMake Error at lang/rust/esp32-c3/aq-sensor/.embuild/espressif/esp-idf/v5.1.1/tools/cmake/build.cmake:363 (message):
    Some Python dependencies must be installed.  Check above message for
    details.

espidf.constraints.v5.1.txt doesn't exist.が無いを怒られている?本当に?
エラーメッセージ(.embuild/espressif/esp-idf/v5.1.1/tools/cmake/build.cmake:363 (message):)を頼りに調べると、どうやら以下の、check-python-dependenciesでエラーになっているようであった。これならもう少し調べて不足しているパッケージを足せばビルドが通る!?

        idf_build_get_property(python PYTHON)
        idf_build_get_property(idf_path IDF_PATH)
        message(STATUS "Checking Python dependencies...")
        execute_process(COMMAND "${python}" "${idf_path}/tools/idf_tools.py" "check-python-dependencies"
            RESULT_VARIABLE result)
        if(result EQUAL 1)
            # check_python_dependencies returns error code 1 on failure
            message(FATAL_ERROR "Some Python dependencies must be installed. Check above message for details.")
        elseif(NOT result EQUAL 0)
            # means check_python_dependencies.py failed to run at all, result should be an error message
            message(FATAL_ERROR "Failed to run Python dependency check. Python: ${python}, Error: ${result}")
        endif()

単体で走らせるとこれは問題無いようであった

python3 .espressif/esp-idf/v5.1.2/tools/idf_tools.py check-python-dependencies
Constraint file: /home/sumi/.espressif/espidf.constraints.v5.1.txt
Requirement files:
 - .espressif/esp-idf/v5.1.2/tools/requirements/requirements.core.txt
Python being checked: /home/sumi/.espressif/python_env/idf5.1_py3.10_env/bin/python
Python requirements are satisfied.

■追記
WSL上に構築したRustビルド環境はどうも何かパラメータ(オプション設定?)がおかしいようで、cargoによるconfigを行うと最後のesp-idfのビルドでエラーになる。原因を探すより作り直した方が早そうだ。以前、素のUbuntuにRustビルド環境を構築したので、そっちを使ってみた。するとそちらは正常に最後までビルドできた。一方、各種ライブラリのバージョンが上がったせいか 、Flashに乗り切らなくなった。以下のようなエラーが出る

$ cargo espflash --release
New version of cargo-espflash is available: v2.1.0

Serial port: /dev/ttyACM1
Connecting...

   Compiling mqtt_tsp_try v0.1.0 (/home/rustbld00/lang/rust/mqtt_tsp_try)
    Finished release [optimized] target(s) in 1.92s
Chip type:         ESP32-C3 (revision 4)
Crystal frequency: 40MHz
Flash size:        4MB
Features:          WiFi
MAC address:       34:85:18:00:b3:ac
App/part. size:    1260720/1048576 bytes, 120.23%
Error:
  × Supplied elf image is too big and doesn't fit configured app partition

Flashは4MBあるはずなのに、1.2MBでもう一杯とはどういうことか??と思っていた。すると、これはFlashパーティションに分割されていて、どうやらデフォルト設定の場合、1MB+α程度らしい。でかいプログラムを乗せたかったらパーティションを切りなおさないといけないらしい。あぁ勉強になる。

■ご参考URL
ESP32: how to read and write the partition table of an ESP device? | mixable Blog
Partition Tables - ESP32-C3 - — ESP-IDF Programming Guide latest documentation
K型熱電対温度計データロガーをESP32-C3(Rust)で作り、InfluxDBで表示する

アシダ音響のHeadset(MT-669CT)

会社でTV会議(?オンライン会議?)する時は会社が支給したヘッドセットを使っていたが、壊れてしまった*1。また買ってもらうのもありだが、自分が希望するヘッドセットを使いたくて、アシダ音響のヘッドセットを買ってみた。片耳なので慣れるまでは違和感があるかも。まだ会議で使っていないので使いやすいかどうかわからない。ヘッドセットの種類として、アナログのミニジャック(4極ピンプラグ)で接続するタイプのと、音声がデジタル変換されてUSBで接続するタイプがあると思いますが、この製品は本体ではデジタル処理せず、アナログ出力されるタイプ。まぁシンプルでいいのではないでしょうか。

*1:USBデバイスとして認識されない状態

メモ:残りの人生は、音や音楽、波、波形に全振りしたい

時間に余裕ができて、絵(イラストや漫画)を勉強しようか、音楽(DTMや楽器)を勉強しようかと思って、少し絵を勉強したが、やっぱり根気が続かず絵は自分に合っていないと思った。次は音楽かということで、DTM(EDM)で音楽を作りたいのだが、なかなか敷居が高い。エアロフォンを習いに行ったが楽器は難しい*1。だが、、MEMSマイクで波形を扱っていて、Sin/Cosとか、フーリエ変換とかいろいろ出てきて、段々とプリミティブな波自体をもっと理解したいと思うようになった*2真空管アンプも設計から勉強して作りたいし、とにかく、音、波、フィルタ、アナログ回路、そういった方面に残りの時間は全振りしたい。
■補足
日本製の真空管KORG Nutubeは買った。自分で設計してこれを動かしたい

■追記
RSコンポーネンツに、げた(変換基盤というのか)の在庫あったので発注した。

*1:1年でレッスン終了

*2:大学で数学落ちこぼれになってからコンプレックスもあるのであった

memo : Grove仕様の解説

繋ぐだけで使えるというGroveのIFですが、素のマイコンからGrove用のセンサ等を使いたいと思った時に、Groveの仕様って実際どうなっているの??となっていましたが、わかりやすい記事がありメモ

M5Stackシリーズ x Grove拡張ユニット 組み合わせ方超入門 | マルツオンライン:;:

これによると、仕様は以下。まぁ確かにそういうことですよね・・・とはなるのだが。

  • ピンの割り当ては信号ピン(1,2)、電源ピン(3,4)と決まっている
  • 電源3番ピンで5Vまたは3.3V、4番ピンはGND
  • 信号は1番、2番ピンで、タイプによってI2C/Serial/GPIO(Digital/Analog)の仕様となる。

ポイントとしては、仕様上電源は5V/3.3Vのいずれかとなっているので、センサー側ではどっちの電源でも動くようにセンサー内の回路でレベル変換されているのだろう(回路図で確認必要ですが)。信号についてはバスの様に接続できるようI2Cのみかと思っていましたが、GPIO/Serialもあると知りました。だから、、不用意に混ぜると動かなくなる。

MEMSマイクからPDM信号を取得するプログラムをno_stdのRustで書いてデータを抜いた(苦笑)

課題:MEMSマイクのPDM出力を抜き取ってΣ、フィルタで元の波形に戻るのかを確認したい
取り組み:MicroPythonの性能ではMEMSマイクのサンプリングレート(1MHz以上)に間に合わないので、(C,TinyGo,Rust等の)コンパイル型言語で、かつ、RTOSによるタスクスイッチしない素のプログラムを作ってデータを抜く
結論:no_stdの組み込みRustでどうにかこうにかデータは抜けた(と思う)
詳細:

いろいろあったが、MEMSマイクに1MHz相当のクロックを与えて、PDM出力を取得するプログラムを書いて動かした。
どうもMEMSマイクは出力が安定するまでクロックを与え続ける必要があるようで、このサンプルのように、クロックを送ったり止めたり、さらには、クロックの周波数を上げたり下げたりするのはかなりまずい実装と思える (低速モードとか、高速モードとかに切り替えていることになるので)。データサンプリングの前にクロックを送ってるのはMEMSマイクが安定して動作するまでの待ちで、データダンプ中もクロックを送ってるのは、MEMSマイクを停止させないため。(変数名もledだが、これはblinkサンプルをベースに書き直したため。本当はclkとすべき)
no_stdでどうにか動かしたけど、理想的には、RTOSを使ってクロック生成タスクと、データ引き抜きタスクで動かすべきなのではないか。RP2040のPIOとの組み合わせも良いとは思う。

#![no_std]
#![no_main]

use esp_backtrace as _;
use esp_println::println;
use hal::{peripherals::Peripherals, prelude::*};
use hal::IO;

#[entry]
fn main() -> ! {
    let peripherals = Peripherals::take();

    println!("Blink Test");

    let io = IO::new(peripherals.GPIO, peripherals.IO_MUX);
    let mut led = io.pins.gpio8.into_push_pull_output();
    let signal = io.pins.gpio9.into_pull_down_input();
    let mut idx;
    let mut ary: [u8; 8000] = [0; 8000];

    led.set_high().unwrap();

    loop {

        for _ in 0..= 10_000 {
           led.set_high().unwrap();
           led.set_low().unwrap();
        }
        for _ in 0..= 10_000_000 {
           led.set_high().unwrap();
           if signal.is_low().unwrap() {
                      break;
           }               
           led.set_low().unwrap();
        }
        idx = 0;
        loop {
           led.set_high().unwrap();
           if signal.is_high().unwrap() {
              ary[idx] = 1;
           }else{
              ary[idx] = 0;
           }
           led.set_low().unwrap();
           idx += 1;
           if idx == 7999 {
                break;
           }
        }
        println!("-------------------------------");
        for val in ary {
           led.set_high().unwrap();
           println!("{}", val);
           led.set_low().unwrap();
        }
        println!("-------------------------------");            
    }
}

ビルドと書き込みの手順は以下*1

cargo build --release
espflash flash  target/riscv32imc-unknown-none-elf/release/blink
espflash monitor | tee > near500Hz

espflash monitorを実行後、Ctrl+Rを打ち込むことで、マイコンに書き込んだプログラムを再実行させる。標準出力されるサンプリング結果をファイルに落とすため、teeコマンドを使って標準出力とファイル出力に枝分かれさせている。
メモ:データ抜き取り中のCLKは、820ns / 1.22MHz
■グラフ化
今回のテストではスマフォの波形生成アプリで500Hzを発生させてMEMSマイクで音を拾いPDM信号に変換した。テストではスマフォとマイクをほぼ密着した状態なので、ノイズ等は入っていない条件下でのテスト

PDMはパルス密度変調(Pulse-density modulation)であり、1が多いと波形の山に近づき、0が多いと波形の谷(信号がない)に近づくという程度にしか理解していません。中間はどうやって表すか?というと、101010...が続くと中央値であると(パルスの密度が50%であり、PDM信号をローパスフィルターに通すと中央値になる)。移動平均を何度か繰り返して01の繰り返しがどのように変化するかを確認した。結果は以下の図

基本的に移動平均を複数回繰り返して波をなだらかに加工しているだけ*2だが、最後はサイン波が得られた。本当に500Hz相当なのか?はサンプリング数とMEMSマイクに送ったCLKの周波数から計算が必要。
(サンプリング数を基準にすると、247 ~ 7012 の間に3波入っている、マイクが動作したクロックは1.22MHzで、1サンプルは820ns・・・)
■追記
必要に迫られないかぎり、プログラミング言語の勉強は進まない

*1:最適化させないと速度が出ないので、--releaseオプションを付けています

*2:5番目のグラフにおいて、値から平均値(中央値)を引き算することで、0を中心とする±の振幅に変換