gitと私

なんかちょっと前からプライベートリポジトリへのアクセスのたびに毎回パスワード聞かれるなーと思いつつもやりすごしていたら、UPMからgithubリポジトリへアクセスする際にエラーが出てついに困ったことになりました。なあなあで続けてきたgitと僕の関係を見直す時が来たようです。ついでにSourceTreeもアンインストールしてコマンドラインで生きていきます。

これらのことはググってたら出てきますが時間が経つと当然のように忘れるので、ここに自分のためにまとめておきます。自分用メモというやつです。こんな私にも「いまさらgitの記事書くの恥ずかしいな・・・」などというプライドがあるのですが、そんなものは捨てておきます。

なんかgitは「git自体の使い方」「gitの設定」「リポジトリの設定」「認証」「git使う時のマナーや標準的なフロー」あたりが混在しているのがわかりにくい原因な気がする。


インストール

gitの現状の確認、整理

where git

windowsのコマンド です。これ使うと手元に複数gitがあったりしてびっくりしました。SourceTreeに同梱されてるgitがあったんですねえ。後述しますがSourceTreeはちゃんとアンインストールしないといろいろ残るようです。これらを一回全部消すことにします。

gitのアンインストール

windowsの「設定/アプリと機能」からアンインストールすればOK。この後再インストールしようとするとgitフォルダが残っていると言われるが無視してそこにインストールしても問題なかったです。

SourceTreeの削除

これもgitと同じく「設定/アプリと機能」からアンインストールできるんですが、それだけでは不十分なようです。上記のようにgitなどの関連ファイルが残ります。

SourceTree関連ファイルの削除

C:\Users[username]\AppData\Local\Atlassian 配下の SourceTree という名前が含まれているフォルダを全削除しましょう。

Windows の SourceTree を完全にアンインストールする方法 - 約束の地

SourceTreeクレデンシャル情報の削除

過去使用していた接続先やユーザーの認証情報がオプションの認証タブに残っています。

これは以前souretreeを再インストールしたときに見た問題です。今回はSourceTree消したままにするので確認はしてないのですが、対策を残しておきます。

Windowsの場合、SourceTreeの認証情報は「コントロール パネル\すべてのコントロール パネル項目\資格情報マネージャー」で管理しているようです。 資格情報マネージャーにアクセスの上sourecetree- で始まる資格情報の削除をお願いします。 削除後 sourecetreeからも削除されます。

SourceTreeの認証情報を削除することができない - RS アトラシアン製品 ユーザーコミュニティ

これで環境はクリーンになったので、次はインストールです。

Gitのインストール

Git - Downloading Package

ここからインストールします。途中の認証ヘルパーのoptionには「Git Credential Manager Core」(以下GCM Core)を選んでおきます。あまり使いこなせてないけど次のデファクトらしい。

確認

$git --version

でインストールしたバージョンと突き合わせて確認。

パスの確認

いまちょうどコミット済みのブランチがあるのでpushしてみます。

$git push
git: 'remote-https' is not a git command. See 'git --help'

おっと。これはremote-httpsというhttps通信するためのサブプログラムが見つからない、ということのようです。いかにも最初から入ってそうな機能なので見つからないのはおかしい。windowsで「git-remote-https.exe」をファイル検索すると普通に見つかりました。

C:\Program Files\Git\mingw64\libexec\git-core パスが通ってないようです。

サブプログラムのパスは以下のコマンドで確認します。

$git --exec-path
C:\Program Files (x86)\Git Credential Manager Core

この作業をやる前にいろいろやってた影響でここの値がおかしなことになってました。「Git Credential Manager Core」フォルダは今はもうないので(これはgitコマンドとは別にGCM Coreを入れたときに作られるフォルダ)、ここのパスを上記のgit-coreフォルダにします。これはWindowsの環境設定でGIT_EXEC_PATHに設定すればOKです。

Git - 環境変数

これでpushできました。インストールはこれでいいと思います。

Gitの設定ファイル

あまり見ることはないですが、概観書き記しておきます。

local, global, systemの3つのレベルがあってこの順番で優先されます。それぞれは以下のコマンドで一覧が見られます。

$git config --local -l
$git config --global -l
$git config --system -l

項目の設定方法は、

$git config --global credential.interactive true

でglobalレベルのcredential.interactiveがtrueになります。

Gitの認証

Git Credential Manager Core

これは現状使いこなせてないのですが、調べたことだけ書いておきます。

そもそもGCM Coreがインストールされているかどうかは

$ git-credential-manager-core version

