Hatena::ブログ(Diary)

分室の分室 このページをアンテナに追加

2016-05-18 Wed

MSX で We Will Rock You(Queen) やってみた。

【547】


 英ロックバンド Queen。…のフレディ・マーキュリーが没したのは 1991年11月(享年45歳)。今年で没後25年になる。もう四半世紀が経とうとしている。時間は決して止まらず、流れ続ける。。。

YouTube動画:

 ビジュアル的な見せ場は 1分以降から。MSX のランダム関数を使って適当に図形を作画し、それを BGV として使っている。低解像度ながらも背景色がカラフルに変わり続けるので、視覚的なインパクトは大きいと思う。

 MSX(2+ 以降) で音声出力可能な『FM音源6音(音声5CH+リズム1CH)』と『PSG音源(3CH)』の全てを使って再生しているので、MSX とは思えないほど厚みのあるサウンドを実現できた。ボーカルパートも合成音声を使っている。バックコーラスも何となく「We Will We Will Rock You」って聞こえると思う。

 この合成音声は、自分自身はホーミー風の音声を作ったつもりだったんだけど、改めて聴くと『ジェフ・ベックがトーキング・モジュレターをくわえて演奏してる音』…みたいにも聴こえる。

 この音は MSX2+ での実行・再生音をそのまま MTR で録音した。MSX2+ は 8ビットCPU のパソコンでクロック周波数も低く、演奏テンポに実行が追い付かなくなって、たまに演奏がモタツクところがある。ターボR ならこういうことはないのだが、リズムの不安定な揺らぎも人間(MSXだけど)の持ち味だと思えば、さほど気にならない。


 やってみた…と言っても、これを作ったのは実は 1994年。インターネットは一部の人間しか利用してなかった時代だ。これをいつ・どのように公開するか、それが問題だった。最大の懸案は著作権の問題。

●オリジナル曲の情報:
曲名:We Will Rock You
演奏:Queen
作詞:Brian Harold May
作曲:Brian Harold May

参考音源1:New of the World / Queen …に収録(1曲目) (1977年 スタジオ盤)
参考音源2:Live Killers / Queen     …に収録(CD2-7) (1979年 ライブ盤)

●やってみた…の情報:
演奏:MSX,  Prog. & Arr. by foussin (FooSAN)
      (上記の参考音源を適度に混ぜたアレンジにして演奏)

 作詞・作曲はギターのブライアン・メイですな。著作権管理団体は外国にあるハズ。所属レコード会社の日本法人に連絡を取れば許諾申請は可能と思う。販売目的のデジタル配信という形で権利者にロイヤリティが入るようにすれば、案外すんなり許諾は取れるのかもしれない。

 しかし自分には、そういう商売スキルがない。でも公開はしたい。このままでは一度も日の目を見ずに終わってしまうと思うので、まずはお披露目をしておきたかった。今年になって MSX 実機を復活させたのは、実はこれをやりたかったためでもある。


 さて。

 YouTube では『やってみた系』の投稿動画作品については著作権侵害をある程度は不問とする協定が各著作権管理団体と結ばれている。これにはいくつかの条件があって、非営利目的であること、歌詞掲載・譜面掲載は原則 NG、替え歌や編曲 NG(著作人格権がらみ)、あとは肖像権を侵害しない等の常識的な条件をクリアしている必要がある。

 この中で『編曲 NG』という項目の判断が難しいところ。投稿者のスキルによってはオリジナルどおりの演奏は困難ということもあるし。だが、普通はオリジナルのデジタルデータに不当な編集を加えることを禁止するための条件と解釈すれば良いだろうと思っている。

 逆にオリジナルと同じ演奏を、オリジナルよりも上手に演奏されてしまったら、それはそれでオリジナル権利者のメンツを潰すことになって摩擦が生じる。やってみた系投稿のコツとしては『オリジナルよりも適度にヘタ』ということも重要な要素としてあるかもしれない(これについては自信満々だぜ!)。。。

 どうしても営利目的で投稿したい、歌詞掲載したい、という場合は権利者の許諾を取る必要がある。ロイヤリティが発生するなら権利者も許諾申請を無下にすることはないと思うし。


