電子趣味の部屋

電子系のガジェットやアプリ開発等の趣味の話題を書いてます

電子工作感覚でプログラミングできる ConnectJS

電子工作やFPGA等の部品同士を配線していくような感じでプログラミングできるJavascriptのライブラリを作りました。
ドキュメント等は簡易的なものしかありませんが、とりあえずGithubで公開してます。
github.com

モジュールさえ用意すれば接続していくだけで色々できるので、将来的にはGUIでブロックをつなげるようにプログラミングできればと考えています。

詳細な説明代わりに実例に沿って説明します。
LED、4bitシフトレジスタ、タイマーに見立てたモジュールを作り、LEDを1秒毎に順番に光らせるプログラムを作ります。

上の画像のようなHTMLのテーブルのセルをLEDに見立てて、左から順番に光らせて一番左の次はまた一番右に戻ります。
回路図でイメージすると、下の図のようになります。

ライブラリ本体(connectjs.js)はGithub内にあります。
サンプルソースを動作させるのに必要になります。
https://github.com/uosoft/ConnectJS/blob/main/src/connectjs.js

モジュール作成

まず、各モジュールを作ります。

LED

ファイル名 : LEDModule.js

// LEDModule
// モジュールはConnectModuleクラスを継承する
class LEDModule extends ConnectModule {
	//コンストラクタ
	constructor(led) {
		super();  //継承先でコンストラクタを定義する場合は親のコンストラクタを初めに呼ぶ
		this.led = document.getElementById(led);
	}
	// セットアップ
	setup() {
		this.addPort("led", true, false);  //ポート led1 を追加 (ポート名, IN許可, OUT許可)
	}
	// ポート led に値がセットされたときに動作する setter
	set_led(value) {
		if (value == 1) {
			this.led.style.backgroundColor = "#ff0000";
		} else {
			this.led.style.backgroundColor = "#ffffff";
		}
	}
}
4bitシフトレジスタ

ファイル名 : ShiftModule.js

// 4bitShiftModule
// モジュールはConnectModuleクラスを継承する
class ShiftModule extends ConnectModule {
	// セットアップ
	setup() {
		this.isCountup = false;
		this.addPort("si", true, false);  //ポート si を追加 (ポート名, IN許可, OUT許可)
		this.addPort("ck", true, false);  //ポート clock を追加 (ポート名, IN許可, OUT許可)
		this.addPort("qa", false, true);  //ポート qa を追加 (ポート名, IN許可, OUT許可)
		this.addPort("qb", false, true);  //ポート qb を追加 (ポート名, IN許可, OUT許可)
		this.addPort("qc", false, true);  //ポート qc を追加 (ポート名, IN許可, OUT許可)
		this.addPort("qd", false, true);  //ポート qd を追加 (ポート名, IN許可, OUT許可)
		this.port.qa = 0;
		this.port.qb = 0;
		this.port.qc = 0;
		this.port.qd = 0;
	}
	
	// ポート ck に値がセットされたときに動作する setter
	set_ck(value) {
		if (value) {
			if (!this.isCountup) {
				var si = this.port.si;
				if (si != 1) {
					si = 0
				}
				this.port.qd = this.port.qc;
				this.port.qc = this.port.qb;
				this.port.qb = this.port.qa;
				this.port.qa = si;
			}
			this.port.isCountup = true;
		} else {
			this.port.isCountup = false;
		}
	}
}
タイマー

ファイル名 : TimerModule..js

// TimerModule
class TimerModule extends ConnectModule {
	// セットアップ
	setup() {
		this.t = null;
		this.addPort("clockout", false, true);  //ポート clockout を追加 (ポート名, IN許可, OUT許可)
		this.addPort("interval", true, false);  //ポート interval を追加 (ポート名, IN許可, OUT許可)
	}
	// ポート interval に値がセットされたときに動作する setter
	set_interval(value) {
		if (this.t != null) {
			clearTimeout(this.t);
		}
		if (value != 0) {
			var self = this;
			self.t = setTimeout(function() {
				self.port.clockout = true;
				self.port.clockout = false;
				self.port.interval = value;
			}, value);
		}
	}
}

HTML

LED表示部分

HTMLのbodyにLEDに見立てたテーブルを作ります。

<table border=1>
	<tr>
		<td id="led1">&nbsp;&nbsp;&nbsp;&nbsp;</td>
		<td id="led2">&nbsp;&nbsp;&nbsp;&nbsp;</td>
		<td id="led3">&nbsp;&nbsp;&nbsp;&nbsp;</td>
		<td id="led4">&nbsp;&nbsp;&nbsp;&nbsp;</td>
	</tr>