を実行してみましょう。この結果が"bash: git-credential-manager-core: command not found"なら、インストールされていないか、されているがパスが通っていないか、です。インストールされている場合は" C:\Program Files (x86)\Git Credential Manager Core"にあると思います。

Credential Manager Core not a git command. See `git --help` . · Issue #144 · microsoft/Git-Credential-Manager-Core · GitHub


GCM Coreの概観、httpssshの違い、ファーストステップについてはこちら↓のページ

Git Credential Manager Core: Building a universal authentication experience - The GitHub Blog

具体的な使い方はこちら↓のページ

Git-Credential-Manager-Core/configuration.md at master · microsoft/Git-Credential-Manager-Core · GitHub

とりあえず最初の段落だけ読んでみました。

  • GCM Coreの設定はgit標準の設定ファイル(git config --local -lで見られるやつ)に記述される
  • その場合「credential.***」となっているのがGCM Coreの設定変数
  • local>global>system に加えて、各リモートurl別に設定もあるようだ
  • ほかにもGCM特有の変数があり、これはconfigurationファイルよりも優先される。GCM_*** という名前のようだが、どこに記述されるものか不明

$git config --global credential.helper manager-core

でGCM Coreをcredential helperとして設定することができる。

$git config credential.helper

で現在のcredential helperを確認できます、とのこと。

git自体の使い方

最初にやること

$git init

なにはともあれ

.gitignoreの作成

普通にテキストファイルを作って.gitignoreにリネームして中身を書く/コピペして持ってくる

$ git add .

ケースバイケースなのかもしれませんが。

現状確認

$git log

今のブランチのコミットログを表示する。

$git status

変更済みファイル、gitの管理下にないファイルなど、現状を一覧する。新規追加してまだステージングされていないファイルなどをこれで確認する。

$git diff
$git diff --name-only

git diffは変更箇所もまとめてバーっとでる。--name-onlyオプションで変更のあったファイル名のみ表示する。

$git branch

ローカルのブランチ一覧。現在地には*が付く。

ブランチ操作

$git checkout <ブランチ名>

ブランチ切り替え

$git checkout -b <ブランチ名>

新規ローカルブランチを作りそのブランチに移動する

Gitコマンド(ブランチの作成) - Qiita

ステージング

$git add <ファイルパス>

modifiedをまとめてコミットしたいときは

git ls-files -z --modified | xargs -0 git add

こう。(多分。未確認)

git diff --cached --name-only

add済みのファイル一覧。--name-onlyが無ければファイルの中身のdiffまで表示

コミット

$git commit -m "メッセージ本文"

プッシュ

$git push --set-upstream origin feature/hoge

リモートリポジトリに対応したブランチがない時の方法。

削除

$ git rm ファイル名

ファイルを削除して、gitの管理から外す。
ファイルが残っていて、前回のcommitから変更されていたらエラーになる。この時は

$ git rm -f ファイル名

で変更内容ごと削除する。自分が使う時はこれで問題なさそう。

$ git ls-files -z --deleted | xargs -0 git rm -f

これは状態がdeletedのものを全てgit rmする。これも良く使いそう。ファイルがdeletedされたらそれ以降はgit管理から外すのが自然(だよね?)

"git ls-files -z"のzオプションとxargsの-0オプションは「デリミタにヌル文字を使うよ」という約束。これでファイル名にスペースが含まれていても大丈夫。

取り消しあれこれ

addしたファイルを取り消したい

$git diff --cached --name-only

addしたファイル一覧を見る。

$git rm --cached -r ファイル名

ファイル名を指定してindexから取り消す。

変更箇所を全て取り消す

$git checkout .

ただし新規追加したファイルは削除されない

忘れやすい人のための git diff チートシート - Qiita

随時更新。

Daito Manabe + Satoshi Horii phenomena

mutek.org

これのアーカイブをシアター上映していたので見てきました。いやーよかったです。ただパルスやアクセントに合わせて映像を動かすのではなく、素材となっているCGの形状、動き、カメラワークに必然性があり、音楽の印象を増幅させているようでした。

max summer school 2019でとても印象に残っている講義がありました。Jean-Marc Pelletier先生によるjitterの講義で、「黒い平面状を光点がランダムに移動するが、移動に連動して音も自動生成させたい。どのようにすれば良いか」という課題を扱ったものでした。

文化的背景が共通でなくても上に行くと高い音、下に行くと低い音という挙動に人は安心感・納得感を覚えるとか、ただ上下を正確に音に反映すると蚊の羽音のような不快なものになるから細かい挙動はフィルタリングするとか、そういった「音と映像の必然性のある関係を考える」というのがひとつのトピックで、これが僕はすごく印象に残ってました。

