Attention! Translated article might be found on my English blog.
ラベル Mac の投稿を表示しています。 すべての投稿を表示
ラベル Mac の投稿を表示しています。 すべての投稿を表示

2017年10月31日火曜日

Mac用速度可変プレーヤ ListeningHelper-2.1 リリース

Mac用速度変更機能付きオーディオプレーヤ ListeningHelper2.1 をリリースしました。

変更点は以下の通りです。

  • 日本語対応
  • 再生位置スライダのバグ修正
  • チュートリアル画面追加

ダウンロードはこちらから。

2017年10月16日月曜日

自作.frameworkでの文字列のローカライズ

通常文字列のローカライズする(Localizable.stringsに書かれた文字列を使う)には、

NSLocalizedString(@"Stop", @"");

を使いますが、このマクロの定義は

#define NSLocalizedString(key, comment) \
    [NSBundle.mainBundle localizedStringForKey:(key) value:@"" table:nil]

となっています。
結果、これを自作.frameworkで使うと利用プログラム側のbundleが参照されることになり、.framework側が参照されません。

解決策としては

NSLocalizedStringFromTableInBundle(@"Stop", nil, [NSBundle bundleForClass:self.class], @"");

てな感じでNSLocalizedStringFromTableInBundle()というマクロを使い、
クラスが属するバンドルを参照するのが良さそうです。

2017年10月14日土曜日

自作V3 AudioUnitをin-processに対応させるためのステップ

NOTEEnglish article is available.

前回の記事で自作AUをGarageBandで使えるようにするには、
in-processな読み込みに対応させる必要がありそうということが分かりました。

試行錯誤の結果、なんとかGarageBand対応版をリリースできたので、
おおまかな修正手順を載せておきます。

手順:
1:AU用のcocoa frameworkターゲットを作る。
2:frameworkのターゲットにAU(.appex)ターゲットの実装ファイルを全て移す。
  ただし、xibや画像リソース類は両方のターゲットに含める。  
3:適当な.mファイルを用意し、ダミー関数を実装する。それを.appexターゲットに含ませる。
4:.appexのInfo.plistを編集する。NSExtension -> NSExtensionAttributes にAudioComponentBundleというキーを追加し、frameworkターゲットのbundle identifierを値として設定する。
5:サンプルコードのFilterDemoViewController.mを参考にして、AUのview controllerのinitをオーバーライドする。自分の場合は以下の通り。
- (id)init {
    self = [super initWithNibName:@"AudioUnitViewController"
                           bundle:[NSBundle bundleForClass:NSClassFromString(@"AudioUnitViewController")]];
    return self;
}
これが無いとGarageBandでビューを表示できませんでした。
  GarageBandのAUの扱い方は少し特殊な気がします。

その他tips:

外部framework(今回新しく作ったAU用のCocoa Frameworkではなく、in-process対応前から既に利用していたもの)は内包アプリとAU用frameworkの両方にembedする方が良さそう。AU用framework側がembedしてない場合、GarageBandでは以下のようなエラーが出てAUをロードできなかった。
Error loading {...中略...}/SYVibratoFramework:  dlopen({...中略...}/SYVibratoApp.app/Contents/Frameworks/SYVibratoFramework.framework/SYVibratoFramework, 265): Library not loaded: @rpath/SYFW.framework/Versions/A/SYFW
  Referenced from: {...中略...}/SYVibratoApp.app/Contents/Frameworks/SYVibratoFramework.framework/SYVibratoFramework
  Reason: image not found
もしかしたら@rpathてのを設定できればembedしなくても解決できるかもしれない。

SYVibratoApp1.2リリース

SYVibratoApp1.2をリリースしました。
SYVibratoAppはビブラートエフェクト付き簡易オーディオプレーヤです。

ビブラートエフェクト部はVersion 3 Audio Unitsプラグイン対応のホストアプリで利用可能です。

変更点は以下の通りです。
  •  GarageBandで利用できない問題の修正
ダウンロードはこちらから。

--
鮭山楽器ではmacOS/iOSアプリ開発のお仕事を募集中です。
詳しくはこちらをご覧ください。

