もし、曲をつなげて一曲にしてしまうスクリプトがあったら、
Quicktimeでアルバムが聴けるのにとブログにと書いたら、
Westacularさんの作ったスクリプトを40番さんに教えていただいた。
いい情報ありがとうございました。ブログをやって良かったと感じました。
そのスクリプトを私なりにモディファイしてみた。
以下は変更点。
1. Chapter番号しか表示されなかったので、
曲名がチャプターに表示されるようにした。
2. ファイルをつなげた後、ポインタが先頭に来るようにした。
(スタートボタンを押せば、すぐ再生出来るようにした。
オリジナルバージョンでは最後の位置)
3. 高域を少し持ち上げた。
(私のシステムではこれぐらいがちょうどいい)
アルバム名も表示されるようにしたいが、現在アイデアなし。
誰か、そこだけ作ってくれるとありがたい。
以下はモディファイしたスクリプト。
赤字は私がモディファイしたところ。
on run {input, parameters}
tell application "Finder" to set input
to sort input by name
repeat with i from 1 to the count of input
set this_item to (item i of input)
tell application "QuickTime Player"
if i is equal to 1 then
make new movie
end if
open this_item
tell movie 1
set MusicName to name of this_item
rewind
select all
copy
select none
end tell
close movie 1 saving no
tell movie 1
add
select none
if i is equal to 1 then
set this_track to make new track at beginning with data "Chapter 1"
set enabled of this_track to false
set the name of this_track to "Chapter Track"
set chapterlist of track 1 to track "Chapter Track"
set the movie_length to the duration
tell chapter 1
set the time to 0
set the duration to movie_length
set the name to MusicName
end tell
else
set the newmovielength to the duration
set the duration of this_track to newmovielength
set the chapter_list to the name of every chapter
set the new_chapter_list to chapter_list & (i as string)
set the contents of the current chapter track to the new_chapter_list
set the time of chapter i to movie_length
set the duration of chapter i to newmovielength - movie_length
set the name of chapter i of this_track to MusicName
set movie_length to the duration
end if
end tell
end tell
end repeat
tell application "QuickTime Player"
tell movie 1
set treble gain to 95
rewind
end tell
end tell
return input
end run
Quicktimeでアルバムが聴けるのにとブログにと書いたら、
Westacularさんの作ったスクリプトを40番さんに教えていただいた。
いい情報ありがとうございました。ブログをやって良かったと感じました。
そのスクリプトを私なりにモディファイしてみた。
以下は変更点。
1. Chapter番号しか表示されなかったので、
曲名がチャプターに表示されるようにした。
2. ファイルをつなげた後、ポインタが先頭に来るようにした。
(スタートボタンを押せば、すぐ再生出来るようにした。
オリジナルバージョンでは最後の位置)
3. 高域を少し持ち上げた。
(私のシステムではこれぐらいがちょうどいい)
アルバム名も表示されるようにしたいが、現在アイデアなし。
誰か、そこだけ作ってくれるとありがたい。
以下はモディファイしたスクリプト。
赤字は私がモディファイしたところ。
on run {input, parameters}
tell application "Finder" to set input
to sort input by name
repeat with i from 1 to the count of input
set this_item to (item i of input)
tell application "QuickTime Player"
if i is equal to 1 then
make new movie
end if
open this_item
tell movie 1
set MusicName to name of this_item
rewind
select all
copy
select none
end tell
close movie 1 saving no
tell movie 1
add
select none
if i is equal to 1 then
set this_track to make new track at beginning with data "Chapter 1"
set enabled of this_track to false
set the name of this_track to "Chapter Track"
set chapterlist of track 1 to track "Chapter Track"
set the movie_length to the duration
tell chapter 1
set the time to 0
set the duration to movie_length
set the name to MusicName
end tell
else
set the newmovielength to the duration
set the duration of this_track to newmovielength
set the chapter_list to the name of every chapter
set the new_chapter_list to chapter_list & (i as string)
set the contents of the current chapter track to the new_chapter_list
set the time of chapter i to movie_length
set the duration of chapter i to newmovielength - movie_length
set the name of chapter i of this_track to MusicName
set movie_length to the duration
end if
end tell
end tell
end repeat
tell application "QuickTime Player"
tell movie 1
set treble gain to 95
rewind
end tell
end tell
return input
end run
1.チャプターをファイル名にすると日本語が文字化けしてしまう。
2.チャプター用のテキストファイルがないので「参照ムービーとして保存」ができない。(保存時に選択はできるが、実際には独立再生形式で保存される)
とくに参照ムービーにできないのが残念です。これにすれば、もとのAIFFファイルを直接参照して再生するので、音質劣化が避けられます。
ということで、上記の問題をクリアしたソフトを今作ってます。かなりイイところまで仕上がってるので、お楽しみに。
今朝気づきました。
また、Westacularさんのスクリプトのスクリプトで出来たファイルを
保存しない方がいい音のように感じました。
(きちんと聞き直さなければいけませんが)
これも40番さんのおっしゃっていることが正しいと思います。
ソフトの完成、楽しみにしております。
http://www.box.net/shared/c97ux75ics
どうぞ良かったらお使いください(Mac OSX 専用です)。
使い方等の詳細は同梱の「Read Me」に書いておきました。
このソフトは前準備(QuickTime Player への関連付け)は不要です。それから、チャプター用のテキストファイルがなくても「参照ムービー」に保存できました。あの AppleScript がどうして参照ムービーにできないのか不明です…。
音質は、AIFF ファイルを直接再生した音より、若干角が取れたような感じに聴こえました。微妙なところです。
ソフト使ってみました。
マイリストが作れるところが良いですね。
日本語表示にするのも大変な作業のようですね。
私は少しの変更するだけでも一苦労ですが、
40番さんぐらいのスキルがあると色々出来て楽しいでしょうね。
このソフトはどの言語で作ったのでしょうか?
アップルスクリプトを勉強してみたいのですが、
お勧めの入門書やホームページがありましたら
教えていただけませんでしょうか?
プログラム例(特にQuicktime)が多いとうれしいのですが。
REALbasic です。本当は Xcode で作れれば良いのですが、スキルがしょぼしょぼなので、もっぱらこれで楽しんで作ってます。
AppleScript はなかなか良い参考書がありませんね。信助さんはある程度のカスタマイズができる方なので、やりたい処理をネット検索で探して、他の方が書いたコードを参考にするのがベストだと思います。アプリケーション形式で配付されていても、スクリプトエディタで中のコードを見れるものもありますし、やはり他人のコードを見るのが一番参考になりますね。
ところで、QuickTime ムービーですが、参照ムービーで保存してもかなり音質が劣化してしまいますね。どうもインターネット・ストリーミング向けにサウンドをわざと品質を下げて(圧縮して)再生しているようです。通常の「保存」ではどうしてもこうなってしまいます。
解決方法としては、保存ではなく「書き出し」の機能を使って、サウンドを「最高品質」に設定すれば、劣化の度合いは少なくなります。ただこの方法ですと、独立再生形式にするしかなく、しかもチェプターもなくなってしまいます。文字コードの件もそうですが、QuickTime は思いのほかできることが限られているので驚きました。
一応、上記をふまえてソフトを改修してみます。未保存の連結ムービーをAIFFに書き出す機能も追加できればと思っております。
昔、マシン語やベーシックでプログラムを作っていたのですが、
最近の言葉は高尚すぎて、敷居が高いです。
もっとも、音楽データを切り貼りするプログラムを簡単に書けるのは、夢のようですが。
もう少し確認をしてから書いた方が良いかもしれないのですが、
Westacularさんのプログラムで作った連結ファイルと、
40番さんに作っていただいたプログラムで作った連結ファイルの
音を聞き比べて、Westacularさんの方が音が良いように感じました。
どちらも保存する前のファイルを比較したので、どちらも同じ音になるはずなのですが、
40番さんに作っていただいた方の音はハイ下がりに感じました。
2回ほど聞いてみたのですが、どちらも、そのように感じました。
間違っていたら、失礼なので、もう少しチェックしたかったのですが、
早くお知らせた方が良いかもしれないと思い、書きました。
せっかく作っていただいたのに文句を言って申し訳ありません。
> 昔、マシン語やベーシックでプログラムを作っていた
でしたら REALbasic はかなり敷居が低いはずです。購入金額がちょっと高くて、日本では人気も活気もないので強くお薦めはできない状況ですけど、遊んで楽しむには良い玩具です。
そこで、そもそもの初めに戻って、AppleScript で連続自動再生するのがやはりベストなのではと考えました。で、作ってみたのが以下のスクリプトです。アプリケーション形式で保存してドラッグ&ドロップで使います。
on open these_items
try
set QTpath to quoted form of POSIX path of (path to application "QuickTime Player")
tell application "Finder" to set sorted_items to sort these_items by name
repeat with this_item in sorted_items
set itemPath to quoted form of POSIX path of (this_item as Unicode text)
do shell script "open -a " & QTpath & " " & itemPath -- QuickTime Player で開く
tell application "QuickTime Player"
tell document 1
rewind
select none
start
repeat until not playing
delay 1
end repeat
close
end tell
end tell
end repeat
end try
end open
「repeat until not playing ~ delay 1 ~ end repeat」のところで、再生が終了したかどうかを1秒ごとに確認しています。終了していれば次のファイルを開いて再生をはじめます。
「do shell script」で ファイルをちゃんと QuickTime Player で開くようにしているので、関連づけは不要です。
「try ~ end try」で囲っているのは、ユーザが途中で QuickTime Player を終了するとエラーメッセージが出るので、それを出さないようにするためです。
欠点はギャップレス再生ができないことですが、音質を考えるとこれがベストでしょうね。
シンプルなプログラムで書けてしまうのですね。びっくりしました。
音を聞いてみたのですが、普通のQuicitime一曲再生やWestacularさんのスクリプトと同じ音のように感じました。ただ、今日少し疲れているので細かいところは聞き取れていないかもしれません。
40番さんのプログラムを使っていて、一時停止をすると次の曲の再生が始まってしまう点、ボリュームを絞って聞いているとき、次の曲始まるときにフルボリュームになってしまう点が気になりました。
Westacularさんのスクリプトを修正して日本語表示することが出来れば、それらの点も音質の問題も解決出来ると思うのですが、難しそうでしょうか?
try
set myVol to 256 -- 最初はフルボリューム
set QTpath to quoted form of POSIX path of (path to application "QuickTime Player")
tell application "Finder" to set sorted_items to sort these_items by name
repeat with this_item in sorted_items
set itemPath to quoted form of POSIX path of (this_item as Unicode text)
do shell script "open -a " & QTpath & " " & itemPath -- QuickTime Player で開く
tell application "QuickTime Player"
set docName to name of front document
tell document docName
rewind
select none
set sound volume to myVol
start
repeat until (not playing) and (current time = duration)
delay 1
end repeat
set myVol to sound volume
close
end tell
end tell
end repeat
end try
end open
こんなところでどうでしょう? 再生中に次のファイルへ移るには、曲の終わりまでジャンプさせて「current time = duration」にしてしまえばOKです。
> Westacularさんのスクリプトを修正して日本語表示することが出来れば
あのスクリプトでは「あ」が「0B」と文字化けします。これはVB風に言うと「chr(asc("あ"))」というような処理をしているとしか考えられません。つまりASCII文字列であることを大前提にしているわけで、この QuickTime Player の仕様では日本語の処理はどうやっても不可能だと思います。
私がRbで作ったソフトでは、Text Track を作成する最も真っ当な方法を採用しています。
http://www.apple.com/quicktime/tutorials/texttracks.html
↑このような text track descriptors を生成して、連結したムービーへ追加しています(日本語はこの方法でしかチャプターにできません)。
ムービーを連結する処理は Westacular さんとまったく同じことをしていますので、この「Text Track を作成する最も真っ当な方法」が音を悪くさせている原因かもしれません。だとすると、これも「仕様」ということで、打つ手はありませんね…。
QuickTime Player の仕様で日本語表示出来ないのですね。Appleがもう少し、親切にQuickTimeの設計をしてくれたら良かったですね。曲をMovieに貼付けると音は悪くなりそうでしょうか?曲名をムービーに貼付けて、チャプターは曲番だけなんてのも考えたのですが。
40番さんに作っていただいたスクリプトを少し自分好みに変えてみました。
最初の曲は自動で再生せずに、手動でスタートする形にしてみました。
(いきなりフルボリュームで始まらないように)
音は明日、朝、起きてから聞いてみます。
on open these_items
try
set myVol to 256 -- 最初はフルボリューム
set StopFlag to "True" -- 1曲目は自動再生させないためのフラグ
set QTpath to quoted form of POSIX path of (path to application "QuickTime Player")
tell application "Finder" to set sorted_items to sort these_items by name
repeat with this_item in sorted_items
set itemPath to quoted form of POSIX path of (this_item as Unicode text)
do shell script "open -a " & QTpath & " " & itemPath -- QuickTime Player で開く
tell application "QuickTime Player"
set docName to name of front document
tell document docName
rewind
select none
set sound volume to myVol
if not StopFlag is "True" then
start
end if
set StopFlag to "False"
repeat until (not playing) and (current time = duration)
delay 1
end repeat
set myVol to sound volume
close
end tell
end tell
end repeat
end try
end open
ところで追加した箇所ですが、「set StopFlag to true」と文字列ではなく boolean 値を代入して大丈夫ですよ。boolean にしておくと
if not StopFlag is "True" then
start
end if
↑これを「if not StopFlag then start」とギリギリまで簡略に書けます。
こういった省略の仕方を知っておくと、人の書いたスクリプトを読むのがぐっと楽になりますね。
今日、こんなページを見つけました。
http://docs.info.apple.com/help/guide.html?path=AppleScript/2.1/jp/
実は私、AppleScript はちょっと苦手なので、これで勉強します。
boolean値がApplescriptで使える事もしらない私でした。
40番さんに作っていただいた修正版のアップルスクリプトの音質を真剣に聞き直したのですが(Airfoil経由で)、Quicktime一曲再生や、Westacularさんのスクリプトの音に比べて、若干音質が落ちる感じがしました。エコーが落ちて、天井が低くなるような印象でした。せっかく作っていただいたのに、また、ケチをつけてすいません。恐らく、一秒おきにApplescriptがQuicitimeにアクセスしているせいじゃないかと感じています。音質をキープしたまま利便性を上げるのはとても難しいと感じました。
Westacularさんのスクリプトの日本語表示はいろいろやってみたのですが、難しいですね。PropertiesのLanguageを日本語に変えれたらと思ってチャレンジしてみたのですが、System defaultから変更出来ませんでした。日本語はあきらめてWestacularさんのスクリプトを使うのが一番音質には良いかもしれません。
text trackを使ってチャプタに日本語を表示させる方法は、Westacularさんのスクリプトの方法と根本的に違うみたいですね。Westacularさんのスクリプトはダイレクトにチャプタを作って、text trackを使う方法はtextをMovieに書き込んでいるみたいです(Movieは表示されませんが)。音楽再生中にMovie処理もしているので音質が落ちるのかなと思っています。
Westacularさんが使った方法で日本語が扱えるようにQuicktimeの仕様が変わってくれれば良いのですが。
「set the language of this_track to 11」
「set the language of this_track to "Japanese"」
どちらでもできますよ。
でも、それにしても日本語が化けるんですよね。
「open」でテキストファイルを開いて作る track では化けないのに、
「make new track」でユーザが作った track だと化けてしまうのは
もうバグなんだと思います。いつか治るといいですね。
> エコーが落ちて、天井が低くなるような印象でした。
こちらでもそういう印象でした。悪い音です。
微細情報がなくなってしまった感じですね。
さらにチャプターを付けると、今度はスカスカ気味の音になります。
ん~、難しい!
でも勉強になって、とても面白かったですよ。
Quicitimeの日本語表示が厳しいようなので、ファイル名が日本語かどうか判断して、ファイルが日本語でなければ、私がモディファイしたスクリプトで曲名表示、日本語であれWestacularさんのスクリプトでチャプター表示というスクリプトを考えています。ファイルが日本語かどうかの判断はApplescriptで出来そうでしょうか?
また、フォルダを選択してファンクションキーなどを押したら自動でアップルスクリプトが立ち上がり、フォルダ中の曲をつなげるというスクリプトが便利かなと思っています。これまでの方法では、全曲を選択する操作とAutometorを起動するためのプルダウンが面倒なので。指定されたフォルダをどのようにアップルスクリプトで認識するかと、ファンクションキーでアップルスクリプトを立ち上げることが出来るのかが良くわかりません。どこかでそんなスクリプトを見たとか情報がありましたら教えていただけませんでしょうか?
Applescript だけでは無理かも。私でしたら「do script」で Perl か iconv を使って、テキストエンコーディングを変換してみます。Westacularさんのスクリプトでは US-ASCII しか受け付けなさそうなので、
とにかくファイル名を US-ASCII に変換してみる。
→ 変換後も同じで変化がなかったらファイル名を使う
→ 変化してイコールじゃなかったら Chapter X にする
こんな感じでしょうか。…って、できるのかな?
面白い課題なので私もちょっとやってみます。
> 指定されたフォルダをどのようにアップルスクリプトで認識するか
選択されたファイルやフォルダでしたら、Finder の「selection」で取得できます。
例)tell application "Finder" to set ItemList to selection
> ファンクションキーでアップルスクリプトを立ち上げることが出来るのか
これも Applescript だけでは無理かも。
http://www16.plala.or.jp/x-tomo/Pages/launcher.html#keyboard
この辺りのフリーウェアで、スクリプト(アプリケーション形式)をFキーに割当てる方法になると思います。
tell application "Finder"
set Select_Items to selection --選択アイテム取得
repeat with theItem in Select_Items --選択アイテムをひとつずつ
if (class of theItem) is folder and number of (items of theItem) > 0 then
-- 属性が folder で、なおかつ中身が空ではない
repeat with i from 1 to number of (items of theItem) --フォルダの中をひとつずつ
set obj to item i of theItem
if (class of obj) is document file and (file type of obj) is "AIFF" then
-- 属性が document file で、なおかつファイルタイプが「AIFF」
set FName to name of obj as Unicode text
-- ファイル名チェック
-- iconv で US-ASCII に変換。変換できない時(文字化けする時)はエラーになるので try で囲っておく
set ASCII_Name to ""
set myScript to "echo '" & FName & "' | iconv -f UTF-8-MAC -t US-ASCII"
try
set ASCII_Name to do shell script myScript
end try
-- 結果で振り分け
if (ASCII_Name as string) is (FName as string) then
-- 文字化けなく変換された
set Use_Name to FName
else
set Use_Name to "Chapter " & (i as string)
end if
--ダイアログを表示して確認
display dialog FName & " → " & Use_Name
end if
end repeat
end if
end repeat
end tell
-- ファイル名チェック
-- piconv で ASCII に変換。
set ASCII_Name to ""
set myScript to "echo '" & FName & "' | piconv -f utf8 -t ascii"
set ASCII_Name to do shell script myScript
この方がずっとスマートです。tryで囲う必要もありません。「piconv」は AppleScript 内でエンコーディング変換をするのに、汎用的に使えます(変換できない文字は半角の ? になりますけど)。
ファイル名に”’”がついているとエラーが起きるようです。「Finder でエラーが起きました:sh: -c: line 0: unexpected EOF while looking for matching `'' sh: -c: line 1: syntax error: unexpected end of file」とエラー表示されます。
set myScript to "echo '" & FName & "' | piconv -f utf8 -t ascii"の命令がまだ良く理解出来ていないのですが、ファイル名に"'"があると、echo以下に"'"が3つで来てしまい、構文エラーになると思われます。"'"は日本語ではないので、set FName to name of obj as Unicode textの直後で、ファイル名に"'"があったら取ってしまうプログラムを入れれば解決するように思いました。自分ではどうやっていいか分かりませんが... すいません。
set myScript to "echo " & (quoted form of FName) & " | piconv -f utf8 -t ascii"
これでOKです。「quoted form of 」とすることで、AppleScript が
・文字列の前後にシングルクォートを付ける。
・文字列の中にシングルクォートがあれば、それをエスケープ処理する。
この2つを自動的に上手くやってくれます。
例)ABC'DEF → 'ABC'\''DEF' (\は半角のバックスラッシュ)
文字列の前後にシングルクォートを付けるのは、shell に「これは文字列だぞ」と明示するためです。
tell application "Finder"
set Mojibake to false
set Select_Items to selection --選択アイテム取得
repeat with theItem in Select_Items --選択アイテムをひとつずつ
if (class of theItem) is folder and number of (items of theItem) > 0 then
-- 属性が folder で、なおかつ中身が空ではない
repeat with i from 1 to number of (items of theItem) --フォルダの中をひとつずつ
set obj to item i of theItem
if (class of obj) is document file then
set FName to name of obj as Unicode text
-- piconv で ASCII に変換。
set ASCII_Name to ""
set myScript to "echo " & (quoted form of FName) & " | piconv -f utf8 -t ascii"
set ASCII_Name to do shell script myScript
-- 結果で振り分け
if not (ASCII_Name as string) is (FName as string) then
-- 文字化けなく変換された
set Mojibake to true
end if
end if
end repeat
end if
end repeat
if Mojibake is true then
set a to Westacular()
else
set a to Nobusuke()
end if
end tell
on Westacular()
tell application "Finder"
display dialog "文字化けあり"
end tell
end Westacular
on Nobusuke()
tell application "Finder"
display dialog "文字化けなし"
end tell
end Nobusuke
option キーを押しっぱなしで iTunes を起動すると
「iTunes ライブラリを選択」のダイアログが表示されます。
[ライブラリを作成...]ボタンで ramdisk を選択して、そこを新規ライブラリにしてしまえば OK です。
> 自然な音でいい音でした(高域がきれいに延びる)
ですねよ。本当の帯域バランスで再生されている感じです。
1.サブルーチンの呼び出しに「my」を付けていない。
2.サブルーチンの呼び出しが repeat の外に書いてある。
3.「set Mojibake to false」が repeat の外に書いてある。
↓こうすると上手くいきます。
-- 結果で振り分け
set Mojibake to false --チェックするたびにfalseにする
if not (ASCII_Name as string) is (FName as string) then
-- 文字化けなく変換された
set Mojibake to true
end if
--直後にサブルーチン呼び出し
if Mojibake is true then
set a to my Westacular()
else
set a to my Nobusuke()
end if
「repeat ~ end repeat」でファイルをひとつずつ繰り返して処理していますから、repeat の中に書くのです。
ありがとうございます。
教えてもらわなかったら相当悩んでいたと思います。
フォルダの中に一つでも日本語のファイルがあったら、すべてWestacularさんのプログラムで連続ファイルを作ろうと思っていて、repeat ~ end repeatの外にサブルーチン呼び出しを書いていました。でも、英語表記出来るファイルは出来るだけ、曲名が表示されるようにした方が良いような気がしてきました。私が良く聞いているアン・サリーのライブ盤は数曲しか日本語の曲が入っていないのに、すべて曲名が表示されないのはもったいないと思えてきました。
> 一つでも日本語のファイルがあったら、
> すべてWestacularさんのプログラムで連続ファイルを作ろうと
なるほど! そういう意図だったんですね。大変失礼しました。
「my」はそもそも「ローカル変数」を示すために使います。これをサブルーチン名に付けることで、「tell application "xxx"」 で呼び出しているアプリケーション(今回は Finder)にローカル変数だと認識させるわけです。そうしないと、アプリケーション は「Westacular()」「Nobusuke()」をそのまま自分自身への命令だと受け取るので「意味わかんないよ」とエラーになってしまうんですね。
サブルーチン処理は呼び出したアプリケーションではなく、AppleScript がするので、こういう手間が必要となります。
ちなみに「tell application "xxx" ~ end tell」の外でサブルーチンを呼び出す場合は、イコール AppleScript への命令ですから my を付ける必要はありません。