</table>
モジュールを接続する処理

下のような処理をbodyのonload辺りに実行します。

// コネクトマネージャ
var cm = new ConnectManager();
// モジュール4bitShiftModule (シフトレジスタ的なもの)
var shift = new ShiftModule();
// モジュールTimerModule (オシレータ的なもの)
var timer = new TimerModule();
// モジュールLEDModule (LED的なもの)
var led1 = new LEDModule("led1");
var led2 = new LEDModule("led2");
var led3 = new LEDModule("led3");
var led4 = new LEDModule("led4");

// モジュールのポートを接続する
// (モジュール1, モジュール1のポート, モジュール2, モジュール2のポート)
cm.connect(shift, "ck", timer, "clockout");
cm.connect(shift, "qa", led1, "led");
cm.connect(shift, "qb", led2, "led");
cm.connect(shift, "qc", led3, "led");
cm.connect(shift, "qd", led4, "led");
cm.connect(shift, "qd", shift, "si");

// 各ポートの初期化処理
shift.port.si = 1;
shift.port.ck = true;
shift.port.ck = false;
timer.port.interval = 1000;
HTMLファイル全文

一通り動作するHTML全文です。
ファイル名 : led_shifter.html

<!DOCTYPE html>
<html>
	<head>
	<title>Connect JS Sample  -- LED Shifter --</title> 
	<meta name="viewport" content="width=device-width, initial-scale=1">
	
	<script type='text/javascript' src='connectjs.js'></script>
	<script type='text/javascript' src='ShiftModule.js'></script>
	<script type='text/javascript' src='TimerModule..js'></script>
	<script type='text/javascript' src='LEDModule.js'></script>

	<script type="text/javascript">
	
	function start() {
		
		// コネクトマネージャ
		var cm = new ConnectManager();
		// モジュール4bitShiftModule (シフトレジスタ的なもの)
		var shift = new ShiftModule();
		// モジュールTimerModule (オシレータ的なもの)
		var timer = new TimerModule();
		// モジュールLEDModule (LED的なもの)
		var led1 = new LEDModule("led1");
		var led2 = new LEDModule("led2");
		var led3 = new LEDModule("led3");
		var led4 = new LEDModule("led4");
		
		// モジュールのポートを接続する
		// (モジュール1, モジュール1のポート, モジュール2, モジュール2のポート)
		cm.connect(shift, "ck", timer, "clockout");
		cm.connect(shift, "qa", led1, "led");
		cm.connect(shift, "qb", led2, "led");
		cm.connect(shift, "qc", led3, "led");
		cm.connect(shift, "qd", led4, "led");
		cm.connect(shift, "qd", shift, "si");
		
		// 各ポートの初期化処理
		shift.port.si = 1;
		shift.port.ck = true;
		shift.port.ck = false;
		timer.port.interval = 1000;
	}
	
	</script>

</head>
<body onload="start();">
<table border=1>
	<tr>
		<td id="led1">&nbsp;&nbsp;&nbsp;&nbsp;</td>
		<td id="led2">&nbsp;&nbsp;&nbsp;&nbsp;</td>
		<td id="led3">&nbsp;&nbsp;&nbsp;&nbsp;</td>
		<td id="led4">&nbsp;&nbsp;&nbsp;&nbsp;</td>
	</tr>
</table>
</body>
</html>

最近遊んで面白かったインディーズ系ゲーム (Steam)

年末年始の休みからSteamのセール等で面白そうなものを買ったり、過去に買ったものの積みげーだったゲームを色々遊んでみました。
そこで特に面白かったゲームをいくつか紹介します。

Palworld / パルワールド

最近話題になってますね。
結構面白く、Diablo4のシーズン3を休んで遊んでます。
システム的にも他のサバイバルゲームよりは難易度は低く遊びやすいと思います。

Vampire Survivors

PCレビュー系のYoutubeチャンネルでグラフィックが軽めのゲームは動きますよといった、軽いゲームの動作確認で良く使われてたので気になってたゲームです。
2Dのドット絵で、ディアブロをローグライクにしたようなゲームです。
ゲーム開始時にレベル1から始まり、レベルアップ時に武器やアイテムを選択して強化し、30分生き残るとステージクリアになります。
ゲーム中に取得したお金でキャラや能力をアンロックします。
沢山の敵を一気に倒す無双的な爽快感があります。
Switchでもダウンロード販売されています。

Hacknet

色々なサーバをハックしてファイルを探したりしながら謎を解いていくハッキングシミュレータです。
実際のUNIXライクなコマンドを使いながら進めていくことになります。
簡単なUIで操作しながら進めることもできますが、Linux等を触ったことがない人には難しいと思います。
わかっている人は意外と嵌ってしまうゲームです。

