2行単位のソート(シャッフル)No.05158
yamasan さん 06/06/23 15:53
 
こんにちは。ヨロシクお願いします。

PCの音楽再生ソフトで作成したプレイリストを、
再生順をランダムに並び替えたいのですが、
それを、秀丸で行いたいのです。

Winampというソフトを主に使っていまして、
プレイリストを開くと、

#EXTM3U
#EXTINF:422,名曲アルバム - 軽騎兵
E:\mp3\名曲アルバム\軽騎兵.mp3
#EXTINF:213,遙かなる山の呼び声
E:\mp3\04\遙かなる山の呼び声.mp3
#EXTINF:167,エデンの東
D:\mp3\02\エデンの東.mp3
#EXTINF:160,ゴッドファーザー 愛のテーマ
D:\mp3\01\ゴッドファーザー 愛のテーマ.mp3

と言う様になっています。(900曲ぐらいあります)

ですので、
^#EXTINF.+\n.+\.mp3$
これをランダムに並べ替えたいのですが、
どうにも分かりません。

申し訳ないのですが、
どうにか、お願いできませんでしょうか?

[追伸]
  Winampでランダム再生するのは、どうにも上手くありませんので、
  MusicMatchというので、プレイリストを読み込み、
  再生順をシャッフルして、保存し、それを使っています。
  厚かましいと思うのですが、どうぞ、お知恵をお貸し下さい。

[ ]
RE:05158 2行単位のソート(シャッフル)No.05159
たけのこ さん 06/06/23 16:11
 
こんにちは、たけのこです。

>^#EXTINF.+\n.+\.mp3$
>これをランダムに並べ替えたいのですが、
>どうにも分かりません。

単純にソートなら簡単にできますが(一行目の改行を、何か別の文字列に置換し、
ソート後に改行に戻せばいい)、アットランダムなものは秀丸の関数に乱数を発
生させる仕組みがない(ハズ?)のでムリではないでしょうか? WSHとかをマ
クロから呼び出すんであれば、最初から最後までWSHでやった方が楽でしょうし。

>[追伸]
>  Winampでランダム再生するのは、どうにも上手くありませんので、

/*
んー。何が「上手くありません」なのかよくわかりませんが……。
私はAlbumListを使ってます。アルバム内シーケンシャル再生、アルバムの最終
曲再生後にアットランダムに次のアルバムが選ばれるので、結構自分の聴き方に
あってます。
*/



では! (^v^)/~

[ ]
RE:05159 2行単位のソート(シャッフル)No.05160
yamasan さん 06/06/23 17:27
 
たけのこさん、こんばんは。ありがとうございます。

>単純にソートなら簡単にできますが(一行目の改行を、何か別の文字列に置換し、
>ソート後に改行に戻せばいい)、アットランダムなものは秀丸の関数に乱数を発
>生させる仕組みがない(ハズ?)のでムリではないでしょうか? WSHとかをマ
>クロから呼び出すんであれば、最初から最後までWSHでやった方が楽でしょうし。

改行を他の文字列に置換するというのは、なるほどです。
Windows Script Host?っていうんですか?
それは、分かりませんし・・。

そうですか。乱数表は、秀丸に持ってこれないのですか。

--------------
>んー。何が「上手くありません」なのかよくわかりませんが……。

これは、自分の感覚です。
1日に、5時間以上、BGMで流しますが、
ランダム再生だと、ある曲を再生する間隔に、違いが生じるような気がして。

それに、どの辺りを再生しているのか確実に把握したいし。
目で見ている順番通りに再生して欲しいときもあるし。

でも、難しいようですね。諦めます。


>私はAlbumListを使ってます。アルバム内シーケンシャル再生、アルバムの最終
>曲再生後にアットランダムに次のアルバムが選ばれるので、結構自分の聴き方に
>あってます。

今後の参考にさせていただきます。ありがとうございました。

[ ]
RE:05160 2行単位のソート(シャッフル)No.05162
K'zawa さん 06/06/23 20:23
 
>改行を他の文字列に置換するというのは、なるほどです。

