PureDataのexternalを作ってみた(後編)

はじめに

先日つくった正弦波を生成するsingen~を拡張して、もう少し複雑なexternにしていきます。正弦波の生成ができたので、それらを複数重ねて音作りをする加算合成シンセにしてみましょう。

とは言ってもいきなり難しいものは無理なので、下図のように基音の周波数倍音の数スペクトルのスロープ(傾き)の3つをコントロールできるものにします。一般的な加算合成法ではそれぞれの正弦波を独立してコントロールできるようにするのですが、今日のところは整数倍の成分の合成だけを考えます。つまり各倍音の周波数は基音の周波数によって決まり、独立したコントロールはできません。

これを数式で書くと以下のようになります。音合成の教科書などには必ずと言っていいほど載っている式で、スペクトルの傾きを0にするとすべての成分音のレベルが等しくなります。また、スペクトルの傾きを1にすると鋸歯波になります。(-1)k-1はなくてもいいのですが、時刻ゼロのときに振幅ゼロの鋸歯波の波形が得られるので入れています。

以下が完成したexternを使用しているイメージ。複数(multiple)の正弦波(sin)を生成(generate)するのでmulsingen~と命名しました。出力のあたりがごちゃごちゃしていますが、Pd-extendedのoutput~のようなことをしているだけです。

続きを読む

PureDataのexternalを作ってみた(前編)

はじめに

MacPureDataのオーディオexternal objectを作ってみたメモ。日本語で書かれた情報が少なかったので、「無いよりはマシ」程度で書き残しておきます。いろいろと間違いがあると思います。指摘していただければ幸いです。

まず参考にしたのはPd-externals-HOWTOです。この文書では4つのexternを説明してくれます。

  1. bangが来たらhelloを表示するもの。内部に状態を保存しない、とても単純なオブジェクトの例。
  2. 内部に数を保存するカウンターの例。bangがやってきたら、1を加算して返す。と同時に新しい(1が加算された)数を保存しておく。
  3. カウンターの機能を拡張して、下限・上限の設定、加算する数の変更、カウンター数値を下限値にリセット、などを可能にする例。可変個数のメッセージが来た時の対応や、インレットを増やす方法などを説明。
  4. オーディオ信号の加工をする例。2つのオーディオ信号が入ってきて、それらのミックスバランスを変化させられるextern。(筆者は「pan~」と呼んでるけど「mixer~」のほうが良かったと思う)

今回はこれらとは少し違う、「osc~」のような「周波数の数値入力に対して正弦波をオーディオ信号として出力するオブジェクト」を作ってみます。正弦波(sin波)を生成(generate)するので、名前は「singen~」とします。最終的にはこんな感じで使いたい。

続きを読む

Pure DataのexternalをMacでビルドするシェルスクリプト

MacでPure Dataの拡張オブジェクト(external object)をビルドする方法はいくつかあり、下記のMakefileを使うものなどが便利だったりします。(永野さん提案の、Xcodeを使う方法もあります)

参考:Pure Data の拡張オブジェクトを作る gcc on Mac OS X 版 - ruby trunk changes

ただ、Makefileを作るほどでもないんだよなー、というときもあります(ない?) 僕は上記ページを参考にした次のようなシェルスクリプトを使っています。

#!/bin/sh
cc -g -DMACOSX -DPD -O2 -Wall -W -Wshadow -Wstrict-prototypes \
   -Wno-unused -Wno-parentheses -Wno-switch -I. \
   -o $1.pd_darwin_o -c $1.c
cc -bundle -undefined suppress -flat_namespace -lm \
   -o $1.pd_darwin $1.pd_darwin_o
rm $1.pd_darwin_o

これをmakepdext.shのようなファイルに保存しておき、例えばpd-externals-HOWTOhelloworld.cがあったとして、

$ ./makepdext.sh helloworld

とするとhelloworld.pd_darwinができあがります。やってることは永野さんのMakefileと同じですが、ちょろっとコンパイルしたいだけの時にどうぞ。

本日の給油

