kiyasuの日記

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

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]みたいにやってくれる。これで混ざることがなくなる。

ミリ秒と小節数を変換する

112.35BPMの曲頭から22小節3拍目までは何秒?

GlobalTransport

メニューの Extras/GlobalTranport を選択するとGlobalTransportというのが出てくる。 f:id:mojo_nobu:20220227002654p:plain

詳しくは調べてないが、どうやらMax起動してから内部でパッチ横断して設定されたテンポとかがあるってことなのかな。

transportオブジェクト

TransportオブジェクトでGlobalTransportの設定を変更できる。

f:id:mojo_nobu:20220227003432p:plain

translateオブジェクト

GlabalTransportの設定に従って、ミリ秒から小節数、音価とミリ秒とかを変換できる。 f:id:mojo_nobu:20220227004159p:plain

設定方法の詳細はここ

Time Value Syntax - Max 8 Documentation

もんだいのこたえ

f:id:mojo_nobu:20220227003804p:plain

おまけ メトロノームを作る

tempoオブジェクト

BPMとビート(8ビートとか16ビートとか)を指定すると、その指定に沿って数字を出力してくれる。

これをselオブジェクトと合わせると、4,8,16拍目だけ抜け出せる

あとはclick~オブジェクトとかで音を出してあげる

f:id:mojo_nobu:20220227005841p:plain

ADM BWFを普通のwavに分割する①

流れとしては

  1. ADM BWFを読み込んでデータ部分のバイト列を取得する
  2. ixml部分に(多分)書かれている情報に従ってデータのバイト列を分割する
  3. 分割したバイト列にファイルごとにヘッダ付けてwavとして書き出す

ということになるだろう。多分。

ADM BWFを読み込んでデータ部分のバイト列を取得する

C#

[C#] Wave波形を読み込むよ – Pelican Philosophy

RIFFについて

RIFFファイルについて – RIFFファイルの概要と読み込み | C++でVST作り

Wavについて

音ファイル(拡張子:WAVファイル)のデータ構造について

WAVのフォーマット

WAVEデータの作成と再生【Windowsプログラミング研究所】

wFormatTag はフォーマットです。PCM形式は WAVE_FORMAT_PCM です。
nChannels はチャンネル数です。1チャンネルならモノラル、2チャンネルならステレオです。
nSamplesPerSec は標本化周波数です。
nAvgBytesPerSec は1秒間のバイト数です。計算式は wfe.nSamplesPerSec * wfe.nBlockAlign です。
nBlockAlign はブロックアライメント(データの最小単位)です。計算式は wfe.nChannels * wfe.wBitsPerSample/8 です。
wBitsPerSample は量子化ビット数です。
cbSize は使いません。0 を指定して下さい。

こういう具体的な話はありがてえ

C, C++

こういうbyte列の処理はなんとなくCとかC++でやりたいけど、それはわきに置いておく。メモだけ残しておこう

謎のC言語ブログ: Broadcast Wave Format に対応した WAVE 音声の読み込み

WAVEファイルの読込み/再生

その他

SoundPlayerという関数でwav再生ができるとのことだが、再生したいわけではない。メモだけ

C#でWAVE再生 - Qiita

あとMedi Control Interfaceというのも気になるな。これも再生などがメインのようだ。 MCI (Media Control Interface) を利用してWaveファイルを再生する : C# | iPentec

ixml部分に(多分)書かれている情報に従ってデータのバイト列を分割する

この前抽出したiXMLをここ見ながら分割する。これまでの情報によるとオブジェクトオーディオ以外に7.1.2chの各bedで再生されるwavも含まれているはず。それを狙う。

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

ただこの前試したlogicのサンプルプロジェクトは、オートメーション付きだからかiXMLだけで5MBとかあった。なので自分で簡易なサンプル曲を作らなければ。

support.apple.com

まあ試すだけなら簡単にできそうだな。ステムミックスを作ってからプロジェクト設定の空間オーディオをオンにすればOKっぽい。

分割したバイト列にファイルごとにヘッダ付けてwavとして書き出す

C#でWAVE再生 - Qiita

remote: Permission to user/repo.git denied to xxxxx.

現象

λ gitpush --set-upstream origin dev
remote: Permission to mojonobu/ADM-BWF-ixml-Parser.git denied to xxxxx.
fatal: unable to access 'https://github.com/mojonobu/ADM-BWF-ixml-Parser.git/': The requested URL returned error: 403

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

git config -l

で見るとuser.nameはxxxxxではなく、このリポジトリを作ったアカウントのものになっている(だから問題ないはず)のだがこれはどういうことだろう。

とりあえず検索するとこれが出てくる。

docs.github.com

This error means the key you are pushing with is attached to another repository as a deploy key, and does not have access to the repository you are trying to push to.

うーん、commitアカウントはmojonobuだが、pushしようとしているkeyがほかのリポジトリにdeploy keyとして紐づいている、ということのようだ。

原因と対策

gitのconfigにあるuser.nameはあくまでコミットのアカウントで、pushなどに使うアカウント(ログインアカウントとでも呼ぶのかな)は別モノだった。おれはそんなことも意識してなかった…

git config --local -l

で出てくる次の行

remote.origin.url=https://github.com/mojonobu/ADM-BWF-ixml-Parser.git

これを 「git config --local -e」コマンドで次のように変える

remote.origin.url=https://(user名)@github.com/mojonobu/ADM-BWF-ixml-Parser.git

するとpushしようとしたときに次のような画面が出る。

f:id:mojo_nobu:20220130205132p:plain

githubPersonal Access Tokenを取得して入力すればプッシュできました。

デフォルトでプッシュしようとするアカウントはどこで設定されているんだろうか?不明である。

ユーザーを指定してgit clone | ハックノート

gitで別のアカウントにpush/pullしたい場合 - Qiita

これはSSHの場合。いつか使うかもしれない。

複数のgitアカウントを使用する場合 - Qiita