PowerWash Simulator

高圧洗浄機でいろんなものを洗うゲームです。
ひたすら汚れを落としていくゲームですが、無心で遊べます。
DLCでバック・トゥ・ザ・フューチャーを題材にしたものがあったので、購入してしまいました。
デロリアンや時計台の時計等を洗えます。

PC Building Simulator

2年以上前に面白そうだと思って買って、やっと遊んでみました。
PCショップを経営し、顧客の依頼でパーツ交換や、組み立て、修理を行いながら余ったお金で自分のPCを強化していくゲームです。
実際のCPUやグラフィックボード等のパーツで組み立てられます。
作業はほぼパーツ交換だけなのですが、永遠に遊んでしまいます。

Retro Gadgets

色々な電子ガジェットを作れるゲームです。
まだボタンを押してる間LEDが光るものしか作ってませんが、使いこなせると面白そうなのでもっと遊んでみようと思ってます。
CPUを置いてLUAでプログラムを組んで制御することもできます。

Planetbase

未開の惑星に基地を建設し開拓していくゲーム。
この手のゲームにしては災害等のイベントは少な目で割と落ち着いてプレイできます。
ある程度大きくなると急にバランスがシビアになって、食料や資源が足りなくなってしまいます。

Sa・Ga COLLECTION

インディーズではありませんが、ゲームボーイ版のサガシリーズ3部作をセットにしてWindowsで遊べるようにしたものです。
これを始めたらどうせなら実機で遊びたいと思い、実機で1をクリアするところまで遊んでしまいました。

Steam Deck (LCD 64GB)を入手しました

年末に色々整理してASUS ROG Allyを手放してしまいました。
XBOXのランチャーやSteamのBig Pictureモードでなるべくゲーム機のような使い方をしてたのですが、Windowsである以上、色々やろうとするとデスクトップ上で操作する事が多くなります。
その際に一々コントローラをデスクモードに切り替えたり、それも使いにくいので結局別にキーボードとマウスを接続したりしていると煩わしくなってしまいます。
また、画面サイズも小さいのでデスクトップで使うときは疲れてしまいます。

欠点がありはありますが、機能とデザインでは気に入ってる機種でした。
コレクション的に置いておきたい気持ちはありましたが、値段が下がる前に売却したいと思い手放してしまいました。

代わりに前から気になっていたSteam Deckを入手しました。
OLEDの新型が発売されて中古相場が少し下がったLCDの64GBの機種です。
オークションでクーポンも使用して4.5万円ほどでした。

購入したのは64GB版ですが、ASUS ROG Allyで交換した1TBのSSDを元の512GBにに戻して売却し、Steam Deckの方を1TBにしました。
ROG AllyとSteam Deckは同じ2230サイズのSSDが使用できます。

はじめはSteam Deckを買おうと思ってたのですが、その予算でROG Allyを買ってしまいました。
今回もROG Allyが購入時の1万円程度のマイナスで売却できたので、OLED版も考えたのですが、1世代前の性能で躊躇したののと、元々Steam DeckのLCDの評判も良く、店頭で見ても十分綺麗だったので今回は安く済ませようと思いました。

実際に触ってみてROG Allyのような性能や価格の製品が発売されてもSteam Deckが人気な理由がわかりました。

まずは操作性で、メニューのUIがよく出来ていてSwitchのようなゲーム機の感覚でPCのゲームができてしまうので、手軽にゲームが始められます。
SteamのBig Pictureモードにすれば同じじゃない?と思われがちですが、あれはただのランチャーだと思いました。
Steam DeckのメニューはSteamや本体の設定まで簡単にアクセス出来て使いやすいです。
次にゲーム自体の動作です。
Steam Deckに正式に対応しているゲームで所有しているものの中で比較的動作が重めなNo Man's Skyを試したのですが、性能が良いはずのROG Allyで遊んだ時よりもスムーズに動作してました。
ROG Allyでも720pにしたり、一番低設定にして何とか遊んでたのですが、Steam Deckの方が快適に動作してます。
ゲームによってはSteam Deckで起動すると、デフォルトの設定をSteam Deck用にしてくれるので、メーカーがチューニングしているのと、OS自体がWindowsより軽いのが動作に影響してると思われます。

Steam Deckを入手してから特にNo Man's Skyとオクトパストラベラー IIが手軽にできるようになったので、購入してから2週間ほどですが毎日遊んでます。
Switchにもあるゲームですが、Steam Deckの方がロードも早く、No Man's Skyはオンライン要素もあるので、快適に遊べます。