給油日 オドメーター (km) 給油量 (L) 単価 (円/L) 燃費 (km/L) 距離単価 (円/km)
2016-02-13 6714.7 2.96 108.78 49.26 2.21
2016-04-03 6847.3 2.57 108.95 51.60 2.11
2016-04-10 7025.7 3.42 111.99 52.16 2.15
2016-05-18 7113.8 1.68 108.93 52.44 2.08
2016-06-01 7286.3 3.28 114.94 52.59 2.19
2016-06-15 7464.2 2.65 118.11 67.13 1.76
2016-07-24 7579.7 2.54 107.87 45.47 2.37

相模湖までの中距離ツーリングの途中で給油。どうしたのだ燃費!

MFiゲームコントローラはほぼ全てがアナログ入力

iPhoneに接続できるMFiゲームコントローラを探していて、Horipad Ultimateが良さそうだったので購入。Macに接続して調べてみたら、メニューボタン以外の全ボタンがアナログ入力に対応していた。十字キーまでとは驚き。

MFi要件がそうなっているのだろうか。気になって開発者向けのドキュメントを読んでみたら、「ボタン、トリガー、スティック、方向キーは感圧( アナログ)にすべし」と書かれていた。ポーズボタンについてはアナログの記載なし。ほぅほぅ。

ANSI Common Lispの規格書(に近いもの)のPDFを入手する【改】

ANSI Common Lispの規格書(に近いもの)のPDFを入手する』を自分の環境で試してみました(元記事に感謝!)。OS X 10.11.5、MacTeX 2016むけに、いくつか変更。ファイルのダウンロードにwgetではなくcurlを使用。PDF結合ツールとしてpdftkではなくpdfjamを使用。また、デフォルト設定だとA4版ができてしまったので、レター版を作るためにDVI→PDF変換にdvipdfmを使用してレター版を明示。

curl -O http://www.cs.cmu.edu/afs/cs/Web/Groups/AI/lang/lisp/doc/standard/ansi/dpans/dpans3.tgz
curl -O http://www.cs.cmu.edu/afs/cs/Web/Groups/AI/lang/lisp/doc/standard/ansi/dpans/dpans3r.tgz
tar xvf dpans3.tgz
tar xvf dpans3r.tgz
mv dpANS3R/* dpANS3/
cd dpANS3
gunzip *.dvi.Z
for f in chap-*.dvi;do dvipdfm -p letter $f;done
pdfjam --paper letter --outfile ../dpANS3-15.17.pdf chap-0.pdf \
       chap-1.pdf chap-2.pdf chap-3.pdf chap-4.pdf chap-5.pdf \
       chap-6.pdf chap-7.pdf chap-8.pdf chap-9.pdf chap-10.pdf \
       chap-11.pdf chap-12.pdf chap-13.pdf chap-14.pdf \
       chap-15.pdf chap-16.pdf chap-17.pdf chap-18.pdf \
       chap-19.pdf chap-20.pdf chap-21.pdf chap-22.pdf \
       chap-23.pdf chap-24.pdf chap-25.pdf chap-26.pdf chap-a.pdf

ときどき参照するときのためにiPadに放り込んでおこうっと。

本日の給油

給油日 オドメーター (km) 給油量 (L) 単価 (円/L) 燃費 (km/L) 距離単価 (円/km)
2016-02-13 6714.7 2.96 108.78 49.26 2.21
2016-04-03 6847.3 2.57 108.95 51.60 2.11
2016-04-10 7025.7 3.42 111.99 52.16 2.15
2016-05-18 7113.8 1.68 108.93 52.44 2.08
2016-06-01 7286.3 3.28 114.94 52.59 2.19
2016-06-15 7464.2 2.65 118.11 67.13 1.76

過去最高の燃費を記録! そして1 kmあたりの単価も初めて2円を下回りました。ここ2週間は長距離しか乗らなかったからかなぁ。オドメーターの記録間違いということもなさそうだし、その他のデータはガソリンスタンドのレシート記載のものから計算しているので、そこが間違っているわけでもなさそう。燃費が良すぎて逆にびびる。