どうしても必要でなければ、「#」で始まる行を
全部消すとゆう方法もありますが。

[ ]
RE:05158 2行単位のソート(シャッフル)No.05164
白雲斎 さん 06/06/23 21:43
 
こんにちは yamasan さん、白雲斎です。

末尾のマクロはいかがですか?
ただし、Winampのプレイリストの意味するところを知らないので、マクロを実行
する前の準備はご自身で行なってください。
例えば、
>#EXTM3U
を切り取っておくとか・・・。

※極めて適当なマクロなので、過度の期待はしないでください。

disabledraw;
replaceallfast "^(#.+)\n([^#])", "\\1¶\\2", regular;
if( result == 0 ) endmacro;
gofiletop;
while( code != eof )
{
    insert str(tickcount / lineno % 9) + ":";
    if( lineno == linecount2 ) break;
    movetolineno 1, lineno + 1;
}
selectall;
run "sort.exe <con >con";
replaceallfast "^[0-9]+:", "", regular;
replaceallfast "¶", "\n", regular;
gofiletop;
enabledraw;
endmacro;

[ ]
RE:05162 2行単位のソート(シャッフル)No.05167
yamasan さん 06/06/25 12:19
 
K'zawaさん、こんにちは。

>どうしても必要でなければ、「#」で始まる行を
>全部消すとゆう方法もありますが。

ありがとうございます。
そうですね。このご助言を元に、考えてみます。
ありがとうございました。

[ ]
RE:05164 2行単位のソート(シャッフル)No.05168
yamasan さん 06/06/25 12:33
 
白雲斎さん、こんにちは。yamasanでございます。

以前から、色々とお世話になっております。
ありがとうございます。今回も、出来ましたら、
もう少し、お教え下さい。お願いします。

>末尾のマクロはいかがですか?

ありがとうございます。希望通りに、なりました。
感謝申し上げます。
sort.exeというのを用いるんですね。知りませんでした。
素晴らしいです。

ですが、
Winampというもののプレイリストを色々開いて試してみると、
沢山のファイルをディレクトリから追加し、直ぐにWinampを終了すると、
^#EXTINF.+\n
の一行が、追加されていない場合があります。

ですので、
 gofiletop;
 replacedown "#EXTM3U\n" , "" , regular, nohilight;
 replaceallfast "^#EXTINF.+\n" , "" , regular, nohilight;
 if( ! result )  beep;
をお教えのマクロの前に、追加して、
その後に、

 gofiletop;
 insert "#EXTM3U\n";
を加えると、望みが叶う気がしてきております。

そうした場合は、2行でなく一行のソートになるんですが、
どう変更したらいいのでしょうか?
--------------
gofiletop;
replacedown "#EXTM3U\n" , "" , regular, nohilight;
replaceallfast "^#EXTINF.+\n" , "" , regular, nohilight;
if( ! result )  beep;

disabledraw;
selectall;
run "sort.exe <con >con";
replaceallfast "^[0-9]+:", "", regular;
replaceallfast "¶", "\n", regular;
gofiletop;
enabledraw;

gofiletop;
insert "#EXTM3U\n";

endmacro;
--------------
これでは、上手くソートできませんでした。
どうか、ご指導をお願い申し上げます。


[ ]
RE:05168 2行単位のソート(シャッフル)No.05169
K'zawa さん 06/06/25 15:26
 
yamasanさん、白雲斎さん、こんにちは。
K'zawaです。
私は白雲斎さんのマクロを参考に
下記のように変更して使っております。
参考までに。

