SVX日記

2004|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|

2022-09-12(Mon) 結局、効果音生成ツールを改良する

  一応、効果音生成ツールは一応の完成を見たのだが、やりだすと、そう簡単には止まらないのである。

  ゲームの効果音にノイズは欠かせない。そのため、ホワイトノイズ、ブラウンノイズ、ピンクノイズ、パープルノイズが使えるようになっているが、それだけでは足りなすぎるのである。バリエーションが欲しい。

  で、ノイズに音程があるかというと、微妙である。ノイズを音程に分解すると、その分布によって上記の「色」が決まるのだが、それなりに広く分布しているので、ノイズには音程がないと言える。

  んが、一方で、3,8,5というノイズを、3,3,8,8,5,5と加工すれば、低音側に遷移することに疑いはないのである。まぁ、厳密な定義はともかく、指定の方法はトーンに合わせて、440.0を標準とし、詰めたり、間引いたりすることで、ノイズに音程変化が起こせるようにしてみた。

  なんだかんだコードを書いているうち、不具合があることに気付き、割と大きな追加/修正になってしまったが、表現力が大きく上がった気がする。

 @length = 1.0
 
 mod1 = it = {}
 it[:device] = 'generate'
 it[:length] = @length
 it[:type] = 'square'
 it[:freq] = [8]
 it[:amp] = <<AMP
 #--------------25--------------50--------------75-------------100
 ................................................................/
 AMP
 
 noise1 = it = {}
 it[:device] = 'fm'
 it[:length] = @length
 it[:type] = 'pink_noise'
 it[:freq] = [20]
 it[:amp] = <<AMP
 #--------------25--------------50--------------75-------------100
 ................................................/
 ................................................................/
 /
 AMP
 it[:index] = 1.5
 
 @connection = [ mod1, noise1 ]

  こんな記述で、ロケット噴射音っぽいの<聴いてみる>を作ることができた。これは使えるな、そろそろシューティングの製作に戻ろう。


2022-09-10(Sat) 結局、効果音生成ツールを自作する

  先日、ノイズを生成できるようになってから、効果音生成プログラムに組み込んでアレコレしていたのだが、アレコレしているうち、効果音とは、基本となる波形に様々な変化を繰り返し重ねていくことによって生成するものだということがわかってきた。

  主には、正弦波、矩形波などの生成、加算、変調、音量変化などである。しかし、その方法を汎化して記述するにはどうすればいいのか。そもそも変調とは何なのか。

  考えれば考えるほどわからなくなり、コードを書いては試し、何度も書き直した。コードの追加ではなく、こんなに何度も、構造ごと変えては、頭から書き直したのは初めてだ。変調を追求していくうちに、FM音源に行き当たり、周波数変調、位相変調、YM2151(OPM)の仕組みにまで踏み込んでしまい、オペレータのコネクションを再現するために、RPNっぽい手法まで実装することになった。

  結局、ほぼ、シンセサイザを自作した、というレベルではないだろうか。ヤクの毛刈りどころか、3頭はバーベキューにして食い尽くした気分だ。

  最終的には、以下のような記述で音を作る。以下は、soxのサンプルにあるパイプオルガンによるAm7を再現するもの。typeで正弦波(sine)を指定、freqで周波数(A3, C4, E4, G4)を指定、envでエンベロープ(音量変化)を指定。最後にそれらをRPN記法で重ねていく。

 @length = 1
 
 car1 = it = {}
 it[:device] = 'generate'
 it[:length] = @length
 it[:type] = 'sine'
 it[:freq] = <<FREQ
 #+BC+D+EF+G+A+BC+D+EF+G+A+BC+D+EF+G+A+BC+D+EF+G+A+BC+D+EF+G+A+BC+D+EF+G+A+BC+D+EF+G+A+BC+D+EF+G+A
 #--1----(55)1--2---(110)2--3---(220)3--4---(440)4--5---(880)5--6--(1760)6--7--(3520)7--8--(7040)8
 ..................................../
 FREQ
 it[:amp] = <<AMP
 #--------------25--------------50--------------75-------------100
 ................/
 AMP
 
 car2 = it = {}
 <略、C4 の正弦波>
 
 car3 = it = {}
 <略、E4 の正弦波>
 
 car4 = it = {}
 <略、G4 の正弦波>
 
 add = it = {}
 it[:device] = 'add'
 
 env1 = it = {}
 it[:device] = 'env'
 it[:length] = @length
 it[:amp] = <<AMP
 #--------------25--------------50--------------75-------------100
 /
 ................................................................/
 ................................................................/
 ................................................................/
 ................................................................/
 ................................................................/
 /
 AMP
 
 @connection = [ car1, car2, add, car3, add, car4, add, env1 ]

  これでwavファイルが生成される<聴いてみる>。

  もちろん、加算はもっとも基本的な演算で、真骨頂は変調である。インベーダのUFOの音っぽいの<聴いてみる>とか、パックマンのモンスタの音っぽいの<聴いてみる>とか、R-TYPEのショット音っぽいの<聴いてみる>とか、ダライアスのレーザ音っぽいの<聴いてみる>とか、割と直感的な記述により生成することができる。

  今回、FM音源のことを調べていて、ものすごく少ないパラメータ(バイト数)で音色が作れることが、当時のPCの性能事情に即していたこと。反面、音色作りがものすごく難しかったことを、改めて知った。実際、自分もX1のFM音源をアレコレしていたが、ちっともイメージしたような音色が作れなかった。

  とはいえ、アレよりはだいぶマシだと思うが、このツールでもイメージ通りの音に近づけていくのは難しい。近づけようとしても、意外な音ができて、その音が気に入ってしまったりする。ま、それはそれでいいんだが。


