米MITメディアラボ開発
ビジュアル・プログラミング環境「Scratch」Web版version3
高度なプログラミング事例
令和6年8月20日
茂出木敏雄
ホームページ http://www.bekkoame.ne.jp/~modegi/
掲載プログラムの全データは上記サイトよりダウンロードできます。
Scratch_example.zip内の¥Scratch¥adv¥フォルダ

６．配列の使用例（１）：シーザー暗号（１）
入力された文字列（本例では英大文字に限定）の各文字コード（ASCIIコード、本例では1～26）に暗号キー（正負の整数値）を加算し、コード表の順にずらした文字に変換する基本的な暗号化手法。暗号キーの正負を逆にして暗号化すれば復号化できる。
暗号化と復号化で使用される暗号キーが同一（正負反転するが）なので、共通鍵暗号方式とも呼ばれる。暗号キーをどのように相手に知らせるかが問題である（鍵配送問題）。
”Scratch3_encrypt.sb3”

2

６．配列の使用例（１）：シーザー暗号（２）：プログラム部拡大”Scratch3_encrypt.sb3”

3

６．配列の使用例（１）：シーザー暗号（３）：コード定義部拡大”Scratch3_encrypt.sb3”

4

６．配列の使用例（１）：シーザー暗号（４）：実行部拡大
入力する文字列を”IBM COMPUTER“、暗号キーを「-1」とすると、暗号化結果は、”HALBNLOTSDQ”になる。復号化する場合は、入力する文字列を” HAL BNLOTSDQ“、暗号キーを「+1」とすると、暗号化結果は、”IBM COMPUTER”になる。
”Scratch3_encrypt.sb3”［文字列の入力］［暗号化結果］

Scratchでは「リスト」と呼ばれる１次元の配列を扱うことができる。26要素の配列（「リスト」）を定義している。
5

６．配列の使用例（２）：公開鍵暗号（１）
入力された文字列（本例では英大文字に限定）の各文字コード（ASCIIコード、本例では1～32）に暗号キー（正の整数値）で累乗し、３３で割った余りのコードの文字に変換する高度な暗号化手法。
暗号化と復号化で異なるキー（３または７）を使用するのが特徴で、共通鍵暗号方式の鍵配送問題を解決できる。２種の鍵を生成し、一方のキーを公開鍵として相手に知らせ（第３者に漏洩しても問題ない）、もう一方のキーは秘密鍵として自分が保管する。
”Scratch3_rsaenc.sb3”

6

６．配列の使用例（２）：公開鍵暗号（２）：プログラム部拡大”Scratch3_rsaenc.sb3”

7６．配列の使用例（２）：公開鍵暗号（３）：コード定義部拡大”Scratch3_rsaenc.sb3”

8６．配列の使用例（２）：公開鍵暗号（４）：実行部拡大
入力する文字列を”IBM COMPUTER“、暗号キーを「3」とすると、暗号化結果は、”CHS+ISDUNZX”になる。復号化する場合は、入力する文字列を”CHS +ISDUNZX“、暗号キーを「7」とすると、暗号化結果は、”IBM COMPUTER”になる。逆に暗号キー「７」で暗号化した場合は、暗号キー「３」でないと復号化できない。
”Scratch3_encrypt.sb3”［文字列の入力］［暗号化結果］

Scratchでは「リスト」と呼ばれる１次元の配列を扱うことができる。32要素の配列（「リスト」）を定義している。

9

６．配列の使用例（３）：３×３魔方陣（スクランブル法）（１）
魔方陣とは、 N×N（N＞２）のマスに１～ N×Nまでの数字を、各行のN個の総和、各列のN個の総和、対角２方向の各々N個の総和がいずれも同一値（N=3の場合、15）になるように配置したもの。本例題は、初期状態として、１～ N×Nまでの数字を順に配置し、ランダムに２つのマスを交換しながら、魔方陣を満足するパターンを探索します。
”Scratch3_magicr.sb3”

10６．配列の使用例（３） ：３×３魔方陣（スクランブル法）（２）：プログラム部拡大”Scratch3_magicr.sb3”
11６．配列の使用例（３） ：３×３魔方陣（スクランブル法）（３）：実行部拡大
Scratchでは「リスト」と呼ばれる１次元の配列を扱うことができる。９要素の配列（「リスト」）を定義している。
変数は以下のように３通りの表示モードを使用できる。
魔方陣の部分は「大きな表示」を使用

12

