信号の包絡線を計算する (Common Lisp)

信号の包絡線 (signal envelope) は「信号の頂点にシーツをかぶせたときのような概形」を持つ波形です。 MatlabやRで書いた信号包絡線の計算プログラムをCommon Lispに移植しました。信号包絡線の計算方法は振幅の絶対値に対して、(1)低域フィルタをかける、…

ピンクノイズを生成するLISP関数

以前PythonやJSFX用のものも作ったのですが、ピンクノイズはいろいろなところで活躍するので、Common Lisp用にも作っておきます。 ピンクノイズを作るPython関数 - 丸井綜研 REAPERのJSFXでピンクノイズを生成してみた - 丸井綜研 Voss-McCartney法 DSP gene…

上方倍音列と下方倍音列

とある音楽理論の一派では、自然倍音列にヒントを得て作曲に活かしたりするそうです。そんな倍音列の周波数と音名との対応を見られるJuliaプログラムを書いてみました。そもそも「倍音ってなに?」については以下の記事を参照してください。 marui.hatenablo…

cl-portaudioを使った音の入出力

前回の記事でCommon Lisp上でPortAudioが使えるようになりました。 marui.hatenablog.com 今回は音の入出力をやってみます。基本的にはcl-portaudioのドキュメントに載っている「入力と出力を15秒間だけつなげる」というデモプログラムを実行するだけです。…

LispからPortAudioでデバイス情報を得る

Common Lispからcl-portaudioを使ってPortAudioを呼び出して音を再生したいのですが、まずはデバイス情報を得るところまでやりました。 cl-portaudioを利用するには例によってQuicklispを使うと便利みたいです。 (ql:quickload :cl-portaudio) とはいえ、bod…

ステレオチェック信号を作った

ごくたまにオーディオシステムの準備をすることがありますが、パワーアンプからスピーカへの結線は赤黒ケーブルが逆になってしまったり、左右スピーカへの接続を逆にしてしまったりということがあります。そこで、ステレオスピーカへの結線がうまくいってい…

スペクトログラム

Common Lispで振幅スペクトルの計算ができるようになり、Hann窓もかけられるようになったので、次はスペクトログラムの実装にいきたいと思います。 スペクトログラムは、振幅あるいはパワーの強さを時間と周波数ごとに計算したものです。以下の画像ではAudac…

macOSのコマンドラインから音ファイル変換

macOSにはafで始まる名前の、オーディオファイルを操作するコマンドラインアプリが入っています(afclip、afconvert、afhash、afida、afinfo、afplayの6つ)。僕がよく使うのはafinfoとafconvertです。 afinfoは以下のようにオーディオファイルの情報を表示…

フィルタの可視化(freqz相当の関数を作る)

信号にフィルタをかけられるようになり、そして、レシピ通りのフィルタを作れるようになりました。 IIRフィルタをかける関数(Lisp Advent Calendar 2022) - 丸井綜研 双二次フィルタの係数(Lisp Advent Calendar 2022) - 丸井綜研 次に、フィルタの周波…

双二次フィルタの係数(Lisp Advent Calendar 2022)