2017年10月13日金曜日

SYVibratoApp1.1リリース

SYVibratoApp1.1をリリースしました。
SYVibratoAppはビブラートエフェクト付き簡易オーディオプレーヤです。

ビブラートエフェクト部はVersion 3 Audio Unitsプラグイン対応のホストアプリで利用可能です。

変更点は以下の通りです。
  •  macOS 10.13で内部プラグインが利用できない問題の修正
ダウンロードはこちらから。

なお、1.1はGarageBandなど一部のホストアプリでは利用できません。
詳しくは「[未解決] 自作V3 AudioUnitがmacOS 10.13のGarageBandで読み込めなかった」をご覧ください。

--
鮭山楽器ではmacOS/iOSアプリ開発のお仕事を募集中です。
詳しくはこちらをご覧ください。

[解決] 自作V3 AudioUnitがmacOS 10.13のGarageBandで読み込めなかった

NOTEEnglish article is available.

-- 2017/10/14追記 --
対応方法を自作V3 AudioUnitをin-processに対応させるためのステップに書きました。
-- 2017/10/14追記ここまで --

要約:
GarageBandで自作AUを動かすにはin-processでの読み込みに対応させる必要がありそう。
そのためにはAUの実装を全て自作.frameworkに詰めこむ必要がありそう。


詳細:
macOS 10.13で自作AUの動作確認をしていたところ、GarageBandで正常に読み込めないことがわかりました。
AUの一覧には表示されるものの、選択するとビックリマークが表示されたまま、
クリックしてもビューが表示できないほか、エフェクトとしても機能していませんでした。(下図)


まだ原因は特定できていませんが、自作AUがin-processな読み込みに対応できてないためではないかと考えられます。

自作AUをGarageBandで読み込む際のConsole.appに流れるログを観察すると、
254: Extension <private> advertises loadable bundle <private>, but we couldn't find it
というエラーをGarageBandが出力しているのが確認できました。

このエラーをなんとか解決できないかと思い、ビルド設定やInfo.plist, Sandbox関連の設定を見直したのですが、解決できませんでした。

その後の調査で、+[AVAudioUnit instantiateWithComponentDescription:options:completionHandler:]の第二引数にkAudioComponentInstantiation_LoadInProcessを指定すると、
自作ホストアプリでも同様のエラーが出力されることが分かりました。
どうやらGarageBandはAUをin-processで読み込もうとしているようです。

in-processなロードの対応:
自作AUをin-processな読み込みに対応させるには、自作AUの実装を全て.frameworkとして提供する必要があるようです。
このことはサンプルコードAudioUnitV3ExampleABasicAudioUnitExtensionandHostImplementationの中のFilterDemoExtension.mにコメントとして書かれています。
To facilitate loading in-process and into a separate extension process, the .appx main binary cannot contain any code. Therefore, all the plugin functionality is contained in the FilterDemo.framework and the .appx Info.plist contains an AudioComponentBundle entry specifying the frameworks bundle identifier.
実際、FilterDemoExtension.mにはdummy()という関数しかなく、AUの実装は全てFilterDemoFramework.frameworkに突っ込まれているようです。

今から新しくV3 AudioUnitを作成する場合、このサンプルコードを雛形にするのが良いかもしれません。
サンプルコードのAU(FilterDemo)ならば、GarageBandでも問題なく使用することができました。

あと、このコメントにある通りbundle identifierも少し工夫が必要なようなのですが、
よく分からないので今後調査したいと思います。
このサンプルコード、今回の更新で微妙にbundle identifierを変えたようなので、
そちらもin-processへの対応に必要な作業なのかもしれません。

つづく。

宣伝:
鮭山楽器ではmacOS/iOSアプリ開発のお仕事を募集中です。
詳しくはこちらをご覧ください。

2017年10月12日木曜日

Sakimon1.9リリース

咲-Saki-スレ用自動読み上げアプリSakimon1.9をリリースしました。

変更点は以下の通りです。
  •  艦これ板の監視を実装
ダウンロードはこちらから。


