さて、レッドストーン回路についての記事は今回で早くも4回目となります。が、まだまだお伝えしたいことがたくさんあります。普段は連載などほとんどしないのですが、ここから記事にナンバリングしていくことにしました。
で、今回は今まで特に意識してこなかった遅延という重要な概念と、その回路を単純に応用する例、そして遅延が必要不可欠ともいえる音符ブロックの取り扱いについて説明していきます。
バックナンバー
今までのレッドストーン関連の記事です。これらの記事に書いた知識があることが前提で説明をしていきますので、まだの方はぜひこれらからご覧ください。
さて、今回の本題に入っていきたいと思います。まずは、大きな回路を組むうえで避けては通れない「遅延」に関することから。
遅延とは
RSトーチに新しい信号が入力されたとき(例えば今までONが入力されていたのがOFFになるとか、OFFが入力されていたのがONになるとか)は、RSトーチの出力ももちろんそれに応じて新しくなりますが、一瞬で更新されるわけではありません。
RSトーチは、新しい入力を受け取ってから、0.1秒ちょっとくらいで新しい出力を出すからです。この0.1秒ちょっとの時間を遅延といいます。
例えば、RSトーチを1個使用したNOT回路に信号を通すと、その先には0.1秒ちょっと遅れて信号が到達することになります。ですからこの回路では、ボタンを押すのと完全に同時に、NOTを通った先の信号が切り替わるわけではありません。まあ、この程度なら体感するほどでもないかもしれませんが。
他には、RSトーチを2個使用したリピーター(仮)だと、0.1秒ちょっとの遅延が2回発生するため、その先には0.3秒弱くらいは信号が遅れて伝わります。
ちなみに…さっきから「0.1秒ちょっと」と言っていますが、はっきりしないのはプレイ環境によって変わるためです。筆者のiOSデバイスだと0.15秒くらいなので、同じiOSデバイスを使われる人は同じ時間になるだろうと思いますが、例えばAndroid環境だとまた分かりません。
遅延を生む回路
注意 : この記事はPEにリピーターがなかった当時のものです。現在は無駄にトーチを多くつなげなくても、遅延を大きくしたリピーターをいくつか使うだけで同じことができます。詳しくは以下をご覧ください。
https://nagished.com/game/minecraft-pe-0-14-redstone-repeater-usage/
単純に遅延を生むためには、RSトーチを大量に直列につなげればいいということになります。もちろん、入力と同じ信号を出力するためには、使用するRSトーチの数を偶数にすることをお忘れなく。
さっそく36個のRSトーチを使用してみた回路を紹介します。この例では、省スペースのために縦に2往復させています。
上に行くときには、前回テクニックとしてご紹介した積み重ね方をしていますが、下に行くときには、2列使い、互い違いに配置してやるとよいでしょう。画像に示した矢印の経路で、信号が伝わります。
さて、単に遅延させるだけではあまり意味がありませんね。遅延を利用して応用してみましょう。
XORを使って、遅延時間分開くドアを作る
このようにXOR回路を追加し、入力の1つはレバーから直に、もう1つは遅延回路を通ってくるものにします。出力はドアに接続します。これはどういう意味になるのでしょうか。実際にレバーを切り替えてみます。
レバーを切り替えてすぐにドアが開きましたが、遅延回路で遅延させている時間(この回路だと5秒ちょっと)経過後、ドアが閉まります。なぜこんな動作をするのか、論理的に考えてみましょう。
まず、XORのどちらの入力も同じレバーから由来するので、本来ならば、XORの出力がONになることはありえないはずです。なぜならXORは「2つの入力が異なるときにONを出力する」回路だからです。
例えば、この回路は絶対にONを出力できないはずです。入力が必ず同じになりますからね(とはいえ、実はこれもラグのせいでごく一瞬だけONを出力する場合もありますが)。
しかし今の回路だと、入力の一方が遅延回路を通過してきます。それはどういうことかというと、レバーを切り替えてから遅延回路を通過し終わるまでの間、XORの2つの入力は同じにならないということを意味します。
つまり、まさに遅延されている間だけONが出力され、ドアが開くということです。
ラッチ回路に変更
XORの例で十分動作するのですが、操作によってはちょっと気持ち悪い挙動をしてしまいます。レバーを連打してみると、ドアが遅延時間分開き続けて欲しいのに、その間レバーを切り替えればドアを再び閉じることができてしまいます。
もちろん最終的に開きっぱなしになることはないので特に問題はありませんが、これを改善したいと思った場合、どう改造すればよいでしょうか。
まず、レバーは切り替えができるのがよくないと考えて、ボタンに変えてみます。しかしボタン自体が1秒(木のボタンなら1.5秒)しかONを出力しないので、1秒後にはOFFに切り替わってしまい、結局レバーをわざと切り替えるときと変わりません。
これをどう解決するかというと、ボタンの入力を保存しておければよいですよね。あれ、保存といえば…?
XORをラッチ回路に変更してみます。そしてボタン側の出力をドアに接続し、反対側を遅延回路に繋ぎます。
すると、ボタンを押すとラッチ回路にONが保存され、ドアが開き続けるようになるはずですが、遅延回路を通ってくるONが遅延時間後にラッチ回路に到達し、それによってラッチ回路にOFFが保存されます。するとドアが閉じます。
この回路なら、ボタンを連打してもラッチ回路にONが保存されている事実は変わらないため、XORを使った時のような問題は発生しません。さらに、単純にボタンをドアにつなげただけだと1秒か1.5秒間しか開けておくことができませんが、この回路ならば好きな時間だけ開けておくことができるのです。
以上、XORのほうは無理やりでしたが遅延回路に前回の知識を組み合わせることで、応用が利くということを確認しました。お好きな方法でどうぞ。
音符ブロック
さて、遅延を利用する他の要素として、音符ブロックを紹介しておきます。音符ブロックは、ONの信号を受け取った瞬間に音を出すブロックですので、上のような回路だと、ボタンを押した瞬間だけ音を鳴らします。
設置した音符ブロックをタップするたびに音階を変更することができます。
また、音色を変更する方法もあります。下に置くブロックの種類に応じて音色を変えることができるのです。
下に置くブロック | 音色 |
---|---|
木系のブロック | ベースギター |
石系、レンガ系のブロック | バスドラム |
砂系のブロック | スネアドラム |
ガラス系のブロック | スティック |
上記以外のブロック・空気 | ピアノ |
ちなみに、ガラスは信号を伝えないので、直接音符ブロックにワイヤーがつながるような配置にしなければいけないことに気を付けてください。
違う音階を設定しておき、このように同時にONにできるようにしておくと、和音を鳴らすことも可能です。
音楽を作る
さて、せっかく音が出せるブロックがあるということは、ちゃんと組み合わせれば、音楽さえも作れるということを意味します。とりあえず、音楽を作るため方法や基本的な構造について説明しておきます。
まず、非常に長い、できれば平坦な道が必要です。初めから音楽を作るのが目的なら、ワールド自体をフラットで作っておくべきかと思います。
次に、音符ブロックの基本的な並べ方です。同じタイミングで鳴らすもの(先ほど説明した和音や違うパートの音など)は、こうして横方向に並べておきましょう。
テクニックとして、まず真ん中の音符ブロックにだけワイヤーを接続すれば、両脇のものも同時に鳴らすことができるということがあります。なぜかというと、音符ブロックは他の多くのブロックと同様動力源(第1回参照)になることができるからです。
出力になり、かつ動力源にもなるというのは珍しい性質なので、覚えておきましょう。
もう1つのテクニックは、音色をピアノ以外にしたい場合、音符ブロックを置く前に適切なブロックを地面に埋めておくことです。この方法ならば、ガラスブロックも同様に使えますし、景観を壊すことはありません。
そうして1つのタイミングで音を鳴らしたあとは、ある程度の時間待ってから次を鳴らさないといけませんよね。
ある程度待つということは……そう、遅延回路を挟むのです。
1回目に鳴らした部分からリピーター(仮)をつなげて先に進め、そこでもさらに横方向に同じタイミングで鳴らすブロックを展開。これを繰り返していきます。
最後に、この音楽を鳴らし始めるためのトリガーとして、スタート地点にボタンなり何なりを接続しておけばOK!
ただし、現在のバージョンで音楽を作ることは、無駄に労力が必要です。
というのも、現在PEにはリピーターが存在しないせいです。リピーターは1個のアイテムで1×1マスの大きさ、そして遅延時間をRSトーチ単体よりさらに伸ばす設定ができるのですが、今までやむを得ず作ってきたリピーター(仮)は、RSトーチ2個とブロック2個を使い、1×3マスの大きさを使い、しかも遅延時間を設定することができないので、十数倍もの手間がかかります。
ということなので、まずは短いチャイムなどを作り、例えば朝になったら鳴らす(日照センサーを入力にする)とか、ドアのインターホン的なものを作り、ボタンを押せば鳴るようにする、とかいった使い方から始めてみてはいかがでしょうか。
いつも見やすい投稿ありがとです!!
えーと
前回に言っていた計算機の作り方を簡単に教えてほしいです!
お願いします!
計算機はバージョン0.14あたりが出たら書こうと思っていました(理由は後述)。以下必要最低限の説明をしましたが、簡単かどうかは人によると思うのでご了承を。語句は説明していられないので、ご自分で調べてください。
まず論理回路での計算は2進数で行うことが望ましいです。10進数のまま入力しようとしても、1桁につきON/OFFの2パターンでは判断できなくなります。
というわけで、10進数で計算が行いたい場合であっても、まずは2進数で入力→演算→出力 を完成させるのが先です。
ここからは単純化のため、2進数で10桁同士の加算(つまり10進数で0+0〜1023+1023)をしたい場合を考えます。
まず入力は、例えばレバーで10×2=20個必要です。まず最下位の桁同士を半加算器の入力にします。そして残りの9桁は、半加算器の出力とその桁の2つの入力の合わせて3つの入力を、全加算器の入力にします。
これら半加算器と全加算器のそれぞれの出力をランプにでもつなげてやれば、2進数で10桁同士の加算ができたことになります。
さらに10進数での入力、出力にしたい場合は、上で作ったものの入力にはエンコーダー(10進数→2進数)、出力にはデコーダー(2進数→10進数)を通す必要があります。特にデコーダーの論理回路は、自分の作成したディスプレイ(ランプでいわゆるデジタル数字を表現するとか)に合わせて設計する必要があります。
なぜバージョン0.14あたりでないと記事にしようと思わなかったかというと、以上のように加算器だのデコーダーだの、中身が複雑な回路が多いからです。
現バージョンでも表現できないことはないですが、RSリピーターなどまだ追加されていない要素があったほうが格段に簡単になりますので、今記事にすると無駄に複雑になると考えたのです。
フリップフロップの説明もしてほしいです!
budやcudとかも説明してください!
はあ?
うっせえ(ry
いつもわかりやすい説明ありがとうございます