kiyasuの日記

ハッピーうれピーよろしく哀愁

音楽視聴、映画視聴における空間オーディオ関連の用語メモ

HRTF

Head Related Transfer Function(頭部伝達関数)のことで、耳、頭、肩などの人体の形や大きさが音に与える影響を表現した関数。HRTFは周波数フィルタであり、これとは別に音の遅延を表現したHRIRというものもある。

耳、頭、肩の大きさや形はもちろん人それぞれなのでHRTFも人によって異なる。

バイノーラル音源

通常のステレオミックスとは異なる、HRTFが適用された音源。ダミーヘッドを用いて録音したり、専用のプラグインを用いるなどしてミックスがなされたもの。

頭内定位

通常のステレオミックスされた音源はスピーカーでの再生が前提であり、ヘッドフォンなどで聞くと2chが自然に混ざり合った音にならない→頭の中で鳴っているような感覚になる、ということらしい。自分はヘッドフォンで聞いて音が頭の中で鳴っているように感じたことは無いが、つまるところ

  • 従来のステレオミックスはスピーカー再生向け
    • ヘッドフォンで聞くと頭内定位が起こる(意図した音像にならない)
  • バイノーラルミックスはヘッドフォン再生向け
    • スピーカーで再生すると、前方向の定位が不明瞭になり、また高音が強調される

といったようにスピーカー向けとヘッドフォン向けのミックスはそれぞれ特性が異なる(ため、両方を満たすベストなミックスは難しい)、ということのようだ。

参考

頭部伝達関数 - Wikipedia

Sony Japan | 概要

Sony Japan | 技術解説

Docker Desktop For Windowsのコンテナbuild時にDNSサーバーを指定したい

前回までのあらすじ

どうやらビルドしたコンテナはネットワークにはつながっているようだ。単体でRUNしたときにpingは返ってきていた。やはりホスト名が解決されてないことが原因のようだ

コンテナのDNSサーバーを指定する

使うDNSサーバーは8.8.8.8(Google Public DNS)。調べ方は「設定後、nslookup www.google.comをやる」です

起動時に指定する

docker run --dns=8.8.8.8 -it [Image ID]

だめでした。

C:>nslookup www.google.com
Server: UnKnown
Address: 172.19.48.1

*** UnKnown can't find www.google.com: Server failed

起動後に指定する

netsh interface ipv4 set dnsservers "Ethernet" static 8.8.8.8 both

これならいけました。

ちなみにネットワークの名前(上のEthernet)は既に存在するネットワーク名を指定しないと"The filename, directory name, or volume label syntax is incorrect"と言われます。

C:>netsh interface ipv4 show interface

これでしらべましょう。で、設定して以下の結果を得られました。

C:>nslookup www.google.com
Server: dns.google
Address: 8.8.8.8

Non-authoritative answer:
Name: www.google.com
Addresses: 2404:6800:4004:825::2004
216.58.220.132

いけました。

しかし問題はそうではなかった

よくよく考えてみると、今やろうとしていることは「Dockerfileでイメージから新規コンテナをビルド中にIPアドレス解決ができない」ということなので、上記の「作ったコンテナの中でdnsを指定する」はちょっと違う。

docker image build時に、DNSの設定をなんとかしたい - CLOVER🍀

となると、今度はこちらが参考になりそうだ。

それで、この「ホスト側のネットワークを使う」を試そうとしたんですが

docker build --network host xxxxxxx
..... network host not found

とのこと。

どうやらホストがLinuxの場合でしかhostのnetworkは使えないようだ

The host networking driver only works on Linux hosts, and is not supported on Docker Desktop for Mac, Docker Desktop for Windows, or Docker EE for Windows Server.

なので、今度は同ブログの「Dockerデーモンのオプションに「--dns」を指定する」を試す。

これでできた!やってみー!

DockerDesktop(Windows)ことはじめ

Installation Guide · homuler/MediaPipeUnityPlugin Wiki · GitHub

これをやろうとして、どうにもひっかかったのでメモ


最初のチュートリアルはここを見ながらやるとうまくいった。 

DockerをインストールしてLinux系コンテナを構築したときの備忘録 - Qiita

問題

Dockerfileのなかの