鮭山楽器ではmacOS/iOSアプリ開発のお仕事を募集中です。
詳しくはこちらをご覧ください。

2017年10月11日水曜日

Firefox.appがウイルス扱いされた

ClamXavでシステムをスキャンしたところ、Firefox.app/Contents/Resources/browser/omni.ja というファイルが"Html.Exploit.CVE_2017_8750-6336209-0"というウイルスに感染しているという結果が出ました。

ググったところ、Re: [clamav-users] /home/gene/Download/firefox/browser/omni.ja: Html.Exploit.CVE_2017_8757-6336185-0 FOUND に同様の報告がありました。

そこでのやり取りや貼られていたリンク先(NVD - CVE-2017-8750)を読む限り、
ひとまずWindowsを使っていなければ問題ないっぽいです。


[解決]Xcode 9.0でMac mini上にXcode Serverを立てられなかった

NOTEEnglish article is available.

-- 追記 2017/12/10 --
"/Library/Developer/XcodeServer"を削除してからためしたところ、エラーなくXcode Serverをセットアップすることができました。
詳細はxcode9 - Xcode 9 enable Server fails because "xcsd" keychain password - Stack Overflowを参照してください。
(Keychain Access.appでxscdを削除する方法はこちらの環境ではうまくいきませんでした)

英語版の記事のコメントで上記URLを教えてくれた名無しさんに感謝します。
-- 追記終了--

CI用に使っていたMacminiにmacOS 10.13とXcode 9.0を入れ、Xcode Serverの設定をしようとしたところ、
xcsreciperunnerは、キーチェーンに含まれるキー"Xcode Server Root Certificate Authority"を使用して署名しようとしています。
という表示が出て、
xcsdというユーザのパスワードを求められました。


管理者用パスワードもXcode 8でCI用に使っていたユーザのパスワードも通らず、
よくわからんので「拒否」を選択しました。
するとユーザがキャンセルした旨を示すエラーが表示されました。




その後、再度Xcode ServerをONにしようとしたところ、
今度はパスワード入力ダイアログは表示されず、

Could not create client certificate authority: Error Domain=Security Code=-25293 "The user name or passphrase you entered is not correct." UserInfo={NSLocalizedDescription=The user name or passphrase you entered is not correct.}

というエラーが即表示されました。




マシンを再起動してからXcode ServerをONにすると再びパスワード入力ダイアログ表示に戻りました。
結局パスワードが分からないので、このマシンでのCIは諦めることにしました。

その後、開発用のMacbookでは特に問題なくXcode Serverを立てることができました。
"xcsreciperunner"や"xcsd"でネットを検索しても、それらしい解決方法は出てきませんでしたので、環境に依存するエラーなのかもしれません。

ちなみに、上記手順を行なった後、Keychain Access.appには
"xcsd"という項目が勝手に追加されていました。


今後、どうしてもMac mini上でCIが必要になった場合は
システムをクリーンインストールし直そうと思います。


2017年10月10日火曜日

自作のV3 AudioUnitがサードパーティ製ホストアプリで動かなかった

NOTEEnglish article is available.

10.13で動作確認中、自作AUがauvalでエラーを吐くという問題が起こりました。
エラーは以下のような感じです。
2017-10-10 11:45:27.172 auvaltool[508:5335] Error: Session 091F49F0-C167-4CFB-820E-4DBCC049FD3B was unable to communicate with the remote service: Error Domain=NSCocoaErrorDomain Code=4099 "The connection from pid 512 was interrupted, but the message was sent over an additional proxy and therefore this proxy has become invalid." UserInfo={NSDebugDescription=The connection from pid 512 was interrupted, but the message was sent over an additional proxy and therefore this proxy become invalid.}
調査の結果、AU側で自作frameworkへリンクしていなかったのが原因のようでした。
XcodeでAUターゲットを選択し、[Build Phases]-[Link Binary With Libraries]に
自作frameworkを追加することで解決しました。



うーん、なぜ今まで問題なかったのかはよく分かりません。><

自作のV3 AudioUnitのビューが作成できなかった

NOTEEnglish article is available.