６．配列の使用例（４） ：３×３魔方陣（インドの奇数魔方陣の高速化解法）（１）
N×N（Nは奇数）のマトリックスの中央列のトップを１として、右上方向に２～N×Nまでの数字を順に配置する。枠からはみ出したら、はみ出した方向と反対側に配置し、配置しようとするマスが配置済の場合、右上でなく１行下にずらした位置に配置する操作を繰り返す。
”Scratch3_magich.sb3”

13６．配列の使用例（４） ：３×３魔方陣（インドの奇数魔方陣の高速化解法）（２）”Scratch3_magich.sb3”

14６．配列の使用例（４） ：３×３魔方陣（インドの奇数魔方陣の高速化解法）（３）
Scratchでは「リスト」と呼ばれる１次元の配列を扱うことができる。９要素の配列（「リスト」）を定義している。
変数は以下のように３通りの表示モードを使用できる。
魔方陣の部分は「大きな表示」を使用”Scratch3_magich.sb3”

15６．配列の使用例（５）：３×３魔方陣（しらみつぶし法）（１）（１）配列IIに初期値を000 000 000として、最下位の桁を１ずつ増加させながら、9桁の数字を最大012 345 678まで順に生成する。各桁には可変の上限を012345 678と設定し、上限を超えたら、上位桁に繰り上げる。
例）配列II: 000 345 679 →配列II: 001 000 000（２）配列IIの値をもとに、配列MTXの値を最下位の桁から順に、配列TBLで決定済の数字を管理しながら、下位桁の数字と重複しないように決定する。数字が重複する場合は、その値より大きい重複しない数字を探索し、8を超えたら、0から探索し直す。配列MTXでは、各桁の数字に1を加えて、1～9の値をもたせる。
例）配列II: 001 000 000 → MTX: 978 654 321
配列II: 001 035 451 → MTX: 834 159 672 （魔法陣の条件適合）”Scratch3_magic3.sb3”

16６．配列の使用例（５）：３×３魔方陣（しらみつぶし法）（２）”Scratch3_magic3.sb3”
定義ブロック「判定」「判定2」「マトリックス表示」は、３×３魔方陣（スクランブル法）と同じ

17

６．配列の使用例（５）：３×３魔方陣（しらみつぶし法）（３） プログラム部拡大１”Scratch3_magic3.sb3”

18６．配列の使用例（５）：３×３魔方陣（しらみつぶし法）（４） プログラム部拡大２”Scratch3_magic3.sb3”
19６．配列の使用例（５）：３×３魔方陣（しらみつぶし法）（５） 実行部拡大”Scratch3_magic3.sb3”
20

７．音の使用例：音の合成・うなり音（１）：サウンド素材の追加方法(1)
Scratchにはデフォルトの「ニャー」音だけでなく、種々のサウンド素材を使用できます。
以下のように「音」タブを選択して波形が表示された後に、左下の音素材追加のアイコンをクリックします。

21

７．音の使用例：音の合成・うなり音（２）：サウンド素材の追加方法(2)
Scratchにはデフォルトの「ニャー」音だけでなく、種々のサウンド素材を使用できます。
以下のように「音を選ぶ」が表示されたら、例えば、「A Piano」のアイコンをクリックします。

22

７．音の使用例：音の合成・うなり音（３）：サウンド素材の追加方法(3)
これにより、デフォルトの「ニャー」音に加え、「A Piano」（ピアノのラ音）のサウンド素材をScratchプログラムで使用可能になります。

23

７．音の使用例：音の合成・うなり音（４）：プログラム例
追加した音素材”A Piano”（ピアノのラ音）を選択し、ピッチを50%と53%の２種（220Hzと232Hz）に変化させて合奏させる。合奏させる場合は、マルチスレッド機能を用いて２本の再生プログラムを作成し、メイン側のプログラムで再生する直前にメッセージを送り、もう一方のプログラムに同期再生させる。参考38-40ページ”Scratch3_beet.sb3”

同時に再生実行24

７．音の使用例（２）：ネコとピアノの音階合奏（１）：プログラム例
２つの音素材（”ニャー”と”A Piano”）を選択し、音階に合わせてピッチを変化させ音階を合奏する。ドレミファソラシドに対応するノートナンバーをC=0,2,4,5,7,9,11,12とすると、ピッチ[%]は、100・2(C-6)/12＝100・(10 0.301)C/12 で算出でき、P= 100・10 0.301・(C-6)/12 -100 をサウンド再生時のピッチ効果として与える。
”Scratch3_audio.sb3”

25

７．音の使用例（２）：ネコとピアノの音階合奏（２）：プログラム部拡大”Scratch3_audio.sb3”

