ラズパイ3倍美味しいブログ

ラズパイ3を美味しく食べるはずがinto the VR!!! Amazon echoのAlexaがトモダチ・・・ラズパイはおやつ。

mpg321でmp3をランダム再生するよ

ラズベリーパイ3の特定のフォルダに入れたmp3をmpg321でランダム再生するperlのプログラムを自分用にカスタマイズする。
参考にさせていただいたのは下記サイト。

digress.exblog.jp

こちらのサイトではaplayでランダム再生されている。
元のプログラムは上記サイトからコピーペーストしてます。(私はperlの文法何も知らんのやで。。。)

自分はrandommp3.plという名前のperlを作ります。
アクセサリ→Text Editorを開き、下記の内容をコピーペースト。赤字は自分の環境用に変えた箇所。
/home/piのフォルダにrandommp3.plという名前をつけて保存する。

############################## ここから
#!/usr/bin/perl

#$player = "aplay";

## 使用プレーヤーを変更
$player = "mpg321"; #mpg321でmpg3ファイル再生したい場合、コメントアウト(#)を取る。→取りました。

## -def オプションで再生したいフォルダー。ほぼ必須。→ここはMusicを指定しておきました。
$defaulturl = "/home/pi/Music";

## 追加フォルダー。ここに書き込んだフォルダー内の該当音楽ファイルは必ず再生されます。→ここも再生されます。
$defaulturls = "/home/pi/work/music";

$max = 0; #再生曲数 0で無制限

if($player eq "mpg321"){@type = (".mp3");}else{@type = (".wav",".wave");}
$dir = "./";
$udir = "0";
$list = 0;
$alist = 0;
$noran = 0;
$down = 0;


if ($ARGV[0]){
foreach $_ (@ARGV){

if($_ =~ /\-dir\=/i){
$_ =~ s/\-dir\=//; $dir = $_;
$udir = 8;
}

if($_ =~ /\-max\=/i){$_ =~ s/\-max\=//; $max = $_;}

if($_ =~ /\-def/i){$dir = "$defaulturl"; $udir = 88;}

if($_ =~ /\-list/i){$list = 8;}
if($_ =~ /\-alist/i){$alist = 8;}
if($_ =~ /\-noran/i){$noran = 8;}
if($_ =~ /\-down/i){$down = 8;}
}
}
else{
$dir = "./";
if($player eq "mpg321"){@type = (".mp3");}else{@type = (".wav",".wave");}
}

if($player eq "mpg321"){@type = (".mp3");}else{@type = (".wav",".wave");}
&getlist($dir);
if($defaulturls ne ""){&getlist($defaulturls);}


print "\n********************************************\n";
print "randommp3.pl は mpg321 でのランダム演奏用です。\n";
print "(初期設定の使用プレーヤー変更してmp3演奏するようにしました)\n";
print "ex: perl randommp3.pl -alist -list -dir=./sound\n";
print "------------------------------------------------\n";
print "-def (設定したデフォルト\"" . $defaulturl . "\"を再生)\n";
print "-alist (再生一覧リストを表示)\n";
print "-list (再生リストを表示)\n";
print "-noran (ランダム再生しない)\n";
print "-down (逆順に再生)\n";
print "-dir=URL (URLのフォルダー内を演奏)\n";
print "-max=数字 (最大演奏回数、無指定で無制限)\n";
print "演奏中 次の Ctrl + C\n";
print "演奏中 中止 Ctrl + Z\n\n";


if($noran){@new = @files; print "\**NORANDOM**\n\n";}
elsif($down){@new = sort {$b cmp $a} @files; print "\**DOWN**\n\n";}
else{
foreach (@files){
my $r = rand @new+1;
push(@new, $new[$r]);
$new[$r] = $_;
}
print "\**RANDOM**\n\n";
}

if($alist){
$listii = 0; print "再生予定リスト\n------------------------------------------------\n";

foreach (@new){
$listii ++;
$wlists = $_;
$wlists =~ s/$defaulturl\//\//g;
$wlists =~ s/$defaulturls\//\//g;
if($player eq "mpg321"){$wlists =~ s/\.mp3//ig;}else{$wlists =~ s/\.wa.+//ig;}
print "$listii*$wlists\n";
if($listii == $max){last;}}

print "------------------------------------------------\n\n\n";
}

$listi = 0;
foreach (@new){
$listi ++;

$lists = " \"$_\"";

if($list){
$wlists = $_;
$wlists =~ s/$defaulturl\//\//g;
$wlists =~ s/$defaulturls\//\//g;
if($player eq "mpg321"){$wlists =~ s/\.mp3//ig;}else{$wlists =~ s/\.wa.+//ig;}
}

#if($list){print "------------------------------------------------\n\n";}

if($player eq "mpg321"){
if($lists){system("mpg321 $lists");}
else{print "--NoFile--\n\n";}
}
else{
if($list){print "NowPlay$listii*$wlists\n";}
if($lists){system("aplay -q $lists");}
else{print "--NoFile--\n\n";}
}

if($listi == $max){last;}
}

exit;
#-----------------------------------------------------------------------

sub getlist{
my $ndir = $_[0];
my @get;

#opendir(IN,$ndir) or die "opendir $dir エラー : $!";
opendir(IN,$ndir) or return;

@get = readdir IN;
closedir(IN);

foreach $files (@get){
next if $files =~ /^\.\.$/;
next if $files =~ /^\.$/;


foreach (@type) {
if($files =~ /$_$/i){
if($ndir =~ /^\.\/.+/i){push @files, "$ndir" . "/$files";}
elsif($udir){$ndir =~ s/\/$//i; push @files, "$ndir" . "/$files";}
else{push @files, "$files";}
}
}


if($ndir =~ /^\.\/.+/i){$nndir = $ndir . "/$files";}
elsif($udir){$ndir =~ s/\/$//i; $nndir = "$ndir" . "/$files";}
else{$nndir = $ndir . "$files";}

#print "$nndir\n";#TEST用
if(-d $nndir){&getlist($nndir);}
}

}

############################## ここまで

使用例

コマンドで

$ perl randommp3.pl -list
とすると、ランダムに再生してくれるし、-listというのをつけているので、再生リストを表示してくれる。ここにさらに -alistというのをつけると再生予定リストも表示してくれる。試しにやってみたら1番目から53番目までリスト表示した。(再生数指定していないからどうなるんかと思ってたけど、53個で終わった。。なんでやろ)-max=数字 (最大演奏回数、無指定で無制限)というのをつけると最大演奏回数を指定できるっぽい。

CtrlとCを同時に押すと次の曲を再生する。
CtrlとZを押すと終了する。

※特定のフォルダにあるmp3をランダム再生できるようになりますが、特定のフォルダは、さらに中にフォルダ分けされててその中にmp3があったとしても再生します。
そのフォルダの下位のフォルダも全部等しくランダム再生されるようです。

なお、ラズベリーパイ3の特定のフォルダにWindowsPCからmp3を入れる方法としては、前回のブログ参照のこと。(ネットワークにつながってる必要があります)

 

ランダム再生できるようになったー。このperl音声認識&音声応答ミュージックプレーヤーに組み込むことできるんとちゃう?
ランダム再生して、とお願いしたら、ランダム再生するよと言ってランダム再生してくれる奴ー。