こちらの記事の通り、自作AUのAVAudioUnitインスタンスは作れたものの、
今度はビューの作成に失敗しているようでした。

-[AUAudioUnit requestViewControllerWithCompletionHandler:]をコールしてもcompletionHandler内のviewControllerがnilになってしまいます。

AudioUnitV3Exampleの-[ViewController embedPlugInView]の実装をパクリ参考にし、
バンドルから直接ビューを作るようにしたところ、
無事ビューを作成することができました。

自作AUのembedPlugInViewの実装例は以下の通りです。
- (void)embedPlugInView {
    NSURL *builtInPlugInURL = [[NSBundle mainBundle] builtInPlugInsURL];
    NSURL *pluginURL = [builtInPlugInURL URLByAppendingPathComponent: @"SYVibrato.appex"];
    NSBundle *appExtensionBundle = [NSBundle bundleWithURL: pluginURL];
    
    self.vibratoViewController = [[AudioUnitViewController alloc] initWithNibName:@"AudioUnitViewController"
                                                                           bundle:appExtensionBundle];
    
    [self.vibratoProgressIndicator stopAnimation:self];
    NSRect r = self.vibratoView.frame;
    [self.vibratoViewController view].frame = NSMakeRect(0, 0, NSWidth(r), NSHeight(r));
    [self.vibratoView addSubview:self.vibratoViewController.view];
    
    [self.vibratoViewController connectAU:self.vibratoUnit.AUAudioUnit];
}
なお、 自作AUがサードパーティ製ホストアプリで認識できるようになった後であれば、
従来の方法requestViewControllerWithCompletionHandler:でもビューを作成できました。

10.13では内包アプリを起動してもすぐにはサードパーティ製ホストアプリで認識できないため、
このような修正が必要になってしまったということかもしれません。

というか、最初からAudioUnitV3Exampleの実装を真似しましょうという話ですね。

自作V3 AudioUnitを10.13のサードパーティ製ホストアプリで認識させる

NOTE: English article is available.

10.13では、従来のように内包アプリを起動するだけではダメそうでした。
自作AUを認識させたい場合、
  1. auval -a で自作AUが認識されないことを確認する
  2. 自作AU内包アプリをビルドする
  3. ログアウトまたはマシンを再起動する
  4. ログインする
  5. auval -aで自作AUが認識されていることを確認する
ログインし直すのがポイントでしょうか。あと、アプリを起動する必要は無いっぽいです。

逆に、自作AUをこれ以上認識させたく無い場合、
  1. auval -a で自作AUが認識されていることを確認する
  2. 自作AU内包アプリを削除する(ゴミ箱からも削除する)
  3. ログアウトまたはマシンを再起動する
  4. ログインする
  5. auval -aで自作AUが認識されないことを確認する
なお同じアプリが複数存在する場合、全て削除する必要がありそうです
例えば、DebugビルドとReleaseビルド、Archiveビルド(?)は
別々のディレクトリ(~/Library/Xcode/DerivedData/...)に生成されるため、
これらを全て削除しなければいけないようです。
(Xcode上でCleanを実行しても別Configurationのビルドは削除されないので注意が必要です)

2017年10月6日金曜日

自作のV3 AudioUnitが10.13で動かなかった

NOTE: English article is available.

開発環境はXcode9.0, macOS 10.13です。

AVAudioUnitインスタンスが作れない

+[AVAudioUnit instantiateWithComponentDescription:options:completionHandler:]でAVAudioUnitインスタンス作成に失敗していました。
completionHandler内のerrorを出力してみると、
Error Domain=NSOSStatusErrorDomain Code=-3000 "invalidComponentID"
というエラーが出ていました。

試行錯誤の結果、ホスト側のSandbox化をoffにすることでインスタンスを作成できるようになりました。
なお、Appleのサンプルコード「AudioUnitV3Example」でもホスト側はSandboxがoffになっているようでした。

ちなみに、Sandboxがonでも+[AUAudioUnit instantiateWithComponentDescription:options:completionHandler]ではインスタンスを作れていたので、こちらに置き換えるのも良いかもしれません。
ついでにAudioComponentInstanceNew()も試しましたがダメでした。