Cの値でそのままピッチを計算すると、ピッチが高すぎるため、-6半音下げる。

ピアノ伴奏の音量調整

ネコの鳴き声の音量調整

26

７．音の使用例（２）：ネコとピアノの音階合奏（３）：指数関数の使用方法
音階のピッチを算出するにあたり、２の累乗という指数演算が必要です。Scratchでは指数の底として、自然対数(exponential)と常用対数(10)のいずれかしか使用できません。そこで、２Xは、１０0.301Xと常用対数の底10を用いて計算します。指数関数は左欄の「演算」メニューより「の絶対値」を使用し、絶対値をクリックして所望の関数（本例では「10A」）を選択します。

27

８．拡張機能「音楽(MIDI機能)」の使用方法(1)
左下の拡張機能アイコンをクリックします。

28

８．拡張機能「音楽(MIDI機能)」の使用方法(2)
下記の拡張機能メニューで「音楽」を選択します。

29

８．拡張機能「音楽(MIDI機能)」の使用方法(3)
左端のメニューの最下部に拡張機能「音楽」が追加されています。

30

８．拡張機能「音楽(MIDI機能)」の使用例(1) ：ハ長調の音階”Scratch3_MIDI.sb3”
MIDI機能を用いて、ドレミファソラシド（C3, D3, E3,F3, G3, A3, C4）の音階を再生します。
２・３番目のブロックで楽器やテンポを変更できます。
MIDIノートナンバｰ
楕円枠をクリックすると音楽鍵盤が表示されるので、鳴らしたい音符をクリックします。

例題の音階では面白みがないので、次ページの和音の入力方法も参照の上、皆さんがご存じのメロディー（単旋律および和声）を打ち込んでみてください。
31

８．拡張機能「音楽(MIDI機能)」の使用例(2) ：ハ長調の音階＋和音付け”Scratch3_MIDIh.sb3”

C2（ド）和音を付加したい音符の直前に、「イベント」の「メッセージ（例．
和音C）を送る」を追加します。

E2（ミ）

G2（ソ）

和音の構成音の各音符ごとに、「イベント」の「メッセージ（例．和音C）を受け取ったとき」と「（）の音符を（）拍鳴らす」を組み合わせたブロックを定義する。
32

８．拡張機能「音楽(MIDI機能)」の使用例(3) ：メトロノーム（リズムマシン）
テンポ(BPM、例:120)と拍子(例:4)を入力すると、ドラム音でリズムを刻むとともに、リズムに合わせてキャラクターが回転する。
”Scratch3_rhythm.sb3”

33

８．拡張機能「音楽(MIDI機能)」の使用例(3) ：メトロノーム(2):プログラム部”Scratch3_rhythm.sb3”

34

９．拡張機能「ペン(２次元グラフィックス機能)」の使用方法(1)
下記の拡張機能メニューで「ペン」を選択します。

35

９．拡張機能「ペン(２次元グラフィックス機能)」の使用方法(2)
左端のメニューの最下部に拡張機能「ペン」が追加されています。

36

９．拡張機能「ペン(２次元グラフィックス)」の使用例：楕円の描画(1)
角度Aを0～360度に変化させ、X=（横径）×cos (A)、 Y=（縦径）×sin (A) で示される座標（X,Y）をプロットすることにより楕円形状を描画する。
”Scratch3_circle.sb3”

37

９．拡張機能「ペン」の使用例：楕円の描画(2)：三角関数の使用方法

左端メニュー「演算」より「の絶対値」を選択し、「絶対値」のプルダウンメニューより「sin」を選択します。

三角関数sinに渡す角度はラジアンではなく、360度単位で、出力は-1～+1の実数値です。

38

９．拡張機能「ペン」の使用例：楕円の描画(3)：プログラム部拡大

横径、縦径は適当に変更してください。

”Scratch3_circle.sb3”

39

９．拡張機能「ペン(２次元グラフィックス)」の使用例（２）：サインカーブ(1)X1をペンでプロットするＸ座標（-(幅)X1+(幅)）で、かつ角度とする。
Y2=（振幅）×sin (X1) で示される座標（X1,Y1）をプロットすることによりサインカーブを描画する。
”Scratch3_sine.sb3”

40

９．拡張機能「ペン」の使用例（２）：サインカーブ(2)：プログラム部拡大(1)

画面の解像度に合わせて増減して下さい。

”Scratch3_sine.sb3”

41

９．拡張機能「ペン」の使用例（２）：サインカーブ(2)：プログラム部拡大(2)”Scratch3_sine.sb3”