ソースコードは公開できない(と思う?):

 当作品の音源データは MSX-BASIC によって記述されている。ソースコードは foussin の著作物である…それは確かだが、コードの中には MML(ミュージック・マクロ・ランゲージ)で記述された譜面データも含まれている。

 MSX を持っているユーザーなら、このコードを使えば動画と同じ音楽が何度でも再生可能となる。これが作曲者の利益を損ねる可能性は、残念ながら否定できないと思う。そんなワケで、なんとも歯切れの悪い話だがブログでのソース掲載はしないことにした。代わりに動画の中でチラッと list 表示するシーンを入れたので、気になる人は参考にしてください。

 ネットの普及によって、今や誰もが著作物をリリースできる時代になった。意識する、しないに関わらず、誰もが著作権を持っている。自分の権利を主張するのと同じように他者の権利も尊重する…そこは大切にしていきたい。


元ネタ 本家オリジナル曲の配信先リンク(Google Play の音楽 より):

https://play.google.com/store/music/album/%E3%82%AF%E3%82%A4%E3%83%BC%E3%83%B3_News_Of_The_World?id=Bz64r7utfddkz2kd5bonpk6yoza

https://play.google.com/store/music/album/%E3%82%AF%E3%82%A4%E3%83%BC%E3%83%B3_Live_Killers?id=B4sqfqbilnkmhawo6jwputefgha



蛇足:

 動画編集では Corel VideoStudio Pro X8 という動画編集ソフトを使用。アルファチャネルを使った透明化処理のコツとか、多少は掴めてきた。個々の映像素材にはあまり意味はなく、音楽と映像のテンポを同期させて臨場感を出すことを重視している。

 そのうち、MSX で作ったこの音源をベーストラックにして、さらにギターとボーカルを被せてみたい…と思っている。


最後に(MSX 関連情報)…

1986年のアスキーとの提携解消の折に著作権をマイクロソフト、商標権(販売権)をアスキーが所有することになった。
(ウィキペディアより抜粋)

MSX は 株式会社MSXライセンシングコーポレーション(MSXアソシエーションではなくなった) の登録商標です。一応、これも書いておきます。

2016-05-10 Tue

語語(カタリガタリ) by Perl for Windows

【546】


 連休中に久し振りに Perl でプログラムを作った。自分のために作ったコードですが、フリーソフトとしてご自由にご利用ください。とりあえず『語語(カタリガタリ)』と名付けた。ファイル名は ktrgtr.pl とした。ネーミングは西尾維新風にしてみた。。。

#!/usr/bin/perl
# <title> 語語(カタリガタリ) by Perl for Windows </title>
#         ktrgtr.pl (KaTaRiGaTaRi) by foussin (v0.00) 2016.05.08 Sun
use strict;
use warnings;
use utf8;
use Encode qw/decode/;
use Encode::Guess qw/sjis euc-jp/;
use FindBin;
use Term::ReadKey;

use Win32::Console::ANSI; # Win専用モジュール?(WinでESCシーケンス使用)
print "\e[2J";            # CLS(クリアー・スクリーン)
$| = 1;                   # STDOUT のバッファリング止め

# ●Act.0:画面表示の文字コード (実行環境をここで特定)
#   ":encoding(cp932)" → Windows(コマンドプロンプト)
#   ":utf8"            → Linux 等
#   ※デコード済の内部表現文字列を binmode で 自動エンコード
my $console_code = ($^O eq "MSWin32") ? ":encoding(cp932)" : ":utf8";
binmode STDOUT, $console_code;  # 標準出力を画面表示に使う
binmode STDERR, $console_code;  # 標準エラー出力を画面表示に使う


# ●Act.1:表示モード選択
print <<"EOT";

0. だらだら表示モード
1. 単語区切りタップ入力モード(主に英文用)
2. 1文字タップ入力モード(主に童謡の歌詞用)
EOT
print "表示モードを選択(0-2)> ";
chomp(my $mode = <STDIN>);  # エラートラップ省いた…


# ●Act.2:初期設定(waitのデフォルト値)
my $wait_sec = 0;                   # 1文字タップ入力(童謡の歌詞用)
($mode==0) and $wait_sec = 0.06;    # だらだら表示モード
($mode==1) and $wait_sec = 0.01;    # 単語区切りタップ入力(英文用)