このアーカイブでみたVJはまさにそんな必然性のある映像だったなーと。説明するのは難しいんですが、不定期なパキンパキンとしたパルスに合わせて尖った宝石のようなオブジェクトが勢いよく突き刺さる。流れるようなシンセの音と、しなやかな女性の肩を思わせるワイヤーフレームがマリアージュする。などなど。低音と連動する箱は画面下部に、高音の箱は上部に配置される。

映像に必然性があると音楽への没入感が段違いですね。これは面白かったなあ。


mutekアーカイブが面白かったので週末のこれも見ました。

これも面白かった。配信内で紹介されたm4lデバイス、試してみよう。

cclab.sfc.keio.ac.jp

ROLI SEABOARD BLOCKをMax(for Live)で扱う

MaxとMax for Live

Max for Liveはmidiバイスの選択に制限がかかっています。

cycling74.com

そのためmax for liveではableton live経由で入ってきたmidiトラックを利用することになります。具体的にはAbleton LivemidiトラックにMax for Live/Max Instrumentを作成し、その中のmidiinオブジェクトからデータを取ってくる、ということですね。

ableton liveが新しい11でのMPE対応と対応デバイスを挙げてましたがそのなかにMax for Liveが入っておらず、この方法で大丈夫かな?と心配でした。

f:id:mojo_nobu:20210220182416p:plain

が、データ見ると入っているようです。midiキーボードから入力されたデータをフィルタリングなどせずMax for Liveに投げている、みたいな感じでしょうか。うーん、でもそれってこれまでも純正デバイス以外は普通に対応できてたってことにならんかね?11ではmidiクリップがmpe形式で保存できるようになるのかしらん。

MPEとして扱う

ともかくMaxをSEABOARDを使ってみましょう。

maxはmidiバイス選択で、Max for Liveは上記の方法で[midiin]オブジェクトからmidiデータを引っ張ってきます。以下、スクショは全てMax for Liveです。

[mpeparse]オブジェクトを作り、そのリファレンスからごっそりコピペで持ってきましょう。MPEに関してはこれで事足りるかと思います。

f:id:mojo_nobu:20210220183517p:plain

使う時は以下を参考にMPEの用語とSEABOARDの操作のすり合わせをしましょう。

Max tutorial: Receiving and displaying the Seaboard's MPE data : ROLI Support

Strike is transmitted as Velocity Press is transmitted as Aftertouch Glide is transmitted as Pitch Bend Slide is transmitted as CC 74 Lift as Release Velocity Data from the Preset Shift buttons or SoundDial is transmitted as Program Change data

マルチタッチデバイスとして扱う

単にMPEの入力装置として扱うだけではなく、MaxはSEABOARDを押し込み機能を持ったマルチタッチデバイスとしてそのデータを取得することができます。

BLOCKS用のパッケージを取得

Maxのパッケージマネージャーで配布されているこちらを取得します。

cycling74.com

maxのメニューからFile/Show Package Managerを選択して「BLOCKS」などと検索して取得します。

f:id:mojo_nobu:20210220165128p:plain

パッチ内でこれで[blocks.*]オブジェクトが使えるようになりました。では使ってみましょう。パッチ内に新規オブジェクトとして[blocks.seaboard]を作ってみましょう。

f:id:mojo_nobu:20210220170018j:plain

続いてエディットモードに入ってalt押したままseaboardの画像をクリックしてリファレンスを見てみましょう。

f:id:mojo_nobu:20210220170140p:plain

タッチのインデックスも取れてるし、多分これで大体のことはできる。

展望

あとはMPE対応音源をあさったり、対応してない音源でもマルチタッチ情報を使ってウネウネ操作してみたりしようと思います。

MRAL(仮)のはなし

先日こういう動画をアップしました。

www.youtube.com

HoloLens2からMax経由でAbletonLiveのセッションビューを再生、録音できるようになりました。これでMixedReality作曲できる!

#HoloLens2​
#AbletonLive​
#maxforlive​
#maxmsp

仮ですがアプリ名はMRAL(Mixed Reality Ableton Live)です。このアプリについての説明と展望を書いておこうかと思います。

どういうアプリか

作曲ソフト、Ableton LiveのセッションビューをHoloLens2のMR空間から操作できるようになるアプリです。

Ableton LiveとMax