RUN curl -L http://repo.msys2.org/distrib/x86_64/msys2-base-x86_64-20210604.sfx.exe

このへんで

0curl: (6) Could not resolve host: repo.msys2.org

というエラーが出ました。

調べたこと

DockerのDNS設定

まずDocker実行時に--add-hostでホストを追加。もしくは--dnsDNSサーバー追加。nslookupでrepo.msys2.orgのIPアドレスを調べて指定する。

docke build --add-host=repo.msys2.org:178.63.98.68 -t mediapipe_unity:windows . -f docker/windows/x86_64/Dockerfile

みたいにやってみたがCould not resolveの表示は変わらず。

curl doesn't work during docker build - Stack Overflow

dockerfile - How to update /etc/hosts file in Docker image during "docker build" - Stack Overflow

Dockerのコンテナの中からホストOS上のプロセスと通信する方法 - Qiita

この辺も気になる

Dockerコンテナ内の名前解決への /etc/hosts の影響 - Qiita

firewallをオフにしてみたが変わらず。

Dockerをもうちょっと触ってみる

Dockerのイメージを起動して直接操作してみる(Dockerfileまかせではなく)。

Dockerコマンド一覧 - Qiita

「docker run -it」にするとコンテナがすぐに終了しない理由 - プログラミング初心者がアーキテクトっぽく語る

まず

docker run -it [image ID]

で入る。次に

C:>ping 178.63.98.68

Pinging 178.63.98.68 with 32 bytes of data:
Reply from 178.63.98.68: bytes=32 time=254ms TTL=51
Reply from 178.63.98.68: bytes=32 time=254ms TTL=51
Reply from 178.63.98.68: bytes=32 time=254ms TTL=51
Reply from 178.63.98.68: bytes=32 time=254ms TTL=51

Ping statistics for 178.63.98.68:
Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 254ms, Maximum = 254ms, Average = 254ms

C:>ping repo.msys2.org Ping request could not find host repo.msys2.org. Please check the name and try again.

とやってみた。ネットワークは出ているがIPが解決できないようだ。 Windowで/etc/hostsにあたる場所はC:\Windows\System32\drivers\etc\hostsらしいが、これはどうやって編集すればいいんだ。

docker コンテナ内でファイルが編集できない | mebee

これか?これもコンテナ名とパスの書き方がちょっとわからないな…。

docker cp使って簡単永続化 - Qiita

ここも参考に

その前に問題のDockerfileを見るとこの後にもいろいろダウンロードするっぽいので、DNS自体の設定をした方がよさそうだ。

しかしここで詰んだ。

Dockerコンテナ内の名前解決への /etc/hosts の影響 - Qiita

これはWindowsマシン用のLinuxコンテナっぽい

Docker Desktop for Windows のネットワーク構築機能 — Docker-docs-ja 19.03 ドキュメント

ここには書いてないっぽい

コンテナの DNS を設定 — Docker-docs-ja 1.10.0b ドキュメント

これもLinuxコンテナぽい

Docker DNS not responding from inside a container - Docker Desktop for Windows - Docker Community Forums

これは試してみたが、変えるべき設定は自分の環境では問題なさそうだった

How to set DNS in Docker for windows? – QuickAdviser

情報が古そう。しょっぱなの

Just right click on docker’s icon in the tray bar and select “Settings” item. Then, on the Docker’s window, select the “Network” section and change the DNS option from “Automatic” to “Fixed” and hit “Apply”.

この項目がもう存在しないもんな。

M1 MacでVS Codeの設定いろいろ

M1 MacでUnityのscriptを編集しようとしたがうまくいかず。

Debugger For Unityが動かない

具体的にはVSCodeデバッグアイコンを押してlaunch.json追加しようとしても下記画像のような"Unity Debugger"の項目が出なかった。

以下を試したら治りました。


Unity C#の補完

UnityEngine.Debug.Log()の補完がでない。これは適用しているスニペット次第で、自分が使っているこれだと、"log"と入れるとDebug.Logが出てきた。自分に合ったものを探すか、自分が合わせるしかない

定義へのジャンプ、実装へのジャンプ

一回全体検索をした後だと動くようになるが、それまではF12でも右クリックメニューでも「No Definition Found」と表示されてしまう。検索のインデックスができていない感じ