# ●Act.3:入力ファイル読込
my $ifile = $ARGV[0] ? $ARGV[0] : "";
unless ($ifile) {
    # 実行中のスクリプトが居る場所をカレントディレクトリにする
    chdir $FindBin::Bin;
    # glob で "./ktrgtr-*.txt" ファイルリストをメニュー表示
    # Windows では open用と表示用、2種類の配列が必要(binmode指定が逆に仇?)
    my @files = glob("ktrgtr-*.txt");                   # open用リスト
    my $num = @files or die "error: 入力テキストが見つからない!";
    my $files = decode("Guess", join("\n", @files));
    my @decode_names = split /\n/, $files;              # メニュー表示用
    for (my $i=0; $num>$i; ++$i) { print "\n$i. $decode_names[$i]"; }
    if ($num == 1) {
        $ifile = $files[0];
    } else {
        print "\n読込テキストを選択(0-", $num-1, ")> ";
        chomp(my $id = <STDIN>);
        $ifile = $files[$id];
        $ifile or die "error: 番号指定が変かも?";
    }
}
# 入力ファイルの文字コードは不明のままオープン
open(IN, "<", $ifile) or die "Error: $!";
# 入力文字列をまるごと配列に入れ、文字コードを推測し内部コード変換
my @src_text = <IN>;   close IN;
my $src_text = decode("Guess", join('', @src_text));


# ●Act.4:テキストのコメント行を除去
# ktrgtr.pl では、"# " (#と半角スペース)から始まり "\n" (改行)まで
# をコメント行として除去する。行の途中にコメントを入れると表示が乱
# れる。 コメントの記述は『1行コメント』のみ有効という仕様とする。
$src_text =~ s/# .*\n//g;
#print $src_text; # 動作確認用


# ●Act.5:テキストを表示モードに合わせて分割し @str に格納
my @str;
if ($mode==1) {
    # 1. 単語区切りタップ入力モード(主に英文用)
    # スペース(全角・半角)、句読点(、。)、\n で区切り文章を分割する
    # (区切り文字 の直後に『$■』を挿入し、最後に『$■』で split)
    $src_text =~ s/(\n+)/$1$■/g;          # 復改
    $src_text =~ s/([、。・=])/$1$■/g;   # 句読点・他
    $src_text =~ s/( +)/$1$■/g;          # 全角スペース
    $src_text =~ s/( +)/$1$■/g;           # 半角スペース
    $src_text =~ s/\n$■( +)/\n$1/g;      # 行先頭のスペースは対象外
    $src_text =~ s/\n$■( +)/\n$1/g;       # 行先頭のスペースは対象外
    $src_text =~ s/$■(\n+)$■/$1$■/g;  # 行末尾をひとまとめにする
    @str = split '$■', $src_text;         # テキスト → 配列
} elsif ($mode==2) {
    # 2. 1文字タップ入力モード(主に童謡の歌詞用)
    # 拗音(ゃゅょャュョ)、?(ぁぃぅぇぉァィゥェォ)、促音(っッ)、長音(ー)、
    # 句読点(、。,.)、スペース(全角・半角)、復改(\n)、記号等は直前の文字と
    # 連結して『1音節扱い』とする。
    # ($src_text を substr で 1文字ずつチェックしながら @str に push)
    $str[0] = "";   # 初期値はダミー
    my $len = length $src_text;
    for (my $j=0; $j<$len; ++$j) {
        my $ch = substr($src_text, $j, 1);
        if ($ch =~ /[ゃゅょぁぃぅぇぉっャュョァィゥェォッ…ー\-!!??==・、。,\.:;:;\(\)  \n]/) {
            push @str, pop(@str) . $ch;     # スタック操作
        } else {
            push @str, $ch;
        }
    }
    $str[0] or shift @str;
} else {
    # 0. だらだら表示モード
    $str[0] = $src_text;
}
#print join("●", @str); # 動作確認用
print <<"EOT";

準備完了:
何かキーを押すと CLS(画面クリア)してスタンバイ状態になります。
その後、もう一度適当なキーを押すと表示が始まります。