2022-08-26(Fri) 色々なノイズをジェネレートする

  シツコく飽きずにオリジナルのシューティングの製作をポチポチと進めているのだが、いくつか敵キャラクタを用意したところで、そろそろ効果音が欲しくなってきた。

  以前に「sox」というコマンドラインツールを使って効果音を作ったことがあり、少しイジり始めたのだが、音に対する自分の知識が少ないのに対して、ツールが多機能すぎるので、どうにも勝手がわからない。このパターンは……あー、いかんて、いかんて、次はサウンドエディタ作り始めちま……で、またもや「ヤクの毛刈り」の始まりである。

  で、正弦波、矩形波、三角波、鋸歯状波あたりを生成、合成や変調、周波数、音量を変化させるアルゴリズムを組んだ辺りで、ノイズの実装が必要になってきた。ん? ノイズって、種類があったよな。ピンクノイズとか。フムン。ブラウンノイズなんてのもあるのか。このパターンは……あー、いかんて、いかんて、次はノイズ生成エンジン作り始めちま……と、さらなる「ヤクの毛刈り」の始まりである。

  ホワイトノイズは簡単だ。ブラウンノイズは「ホワイトノイズの積分」らしい。基本、数学が苦手なオイラだが、試行錯誤しているうちにそれっぽいのがデキた。フタを開けてみればこれも単純だ。

  問題はピンクノイズ。1/fゆらぎの実装が必要らしい。1/fゆらぎといえば、このブログを始める前にUSB扇風機にPICマイコンを使ってそれっぽい制御を組み込んだことがあったな……などと、思い出す。弱い変化は頻繁、強い変化は稀、というヤツだ。が、結局よくわからず。ググッてどこかで見つけたサイコロ理論をアレンジして組み込んだ。

  答え合わせは、生成したノイズを「Audacity」に食わせ、周波数解析することで行う。まずはホワイトノイズ。

  画像の説明

  だいぶバラついているように見えるが、左の軸が自動調整により拡大されすぎているからだ。-21dB±1dBの範囲に収まっており、ホワイトノイズの特徴である「平坦なパワースペクトル」が実現できている。次はブラウンノイズ。

  画像の説明

  ブラウンノイズの特徴は「1オクターヴあたりパワーが6dB降下」である。言い換えると「周波数が倍になる都度パワーが6dB降下」。理想的な降下ラインを赤で示してみたが、ほぼピッタリであり、実現できたといえよう。最後はピンクノイズ。

  画像の説明

  ピンクノイズの特徴は「1オクターヴあたりパワーが3dB降下」である。言い換えると「周波数が倍になる都度パワーが3dB降下」。同じく、理想的な降下ラインを赤で示してみたが、ほぼピッタリであり、実現できたといえよう。

  というわけで、調べると他にも「ブルーノイズ」「パープルノイズ」などがあるようであるが、やりだすとキリがないので、今回はここまで。コードを置いておく。ノイズ生成のキモは「when」に続く各数行のみだ。ピンクはちょっとアクロバチックかな。

 #!/usr/bin/env ruby
 # coding: utf-8
 
 # create base.wav
 #   sox -n -r 44100 -b 16 -c 2 base.wav trim 0 1
 
 begin
     $LOAD_PATH.unshift('/usr/local/lib/ruby')
     require 'libwav'
 rescue LoadError
     raise
 end
 
 include Math
 
 ARGV.size < 2 and abort(<<USAGE % $0)
 Usage:
   $ %s base.wav white|brown|pink [sec]
 USAGE
 
 wav = NewWavFile.new(ARGV[0])
 wav.get_info[0].each {|l|
     puts(l)
 }
 type = ARGV[1]
 sec = (it = ARGV[2]) ? it.to_i : 1
 
 case(type)
   when('white')
     gain = Proc.new {
         (rand(0) - 0.5) * 65536
     }
 
   when('brown')
     gain = Proc.new {|g|
         g + (rand(0) - 0.5) * 1024
     }
 
   when('pink')
     gain = Proc.new {|g, pbuf|
         (9 - ('%b' % (rand(255) + 1)).length).times {|n|
             g -= pbuf[n]
             g += (pbuf[n] = (rand(0) - 0.5) * 8192)
         }
         g
     }
 
   else
     raise('Unexpected noise type.')
 end
 
 srand; g = 0; pbuf = [0] * 8
 (n_sample = wav.freq * sec).times {|n|
     wav[n] = [g, g]
     g = gain.call(g, pbuf)
     g < -32768 and g = -32768
     g >  32767 and g =  32767
 }
 
 wav.save_phrase(0, n_sample, '%s_noise.wav' % type)
 
 __END__

  プログラミングの歓喜を無限に味わうために。次のヤクの毛刈りのために。次の次のヤクの毛刈りのために……。