Ableton LiveはMax(名前がいろんなものと被るので一般的にはMax8やMax/Mspと呼ばれたりする)というプログラミング環境を使って作曲に使うエフェクトやプラグインを作ることができるのですが、MaxはLOM(Live Object Model)というAPIを使ってAbleton Live自体の情報を取得することもできます。Live上で現在どのクリップが再生されているのか取得したり、Liveに対して「特定のトラックで新規録音を開始させる」などの命令を送ることもできます。

MaxとHoloLens(Unity)

Maxはプログラミング環境としてUDPやOSCの送受信の機能を備えているので、これを使ってHoloLensアプリと通信を行います。HoloLensアプリはUnityで作ってます。

図にするとこんな感じです。

f:id:mojo_nobu:20210214204100p:plain
システム図

難しかった(現在進行形で難しい)ところ

Maxがとにかく曲者でした。ノードの中に流れるシーケンシャルなデータを逐次処理していく、というのが普通のプログラミングと違っていて慣れるまで大変でした。C#だと工場のオートメーションのところがMaxだと流しそうめんみたいな。データをプールするような作りになっていないというか。

Maxはちょくちょく触っていたんですが、久しぶりに触ると感覚も忘れてしまうので、定期的に触らなければ・・・という思いを強くしました。慣れると自分に必要なオブジェクトがわかってきて、それを探して使っていくのが面白いです。

あとは一連の処理の末端に複数のsendがあった場合その後のreceiveの実行順は未定義らしいとかあって、全体的に何かしらロジックを組むような用途には向いてないのかなという感触でした。Maxが悪いんじゃなく僕の使い方、アプローチが何か間違ってるのかも、という話です。シューゲイザーのエフェクト構成でクラシックを弾くんじゃない、みたいな。

それこそgenとか使えば良かったのかもしれない。今後の課題。

このアプリで何が嬉しいか

今のところ特にないんですよね。

実はこのプロジェクト自体は結構長くて、1年半くらい前にこういうのを作りました。

youtu.be

Ableton Liveにはclipのon/offを切り替えて曲の構造を変えながら作曲していくセッションビュー という機能があるんですが、それをHoloLensで叩く。スマホARでは手がふさがる、VRでは楽器が見えない、ということで考えたアプリです。 これで楽器を弾く手を止めることなく、曲の展開をどんどん変えていけるようになりました。

このときは「MRにより実空間での場所を取らないから嬉しい」「演奏の手を止めずにLiveを操作できるから嬉しい」そのあたりを考えていたんだと思います。しかし、

果たしてそうだろうか・・・?

あまりにも特定のシーンに限定しすぎではないか・・・?

演奏中に視線(正確にはhead gaze)でclip選択は難しすぎないか・・・?

機能にアクセスできるからって同じ見た目にする必要ないし、もっとMR特化のインタフェースがいいんじゃないか・・・?

などと頭を回る疑念。ここで手が止まるのが自分の悪いところである。先のことはわからないがとりあえず「Ableton Liveの機能をHoloLens上に再現する」にフォーカスし、手を動かしていくことにしました。なので現状これによって嬉しくなることはないです。書いていて思いましたがこれって技術デモみたいなものですね。

あと、あんまり頭の中でだけで作ったものを見せても、見た人は付いてきてくれないんじゃないかなという気持ちもあった。いきなり空中のCGを手でぐねぐねやるよりも、とりあえず技術デモから始めるのって悪くない気がしますね。

今後の展望・やりたいこと

自分は音楽が好きなので「新しい音楽を作りたい」というのが一番やりたいことですね。「新しい音楽」というのが新しい楽曲構造なのか、音色なのかリズムなのか、演奏表現なのか、というのは定かじゃないですが。

ソフトウェアの進化によって理屈の上ではどんな音も出せるはずなんですが、ウンウン頭を捻ってPCの画面と睨めっこして新しい音を出すだけでは面白くない。新しい道具、インタフェースから人間の反応を引き出すやり方っていうのは悪くないと思うんですよね。HoloLens単体だとフィジカルなフィードバックがないので、この場合は演奏表現よりも楽曲構造や音色、リズムの生成に影響が出るんじゃないかとか。

新しくなるのは音楽ではなく、体験なのかもしれないし。視点かもしれない。作曲風景って五線譜からPCの画面まで2Dなんだけど、3D空間で作られているというイメージが浸透すればリズムの捉え方も変わるかもしれない。その辺りは固執せずにやっていけたらいいな。

まあ、単に見た目にでも新しいパフォーマンスが生まれればそれも良しかな。

続live.object: Live API is not initialized, use live.thisdevice to determine when initialization is complete(未解決)

kiyasu.hatenadiary.com

こちらの問題はまだ解決せず。

cycling74.com