UnityでVSCodeを使用中、関数ジャンプや参照ができない!の解決方法 - Qiita

こちらを試したけども解決せず(slnも消してみた)。最後に書かれてるUnity Attach Debuggerはデバッグ時にどのUnityのランタイムにアタッチするか、ということのようで、デバッグ実行したところそれは問題なさそう。

コンソールに何か色々出てるな

[warn]: OmniSharp.CompositionHostBuilder
It looks like you have Mono installed which contains a MSBuild lower than 16.8.0 which is the minimum supported by the configured .NET Core Sdk.
Try updating Mono to the latest stable or preview version to enable better .NET Core Sdk support.

うーん、これか?monoはVisual Studioバージョンを入れていたが、stableのほうが先らしいのでそれを再度インストール。しかし同じエラー。バージョン確認。

% mono -V
Mono JIT compiler version 6.12.0.122 (2020-02/c621c35ffa0 Wed Feb 10 00:51:43 EST 2021)
Copyright (C) 2002-2014 Novell, Inc, Xamarin Inc and Contributors. www.mono-project.com
TLS:
SIGSEGV: altstack
Notification: kqueue
Architecture: amd64
Disabled: none
Misc: softdebug
Interpreter: yes
LLVM: yes(610)
Suspend: hybrid
GC: sgen (concurrent by default)

msbuildのバージョンは?

% msbuild -version
Mono 向け Microsoft (R) Build Engine バージョン 16.6.0
Copyright (C) Microsoft Corporation.All rights reserved.

16.6.0.10801

じゃあpreview入れてみよう。monoは6.12.0.177、msbuildは16.10.1になった。上記のwarnは出なくなった。しかしDefinitionは依然出てこない。

UnityでVSCodeを使用中、関数ジャンプや参照ができない!の解決方法 - Qiita

もう一回これもやってみたがうまくいかず。

あとは

omniSharp.Roslyn.CSharp.Services.Navigation.FindUsagesService no document found - Google 検索

Mac + VSCode + .NET 5 SDK + C#拡張 で omnisharp がうまく動かない時のたったひとつのcoolな答え

この辺が気になるが続きはまた今度にしよう

Dolby AtmosのADM仕様書をそれとなく理解する

https://professionalsupport.dolby.com/s/article/Dolby-Atmos-ADM-Profile-specification?language=en_US

こちらの公式資料と、Logicサンプルファイルから抽出したiXMLファイル(これを使えばできます)を眺めつつそれとなく理解に努める。

おおまかには、様々なパラメータがXMLエレメントごとに分割して格納されているので、それぞれ紐づけされたIDでたどって情報を集約していくことになる。

重要そうなところは

  • オーディオベッドの各チャンネルへのアサインが書かれているAudioChannelFormat(typeDefinition=DirectSpeaker)
  • audioChannelFormatは最大128個出現し、DirectSpeakerとObjectに分かれている。
    • audioBlockFormatはaudioChannelFormatの子として入っている。
    • (DirectSpeakerの場合)audioBlockFormatは位置情報が入っている
    • (Objectの場合)audioBlockFormatは時間とその時点での位置情報が格納されている。これがchannelの下に複数個格納され、アニメーションとしてパースできる(多分)
      • あまり具体的な実装の説明はないが、jumpやinterpolationについては補足説明がある。

この仕様書にはエレメントやアトリビュートの名前と取りうる値、仕様としてどう扱われるか(オミットされるか。無視されるか)などが書かれているが、実際にアプリケーションでどう実装されるか、どうレンダリングされるかは解釈の余地があるように思われる(名前からなんとなく想像はできるが)。ほかにも資料があるのか、こういうものなのか。

General Requirementくらいは見ておいた方がいいかもしれない。