2022-08-24(Wed) パックマンのナイトライトを修正

  家族から贈られたパックマンのナイトライトだが、なんとなくググったら「買ったけど破損した状態で届いた」という報告を見つけた。併せて、一匹のモンスタがハズれた状態の写真が掲載されている。

  と、そこでヒラメいた。そんなに簡単に外れる仕様ならば、順序を入れ替えてしまえばイイじゃないか。特段パックマンに興味がない人にはどうでもいいことかもしれないが、パックマン好きとしてはこの隊列の順序に、なんともいえない違和感を拭えないのだ。

  画像の説明

  つうわけで、裏のネジを外し、各モンスタを固定しているツメを押し込んで外し、順序を変更した。すると、なんということでしょう。見るたびにイヤというほど違和感に満ち溢れていたアイテムが、心にシミ入る感じに変わっているではありませんか。まさに匠の技。

  ピンキーがいないのはどうしようもないが、そもそも彼女は待ち伏せる性格だから、きっと前方に居るのだろう。去年のアイテムから出張を願おう。よし。と。

  画像の説明

  しかし、こんどは右向きなのが気になりはじめてしまった。コーヒーブレイクの時もそうだが、追いかけられて逃げる方向は左と決まっているのだが……。


2022-08-06(Sat) 生誕51周年記念のパックマン

  昨年に引き続き、誕生日プレゼントにパックマングッズを贈られた。いや、嬉しいんだが、オレはパックマニア(?)ではないぞ。ナムコファンだが、ダライアス教に入信しているし、グラディウス派に属しているし、ファンタジーゾーンの住人だぞ。

  置物のように見えて、USBから電源を与えると、ナイトライトになるのだ。なかなか美しく光る。

  画像の説明 画像の説明

  が! なんで3匹なんだ。なんでピンキーがいないんだ。なんでアカベイが最後尾なんだ。パックマニアとしては気になって仕方ない。

  画像の説明

  以前に、パックマン柄の2種類のトランクスを買って、喜んで履いているのだが、その片方の柄は、アカベイ、アオスケ、ピンキーで、グズタがいない。もう片方の柄は、隊列を組んでいないのだが、ピンキーがいない。誰か! ちゃんと監修してやってくれ!

  というか、よく見るとこのライト「namco」のマークないな……まー、そういうことか。

  画像の説明

  念のため、オリジナルのドットパターンをオーバレイしてみたら、モンスタは1ドットの違いもなく正確であった。パックマンは口角の1ドットのみ違う。うぅーむ……うぅーむ!!