明らかにROG Allyの時より遊ぶ頻度は多いです。
携帯機は操作性も含めて手軽さが重要だと思いました。
OLED版が発売したばかりですが、次の性能アップした機種が発売されたら買い替えてしまう気がします。

ゲーミングノートPCを買いました ASUS TUF Gaming A15 (Ryzen 7 7735HS GeForce RTX 4060)

最近TensorflowやPyTorchを使いたいのでnVidiaのGPUのPCが欲しいと思って探してました。
GeForce RTX 3070搭載のミニPCのMinisforum NUCXI7を注文しましたが、在庫を確保できなくてキャンセルになってしまいました。
他にnVidiaのGPU搭載のミニPCで探してもいまいち無くて、結局ノートPCで探すことになりました。

今回購入したのはASUS TUF Gaming A15です。

ASUS ゲーミングノートPC TUF Gaming A15

GPUにGeForce RTX 4060を搭載したモデルです。
CPUはRyzen 7 7735HSです。コアはZen3+、内蔵GPUはRadeon 680Mと前世代の6800Hと同じ構成ですが、GPUは別にあるので特に気にしてませんでした。

Minisforum HX90Gの後継としてデスクトップとして使用しようと思い、普段はスリープしないようにしてモニタに接続して、Bluetooth接続のキーボードとマウス、有線LANで使用してます。
電源をONにする際にノートを開くのが面倒ですが、それ以外は快適です。

さすがにGeForce RTX 4060を搭載してるだけあってFHDの画質ではほとんどのゲームで最高設定で遊べます。
動作モードはサイレント、パフォーマンス、Turboが設定があり、プリインストールされた専用のソフトで設定できます。
Turboモードはゲーム中はフルスピードでファンが回転するので、うるさいので実用的ではないかと。最高性能でヘッドホンでゲームをする人向けだと思います。
パフォーマンスモードはゲーム中はファンの回転数は上がるのですが、他のノートPCでも高負荷時でよくあるくらいの騒音です。Minisforum HX90GやPS5と同じくらいの感覚です。
サイレントモードは非常に静かで、高負荷時にファンの回転数が上がるのがわかるのですが、ほとんど気にならないくらいです。
他のレビューサイトを参考にするとベンチマークの3DMarkの実行中の騒音はTurboで55dB前後、パフォーマンスモードで45db前後、サイレントモードで38db前後です。

各モードの3DMarkのTime Spyを実際に実行してみました。

Turboモード

パフォーマンスモード

サイレントモード

Turboモードとパフォーマンスモードは騒音を犠牲するほどの性能差ではないかなと。
普段はパフォーマンスモードで良いと思います。
サイレントモードは20%程性能は落ちますが、Minisforum HX90Gと同じくらい(300程スコアが低いくらい)出てました。

普段遊ぶゲームはサイレントモードでも高設定で遊べてしまうくらいなので、FHDの解像度で使用する場合はサイレントモードで十分だと思います。ほとんどファンの音も気にならないので快適です。
特にDLSS3が優秀で対応しているゲームはフレームレートが倍くらいになるので、Diablo4やCyberpuck2077はサイレントモードでも十分に高い設定で遊べてます。

SSDが2個搭載できるので、2TBを2台にしてWindows2TB、Ubuntu1TB、共通データ用(exFAT)1TBにしました。
セットアップ後はMinisforum HX90GJetson Orin NXが思ったより高く売却できたので、上手く新たな出費なしで購入できました。

レトロPCコレクション 2024年1月

明けましておめでとうございます。
本年も当ブログをよろしくお願いします。

Libretto 70が故障してからあきらめたPC-DOS環境ですが、実家で古いWinXPノートを発掘したので、これをPC-DOS保存環境にしました。

他は1年前から変わってません。

PC-9821Xa16/R12

https://blog-e.uosoft.net/entry/20200124/1579804390 参照
2018年入手
PC98のメインマシン。
コンデンサ交換等の整備品を約2万円で購入
色々追加して結構フル装備になりました。

PC-486note au

https://blog-e.uosoft.net/entry/20200421/1587449084 参照
2020年入手
動作品確認品を約3万円で購入。
FDドライブが2台でPC-9801-26互換FM音源搭載のノート。640x480のTFT液晶
PC-9821Nxから乗り換えたノート環境です。FDドライブが2台なので、遊べるゲームが増えました。
DOS環境保存用のノートでは最適な機種だと思います。

FS-A1ST

