Tera Term 5.2でASCIIコード0x00を1バイト送信すると通信相手は0x01を2バイト受信する

目的

今日(2024/03/31)現在で最新のTera Term 5.2にて,シリアルポートでASCIIコード0x00を1バイト送信すると通信相手は0x01を2バイト受信してしまう.

0x00の送信は,マクロで

send $00

としているだけで,特に特殊なことはしていない.バージョン4.x系の最新4.108では0x00を1バイト送信すると,受信側も正常に0x00を受信する.

名称 規格 製造会社 備考
オペレーティングシステム Windows 10 Pro 64ビット,22H2 マイクロソフト
Tera Term 5.2 TeraTerm Project 今日(2024/03/31)時点で最新の5.x系のバージョン
Tera Term 4.105 TeraTerm Project 4.x系で今まで使っていたバージョン
Tera Term 4.108 TeraTerm Project 4.x系で最新

結論

現状では,4.x系の最新版である4.108であれば正常(0x00を1バイト送信すると,受信側も正常に0x00を受信する)であるので,この記事の現象に困った場合は,5.x系ではなく4.x系を使用する必要がある.Tera TermプロジェクトのGitHubにはissueを発行しておいた*1

github.com

上記issue発行より修正いただいたもので正常動作を確認した.次のバージョンである5.3より修正される見込み.

その他

業務上0x00のデータを含むシリアルポート通信を送信するマクロを作成していて,マクロでの送信データは正しいはずだがいっこうに受信機器が動作しないため,通信内容を調べたらこの現象に至った.

改訂履歴

# 日付 内容
1 2024/04/06 修正完了され,次のTera Term 5.3にて解消される見込みを追記

*1:本当は自分で直してプルリク発行をしたいが,ソースコードを見てみても該当の箇所がすぐわかる技術力を持っていないので諦めた

連番画像からパラパラ漫画風のmp4動画を作成する

目的

AviUtlにて,連番BMP出力(または連番PNG出力)した画像から特定のfps(秒間フレーム数)のパラパラ漫画風のmp4動画ファイルを作成する.

Python3は既にインストールされている前提で,PythonOpenCVライブラリーを使用した方法を紹介する.

名称 規格 製造会社 備考
オペレーティングシステム Windows 10 Pro 64ビット,22H2 マイクロソフト
Python3 3.12.2 Python Software Foundation python3 --versionにて確認
package installer for Python(pip) 24.0 Python Software Foundation python3 -m pip listにて確認
opencv-python 4.9.0.80 OpenCV Team
Python Image Library(Pillow,PIL) 10.2.0 gif出力は採用せず(後述)

結論

インストール~mp4動画生成までを順番に記載する

インストール

D:\>python3 -m pip list
Package Version
------- -------
pillow  10.2.0
pip     24.0

D:\>python3 -m pip install opencv-python
Defaulting to user installation because normal site-packages is not writeable
Collecting opencv-python
  Using cached opencv_python-4.9.0.80-cp37-abi3-win_amd64.whl.metadata (20 kB)
Collecting numpy>=1.21.2 (from opencv-python)
  Downloading numpy-1.26.4-cp312-cp312-win_amd64.whl.metadata (61 kB)
     ---------------------------------------- 61.0/61.0 kB 819.4 kB/s eta 0:00:00
Using cached opencv_python-4.9.0.80-cp37-abi3-win_amd64.whl (38.6 MB)
Downloading numpy-1.26.4-cp312-cp312-win_amd64.whl (15.5 MB)
   ---------------------------------------- 15.5/15.5 MB 46.7 MB/s eta 0:00:00
Installing collected packages: numpy, opencv-python
  WARNING: The script f2py.exe is installed in 'C:\Users\so2akt\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.12_qbz5n2kfra8p0\LocalCache\local-packages\Python312\Scripts' which is not on PATH.
  Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.
Successfully installed numpy-1.26.4 opencv-python-4.9.0.80

D:\>python3 -m pip list
Package       Version
------------- --------
numpy         1.26.4
opencv-python 4.9.0.80
pillow        10.2.0
pip           24.0