2022-08-04(Thu) CoffeeScriptにて回転機能をmixinにより実装す

  意外と飽きずにオリジナルのシューティングの製作をポチポチと進めているのだが、考えれば考えるほど、既存のシューティングに対する気付きが増えていく。

  例えば、R-TYPEは初見でも1面はクリアさせたい作りなんだな、とか、ダライアスはボス以外の作りは適当だな、とかである。反面、ゼビウスは「最初は偵察機が登場する」とか「有人機は自殺的攻撃をしない」とか考えてあることに驚く。そうだよな。それは世界感を感じさせるために有効だよな。

  今回、自分は「ストーリ」を強く感じさせるゲームにしたいので、単に思いつきで敵を作るのではなく、それなりの理由に基づいて登場、行動させたい。そうなると、最初は偵察機だし、その後はミサイル攻撃かな、とか思うわけだ。

  で、ミサイルを作ったのだが、誘導したくなってしまい、斜めに飛ばしたくなってしまった。すると、回転機能が必要になる。先日のテトランはプリレンダだったが、汎用性を考えればリアルタイムレンダを実装するべきだ。しかもキャッシュ付きで、できるだけ軽く。

  とりあえず試験的にCoffeeScriptで実装してみたら、処理はだいぶ軽く、負荷的には問題なさそうだ。後は、どういうパラダイムで実装するか。現状、以下のようなオブジェクト構成になっている。

 class Plane					# 描画面
 class Obj extends Plane			# オブジェクト(スプライト)
 class Ship extends Obj				# 自機
 class Enemy extends Obj			# 敵
 class MissileA extends Enemy			# ミサイル
 class Fixed extends Enemy			# 地形に固定された敵
 class ReconA extends Fixed			# 偵察機

  回転するのは敵に限らず、あらゆるオブジェクトが回転可能にできるべきだ。しかし、そうすると多重継承が必要になってしまう。それを避けるには、一番の根っこであるObjクラスに実装してしまう方法も考えられるが、それは気が進まない。必要に応じて回転機能が追加できるのが望ましい。

  そういう場合、Rubyならミックスイン(mix-in)があるが、CoffeeScriptにはあるのかしらん……と、調べたらあるんだな。というか、正確には「後付けできる」といったところか。

 #---------------------------------------------------------------
 #
 #   クラスの mixin を可能にする
 #
 #       https://coffeescript-cookbook.github.io/chapters/classes_and_objects/mixins
 #
 mixOf = (base, mixins...) ->
     class Mixed extends base
     for mixin in mixins by -1
         for name, method of mixin::
             Mixed::[name] = method
     Mixed

  上記を冒頭に記述しておいて、

 class Rotnscl					# 回転拡大縮小機能
 class RmissileA extends mixOf Enemy, Rotnscl	# 敵+回転拡大縮小機能

  上記のようなオブジェクト構成にする。それにより、RmissileAは、敵であり、回転機能を持つ、という定義となる。これにて一件落着。

  次は、回転パターンのキャッシュについて考える。処理負荷的にリアルタイムレンダは可能な見通しだが、毎回、回転パターンを作るのは無駄なので、一度作った回転パターンは残しておき、二度目からは勝手にそれを使うようにしたい。つまりはキャッシュだ。

  キャッシュはどう実装されるべきか、といえば、そりゃオブジェクトタイプ、パターン、角度毎に残しておくべきで、個体(インスタンス)毎に行うべきではない。つまり、クラス変数に残しておくべきだ。クラス変数はCoffeeScriptにはあるのかしらん……と、思ったら、ちょっと微妙ではあるが、ある。

  クラスの中、メソッドの外に「@xxx」を定義しておき、メソッド内からは「@constructor.xxx」でアクセスする。ただし、利用はそのクラスのみに閉じ、継承したクラスからはアクセスできない。今回の場合、その仕様で問題ないが。

  画像の説明

  つうわけで、こんな感じで気持ちよくグルグルと回転している。いや、canvas要素には、ネイティブな回転機能はあるようなのだが、それはそれとして、実装するのが楽しいのだから、これでいいのだ。コードはこんな感じ。

 #---------------------------------------------------------------
 #
 #   回転拡大縮小可能オブジェクト(mixin用)
 #
 class Rotnscl
 
     rotnscl: (pats, n, v, t, w = null, h = null, dx = null, dy = null) ->
         pat = pats[n]
         w ||= pat.width;  dx ||= -(w >> 1)
         h ||= pat.height; dy ||= -(h >> 1)
 
         return(rpat) if(rpat = @constructor.rpats[rsym = "#{n}_#{t}_#{v}_#{w}_#{h}_#{dx}_#{dy}"])
 
         unless(pdat = @constructor.pdats[psym = "#{n}"])
             src_canvas = document.createElement('canvas')
             src_canvas.width  = pat.width
             src_canvas.height = pat.height
             src_context = src_canvas.getContext('2d')
             src_context.drawImage(pat, 0, 0)
             pdat = @constructor.pdats[psym] = src_context.getImageData(0, 0, w, h).data
 
         rot_canvas = document.createElement('canvas')
         rot_canvas.width  = w
         rot_canvas.height = h
         rot_context = rot_canvas.getContext('2d')
 
         rxys = Vec.v2vxy(v, t); hxys = Vec.v2vxy(v + 32 & 0x3F, t); vxys = Vec.v2vxy(v + 48 & 0x3F, t)
         _vx8 =   dx * rxys[1] - dy * rxys[0]  - (dx << 8)
         _vy8 = -(dx * rxys[0] + dy * rxys[1]) - (dy << 8)
         w8 = w << 8; pw = pat.width
         for y in [0...h]
             _hx8 = _vx8; _hy8 = _vy8
             for x in [0...w]
                 _hx8 += hxys[0]; _hy8 += hxys[1]                # 横方向加算
                 continue if(_hx8 < 0 or _hx8 > w8)
                 p = ((_hy8 >> 8) * pw + (_hx8 >> 8)) << 2
                 continue unless(pdat[p] + pdat[p + 1] + pdat[p + 2])    # 黒は透過
                 rot_context.fillStyle = "rgb(#{pdat[p]}, #{pdat[p + 1]}, #{pdat[p + 2]})"
                 rot_context.fillRect(x, y, 1, 1)
             _vx8 += vxys[0]; _vy8 += vxys[1]                    # 縦方向加算
         return(@constructor.rpats[rsym] = rot_canvas)
 
     cache_status: ->
         console.log([@constructor.name, Object.keys(@constructor.pdats).length, Object.keys(@constructor.rpats).length].toString()) if(tsc % 60 == 0)
 
 #---------------------------------------------------------------
 #
 #   回転オブジェクトサンプル
 #
 class Rsample extends mixOf Obj, Rotnscl
 
     Plane.image_src(@pats = [
         'images/rsample0.png'                   #  0:  46 x  46
     ])
     @pdats = {}; @rpats = {}
 
     constructor: (_s, x, y) ->
         super(_s, x, y)
 
     draw: ->
         n = 0                                   # パターンナンバ
         v = (tsc >> 2) % 64                     # 角度
         t = 0                                   # 倍率
         rpat = @rotnscl(@constructor.pats, n, v, t)
         @context.drawImage(rpat, @pos_x, @pos_y)
 
     d0: ->
         @cache_status()

  さて、別にミサイルはグルグル回したかったわけじゃない。意図した動きをプログラミングしていくことにしよう。