ご自分のタイミングでキーを押して実行開始してください。
EOT
ReadMode 4;         # Turn off controls keys(とりあえず 4 にしとけば OK)
my $x = ReadKey;    # 何かキーを押すまで wait を続行
print "\e[2J";      # CLS(クリアー・スクリーン)
#print "\e[5>h";     # カーソル非表示モード(Windows は使えないらしい)

# ●Act.6:@str の先頭要素を shift で取り出し、適度に wait をかけて表示
while (@str) {
    my $x = ReadKey;  # 何かキーを押すまで wait を続行
    my $str = shift @str;
    my $len = length($str);
    for (my $j=0; $j<$len; ++$j) {
        my $ch = substr($str, $j, 1);
        wait_on($wait_sec);
        print $ch;
    }
}
ReadMode 0;     # Reset tty mode before exiting
#print "\e[5>l"; # カーソル表示モードに戻す(Windows は使えないらしい)
sleep 2;
$| = 0;         # STDOUT のバッファリング復活
1;


# ●サブルーチン:wait_on (wait 実行ルーチン) by foussin
# 2005.11.05 Sat 10:21 (初版)
# 2012.05.15 Tue 23:42 (Perl5 風にリライト)
# 概要:1秒未満の wait をかける
#       最小単位:10ミリ秒=1センチ秒 (Win32 の場合) (Linux は 1ミリ秒)
#       最小単位は times の実装に依存 (Linux と Win32 では仕様が異なる)
#       0.01秒未満の秒数を指定すると 0.01 を指定したと見なされる(Win32)
# 備考:times の実装は 2012年当時の話(現在では仕様が変わっているかも…)
# 書式:$true_time = wait_on($sec);
# 引数:$sec: 0.01秒以上の wait時間(秒数)を指定する。
# 戻値:$true_time: 実際に wait した時間を秒数(実数値)で返す。
# 備考:実際の待ち時間は引数$secを超える可能性アリ (正確なwaitではない)
sub wait_on {
    my $start = (times)[0];
    my $sec   = $_[0];
    my $break = $start + $sec;
    my $now;
    while (1) {
        $now   = (times)[0];
        ($now >= $break) && last;   # 正確な wait ではない...
    }
    return $now - $start;
}
__END__

機能:テキストをコンソール(ターミナル)に『ゆっくり標準出力』する
書式:ktrgtr.pl [入力テキストファイル名]

引数:引数を省略すると ktrgtr.pl が居る場所をカレントディレクトリにして
   そこにある『ktrgtr-云々.txt』を入力ファイルとして読み込む選択画面
   となる。入力ファイルが 1個しかない時は選択プロンプトを表示せずに、
   そのファイルを直ちに読み込む。入力ファイルの文字コードは問わない。

カテゴリ:創作支援ツール(映像表現用)

 ソースコードは Windows 用になってるが、12行目の

use Win32::Console::ANSI; # Win専用モジュール?(WinでESCシーケンス使用)

…をコメントアウトすれば、Linux でも問題なく使えると思う(動作未確認)。ソースは utf8 で保存してください。

 以下のページ(サンプル置き場)からも DL できます。ソースが表示されたら『名前を付けてページを保存』で ktrgtr.pl の名前で保存してください(文字コード UTF-8、復改 LF のテキストファイルで保存されます)。

http://blue.zero.jp/foussin/cgi/src/fs-utl/_tiny_tools/ktrgtr.pl_utf8.txt


 約180行(3分の1ぐらいはコメントなので実質120行ぐらい)。使い方は __END__ 以降のコメントに書いた。基本は『動画用の字幕』をコンソール上に表示して、それを後で動画編集ソフトで合成して使う…という使い方になる。


実行手順:

 実行すると次のような画面が表示される…

0. だらだら表示モード
1. 単語区切りタップ入力モード(主に英文用)
2. 1文字タップ入力モード(主に童謡の歌詞用)
表示モードを選択(0-2)> 0

0. ktrgtr-アルプス一万尺.txt
1. ktrgtr-奥の細道(松尾芭蕉)-草の戸(冒頭部分).txt
2. ktrgtr-星の王子さま名言.txt
3. ktrgtr-rock-you-singing.txt
読込テキストを選択(0-3)> 1