------------------------------
disabledraw;
gofiletop;
searchdown2 "^#extm3u$",regular,nocasesense;
#header=result;
if(#header){
    $s=gettext(foundtopx,foundtopy,foundendx,foundendy);
    gofiletop;
    selectline;delete;
}
replaceallfast "^(#.+)\n([^#])","\\1¶\\2",regular;
gofileend;
if(linelen2) insert "\n";
gofiletop;
while(lineno<linecount2){
    insert ":";
    movetolineno 1,lineno+1;
}
while(#i<3){
    call Sort;
    #i=#i+1;
}
replaceallfast "^[0-9]+:","",regular;
replaceallfast "¶","\n",regular;
gofiletop;
if(#header) insert $s+"\n";
enabledraw;
endmacro;

Sort:
gofiletop;
while(lineno<linecount2){
    insert str(tickcount/lineno%9);
    movetolineno 1,lineno+1;
}
selectall;
run "sort.exe <con >con";
return;
------------------------------

これなら900曲でもよく混ざるとおもいます。
(あくまでも自分用ですが)

白雲斎さん、参考にさせていただき、
ありがとうございました。


[ ]
RE:05169 2行単位のソート(シャッフル)No.05170
yamasan さん 06/06/25 16:00
 
K'zawaさん、こんにちは。yamasanです。
ありがとうございます。

>私は白雲斎さんのマクロを参考に
>下記のように変更して使っております。

>これなら900曲でもよく混ざるとおもいます。

ありがとうございました〜。
今までにない、シャッフルだと思います。
アトランダムに綺麗に混ざっている感じです。

このマクロを使わせていただきます。

実は、今までのシャッフル方法(MusicMatchを使う)だと、
続けてやればやるほど、偏ってくる箇所があると感じてました。
ですので、異なった方法を探していたのです。

このマクロで、バッチリ希望が叶った感じです。

白雲斎さん、K'zawaさん、お二方にお礼を申し上げます。
どうもありがとうございました。

[ ]
RE:05170 2行単位のソート(シャッフル)No.05171
K'zawa さん 06/06/25 21:27
 
yamasanさん、こんばんは。
またまたK'zawaです。

>今までにない、シャッフルだと思います。
>アトランダムに綺麗に混ざっている感じです。

>このマクロを使わせていただきます。

お役に立てて幸いです。
すべては白雲斎さんのマクロあってのものですが。
その前に作った完全自作のマクロは力技すぎて、
結果も出すが、他の常駐ソフトが死ぬとゆう恐ろしいものでした(笑)。


いまさらですが、

>>Winampというもののプレイリストを色々開いて試してみると、
>>沢山のファイルをディレクトリから追加し、直ぐにWinampを終了すると、
>>^#EXTINF.+\n
>>の一行が、追加されていない場合があります。

yamasanさんが言っておられるのはたぶん
winamp.m3uとゆうファイルだと思うのですが、
このファイルなら #EXTM3U を消しても
winampがまた勝手につけてくれますよ。
#EXTINF〜 の行もwinampを終了時点で
それまで再生した曲に付加されます。
どちらも、ローカルディスク内の音楽ファイルを再生するには、
無くても問題ないです。

では。

[ ]
RE:05168 2行単位のソート(シャッフル)No.05172
白雲斎 さん 06/06/26 02:16
 
こんにちは yamasan さん、白雲斎です。

>そうした場合は、2行でなく一行のソートになるんですが、
>どう変更したらいいのでしょうか?

既に解決なさったようですが、一応投稿しておきます。

disabledraw;
gofiletop;
searchdown2 "^#EXTM3U\n", regular, nocasesense;
if( result ) cut;
else setclipboard "";
replaceallfast "^(#.+)\n([^#])", "\\1¶\\2", regular;
gofiletop;
while( code != eof )
{
    insert str(tickcount / lineno % 9) + ":";
    if( lineno == linecount2 ) break;
    movetolineno 1, lineno + 1;
}
selectall;
run "sort.exe <con >con";
replaceallfast "^[0-9]+:", "", regular;
replaceallfast "¶", "\n", regular;
gofiletop;
if( anyclipboard ) paste;
enabledraw;
endmacro;

[ ]
RE:05171 2行単位のソート(シャッフル)No.05173
yamasan さん 06/06/26 12:14
 
K'zawaさん、こんにちは。お世話になります。

>winampがまた勝手につけてくれますよ。
>#EXTINF〜 の行もwinampを終了時点で
>それまで再生した曲に付加されます。

ハイ、何度か繰り返す内に、気がつきました。
でも、プレイリスト(.m3u)を開くと、必ず付加されるので、
取るのも、無駄じゃないかと思うのも、半分あります。

どっちもあり。ってことですね。
失礼しました。ありがとうございました。

[ ]
RE:05172 2行単位のソート(シャッフル)No.05174
yamasan さん 06/06/26 12:20
 
白雲斎さん、こんにちは。お世話になっております。
ありがとうございます。

マクロを使わせていただきます。ありがとうございます。

>if( anyclipboard ) paste;

この箇所のことだと思いますが、
必ずしも、ソート後の文頭に、
#EXTM3U\n
が、入りません。

このソートするマクロ実行前の、クリップボードの内容が、
文頭に付加されます。

単純に、
insert "#EXTM3U\n";
としていないのは、

この"#EXTM3U\n"が含まれていない場合を想定していると思うのですが、
どうしたらいいのでしょうか?
お教え下さい。お願いします。

[ ]
RE:05173 2行単位のソート(シャッフル)No.05175
K'zawa さん 06/06/26 13:26
 
K'zawaデス。

[#EXTM3U の移動方法]
こんな手もあります。

無視して一緒にソートする。
ソート後、
gofiletop;
searchdown2 "^#EXTM3U\n",regular,nocasesense;
if(result){
    selectline;
    cut;
    gofiletop;
    paste;
}

検索から移動まで一括で終わります。

[ ]
RE:05175 2行単位のソート(シャッフル)No.05176
yamasan さん 06/06/26 14:59
 
こんにちは。yamasanです。

>無視して一緒にソートする。

と言うことは、
------------------------------
disabledraw;
gofiletop;
replaceallfast "^(#.+)\n([^#])","\\1¶\\2",regular;
gofileend;
if(linelen2) insert "\n";
gofiletop;
while(lineno<linecount2){
    insert ":";
    movetolineno 1,lineno+1;
}
while(#i<3){
    call Sort;
    #i=#i+1;
}
replaceallfast "^[0-9]+:","",regular;
replaceallfast "¶","\n",regular;
gofiletop;
if(#header) insert $s+"\n";
enabledraw;
endmacro;

Sort:
gofiletop;
while(lineno<linecount2){
    insert str(tickcount/lineno%9);
    movetolineno 1,lineno+1;
}
selectall;
run "sort.exe <con >con";
return;

gofiletop;
searchdown2 "^#EXTM3U\n",regular,nocasesense;
if(result){
    selectline;
    cut;
    gofiletop;
    paste;
}
------------------------------
これで、良いんですか?

"enabledraw;"と、"endmacro;"
が、マクロの終わりでない箇所にありますが、
これでも良いんでしょうか?

どうぞ、お願いします。

[ ]
RE:05174 2行単位のソート(シャッフル)No.05177
白雲斎 さん 06/06/26 19:28
 
こんにちは yamasan さん、白雲斎です。

>この箇所のことだと思いますが、
>必ずしも、ソート後の文頭に、
>#EXTM3U\n
>が、入りません。

あら、どうしてでしょう?
末尾マクロの「ここに前処理」「ここに後処理」部分に、望む処理を入れてくだ
さい。例えば、「#EXTM3U」が必須のキーワードなら、

    1)  前もって削除する
        searchdown2 "^#EXTM3U", regular;
        if( result ) deleteline;

    2)  書き戻す
        gofiletop;
        insert "#EXTM3U\n";

など、ソート対象以外のデータ処理をすれば良いと思います。


disabledraw;

// ここに前処理

replaceallfast "^(#.+)\n([^#])", "\\1¶\\2", regular;
gofiletop;
while( code != eof )
{
    insert str(tickcount / lineno % 9) + ":";
    if( lineno == linecount2 ) break;
    movetolineno 1, lineno + 1;
}
selectall;
run "sort.exe <con >con";
replaceallfast "^[0-9]+:", "", regular;
replaceallfast "¶", "\n", regular;

// ここに後処理

enabledraw;
endmacro;

[ ]
RE:05177 2行単位のソート(シャッフル)No.05179
K'zawa さん 06/06/26 21:09
 
どうも、K'zawaです。

>あら、どうしてでしょう?

>>searchdown2 "^#EXTM3U\n", regular, nocasesense;
>>if( result ) cut;
>>else setclipboard "";

searchdown2 "^#EXTM3U\n", regular, nocasesense;
if( result ) {
    selectline;
    cut;
}
else setclipboard "";

ではないでしょうか?

では。

[ ]
RE:05176 2行単位のソート(シャッフル)No.05180
K'zawa さん 06/06/27 10:09
 
K'zawaです。
(No.05178の修正投稿)

searchdown2 "^#EXTM3U\n",regular,nocasesense;
if(result){ 〜 }
よりも、
replaceallfast "^#extm3u\n","",regular,nocasesense;
if(result){
    gofiletop;
    insert "#EXTM3U\n";
}
の方が確実でした。
あらかじめ作成しておいたプレイリストを、
秀丸上で合体したときなど、
"#EXTM3U"が複数あった場合用。

------------------------------
disabledraw;
gofiletop;
replaceallfast "^(#.+)\n([^#])","\\1¶\\2",regular;
gofileend;
if(linelen2) insert "\n";
gofiletop;
while(lineno<linecount2){
    insert ":";
    movetolineno 1,lineno+1;
}
#i=0;
while(#i<3){
    call Sort;
    #i=#i+1;
}
replaceallfast "^[0-9]+:","",regular;
replaceallfast "¶","\n",regular;
gofiletop;
// if(#header) insert $s+"\n"; この行も削除しましょう。

replaceallfast "^#extm3u\n","",regular,nocasesense;
if(result){
    gofiletop;
    insert "#EXTM3U\n";
}

enabledraw;
endmacro;

// ここからサブルーチン
Sort:
gofiletop;
while(lineno<linecount2){
    insert str(tickcount/lineno%9);
    movetolineno 1,lineno+1;
}
selectall;
run "sort.exe <con >con";
return;
------------------------------

こうなります。

>"enabledraw;"と、"endmacro;"
>が、マクロの終わりでない箇所にありますが、
>これでも良いんでしょうか?

"call XXX;"で"XXX"とゆうサブルーチンを呼び出す
の意味になります。(XXXは自分で決める)
サブルーチンは、

XXX:
    (コマンド)
    return;

のように書きます。(詳しくはマクロヘルプを見てください)

このマクロでは、Sortサブルーチンを3回呼び出しています。
ここで混ざり具合がきまります。
興味があれば、白雲斎さんのオリジナルを3回実行するのと
どう違うのか研究してみてください。

"#i=0;"を明示的に付け加えました。
何も変わらないですが、トラブル防止のため。
前で"#i"を使わなければなくてもいいのですが。

2行目の"gofiletop"は無くてもいいです。
"replaceallfast"の対象は、ファイル全体ですから。
そうゆう意味も含め、
disabledraw;
gofileend;
if(linelen2) insert "\n";
replaceallfast "^(#.+)\n([^#])","\\1¶\\2",regular;
gofiletop;
の順の方がいいかも。

では。

[ ]
RE:05180 2行単位のソート(シャッフル)No.05181
yamasan さん 06/06/27 14:49
 
yamasanです。K'zawaさん、お手間をおかけしました。
申し訳ありません。

>"call XXX;"で"XXX"とゆうサブルーチンを呼び出す
>の意味になります。(XXXは自分で決める)


>このマクロでは、Sortサブルーチンを3回呼び出しています。
>ここで混ざり具合がきまります。
>興味があれば、白雲斎さんのオリジナルを3回実行するのと
>どう違うのか研究してみてください。


色々と、ご丁寧にお教えいただきありがとうございます。
このマクロを使わせていただきます。ありがとうございました。

[ ]
RE:05177 2行単位のソート(シャッフル)No.05182
yamasan さん 06/06/27 14:52
 
白雲斎 さん、こんにちは。yamasanです。
お世話になります。

>    1)  前もって削除する
>        searchdown2 "^#EXTM3U", regular;
>        if( result ) deleteline;
>
>    2)  書き戻す
>        gofiletop;
>        insert "#EXTM3U\n";

お教えありがとうございます。
マクロを勉強して、使わせていただきます。
ありがとうございました。

[ ]