2022-08-03(Wed) ついにモータのコイルが焼けちまったところだぜ

  先日(7/24)、長らく愛用していたカリタのコーヒーミルのヒューズが飛んだ。普段から気に入った豆をちゃんと挽いて淹れたコーヒーを飲んでいると、それ以外のコーヒーが絶対にダメということはないものの、物足りなさを感じてしまうのである。ヒューズが飛んだのは初めてではないが、サッサとヒューズを手配しないとな、と思いつつ、とりあえず刃を外して掃除しておいた。

  翌日、唐突にミルの底に予備のヒューズがセットしてあったことを思い出す。しかし、高確率ですぐ飛んでしまうだろうなぁ、と思って回すと、案の定すぐ飛んでしまった。これは、本格的にオーバホールをする必要がありそうだ。

  カリタのナイスカットミルは、なんだかんだベストセラー機種なので、修理ノウハウも多いのではないかと思ってググると、案の定、事例がたくさんあり、モータをバラして修理した、という動画まで見つけた。なるほど。ブラシモータなのか。直流モータの構造に関する基本的な知識はある。というわけで、週末(7/30)に外でモータをバラしてみた。動画での指摘どおり、ブラシのカスであるカーボンの微粉が内部に溜まっていたので、ウェスで拭いまくって、組み立て直し、通販でヒューズを注文する。

  しばらくして(8/2)ヒューズが届く。早速、試運転。しかし、またヒューズが飛んでしまう。あー、もー。もう一度、念入りにオーバホールしてみるか。

  つうわけで、本日、改めてバラし、パーツクリーナでピッカピカにする。そして、試運転。しかし、またヒューズが飛んでしまう。むーん、そんならモータ単体なら動くのか? と思い、まったくギアを介さない状態で手に持って回すと、数秒回った後に、ヒューズが飛ぶと同時にネジ穴から火を吹いた……チーン。これはおそらく、モータのコイルのどこかが短絡状態になってしまっているのではないか。修理できるレベルではないな。諦めよう。

  画像の説明

  過去のメールを漁ると、購入したのは2011年12月の中旬頃。あ、記事にもしてたな。2万円強。まぁ、10年間以上も問題なく動いてくれていたのだから、文句を言うべきじゃないな。しかし、この色も形も性能も、愛していたのだがなぁ。

  で、ここしばらくはスーパーで粉のコーヒーを買って凌いでいたのだが、到底納得できるレベルではなく、そろそろ我慢も限界である。新しいミルの購入も視野に入れ、製品を探していたのだが、カリタのナイスカットミルは絶版。後継モデルはあるものの4万前後と倍もするし、なぜかオフィシャルサイトに掲載がなく不安しかない。というわけで、少し性能は落ちるらしいが、似たようなプロダクトであるボンマックのコーヒーミルをポチった。あー、早く届いておくれー。