42

９．拡張機能「ペン(２次元グラフィックス)」の使用例（３）：波形合成・うなり(1)
周期がわずかに異なる２種のサインカーブ（前ページのサインカーブの10周期と9周期分）を生成し、２種のサインカーブと合成波形をプロットする。音響再生はできないが、合成波形は１周期分のうなり音になっている。参考16-19ページ ”Scratch3_beetw.sb3”

43

９．拡張機能「ペン」の使用例（３）：波形合成・うなり(2) ：プログラム部拡大(1)”Scratch3_beetw.sb3”

44

９．拡張機能「ペン」の使用例（３）：波形合成・うなり(2) ：プログラム部拡大(2)”Scratch3_beetw.sb3”

45

９．拡張機能「ペン」の使用例（３）：お絵描き(1)
マウスをクリックした点（ペンダウン）から、再度クリックする点（ペンアップ）までの間、マウスを動かすことにより自由曲線を描くことができる（描画中はボタンを離した状態）。
”Scratch3_draw.sb3”

46

９．拡張機能「ペン」の使用例（３）：お絵描き(2)：プログラム部拡大

ペンの色や太さは自由に変更できます。

”Scratch3_draw.sb3”

47

１０．拡張機能「ペン」と「音楽」の使用例：ピアノ鍵盤(1)
拡張機能「ペン」を用いてピアノ鍵盤を描画し、先の拡張機能「音楽」を用いてマウスでクリックすることにより対応するキーの音階を鳴らすことができる。
”Scratch3_piano.sb3”

48

１０．拡張機能「ペン」と「音楽」の使用例：ピアノ鍵盤(2)：プログラム部拡大(1)「移調」設定によりキーを半音単位で上下させることができます。

”Scratch3_piano.sb3”

49

１０．拡張機能「ペン」と「音楽」の使用例：ピアノ鍵盤(3)：プログラム部拡大(2)”Scratch3_piano.sb3”

50

１０．拡張機能「ペン」と「音楽」の使用例：ピアノ鍵盤(3)：プログラム部拡大(3)”Scratch3_piano.sb3”

51

１０．拡張機能「ペン」と「音楽」の使用例：ピアノ鍵盤(3)：プログラム部拡大(4)”Scratch3_piano.sb3”

52

１０．拡張機能「ペン」と「音楽」の使用例（２）：自動演奏ピアノ(1)先に拡張機能「ペン」と「音楽」を用いて作成したピアノ鍵盤に対して、あらかじめ演奏する音符を定義して、鍵盤を自動的にクリックして自動演奏させることができる。
”Scratch3_apiano.sb3”

53

１０．拡張機能「ペン」と「音楽」の使用例（２）：自動演奏ピアノ(2)：プログラム部(1)「移調」設定によりキーを半音単位で上下させることができます。

例題の半音階では面白みがないので、皆さんがご存じのメロディー（単旋律）を打ち込んでみてください。

”Scratch3_apiano.sb3” 54１０．拡張機能「ペン」と「音楽」の使用例（３）：自動演奏ピアノ(3)：プログラム部(2)”Scratch3_apiano.sb3”

55

１０．拡張機能「ペン」と「音楽」の使用例（３）：自動演奏ピアノ(3)：プログラム部(3)”Scratch3_apiano.sb3”

56

１１．拡張機能「音声合成・翻訳)」の使用方法(1)
下記の拡張機能メニューで「音声合成」と「翻訳」を順次選択します。

57

１１．拡張機能「音声合成・翻訳」の使用方法(2)
左端のメニューの最下部に拡張機能「音声合成」と「翻訳」 が追加されています。

58

１１．拡張機能「音声合成・翻訳」の使用例：多言語翻訳機(1)
日本語でメッセージを入力すると、原語、英語、韓国語、中国語の順にキャラクターにしゃべらせ音声で読み上げる。
”Scratch3_trans.sb3”

59

１１．拡張機能「音声合成・翻訳」の使用例：多言語翻訳機(2)：プログラム拡大”Scratch3_trans.sb3”

入力文字列の言語および、翻訳先の外国語は、英語、韓国語、中国語に限らず多種類用意されていますので、種々の外国語に変更して試してください。

60

１１．拡張機能「音声合成・翻訳」の使用例：多言語翻訳機(3)：実行部”Scratch3_trans.sb3”［文字列の入力画面（日本語） ］［翻訳結果の出力画面（英語） ］

音声で読み上げられる（現状、音声認識は不可）

翻訳文がテキスト表示され、音声で読み上げられる

61