2014年頃入手
当時約4万円
元MSXユーザである以上、ずっと憧れていた機種であり、いつか手に入れたいと思った機種でした。
MSX現役当時はMSX2だったので、入手したときは最高の機種がやっと手に入った気持ちでした。
FS-A1GTはディスプレイケーブルが専用なので、普通のケーブルが使用できるFS-A1STを選択しました。
音声にノイズが乗る様になったのを機に電解コンデンサを全部交換しています。その他にメモリ512KBに増設、ベルトレスFDドライブに換装をしました。
その後将来入手できなくなる可能性も考え、2017年に予備機としてもう1台同等処置を施した整備品を初回より倍近い金額で入手しました。
純粋な8ビット機が欲しいと思いHB-F1XDJを購入後 2022年に1台手放しましたが、整備品ということもあり購入した時より高額で売却できました。

HB-F1XDJ

2022年頃入手
当時約4.5万円
一度HB-F1XVを手放したところ、やはりBASICの速度や細かい挙動などからFS-A1STではなく純粋な8ビット機が欲しいと思い、コンデンサ交換、ベルトレスFDDに換装した整備品を購入しました。
現在はFS-A1STの方が予備機扱いで、こちらの方をメイン機として遊んでます。

Vaio type W

2009年頃入手
当時流行したネットブック。他のネットブックが軒並み解像度が1024x600でしたが、その中で1366x768だったのでこれにしました。ネットブックの中では少々高価でしたが、それでも購入時5万円以下だったと思います。
これは現在も持ち続けてWindowsXP保存環境として使用しています。
Windows95時代のゲームは大抵WindowsXPでも動作するので、古いWindowsゲームでは重宝しています。

HP Compaq nx9030

2004年頃入手
当時父親がパソコンを始めたいというのでプレゼントした機種。
すっかり存在を忘れてましたが、実家のものを整理してるときに発見しました。
WindowsXPのPCでしたが、PC-DOS2000をインストールしました。
1024×768のTFT液晶でVGAの等倍ではないのでちょっとぼけた感じになりますが、14インチと当時ありがちな大きさのディスプレイなので、PC-DOSの保存環境としては雰囲気も含めて良いものだと思います。
状態も良く、今でもバッテリーが1時間以上使用できます。

ハードウェアMIDI音源のこと (YAMAHA MU2000とRoland SC-88pro)

現在でも使用しているハードウェア音源があります。
YAMAHAのMU1000とRolandのSC-88proです。どちらも数年前に中古で購入したものです。

PC98所有当時はMIDI音源に憧れていたのですが、YAMAHAやRolandのものは価格的になかなか手が出ず、WaveStarにMIDIドーダーボードを装着したものを使用してました。

その後、QY70を音源代わりに使用してました。何か曲を作れそうと思って選んだのですが、結局固定で音源のみ使用してました。
QY70は当時から持ってるものではないのですが、これも数年前に状態の良いもの確保してを1台保管しています。

その後DOS/Vに移行後はSoundBlasterにDB50XGを装着しました。
PCのバスがISAからPCIに代わるタイミングでサウンドカードをYMF724を搭載したものにしました。

このような経緯からずっとYAMAHAのXG音源派でした。そこでWindows7の時代に過去のMOデータ整理してMIDIデータを発見したのを機に久しぶりに実機で聴きたくなり、当時憧れていて中古で安くなってたMU1000を入手しました。
その後、スマートメディアに入れたMIDIデータが直接聴けるMU2000に変えました。

MIDIデータはRolandのGS音源に最適化したものも多く、こちらも実機で聴きたくなりRolandのMIDI音源全盛期の定番のSC-88proを入手しました。
現在ではMU2000をWindows機に、SC-88proをPC-9821Xaに繋いで使用しています。


KZ PR3 私的レビュー

久しぶりのイヤホンレビューです。
最近は全く新しいイヤホンを買ってなかったのですが、平面磁気ドライバーが気になり、KZ PR3を買ってみました。


KZ PR3

初めはカサカサしたような乾いた感じの音がして、低音も籠った感じで失敗したと思いましたが、一晩のエージングで化けました。
いつものKZよりエージングの効果を感じました。振動版の銀コーティングが固くなってたのでしょうか。
音の傾向はKZらしくなく、低音が弱くて高音が強いです。
13.2mm平面ドライバーが高周波と超高周波応答を特徴としているので、高音寄りのバランスになったと思われます。
全体的に楽器が前に出てボーカルが遠いなと感じました。
特にバイオリンやギター等の弦楽器が素晴らしく、音の細かさや艶が感じられます。

KZの中では高価な方なので、解像度や音の分離感は良好です。
音の傾向は好みがわかれるところだと思います。

このようばパターンのイヤホンは持ってなかったので面白いです。