2022-07-26(Tue) 法律くん大好き!

  あまり、毒吐きエントリは書かない主義なのだが、ずっと抱いていた違和感にヒットするコンテンツを見つけ、少しスッキリしたので、今回は敢えて。

  先日「行動制限なく『判断難しい』」というニュースエントリを目にした。なんでも「(コロナで)緊急事態宣言が発令された昨夏とは異なり、今年は今のところ行動制限がないため『判断を委ねられて難しい』」んだそうだ。なんつうか、片や「政府のお願いだから強制力はない」なんていいながら、イザ「お願い」がなかったら、決めてもらえなかったら、どうしていいかわからないとか、日本国国民の主体性のなさには呆れ果てる。

  別視点だが、最近、話題になっているのが「車に乗っていて、横断歩道で歩行者に譲られたら」という内容だ。なんでも、違反として取り締まられたケースがあるという。理由は「法律がそうなっているから」だそうだ。本気で、頭、大丈夫なのか。

  日本人は、ホントに法律が好きだ。なにか問題が起きると、すぐに法に照らして判断しようとし、訴えるとか言い出す。もしかするとその原因は、テレビ番組の「バラエティー生活笑百科」にあったのかもしれない。微妙に判断に迷うケースを持ち出してきては、最後は弁護士が一刀両断して答えを出してしまう。面白いといえば面白いのだが、そんなバカなというケースも少なくない。

  ネット記事もこの流れを汲むものがある。「バイクで走行中のヘルメット、あご紐をしてなかったら違反になる?」の答えが「あご紐の装備があるヘルメットを着用する義務はあるが『あご紐をしめて着用しなければならない』とは明記されていない」だそうだ。あのさ、ヘルメットする意味ってわかってる?

  そもそも、法律や規則なんてなしに解決に至ればそっちのほうがいい。自分が気に食わないことがあると、必死で関連する法律を探し出そうとする人をよく見るが、法律や規則なんて少ないほうがいいことに気づかないのか。

  いつも思い出すのは、昔のNHKの人形劇の劇中歌「アクタ共和国国歌」だ。「命令絶対規則はいっぱい、アクタ、アクタ、共和国」。あれは、日本人の憧れの国だったのだな。

  とはいえ、もしかしたら狂っているのは自分の方かもしれない、などとも思っていたのだが、先日、試し読みで読んだマンガ「エチカの時間」に、スッキリする記述を見つけた。「エチカ(Ethica)」とは「倫理学」のことだ。記述を引用すると。

  ・法律にあるから、という理由で行動する。法律にあるからという理由だけが行動の規範の人は、同じように法律にないからという理由であらゆることをする。

  ・規則にあるから(規則にないから)。上の命令だから(上の命令じゃないから)。神が言っているから(神が言ってないから)。

  ・一見、従順……規律正しい……敬虔……のようでいて、実際は、24時間思考停止。全ては、♪誰かさんの言う通り〜〜〜だ♪

  ほぼ、自分の思っていた違和感を裏付ける内容だ。法律や規則はそれとして、それの目的とする意味について考える必要はあるんじゃないのか? ってことだ。

  蒸し返すが、そもそも「車に乗っていて、横断歩道で歩行者に譲られたら」以前に「横断歩道で歩行者に譲る」という規則そのものに疑問を感じる。

  車を止めれば無駄なエネルギが必要になるし、車に比べて歩行者は小さく目立たないし、夜に光るライトも、進行方向を予告するウインカもないし、対向車線の車の挙動まで考慮に入れたら、車を止める判断は無理ゲーレベルだ。歩行者側が車を認知する方がよほど容易だが、もしかしたら止まらないという緊張感は捨てられないし、捨てるべきでもない。だったら、歩行者を確認しつつも止まらずに通り過ぎたほうが、互いに安心して通行できるし、時間のロスもない。「横断歩道で歩行者に譲る」って規則考えたヤツって、バカじゃないの? というか、そこまで深く考えた規則じゃないのだろう。しかし、そもそも長らく眠っていたその規則を、誰かが掘り返してきたのをいいことに、オトリを使って取り締りしている警察って、自分の心に照らして恥ずかしくはないの? ねぇ? ねぇ?

  他にも、一時停止の「タイヤが停止すること」とかだ。そもそも、停止ラインを疎かにしてることの方が問題だ。歩行者や自転車のことを考えれば、停止ラインを意識することは重要だが、完全停止の必要は感じない。停止ラインまでに十分に減速して、進行する判断が可能な場所まで徐行し、必要に応じて停止するべきだ。「タイヤが停止すること」自体に何の意味もない。

  社畜と嘲る自身も、そもそも思考停止した家畜になっていないか、振り返るべきだな。