AUViewControllerが作れない

数時間かけてようやくインスタンスが作れるようになったものの、
今度はビューが表示されないという問題が発生しました。

-[AUAudioUnit requestViewControllerWithCompletionHandler:]をコールしてもcompletionHandler内のviewControllerがnilになってしまいます。

ビューコントローラのメソッドにトレースを仕込んでみましたが、
そもそもオブジェクトが生成すらされてないようです。

AudioUnitV3Exampleは-[ViewController embedPlugInView]でバンドルから直接ビューを作っているようなので、
こちらに実装を変更するのが良さそうです。(未着手)

雑感

10.13だと.appexを内包するアプリを起動してもauval -aで表示されるリストの中に自作AUが表示されないようですね。
ということは他のホストアプリから使えないということになるはずなので、
こちらも解決しないといけませんね。

めんどくさい!

つづく…

2017年10月5日木曜日

vecLibが10.13でリンクできなかった

10.13上のXcode 9.0では
cannot link directly with /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk/System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/vecLib.tbd for architecture x86_64

と表示されビルドできないケースが有りました。

結局、vecLib.frameworkとvImage.frameworkにリンクしないようにすることで解決しました。
Accelerate.frameworkをプロジェクトに追加してない場合、
追加してリンクするようにした方が良いでしょう。
私のケースでは既にAccelerate.frameworkにリンクしていたので、vecLibとvImageを削除するだけで済みました。

Mac用速度可変プレーヤ ListeningHelper-2.0b2 リリース

Mac用速度変更機能付きオーディオプレーヤ ListeningHelper2.0b1 をリリースしました。

変更点は以下の通りです。

  •  10.13で再生位置スライダが表示されない問題の修正
ダウンロードはこちらから。

2017年6月30日金曜日

Macでexcelの表をredmineに貼る

手順:

こんな感じで範囲選択して



Cmd+Cまたは[編集]-[コピー]を選択してクリップボードに保存する。

ターミナルを開き、

$ pbpaste | tr '\r' '\n' | sed -e 's/^/|/g' | sed -e 's/$/|/g' | sed -e 's/       /       |/g' | pbcopy

を実行。

redmineのコメント欄に貼り付けてプレビューすると


このような表になるぞ!

コマンド解説:

pbcopy, pbpasteはそれぞれコピーとペーストと同じ動作。

ただし、Macなせいか改行コードがCRのままなので、まずtrでLFに変換する。

続いてsedで行頭と行末、そしてタブ直後に"|"を付加する。

なお、最後のsedの空白部分はCtrl-Vを押した後にタブを押す。
(参考: mac OSX で sedを使ってtabの文字列を置換 - Qiita)


うーん、数回程度ならスクショ撮って貼る方が楽かなw

2017年3月13日月曜日

Mac用速度可変プレーヤ ListeningHelper-2.0b1 リリース

Mac用速度変更機能付きオーディオプレーヤ ListeningHelper2.0b1 をリリースしました。

ListeningHelper-2.0b1.zip - Dropbox

スクリーンショット


ListeningHelper-2.0b1操作風景動画

独自のUIに変更した他、速度やピッチを反映したファイルを書き出せるようになりました。
詳細は以下の通りです。

 ソフトウェア名:ListeningHelper
  ソフトの概要:速度変更機能付き簡易オーディオプレーヤ。
   バージョン:2.0β1
  取り扱い種別:フリーウェア
      作者:鮭山楽器
  インストール:zipファイルを展開後、ListeningHelperをお好みのディレクトリに
         移動してください。
アンインストール:ListeningHelper本体、および~/ライブラリ/Containers内にある
         com.shakeyama-mi.ListeningHelperを手動で削除してください。
    動作環境:Mac OS X 10.11 以上
 作者への連絡先:鮭山楽器 / メール: shakeyamami@gmail.com / Twitter: @shakeyamami

--

●使い方

ファイル選択:
 Openボタンをクリックしてダイアログを開き、ファイルを選択します。

ファイル再生/停止:
 Playボタンをクリックします。再度クリックすると停止します。