f2py.exeが既にインストールされているがPATHに登録されていないという警告が出ているが,今回の手順では問題なかったため,無視して進めている.

連番画像からmp4動画作成

以下のPythonコードを,連番画像と同一のディレクトリーで実行する.以下の例では,連番画像が5_00000.png5_00001.png5_00002.png,……,5_01113.pngの合計1114枚あり,それら画像を約0.618(≒2200 / 3555)fps*15.mp4として動画にするように処理している.

import numpy as np
import cv2

filnam = '5'
delim = '_'
ext_in = '.png'
ext_out = '.mp4'
zfill_num = 5      # 連番部分が00001という形式のように5ケタなので5
fps = 2200 / 3555 # 計算値の小数点以下の精度は不明……
frm_num = 1113     # フレーム数(≒結合する画像の連番番号最大値)

# 1枚目の画像を読み込んで,幅と高さを確定させる
img = cv2.imread(filnam + delim + str(0).zfill(zfill_num) + ext_in)
w = img.shape[1]
h = img.shape[0]
codec = cv2.VideoWriter_fourcc(*'mp4v')
video = cv2.VideoWriter(filnam + ext_out, codec, fps, (w, h))

for i in range(frm_num):
    img = cv2.imread(filnam + delim + str(i).zfill(zfill_num) + ext_in)
    video.write(img)
video.release()

画像ファイル名が連番ではない場合

連番画像ではあるが,5_00000.png5_00029.png5_00059.png,……というように数字で言う30ごとに飛び飛びのファイル名の場合,上記のPythonコードを一部変更する必要がある:

import numpy as np
import cv2

filnam = '5'
delim = '_'
ext_in = '.png'
ext_out = '.mp4'
zfill_num = 5      # 連番部分が00001という形式のように5ケタなので5
fps = 2200 / 3555 # 計算値の小数点以下の精度は不明……
frm_sta = 0        # 結合する画像の連番番号開始値
frm_end = 1113     # 結合する画像の連番番号最大値
frm_delta = 30     # 結合する画像の連番番号増分

# 1枚目の画像を読み込んで,幅と高さを確定させる
img = cv2.imread(filnam + delim + str(0).zfill(zfill_num) + ext_in)
w = img.shape[1]
h = img.shape[0]
codec = cv2.VideoWriter_fourcc(*'mp4v')
video = cv2.VideoWriter(filnam + ext_out, codec, fps, (w, h))

# 00000番から始める場合は,0→29→59→……としたいが,増分30では,0→30→60→……となってしまうため,-1から繰り返す
# それ以外の,たとえば,29→59→89のように00029番から始める場合は29から繰り返せばOK
if frm_sta == 0:
    frm_sta = -1
for i in range(frm_sta, frm_end, frm_delta):
    # iが-1のときは00000番を意味するのでif文で分岐している
    img = cv2.imread(filnam + delim + str(0 if i < 0 else i).zfill(zfill_num) + ext_in)
    video.write(img)
video.release()

その他

感想

当初はmp4ではなく,Pillowライブラリーを使ったgifファイルとして生成し,AviUtlでイロイロ結合してmp4出力させようとしていた.しかしながら,gifをAviUtlで複数回読み込ませるとAviUtlで例外が発生してAviUtlが強制終了してしまっていたため,OpenCVを使用してmp4ファイル生成に至った.

OpenCVのインストールに手間・時間がかかると思い込んでいたが,Pythonライブラリーとしてのインストールは数秒であり,使い方例も豊富に存在したので手軽に実行できた.

なお,Pillowライブラリーを使ったgifファイル生成のソースコードは以下のとおりだが*2

from PIL import Image

filnam = '5'
delim = '_'
ext_in = '.png'
ext_out = '.gif'
zfill_num = 5      # ファイル_00001.pngなので5ケタ
dur = 3555 / 2200 # フレーム間隔ms
frm_num = 1113     # フレーム数
pictures = []

for i in range(frm_num):
    pic_name = filnam + delim + str(i).zfill(zfill_num) + ext_in
    img = Image.open(pic_name)
    pictures.append(img)