準備完了:
何かキーを押すと CLS(画面クリア)してスタンバイ状態になります。
その後、もう一度適当なキーを押すと表示が始まります。

ご自分のタイミングでキーを押して実行開始してください。

 最初に『表示モード』を選択。次に『読込テキスト』を選択する。読込テキストは ktrgtr.pl が入っているフォルダの『ktrgtr-云々.txt』が表示される。テキストの文字コードは問わない。


事前準備:

 読込テキストが必要。今回は実行例を説明するために、次のようなテキストを作っておいた。今回は作者不詳とか大昔の作家の作品を使っている。これなら著作権的に掲載可能なので。

# ktrgtr-アルプス一万尺.txt
# 1文字タップ入力モード用のテキストの例

# 作曲者:不明(アメリカ民謡)
# 作詞者:不明
# 題 名:アルプス一万尺 (手遊び唄)
  アルプス一万尺

  小槍の上で

  アルペン踊りを

  さあ踊りましょ!


# ktrgtr.pl では、"# " (#と半角スペース)から始まり "\n" (改行)までを
# コメント行として除去します。行の途中にコメントを入れると表示が乱れ
# ます。コメントの記述は『1行コメント』のみ有効という仕様とします。

# ktrgtr-奥の細道(松尾芭蕉)-草の戸(冒頭部分).txt
# だらだら表示モード用のテキストの例


 奥の細道 草の戸(冒頭部分):松尾芭蕉


  月日は百代(はくたい)の過客にして、行きかふ人もまた旅人なり。

  舟の上に生涯を浮かべ、馬の口とらへて老いを迎ふる者は、

  日々旅にして、旅を住みかとす。古人も多く旅に死せるあり。

  予も、いづれ… (後略)

# ktrgtr-星の王子さま名言.txt
# 単語区切りタップ入力モード用のテキストの例


  It is only with the heart that one can see rightly;
  what is essential is invisible to the eye.


  心で見なくちゃ、ものごとは よく見えないってことさ。
  かんじんなことは、目に見えないんだよ。


 …星の王子さま(アントワーヌ・ド・サン=テグジュペリ・著)より
# アントワーヌ・ド・サン=テグジュペリ(1900年〜1944年)
# Antoine de Saint-Exup?ry ←(UTF-8:euc-jp, shift_jis では表示不可能)


実行例:

まずは『コマンドプロンプト』での実行風景(動画):


語語(カタリガタリ) ktrgtr.pl には 3つの表示モードがある。


『0. だらだら表示モード』の例:

 奥の細道(冒頭)。コマンドプロンプトを半透明にして、動画で使う静止画像が透けて見えるようにしているのがポイント。


『1. 単語区切りタップ入力モード(主に英文用)』の例:

 星の王子さまの有名な一節。個人的にはけっこう気に入っている。字幕に気を取られていると後ろに見えるモンシロチョウ(メインビジュアル)を見落としてしまう。雑に作っている割には、意外と文章とマッチした映像表現になっている気がして。。。


『2. 1文字タップ入力モード(主に童謡の歌詞用)』の例:

 アルプス一万尺の歌詞。音楽に合わせてキーをタップすることで、手軽に字幕と音楽を同期させている。


 実行中にカーソルがチラチラ見えるのがウザいが、Windows ではこれを非表示にする方法が分からなかった。Linux の場合、125行目を

print "\e[5>h";     # カーソル非表示モード(Windows は使えないらしい)

…にすれば、たぶんカーソルを消せると思う(動作未確認)。さらに 139行目を…

print "\e[5>l"; # カーソル表示モードに戻す(Windows は使えないらしい)

…とする。ちなみに、"\e[5>h" とか "\e[5>l" というのは『エスケープ・シーケンス』である。

 自分にとって、このコードはかなり使えると思っているが、一般ユーザーの目にはしょぼく見えるだろうな…。というわけで、詳しく説明するモチベーションが湧いてこない。中途半端な説明で申し訳ないが、このネタはこれでおしまい。

 また、しばらくの間、休眠状態に入るかもしれない。。。