General Requirement

  • Dolby ATmosのADMファイルは最大128チャンネルのオーディオとメタデータが含まれている。
  • チャンネルにはオーディオベッド(typeDefinition="DirectSpeakers")とオーディオオブジェクト(typeDefinition="Objects")が含まれる
  • 例外はあるが最大118のオーディオオブジェクトが存在する
  • これらの制限と他の条件(audioBlockFormatアトリビュートの仕様を参照)を鑑みて、MAX_CHANNEL_COUNTとMAX_ELEMENT_COUNTという2つの変数がこのドキュメントでは使われる。
  • MAX_CHANNEL_COUNTは最大チャンネル数で128、MAX_ELEMENT_COUNTはXMLエレメントの最大出現回数で、118のオブジェクトと5つのDirectSpeakerのステレオセットの合計で構成されている。
  • くわしくはaudioBlockFormatアトリビュートの仕様を参照

あとは各XML Element, Attribute, Subelementについて

  • 各項目の制限、要求
  • 各エレメント同士の紐づけ

が主に書かれている。前述したとおり「このデータはプログラムでどのように扱われるべきか」といったことは書かれていない。あくまでデータの仕様書という感じ。

自分がやりたいことに照らし合わせると

  • audio bedを空間上の定位置にレンダリングする
    • typeDefinition=DirectSpeakersとなっているaudioChannelsを見て、coordinateに合わせて配置する。
  • audio objectをパースする
    • typeDefinition=ObjectsとなっているaudioChannelsを見て、その子のaudioBlockFormatのrtime, duration, coordinateをパースしてアニメーションさせる。

となるだろうか。

オーバーダブするlooper

Delicious Max/MSP Tutorial 5: Boomerang! - YouTube

f:id:mojo_nobu:20220227232450p:plain

肝心なのは[poke~]のあたり。

[count~]で1サンプルずつ出力し、[poke~]のヘッドと[play~]のヘッドを同時に動かす。

1サンプルごとに左から入ってくるオーディオ入力と[play~]からの出力を加算して[poke~]を使ってbufferに書き込む。こうすることで再生しつつ録音されるオーバーダブlooperができる。

[play~]の制御が外側からミリ秒指定でサンプル読み込みをしていて、標準の(start)メッセージであとはおまかせ、みたいな制御方法とは異なる。そのせいか、ループ時に最初のサンプルに戻る時に少しノイズが聞こえる(環境依存?)。標準の方法で指定できるinterpolateも効いてないようだ。(とはいえinterpolateはドキュメント読んだだけなので思った通りギャップを埋めてくれるのかわからないけど…)

ここは少し工夫が必要かもしれない。

maxプログラミングの際に知っておきたいこと

プログラミングに慣れてる人ならさっさと頭の中でロジック組み始めちゃう人もいると思うんですが、maxにはmaxのやり方があります。

[tempo]

BPMやビート(16ビートなど)を指定してbangや数字を定期的に出す

[sel]

[sel 0]で0が入ってきた時だけbangを出す

[counter]

bangごとに指定した数字をループで出す。

[counter 0 3]なら0,1,2,3,0,1,2,3...といった具合

[click~]

bangが入ってきたら動かす

メトロノーム

これらを組み合わせてメトロノームが作れる。

f:id:mojo_nobu:20220227225400p:plain

[route]

入力値を値によって分岐させる。適切な使い方かわからないけどパッチャーのインレット直後に置けばメッセージで分岐してそれっぽくできる。

f:id:mojo_nobu:20220227225745p:plain

[togedge]

f:id:mojo_nobu:20220227231506p:plain

入力が0から1になるとき左から、1から0になるとき右からbangが出る。今パッと思い出せないが、これはだいぶ使える気がする。01に限らず、ある閾値を行ったり来たりするのを検知したい時はままある。

メッセージのアーギュメント

f:id:mojo_nobu:20220227225914p:plain

これで代入即出力ができる。

アトリビュートなど呼び出す

オブジェクトのインレットを右クリックすると指定可能なアトリビュートやメッセージが表示される。

f:id:mojo_nobu:20220227230403p:plain

ここから選択すると

f:id:mojo_nobu:20220227230450p:plain

こういう感じの便利そうなUIが出てくれる。

patcherローカル(#0トリック)

sendの宛先名などは全てのpatcherで共通なので、[send SetArg]みたいに書かれたpatcherを複数呼び出すと、全てのsend receiveが混ざり合っておかしなことになる。

#0は実行時にpatcherごとに一意の番号を振ってくれるので[send #0_SetArg]としておくと、実行時は[send #1057_SetArg]みたいにやってくれる。これで混ざることがなくなる。