pictures[0].save(filnam + ext_out, save_all = True, append_images = pictures[1:], optimize = True, duration = dur, loop = 0)

今までは……

以下の画像のように,1枚ごとにAviUtlに読み込ませる→長さを変更,を画像の枚数ごとに繰り返していた.さすがにもっとよい方法があるだろうと思い,今回の対策大作にたどり着いた.

従来はなんと1枚ごとに画像読み込み・長さ変更

改訂履歴

# 日付 内容
1 2024/02/11 Pillowライブラリーを使用したgifファイル出力について追記
2 2024/02/17 画像ファイル名が連番ではない場合のPythonコードを追記

参考サイト

  1. OpenCVで動画作成 VideoWriter - Python徹底解説 · Daizyu.com(2024/02/10現在)
  2. Python(Google Colab)で.pngを.mp4にする(2024/02/10現在)
  3. 【python】複数画像からパラパラ漫画(gifアニメ)を作成する方法! - ヒガサラblog(2024/02/11現在)
  4. [解決!Python]条件式(三項演算子)を使ってif文を1行で書くには:解決!Python - @IT(2024/02/17現在)

*1:今回作成時のfpsなので任意の値にすればOK.秒間30フレームなら30.

*2:所望の動画は作成されるが,画質が劣化していたのでそれも併せて採用を見送っている.

batファイルを使用して連番画像から特定規則で画像を抽出する

目的

AviUtlにて,動画を連番BMP出力(または連番PNG出力)して,それらの連番画像から特定のフレームを偶数番,奇数番など規則的に取り出したい.ここでは,3個飛ばしの例を記載する.

連番画像例(_00000という5ケタの連番が付与されている)

おそらく方法はいくらかあるが,Windowsにて追加でソフトのインストールが必要なく実施できるバッチファイル(*.bat)にて実現する方法を紹介する.

名称 規格 製造会社 備考
オペレーティングシステム Windows 10 Pro 64ビット,22H2 マイクロソフト

結論

以下をbatファイルとして連番画像と同一フォルダーに保存して実行すると,tempフォルダー内に抽出された画像がコピーされる*1

@echo off

setlocal enabledelayedexpansion

rem 連番数字前までのファイル名
set filename_prefix=6_

rem 抽出先のディレクトリー指定
set pickup_dst=temp

rem 対象とする連番出力画像の開始番号
set idx_start=0

rem 対象とする連番出力画像の番号増分
rem ☞ここでは3のため00000,00003,00006,……となる
set idx_delta=3

rem 対象とする連番出力画像の終了番号
set idx_end=182

mkdir %pickup_dst%
for /l %%n in (%idx_start%,%idx_delta%,%idx_end%) do (
  rem 5ケタの場合は,変数前に0を4個分記載する
  set num=0000%%n

  rem 5ケタの場合は,5を指定する
  set num=!num:~-5,5!

  set filename=!filename_prefix!!num!.png
  copy !filename! !pickup_dst!\
)

endlocal

3ごとに連番画像を抽出

参考サイト

  1. .bat(バッチファイル)で数値の任意の桁を0で埋める方法 | 技術的特異点(2024/02/10現在)
  2. 環境遅延変数の原因と2つのポイント #コマンドプロンプト - Qiita(2024/02/10現在)

*1:書式の詳細は,参考サイトに記載したサイト参照

from PIL import Imageのエラーを解消する

目的

png画像を組み合わせてgifなりmp4なりにしたくて調べるとPythonでできるらしいのだが,サンプルコードの頭にあるライブラリー読み込み

from PIL import Image

D:\>python3 renban.py
Traceback (most recent call last):
  File "D:renban.py", line 1, in <module>
    from PIL import Image
ModuleNotFoundError: No module named 'PIL'

というエラーにしかならなかった.それをなんとか,エラーなく実行できるようになったので記載しておく.