2022-07-12(Tue) 政治と選挙とBASTARD!!と最終話

  基本、政治ネタは書かない主義なのだが。今回は敢えて。

  自分は、基本的に選挙に行かない派だ。実際、アラフィフだが、わずか2,3回しか行ったことがない。選挙に行かないというと、すぐに非国民扱いされるが、最近ちゃんとした理由を心に確立しているので、寸分も気にならない。

  簡単に言えば「日常の生活に大きな不満がない」「候補についてよく知らない」「たかが1票なんかよりやれることはある」と思っているからだ。

  まず「候補についてよく知らない」だが、実際、知らない人だ。そして、知ることも難しい。せめて、競馬新聞のように半面程度で、候補の「過去の具体的な成果」「具体的な公約」を横並びしたものを配ったらいいのに。選挙ポスター1枚程度の面積があれば収まる。むしろ、顔を貼り出していることに何の意味があるのか聞きたい。

  次「たかが1票なんかよりやれることはある」だが、それはズバリ、人の心を動かすような文章の発表だ。ツイッターあたりで、ひとつバズれば、世論が動くといっても過言じゃないだろう。実際、ひろゆきは世論を動かしまくっていると思う。自分も、自分の得意な分野で人の心を動かせるような提言ができるならば、いつでもそれをやるつもりだ。

  しかし、そんな自分だが、今回は選挙に行ったのである。なぜなら、上記の3つの条件に沿わない状況が発生したからだ。それは、赤松健氏だ。正直、彼の代表作「ラブひな」はよく知らなかったが「Jコミ/絶版マンガ図書館/マンガ図書館Z」を知り、訪れ、メルマガを購読していて、彼をよく知り、その考え、活動に共感していたからだ。つまり「候補についてよく知らない」どころか、詳しく知っている人物だからだ。

  そして「日常の生活に大きな不満がない」と思っていたが、主にマンガに対する表現規制の動きに関しては大いに不満を抱いていたことに気づかされたからだ。

  とはいえ「たかが1票なんかよりやれることはある」には変わりないし、彼は自分が投票しなくてもブッチギリ当選すると思っている。しかし、少しでも彼の存在感を増すために、この1票を上乗せしなくては、と思ったからだ。

  結果、当選どころか、53万票だそうだ。これは、過去3回連続で党内トップ当選している次点の候補より11万票も上回っているとのこと。これだけ集めれば、党内でも相当の存在感を示せるのではないか。わずかながら、それに貢献できたことが嬉しい。要するに、ちゃんとした理由があるならば、自分だって投票に行くってことさ。

  さて、ここまできて「日常の生活に大きな不満がない」と思っていたが、マンガ以外に、クルマ関係の動きに関しても、大いに不満があることに気づいた。

  その不満は、単に自動車税やガソリン税が高いという個人的な都合には留まらない。過剰に電気自動車推進をするのでなく、世界の中で日本の車が存在感を示し続けられるよう、トヨタやマツダをもっと支援するべきだということだ。トヨタの車は1ミリも好きじゃないが、日本の屋台骨であることには敬意を払っている。

  つうか、トヨタくらいの規模になれば、いくらでもお抱え政治家を送り込めそうなものだが、そんなことはないのか。ある意味クルマバカすぎて、そこまで気が回らないのか。池田直渡氏みたいなご意見番が立候補するならば、ゼヒまた投票に行きたいのだけどね。

  と、いうところで「BASTARD!!」の最終話を観た。他にやりたいこともあるので、一日一話と決めて観ていたのだ。で、先に「ガッカリ慣れしたのか、それほど違和感なく観えるようになった」と書いたが、そうではなく、実際だんだんよくなってきたのではないかと思える。というのも、最終話にはグイグイと心を持っていかれたからだ。単に、原作が熱い展開だから、だけではないように思える。処女作のマンガの一巻の最初と最後で、技量の違いが明らかな作品のようなことが起こったのか。いや、よかった。観てよかった。こんなことあるんだな。

  しかし、まさかそこで終わるとは。まだ、興奮が醒めない。二期への期待は高まったぞ。契約の継続は決まったな。しかし……完全版の2巻が未だに届かないのだが……。