この記事はLisp Advent Calendar 2022の25日目です。Lispで音プログラミングに向けた、さらなる一歩。 目次 はじめに RBJ Cookbookによる低域フィルタ フィルタを使ってみる 他の形状のフィルタ はじめに 先日フィルタをかける関数を作りました(IIRフィルタ…

IIRフィルタをかける関数(Lisp Advent Calendar 2022)

この記事はLisp Advent Calendar 2022の16日目です。Lispで音を自由自在に扱うという野望に向けての次の一歩。 デジタルフィルタ ちょっと前に高速フーリエ変換を用いて畳み込み演算の実装をしました。2信号の時間領域での畳み込み演算は周波数領域での要素…

音ファイルを書き出すwavwrite関数(Lisp Advent Calendar 2022)

この記事はLisp Advent Calendar 2022の11日目です。Lispには入門と挫折を繰り返していましたが、今年4月にLispに再入門し、なんとか日常的なイロイロに使えるようにしているところです。 普段使いするためには自分の専門分野のプログラムを作るのがよいだろ…

Common Lisp用のwavread

(追記:関連記事として「音ファイルを書き出すwavwrite関数(Lisp Advent Calendar 2022) - 丸井綜研」を書きました) 9月に「Common Lispで音ファイルを読み込む - 丸井綜研」というエントリでcl-wavとbodge-sndfileを試用しました。Apple Siliconではbod…

TSP信号の生成(Julia)

先週、Common Lisp版のOATSP信号を作りました。 marui.hatenablog.com Julia版もあると便利かと思ってサクッと実装してみました(OATSPの説明などは上記のページを見てください)。一つの関数で測定信号と逆信号を作れると便利なので、まとめてしまっていま…

TSP信号の生成

インパルス応答 OATSPの数式 Common Lispで試す 時間領域にもっていく 関数にした インパルス応答 頭部伝達関数を測定したり、スピーカーの応答を測ったり、室内音響指標の計算に使ったり……インパルス応答が測定できると色々と便利です。すでにMatlab、R、Ju…

Common Lispで音の振幅スペクトルの計算

先月末「Common LispでFFTライブラリを使ってみる - 丸井綜研」を書きました。このエントリの最後に「関数化した上でWAVファイルを読み込んで分析してみたい」と書いていたので、今日はそれをやってみました。 WAVファイルを読み込むのには「Common Lispで音…

Common Lispで音ファイルを読み込む

(2022-12-04追記:cl-wavを便利に使える関数を作りました→Common Lisp用のwavread - 丸井綜研) Lispで音をやろうと思ってもなかなか情報が出てこないのですが、OpenMusicのような大規模なシステムもCommon Lispで書かれているので無理なことはないはず。Go…

1/3オクターブ周波数のリストを得る

目次 標準数とは Common Lispでの実装 実行例 似たようなことをJuliaでやってみると…… 標準数とは 1/3オクターヴ幅での周波数リストが欲しい時があります。20, 31.5, 40, 50, 63, 80, 100, 125, 160, 200, 250, 315 Hz... というやつです。実はこのリスト、…

周波数から音名を得る

Common Lispの勉強をしていて、簡単なプログラムを再実装しています。数年前にJuliaで書いた「周波数を与えると音名・セント値が返ってくる関数」をLispに移植してみました。Julia版は以下の記事に書いてあります。 marui.hatenablog.com やっていることはJu…

Juliaで基音周波数の推定(YINの解説)(Julia Advent Calendar 2021)

これはJulia Advent Calendar 2021の25日目の記事です。これまでにこのブログで書いたJulia Advent Calendar記事は以下の通りです。 楽器音の分析とスペクトログラム (Julia Advent Calendar 2018) - 丸井綜研 パワースペクトル計算の2つの方法 (Julia Adven…

楽器の音域

さまざまな楽器の音域がピアノの鍵盤のどの辺りに位置するのか、周波数やMIDIノート番号はどうなっているのか、といったことを調べたことがありました。その時に作った図が出てきたので、こちらに掲載して供養します。 同じ楽器であっても個体によって出せる…

フィルターバンク (Julia Advent Calendar 2020)

このエントリはJulia Advent Calendar 2020の25日目のものです。Juliaを音に関する研究によく使っているので、その中から一つ紹介したいと思います。 音の加工をするときにフィルタというものを使うことがあります。フィルタは、特定の周波数の音を除去した…

周波数から音名を得る (Julia Advent Calendar 2020)

このエントリはJulia Advent Calendar 2020の24日目のものです。Juliaを音に関する作業によく使っているので、その中から一つ紹介したいと思います。 音の高さをあらわす方法にはいくつかあります。周波数を使うと「1秒あたりの周期の数」として物理的にも明…

パワースペクトル計算の2つの方法 (Julia Advent Calendar 2019)

はじめに これはJulia Advent Calendar 2019の20日目の記事です。「音について何か書きます」と宣言したので、普段Juliaを使って音についてどんなことをしているかを紹介します。今年はパワースペクトルの計算を、(1)信号全体をフーリエ変換する方法と、(2)…

線形予測符号(LPC)でスペクトル包絡を計算する

Juliaを使った音の処理については、これまでにいくつかのエントリを書きましたが、今日は線形予測符号(LPC; Linear Predictive Coding)を用いてスペクトル包絡を求めてみます。ここでは線形予測符号の説明は省きますが、音声信号処理の分野では昔からよく…

楽器音の分析とスペクトログラム (Julia Advent Calendar 2018)

この記事はJulia Advent Calendar 2018の24日目です。 僕は日頃、おもにオーディオ信号を扱うのにJuliaを使用しています。今日はそのうち楽器音の分析のために作成したプログラムを紹介します。 楽器音の分析 楽器の音を聞いたとき、トランペットとピアノと…

Julia 1.0でオーディオ入出力(とインパルス応答測定)

Juliaが1.0になって、徐々に環境が整ってきました。ここ数日、LibSndFile.jlやPortAudio.jlを使ってゴニョゴニョやっていたことをまとめておきます。 入出力の同期とか考えずに最低限の音再生ができればいいという場合は、 using FileIO: load, save import …

PinkTSP信号をJuliaで作る

Julia言語でPinkTSP信号を作るプログラムを書いた。とは言っても、以前書いたMatlabのものをそのまま移植しただけ。そもそも参考にしたのは以下の文献。 藤本卓也. “低域バンドでのSN比改善を目的としたTSP信号に関する検討.” 日本音響学会研究発表会講演論…

DSP.jlに対応した低域フィルタ

引き続きJuliaネタです。前回は、Bristow-JohnsonのパラメトリックEQを自作のfreqz関数で可視化してみました。 marui.hatenablog.com ただ、プログラミング言語を使う際には長いものには巻かれておいたほうが良いので、Juliaのエコシステムで言及されているJ…

パラメトリックEQ

先日Juliaでフィルタの可視化をしたけれど、あの時点ではまだフィルタの設計はMatlabに頼っていた。今回はRobert Bristow-Johnson氏の名作をもとに、パラメトリックEQを作る。ただし、今日ここに紹介するのはピークフィルタのみ。