名称 規格 製造会社 備考
オペレーティングシステム Windows 10 Pro 64ビット,22H2 マイクロソフト
Python2 2.7.12 Python Software Foundation python --versionにて確認
Python3 3.12.2 Python Software Foundation python3 --versionにて確認
package installer for Python(pip) 24.0 Python Software Foundation pip listおよびpython3 -m pip listにて確認
Python Image Library(Pillow,PIL) 10.2.0

結論

pip install pillow

ではなくて

python3 -m pip install pillow

でインストールすると問題なくfrom PIL import Imageが実行できた:

D:\>python3 renban.py

D:\>

その他

数年ぶりにPythonを触ってみて,そもそもPCに環境がインストールされているのかも不明だった.加えて,Pythonは2や3といったバージョン系があるところが自分自身まったくわかっていない.上記install前後でのインストール済みライブラリー確認コマンドは以下のとおりで,とにかくpip installではなくてpython3 -m pip installなら大丈夫だった:

D:\>pip list
Package    Version
---------- -------
pillow     10.2.0
pip        24.0
setuptools 58.1.0

D:\>python3 -m pip list
Package Version
------- -------
pip     24.0

D:\>python3 -m pip install pillow
Defaulting to user installation because normal site-packages is not writeable
Collecting pillow
  Downloading pillow-10.2.0-cp312-cp312-win_amd64.whl.metadata (9.9 kB)
Downloading pillow-10.2.0-cp312-cp312-win_amd64.whl (2.6 MB)
   ---------------------------------------- 2.6/2.6 MB 12.9 MB/s eta 0:00:00
Installing collected packages: pillow
Successfully installed pillow-10.2.0

D:\>python3 -m pip list
Package Version
------- -------
pillow  10.2.0
pip     24.0

D:\>python3 renban.py

D:\>

なお,PillowのDocumentationのInstallation(2024/02/09現在)には,上記正しい方法のpython3 -m pip install pillow相当のコマンドが記載されている.

参考サイト

  1. [Python] ModuleNotFoundError: No module named 'PIL'の解決方法(2024/02/09現在)

PCのマイク端子でXLR接続のダイナミックマイク,コンデンサーマイクを使う

目的

PCI Express接続のボードにマイク入力,ライン入力,SPDIF入力を集約しようと計画していたが,マイク入力だけどうしても集約できていなかった.理由は簡単で,PCI Express接続のサウンドカードであっても,通常は,マイク入力端子はプラグインパワーによりエレクトレットコンデンサーマイクの接続が想定されており,XLR端子接続のダイナミックマイクまたはコンデンサーマイクは接続できないから*1

しかしながら,ちょっと着眼点を変えると,スマートフォンに対してXLR接続のダイナミックマイクコンデンサーマイクが接続できるオーディオインターフェースは存在する. 今回は,それを用いてPCのオンボードおよびサウンドカードのマイク入力端子にてコンデンサーマイクを使用することができたのでまとめておく.

名称 規格 製造会社 備考
オペレーティングシステム Windows 10 Pro 64ビット,22H2 マイクロソフト
サウンドカード Sound Blaster ZxR Creative マイク入力は6.35mmジャック
オンボードオーディオ HD Audio Realtek Gigabyte製AORUS Mマザーボード
マイク入力インターフェース iXZ TASCAM CTIA端子(3.5mm,4極)のマイクまたはギター入力,単3電池2本必要
CTIA-3.5mmマイク・スピーカー分岐ケーブル WE-ERMCCON-50 WEUTOP Amazon.co.jpで安いものを購入
3.5mmメス-6.3mmオス変換プラグ AC-666 フジパーツ
コンデンサーマイク AT2020 オーディオテクニカ

結論

以下の接続

とすることで,XLRのコンデンサーマイクAT2020を問題なく使うことができた.ファンタム電源はiXZから供給することができる.

その他

XLR接続のマイクを変換ケーブルを使用してPCに接続すると

世の中にはXLR端子-3.5mm3極プラグ(または6.3mm3極プラグ,TRS)は販売されているが,このケーブルを使用して単純に物理的に接続してもダイナミックマイクおよびコンデンサーマイクは使用できなかった.PCのマイク端子は,プラグインパワー と呼ばれ,エレクトレットコンデンサーマイクが考慮されているが,その端子の出力電圧が業界で定まっておらずメーカーによって異なるとのことである*3