ただ、このスレッドを読んでみると、どうやらシステム全体の負荷が原因のひとつではあるようだ。maxを起動させずlive上だけで操作するとエラーが出ない、エラーが出やすい処理と出にくい処理がある、などの報告がある。

このスレッドには[deferlow]の使いどころも書いてあるので読むのがいいと思います。[live.path]の直後に入れればいいらしい。つまりエラー文中の"notification"とは[live.path]のアウトレットの出力のことのようだ。

ではMaxの設定を変えてみてはどうか。

Max6の環境設定をいじってパフォーマンスをあげる:Max/MSP | mirrorboy

この記事を見つけた。

簡単なパッチでいろいろ設定かえて試してみたが解決せず…同時処理イベント数とか、最初の設定値で十分足りてそうなんだよなあ。

そうこうしていると動いていたパッチも変な挙動になってしまった。そこかしこにdeferlow突っ込んでいたが、deferlowってちょっと遅らせるだけではなくて「右のinletから順番に処理する」というルールも変えてしまうらしいのだった。ちょっと一回落ち着いてdeferlowの置き場所考え直して、処理全体も整理したほうがいいな…

進捗

最近ずっとやってるプロジェクト、そろそろ終わらせたいんだけど次から次へと問題が起こる。今日はm4lのデバイスが起動後に動作しないという状態になった。なんだこれは…
パッチを一度閉じて再度開いたり、編集モードに切り替えてセーブしたりしたら動くようになった。

たまに出るこのwarningと関係あるだろうか?

live.object: Live API is not initialized, use live.thisdevice to determine when initialization is complete

live.thisdeviceの使い方もよくわからない。getstateメッセージを突っ込んでみたが…


とりあえず細かいことには目を瞑ってゴンゴンやろう、と思って進めてきたが、[live.object]を呼び出すときに以下のエラーが出る件、だんだんと頻発するようになった。どうやら腰を据えて向き合わないといけないようだ。

live.object: Changes cannot be triggered by notifications. You will need to defer your response.

live.object: Setting the Id cannot be triggered by notifications. You will need to defer your response.

フィードバックループしないための仕組みで、notificationきっかけで[live.object]のid設定したりプロパティ設定をしようとするとこのエラーが出るようだ。ただ毎回出るわけではなく、体感では作業の最初の頃は出ないが続けているうちにだんだん出る可能性が高くなってくる。

ちなみに

You will need to defer your response.

は[deferlow]オブジェクトのことらしく、これを適当なところに挟めば解決する「かも」みたいな記事を見つけた。改善はしているのかもしれないがそれでもエラーが出る時は出る。

cycling74.com

ほかにもいろいろ知見が集まっていたので訳してみた

  • 編集中のデバイスが含まれている時、この問題が起こる傾向がある。maxとlive間の通信がうまくいっていないようだ

  • 編集状態じゃなければ問題なく動くようだ

  • deferやdeferlowは信用できない。live.objectのid指定時にdeferlowを挟み込んだり、live.objectの前段に挟み込んだりしたが毎回異なる結果とエラーがでた。

  • edit modeじゃないときどういう挙動になるか調べるため、右クリックでliveからmaxを開いた。editorかそうじゃないかで、確かにスケジューリングなどの挙動がだいぶ異なるようだ…

「編集状態じゃなければ問題なく動く」というのは本当だろうか。試したが自分の環境ではうまくいかなかった。というか一回閉じると冒頭の「そもそも動作しない」みたいな挙動になったのだった。どうすれば…


次にこちらの長大なスレッド読んでみよう。

cycling74.com

Note: changes to a Live Set and its contents are not possible from a notification. The error message in the Max Window is 'Changes cannot be triggered by notifications'. In many cases putting a deferlow between the notification outlet and the actual change helps to resolve the issue.

古いですが Live API Overview Reference

からの引用ですね。自分プロジェクトではnotificationから呼びまくりだし、おそらくそうせざるを得ない。どうするべ…とりあえずこのスレッドをじっくり読んで、以下の記事も目を通しておこう

cycling74.com

cycling74.com

【Max8】[iter]の終わりを検知する

[iter]オブジェクトは結構便利ですが、終わりを検知したいときがあります。maxで明確に処理順を定義したいときです。基本的には処理は上から下まで順番に流れるんですが、send, receiveを挟むとその後の順番が不安だったりする…

そういうときはリストの最後に終端シンボルを自分で定義してそれを検出すればよいです。

f:id:mojo_nobu:20210109233614p:plain

[iter]に行く前にリストの後ろにendなどをappendして、出口で[route]で受ければよいです。