本文へスキップ

Vox Graphica|Craft Session #0

2026.03
線を指でなぞると音が鳴る紙。Mozziでマイコン上に音を合成し、電源だけで成立させる

AID-DCC、Konelとの三社合同公開勉強会「Craft Session #0」への出品作。2026年3月20日〜23日、下北沢「砂箱」。

一見すると何の変哲もない図版だが、指で触れると音が鳴る。楽譜のように整然とした仕組みがあるわけではなく、ソニフィケーションのように情報としての無機質な音を扱うものでもない。鑑賞者がグラフィックに触れることで、その視覚から音が想起される。

点線、三つの点、もつれた線。3枚それぞれに違う図版が刷ってあり、隅に「線を指でなぞってみて」とだけ書かれている。

浅岡敬太(Parking Inc.)との共作。以下は音の部分について。

構成

  • Arduino(アナログ入力)
  • Mozzi

音は基板の上で合成している。PCもDAWもつながっていない。

展示

この作品でいちばん手を入れたのは、音そのものより基準値の扱いだった。

センサの値は、誰も触っていない状態でも一定ではない。時間帯や環境で変わり、固定のしきい値では成立しない。

起動時にキャリブレーションする

まず電源を入れた時点で32回サンプリングし、その値にオフセットを足したものを「誰も触っていない状態」として記録する。

触られていない隙に、自動で測り直す

それだけだと日中の光の変化に追従できないので、一定時間ごとに測り直す。ただし測り直してよいのは、誰も触っていないときだけになる。

そこで「5分経過した」かつ「値の変化が10秒以上小さいままだった」の両方を満たしたときにだけ再キャリブレーションを走らせている。

const unsigned long PAPER_SENSOR_RECALIB_INTERVAL_MS = 300000UL; /* 約5分 */
const unsigned long PAPER_SENSOR_STABLE_REQUIRED_MS  = 10000UL;  /* 変化が小さい状態を10秒維持 */
const int PAPER_SENSOR_STABLE_DELTA = 20;                        /* これ未満の変化なら「安定」扱い */
void maybeRecalibrate(unsigned long now) {
    if ((now - lastRecalibMillis) >= PAPER_SENSOR_RECALIB_INTERVAL_MS &&
        (now - lastUnstableMillis) >= PAPER_SENSOR_STABLE_REQUIRED_MS) {
        calibrateMin();
    }
}

センサ値そのものは16サンプルの移動平均をかけて、指の細かな震えや蛍光灯のちらつきを均している。音量にもフェードを入れて、触れた瞬間・離した瞬間にプツッと鳴らないようにした。

ノイズから音程へ

触れ方の強さを、ノイズと正弦波の混ざり具合に割り当てている。ほとんど触れていないときはノイズだけ、深く覆うほど音程のある音が立ち上がってくる。

混ぜる比率は線形ではなく4乗のカーブにした。

float sineF  = nm * nm * nm * nm;
float noiseF = 1.0f - sineF;

線形だと中間あたりでぼんやりと両方鳴っている時間が長くなる。4乗にすると、動かしている範囲の大半はノイズのまま推移して、最後のところで急に音程が現れる。触った手ごたえとしてはこちらの方がはっきりする。

基音は80Hzから1760Hzの間を動き、5Hzのビブラートと0.2HzのLFOによるノイズ量の揺れが乗る。

ノイズはマイコンらしく整数演算だけで作っている。乱数に1次のローパスをかけ、元の信号からそれを引くことでハイパスにしている。ビットシフトだけで済むので、オーディオレートのループの中でも負担にならない。

int16_t n = (int16_t)rand(256) - 128;
noiseLP += (n - noiseLP) >> 1;
int16_t noiseHP = n - noiseLP;

バリエーション

スケッチは14本作って、展示では3本を使い分けた。

  • ノイズ&サイン波
  • パーカッション
  • 再生速度