再生範囲調整:
 再生位置インジケータ両端にある三角のマーカーをドラッグすることで再生範囲を調整します。

再生位置調整:
 再生位置インジケータ内の再生位置ラインをドラッグすることで再生位置をシークできます。

ループ再生:
 再生範囲終端まで再生すると、自動で始端まで戻りループします。

再生速度調整:
 Rateスライダをドラッグすることで速度を調整します。
 スライダ右にあるテキストボックスからも調整できます。

再生ピッチ調整:
 Pitchスライダをドラッグすることでピッチを調整します。
 スライダ右にあるテキストボックスからも調整できます。

AIFFファイル書き出し:
 Exportボタンをクリックしてダイアログを開き、ファイル名と保存場所を指定します。
 速度とピッチを反映した音声データが保存されます。
 
●開発環境
 MacBook Pro (Late 2012)
 Mac OS X 10.12.3
 Xcode 8.1 (8B62)

●動作確認環境
 MacBook Pro (Late 2012) / Mac OS X 10.12.3

●既知の問題点
 ・正常に再生・保存できない場合がある。
  他のフォーマットに変換したものを読み込むか、旧バージョン(1.0)を使用してください。
 ・再生開始直後、または保存したファイルの先頭に、意図しない音声データが入る場合がある。
 ・HDD上やネットワーク上のファイル再生時に音が途切れる。

●更新履歴
2017/03/04 1.0リリース
2017/03/13 2.0β1リリース
英会話リスニングの練習や音楽の耳コピのお供にどうぞ。

2017年3月10日金曜日

ffmpegでwebmに変換したかった

web味スレで見かけたffmpeg用のwebm変換コマンド

-c:v libvpx-vp9 -maxrate 400k -bufsize 1835k -b:v 129k -threads 1 -cpu-used 1 -tile-columns 0 -frame-parallel 0 -auto-alt-ref 1 -lag-in-frames 25 -g 240 -aq-mode 0 -deadline good -c:a libopus -ar 48000 -b:a 47k

を試してみました。

参考: 2mbっでなかなかきつくない?スレ画が画像だし技術論スレ?きついけ - ふたろぐばこ-二次元裏may@ふたば過去ログ保管庫
が、
"Unrecognized option 'cpu-used'"
というエラーが出てしまいました。
そもそもwebm用のライブラリが入ってなかったようで、試行錯誤の結果

$ brew reinstall ffmpeg --with-libvpx --with-opus

としてffmpegを再ビルドすることで変換できるようになりました。


というわけで、早速自作動画(24.3MB, 1分半)を変換してみました。


うーん、2.4MB。しかも茂みのような動きの速いシーンは画質が下がりますね。
とっしーがきついきつい言ってたのも今ならよくわかる。

Mac用咲-Saki-スレ読み上げアプリSakimon 1.8リリース

Sakimon1.8をリリースしました。

Sakimon1.8.zip - dropbox

変更点は以下の通りです。
  • 画像が表示されない問題の修正
  • 検索語変更時にスレッドブラウザがクリアされない問題の修正
  • スレッドブラウザ内のコメントの順番を逆(新規が上)になるよう修正
最近は咲スレを見なくなってしまったので、
次回更新時はアプリ名自体変更するかもしれません。

2017年3月7日火曜日

GME(Game_Music_Emu)のFDS対応版

GMEはFDS未対応のようです。

参考: Game_Music_EmuはFDS未対応です:>FDS対応なのはGameEmuPlayer(foo_gep.dll)の独自拡張ですね:l50 - モナラ

上記サイトによると、kode54という人が独自にFDSを実装しているようでした。
で、少し調べたところ、CogというMac用音楽プレーヤのソースが公開されていました。

参考: Christopher Snowhill / Cog · GitLab

どうやらファイルツリーの ./Frameworks/GME/gme/Nes_Fds_Apu.cpp が
FDSの実装なのではないかと思います。

ちなみにCogというプレーヤは.nsf、.spcなどの再生に使えるので、
素のGMEを使っているAudio OverloadやVLCよりも良いかもしれません。