ダイナミックマイクは電圧を印加しない仕様*4.一方,コンデンサーマイクはファンタム電源として+48[V]を印加する仕様なので,当然,2~3.3[V]では電圧不足である.

マイクの入力ゲインは,Windowsサウンド設定のレベルタブにあるマイクブーストからあげることができるが,試してみたが,ノイズも増幅してしまい,まったく使い物にならなかった*5

サウンド設定タブのマイクブースト設定画面

スマートフォンにXLRマイクを接続できる機器

今回のTASCAM iXZ以外にも,以下のデバイスで対応できそうではある(動作未確認).

本件の着想に関して

オーディオ周りの電気回路は,素人には難しいところではあるが,「プラグインパワー ライン入力 マイク入力」で検索するとTOMOCA製VX-3LMP*6

というXLRのダイナミックマイク入力をPCのマイク入力レベルまたはライン入力に変換できる機器を解析したブログがあった:
VX-3LMPの回路解析(linear_pcm0153氏のブログより引用)

この内容からすると,マイク入力に対しては,オーディオトランスを介して接続し,PCのマイク端子とオーディオトランスの間にプラグインパワーによる直流カットのための電解コンデンサーを挿入する回路を構成することで,ダイナミックマイクは接続できるようになると思われる.一方,コンデンサーマイクの場合はファンタム電源を供給できるような電源回路が必要となる.

TASCAM iXZのハードウェア

TASCAM iXZはプラスチックとネジ止めされているだけなので,カンタンに分解できる(解像度高めに撮影したので拡大可):

メイン基板裏面 メイン基板表面

CTIA端子に対して,黒色線がGND,茶色線がMICに接続されている.MODEスイッチはマイク設定時,1と3,5と7がショートする.また,PHANTOMスイッチはONのとき1と3がショートする.

MODEスイッチの5と7ショートは,単純に緑色電源LEDのON/OFFであるように見える.一方,MODEスイッチの1と3は,MIC端子へのプラグインパワーを受けて,基板表面のXLR・TSコンボジャックの白色5線でよく見えないがRとLを介して,C1の電解コンデンサー+に入力されている.

ファンタム電源は,基板裏面のXLR・TSコンボジャック横の電解コンデンサー47[μF],耐圧63[V]に印加され,XLRのホットおよびコールドにそれぞれ6.6[kΩ](≒3.3[kΩ]の直列抵抗,R3とR6,R5とR7)を介して実測+45[V]が出力されていた.

基板において,U1は211と印字があるのでオペアンプU2はPH01またはPHO1と印字があるので昇圧のDCDCコンバーターであると思われる. このDCDCコンバーター単品では,TPS61040のデータシートにおけるTypical Application Schematicを見る限り,+28[V]までの出力に思えるが,リファレンスデザインPMP4677*7

TPS61848DBVの昇圧回路
に+47.5[V]の出力回路例があるので,これと同等の回路構成の可能性はある.回路上の部品点数が似ているようにも見える.

改訂履歴

# 日付 内容
1 2024/01/21 TASCAM iXZの基板について追記

参考サイト

  1. プラグインパワーマイク入力へのライン入力を考える | 音響・映像・電気設備が好き(2024/01/21現在)
  2. ダイナミックマイクにファンタム電源がかかっても大丈夫か?|サウンドハウス(2024/01/21現在)
  3. OPA211 data sheet, product information and support | TI.com(2024/01/21現在)
  4. TPS61040 data sheet, product information and support | TI.com(2024/01/21現在)
  5. PMP4677, Low Power boost Reference Design with cascaded NPN - Datasheets.com(2024/01/21現在)

IK Multimedia iRig Pre 2

IK Multimedia iRig Pre 2

  • IK Multimedia(アイケーマルチメディア)
Amazon

*1:ESI製MAYA44 eX,Creative製Sound Blaster AE-9などを除く.ESI製MAYA44 eXはソフトウェアでのノイズフィルターが不要なほどきれいなマイク入力できます.