2022-07-08(Fri) そんなにBASTARD!!が好きだったのか、フルタニアン。

  以前、ヴォーカル趣味のYOASOBIつながりで、アニメ「BEASTARS」が観たくなって契約したNetflixだが、何ヶ月か契約したものの、それほど観たいものがなく、契約を打ち切っていた。しかし、観たいものが出てきて、契約を再開である。

  画像の説明

  「BASTARD!!」だッ!

  当時、途中までコミックスを買っていたものの、それほど熱中していたわけでもないが、アニメ化と知ってなんだか無性に観たくなってしまった。ちなみに、旧OVA版は観ていない。で、待ちに待った配信当日。契約を再開し、ワクワクしながら1話を観始めた。

  ……が、何だか微妙……。

  急速にしぼんでいくワクワク感。なんだこのコレジャナイ感は。うまく説明できないが、心に響かない。確かに、作画がキリッとしてないような気はするが、それだけではないような……。

  観終わって、何気なく横に並んでいた「HELLSING」を途中から観てしまう。ペンウッド卿の辺り。いや、既に何度か観てるんだが、そうなんだよな。こう、なんというか、グッとくる感じがまるで違う。まぁ、こっちは神作の部類なんだろうが、こうあって欲しいんだよな。

  どうにもクサクサして、無料公開している原作の漫画を読み返してしまう。うぉ、なんというか、原作の方が圧倒的にグッとくる。そうなんだよな。あー、ガッカリ感が半端ない。よく考えたら、Netflixのアニメ化って、微妙なものも多いような気がしてきた。しかし、よりによって「BASTARD!!」を微妙にするんじゃねーよ……。

  まぁ、せっかくだし、2話以降も観ているのだが、ガッカリ慣れしたのか、それほど違和感なく観えるようになったものの、観終わったあとに無料公開している原作の漫画を読み直してしまう。つうか、もう一度、ちゃんと紙で欲しくなってきてしまった。

  調べると完全版というのも出ているようだ。高いけどサイズが大きいのは、ちょっとイイかも。やはり、本作の魅力は、圧倒的な画力に拠るところも大きい。しかもなに? 2巻は別物レベルに描き直してあるんだって?

  えーい、そんなら少なくとも2巻まで買ってしまおう……と、思ったら、2巻は既に新品で買えない。が、今を逃すとますます入手困難だ。1巻は新品で。2巻は中古で手配する。1巻は翌日には届いた。

  デカい。本を取り巻くような想定外の装丁。しかし、迫力が違う。カラーもそのまま収録されているし、これはイイ。細かい部分まで楽しめるから、一度読んでるはずなのに発見だらけだ。つうか、オイラはそんなに「BASTARD!!」が好きだったのか。

  残念なことに、連載は中断していて完結していないし、作者ももう描く気がなさそうだ、とのこと。いや、そんなの全然いいです。やたら完結にコダわっている読者は多いようだが、自分は全然コダわらない。そもそも、話の展開の仕掛けを楽しむような作品でもないだろうし。

  いっちゃわるいが、某エヴァンゲリなんとかみたいに、ヤル気がないのに無理に完結まで持っていって、まったくクソしょーもないラストに至るくらいなら、そんなの作らないほうがよっぽどいい。まぁ、アレをありがたがっている人も多いようではあるが。

  未だ完全版の2巻は届いていないが、どうも3巻以降も今となっては入手困難のようなので、そこからは読みたい気持ちがある限り通常版をボチボチと買っていこうかしらん。

  画像の説明

  あ、関係ないが、先日、居酒屋で呑んだウイスキー、ニッカの「奏楽(セッション)」がよかったので、ボトルで買ってみた。ここんとこ、筋トレとかに熱中しているものあって、ずっと寝床でのウイスキーをヤメてたんだが、久々に。んが、あれ? こんなんだったっけ……?