*2:ピンク色のマイク端子を使用する.

*3:実測でオンボードオーディオの場合2[V],Sound Blaster ZxRの場合3.3[V]が出力だった.

*4:作りによっては印加しても問題ないらしく,オーディオテクニカ製AT2040はファンタム電源+48[V]を数秒印加しても壊れなかった.

*5:Equalizer APOやVSTプラグインで対処できる"レベル"ではない.

*6:廃盤であり,後継機種のひとつにVX-3MPがあるがSoundHouseで注文したところメーカー販売終了とのこと(2024/01/15時点).

*7:Texas Instruments社のサイトからはたどりつけず

(書きかけ)ASIO対応しているオーディオデバイス

目的

オーディオデバイス周りを触っていて,ASIO対応しているデバイスが気になってきたのでまとめておく.

結論

  1. Sound Blaster Z
  2. Sound Blaster Z SE(動作未確認)
  3. Sound Blaster ZxR
  4. MAYA44 eX
  5. Razer Audio Mixer
  6. GO XLR mini(動作未確認)

参考サイト

  1. GOXLR Miniを買って試してみた!! | Mamireimu Net Work's

Sound Blaster Z(Sound Blaster Z SE)のライン入力を有効にする方法

目的

Sound Blaster Z(Model Number: SB1500)*1にて,以下の端子①は,アナログライン入力/マイク入力共用端子である.これをアナログライン入力端子として使いたかったが,その変更方法に迷ったため明記しておく.

Sound Blaster Zの端子①

名称 規格 製造会社 備考
オペレーティングシステム Windows 10 Pro 64ビット,22H2 マイクロソフト
サウンドカード Sound Blaster Z Creative メルカリで本体のみ購入(Z SEで販売されていたが……)
サウンドカード制御ソフトウェア(旧) Sound Blaster Z-Series Control Panel,2.15.04 Creative
サウンドカード制御ソフトウェア(新) Sound Blaster Command,3.5.10 Creative

結論

以下の設定において,ダイレクトモードをONにしている.

Sound Blaster Z-Series Control Panelの場合

Sound Blaster Z-Series Control Panelでは,ユーザーズガイドに記載あり

  1. Sound Blaster Z-Series Control Panel左側の一覧から,MIXERを選択する.デフォルトの状態なので,Rear Microphoneが選択されているため,Windowsサウンドの録音タブでは,Microphone表示となっている
    マイク入力が有効の状態(デフォルト)
  2. Rear Line-Inを選択すると,Windowsサウンドの録音タブにて,Line-In表示となる
    ライン入力が有効の状態

Sound Blaster Commandの場合

  1. Sound Blaster Command左側のメニューから,Mixerを選択し,Multipurpose Input Selectをクリックする.デフォルトの状態なので,Microphoneが選択されているため,Windowsサウンドの録音タブでは,Microphone表示となっている
    マイク入力が有効の状態(デフォルト)
  2. Line-Inを選択すると,Windowsサウンドの録音タブにて,Line-In表示となる
    ライン入力が有効の状態

その他

Sound Blaster Z-Series Control Panelにてサウンドカードが見つからなかった

Sound Blaster Z-Series Control Panel起動時,サウンドカードが見つからないエラーが一度発生した*2.そのエラー発生時は,以下のように右上の▼よりオーディオデバイスを明示的に選択することにより解決できる.

  1. Audio Device Selection...を選択する
    Audio Device Selection...の選択
  2. プルダウンメニューから,Sound Blaster Zを選択してOKを押す*3
    Sound Blaster Zの選択

参考サイト

  1. Sound Blaster Zのアナログライン入力 - stutterの日記
  2. Sound Blaster Z - Sound Blaster Beamformingマイクロフォン付属、Sound Blaster Zシリーズのベーシックモデル - Creative Technology (日本)
  3. Sound Blaster Z/Zx - User Guide (Japanese)

*1:Sound Blaster Z SEも同一のModel Numberであるため,おそらく同一.

*2:スクリーンショットを撮らなかったのでエラー詳細は不明.

*3:エラー発生時は,ココが空白になっていた.