トップ 履歴 一覧 Farm ソース 検索 ヘルプ PDF RSS ログイン

HSP

*disclaimer
602977

[HSP]

(一部、HSP2.61の表記法のスクリプトが残っていることがあるかも)

HSP



 英語教育研究のためのプログラミング:HSPの基礎テキスト


 HSPで教材開発

 HSPで言語心理学的実験




 HSPの導入


ダウンロードとインストール


https://hsp.tv/idman/download.html

HSPスクリプトエディタの設定

  • 「ツール」>「オプション」
    • 「エディタ」>「表示」
      • 「非文字の可視化」で、「TAB」「半角スペース」「全角スペース」「改行」にチェックを入れる

 コメントアウト

; で、その行のそれ以降コメントアウト

/*
この上下で挟まれた部分は、複数行にわたってコメントアウト
*/


 画面「消去」の3つの命令

  1. boxf
    • 画面(のある範囲)を「色」で塗りつぶすことで「消去」する
  1. cls
    • 画面上のすべてを初期化してしまう
  1. screen
    • ウィンドウの初期化

参考:https://wiki.hsp.moe/

 画像の一部分のコピー(画像を「部品」として使う)

  • gmode によってコピーするモードを選ぶ
  • gcopy によって、どのウィンドウIDの画像のどの部分をコピーするか指定

gmode 0

gcopy ウィンドウID, コピー元座標x, y, x軸で何ドット分か、y軸で何ドット分か

PictureFeedback参照

 文字列と数値の連結

  • 数値の文字列変換: str()
str(suuji)+"もじもじ" => 文字列
  • 文字列+数値型変数
"もじもじ"+suuji => 文字列

    「文字列型」に「数値型」を足し算した場合には、「数値」を文字列にして連結される。
    「数値型」に「文字列型」を足し算した場合には、「文字列」を数値にして加算される。

つまり、計算式で最初の項になっている型に自動的に合わせてくれるということです。

http://www.onionsoft.net/hsp/v34/doclib/hsp3str.htm

 文字の改行

文字列中に \n を入れることで、そこで改行される。

mes "ながいぶんしょうなので、\nかいぎょうしたいとおもうのですが\nどうしたらよいでしょうか"

適当に改行したうえで、前後の引用符をさらに { } で囲む。

mes {"ながいぶんしょうなので、
かいぎょうしたいとおもうのですが
どうしたらよいでしょうか"}

 音声を録音する

録音の設定

  • setを分けて書くと、うまく動きません。音質が悪くなります。
*record
	mci "open new alias sam type waveaudio"
	mci "set sam channels 2 samplespersec 44100 bitspersample 16"
	;mci "set sam channels 2"
	;mci "set sam samplespersec 44100"
	;mci "set sam bitspersample 16"
	mci "record sam"
	return

  • 以下のようにすると、音声が悪くなります。
mci "set sam channels 2"
mci "set sam samplespersec 44100"
mci "set sam bitspersample 16"
mci "open new alias sam type waveaudio"

録音の開始・停止・終了

mci "record sam"				; 録音の開始
mci "stop sam"					; 録音停止
mci "save sam \"sample.wav\""			; 音声ファイル保存
mci "close sam"					; 録音終了(デバイスを閉じる)

重要な訂正(2020-06-14)

上記のスクリプトの2行目「samplepersec」ではなく「samplespersec」です。
間違えていました。すみません。

一行に

  • mci命令はWindows 7 以降、一行にまとめて書かないといけなくなったようです。

http://hsp.tv/play/pforum.php?mode=pastwch&num=39979

サンプルプログラム

sound recording

 動画の再生


マルチメディア制御

http://lhsp.s206.xrea.com/manual/i_mmedia.html

mci命令

https://blog.goo.ne.jp/predater/e/7b8985aa3cea94896fd61bebd5c32098
http://lhsp.s206.xrea.com/command/mci.html
https://docs.microsoft.com/ja-jp/windows/win32/multimedia/mci

 実行ファイル作成時にファイル名を特定しておく

#packopt name "postoffice01"


 実行ファイル作成時に独自のアイコンを設定する

#packopt icon "ファイル名.ico"

ico 形式の画像ファイルを作成して、同じフォルダーに入れておく

 実行ファイル作成時に複数のファイルをまとめてコンパイルする

#pack "ファイル名"
  • packできるのは
    • 画像ファイル *.jpg
    • テキストファイル *.txt
    • 音声ファイル *.wav
      • ただし、大きさは2MB以下
    • ファイル名は15文字以下にすること

 文字を順番に表示する

text ミリ秒
mes "文字列"

text で設定したミリ秒ずつwaitがかかってmesで指定した文字列が順に表示されていく。

HSP3では、#include "hsp3util.as" して、mes ではなく emes を使うことになったので注意。


 データを保存する

notesel 変数名 ; データを保存する特別な変数を設定
noteadd "データ" ; データを追加
notesave "ファイル名" ; データを「ファイル名」で保存する

 オブジェクト




 ボタンの大きさを変える objsize 横, 縦

  • デフォルトは 64 x 24
objsize 200, 20
button "ちょっと長い名前", *nextstep

 配列 (配列変数)

複数の変数を順に並べて番号を付けたもの。
番号で変数を指定できるので、順番に処理するのに便利。

変数と同様に、配列に名前をつける。(kamoku)
名前のうしろに括弧で番号をつける。
番号は 0 から始まる。

kamoku(0)

値は変数と同様に = で代入する。(「配列変数kamokuの要素0に39を代入する」という)

kamoku(0) = 39
kamoku(1) = 29
kamoku(2) = 32

配列の数を調べる length(配列名)

kamokusuu = length(kamoku)

HSP2.61でのこと

配列の後ろに、番号を付ける。(kamoku.0)
15個以上使うときは、最初にdimで使う数を設定する。
dim kamoku,20

文字を扱うときは、sdim で設定する。
sdim 配列名,文字数,要素数

ひとつの科目名の文字数は20文字以下で、科目は10科目あるとすると、
sdim kamoku,20,10



 テキストを読み込む

notesel 変数名
noteload "ファイル名"
mes 変数名

変数名は何でも良い。bun とか、、、
一行が長い場合、自動的に改行はしてくれないので注意。

読み込むファイル形式と文字コードに注意

 画像を読み込む

picload "ファイル名"

ウインドウサイズは、読みこんだ画像の大きさになる。

事前にウインドウを表示して、その中に画像を位置づけるには、

pos 100, 200
picload "ファイル名", 1


 dialog を使ってテキストファイルを読み込む

dialog "拡張子", 16, "補足説明"
  • dialogのオプション 16 で、ファイル選択のウィンドウが開く
  • 読み込んだファイル名は refstr というシステム関数に保存される。
    • ファイル名は絶対パスでドライブ名・ディレクトリー名付き
notesel nakami				;読み込んだ中身を入れておく

dialog "csv", 16, "CSVファイルを選んでね"	;拡張子 csvのファイルを開く
					;ファイル名は refstr に入る
noteload refstr				;開いたファイルの中身を読み込む

pos 100, 100
	
mes refstr			;ファイル名の表示
mes nakami			;ファイルの中身の表示
mes notemax			;ファイルの行数の表示

stop


 dialog を使って音声ファイルを読み込み再生する

;2021-06-25 sugiura@nagoya-u.jp

	dialog "mp3", 16, "Choose mp3"	;拡張子 mp3のファイルを開く
									;ファイル名は refstr に入る
	pos 100, 100

	mes refstr						;ファイル名の表示
	mmload refstr, 1				;ファイルをバッファ1に読み込む
	button gosub "Play", *play		;ボタンを押したら、再生へ
	button "Quit", *owari
	stop

*owari
	end
	
*play
	mmplay 1						;再生実行
	return

 dialog を使って動画ファイルを読み込み再生する

;2021-06-25 sugiura@nagoya-u.jp

	dialog "avi", 16, "Choose avi"	;拡張子 aviのファイルを開く
									;ファイル名は refstr に入る
	pos 100, 100

	mes refstr						;ファイル名の表示
	mmload refstr, 1				;ファイルをバッファ1に読み込む
	button gosub "Play", *play		;ボタンを押したら、再生へ
	button "Quit", *owari
	stop

*owari
	end
	
*play
	mmplay 1						;再生実行
	return

 getkey と stick の違い

getkeyは連続してキーの値を受け付ける。
stickはキーを押したときに一度だけ値を受け取る。

repeat
;	getkey a, 32    ; 特定のキーを先に想定
;	if a&1 : break  ; a には、そのキーが押されたという意味の「1」が入っている。

	stick a, 0      ; 何が押されるかはわからない
	if a&16 : break ; a には押されたキーのコードが入っている。

loop

mes "Hit"

stop

 キーボードやマウスボタンのコード (stick)

「ヘルプ」の「HSP命令リファレンスを開く」でstickの項目を見る。

       1 : カーソルキー左(←)
       2 : カーソルキー上(↑)
       4 : カーソルキー右(→)
       8 : カーソルキー下(↓)
      16 : スペースキー
      32 : Enterキー
      64 : Ctrlキー
     128 : ESCキー
     256 : マウスの左ボタン
     512 : マウスの右ボタン
    1024 : TABキー

 キーボードやマウスボタンのコード (getkey)

「ヘルプ」の「HSP命令リファレンスを開く」でgetkeyの項目を見る。


           1    : マウスの左ボタン
           2    : マウスの右ボタン
           3    : キャンセル([CTRL]+[BREAK])
           4    : 3ボタンマウスのまん中のボタン
           8    : [BACKSPACE](PC98の[BS])
           9    : [TAB]
          13    : [ENTER]
          16    : [SHIFT]
          17    : [CTRL]
          18    : [ALT](PC98の[GRPH])
          20    : [CAPSLOCK]
          27    : [ESC]
          32    : スペースキー
          33    : [PAGEUP](PC98の[ROLLDOWN])
          34    : [PAGEDOWN](PC98の[ROLLUP])
          35    : [END](PC98の[HELP])
          36    : [HOME](PC98の[HOMECLR])
          37    : カーソルキー[←]
          38    : カーソルキー[↑]
          39    : カーソルキー[→]
          40    : カーソルキー[↓]
      48〜57    : [0]〜[9](メインキーボード)
      65〜90    : [A]〜[Z]

 動きを一時停止する

wait 300 ; 300 x 10ミリ秒 = 3秒 待つ


 画面の色を変える

=画面と同じ大きさの四角を、色で塗りつぶす

color 0,255,255 : boxf 0,0,640,480

colorコマンドで色を指定し、直後に、boxfコマンドで範囲を指定する。

boxf: 四角い範囲を指定して色で塗りつぶす。
四角い範囲=ウィンドウの大きさ にすると画面全体の色が変わる。

boxf は、範囲を指定しなければ、ウインドウ全体を塗りつぶす。だから、結論としては、画面の色を変えるには、

color 0,255,0 : boxf

とするだけでよい。


 色を設定する


RGB値で指定する


color 0,200,0
color Red, Green, Blue

  • 0(暗い) - 255(明るい)で値を決める。
   0,   0,   0; black

 255,   0,   0; red
   0, 255,   0; green
   0,   0, 255; blue

   0, 255, 255; light blue
 255,   0, 255; purple
 255, 255,   0; yellow

 255, 255, 255; white

 255, 165,   0; orange
 255, 200, 200; pink
  • colorだけで数字を指定しないと、黒になる

文字列の一部だけ色を変える

  • colorで文字の色を指定し
  • mes命令のオプション 1 で改行しないようにする
mes "ここは黒",1 :color 255, 0, 0: mes "ここは赤", 1: color: mes "後ろを黒に"


 フォントを指定する

font "MS ゴシック", 32, 1

font "フォント名", サイズ, スタイル

スタイルの設定

1 太字
2 イタリック
4 下線
8 打ち消し線
16 アンチエイリアス

スタイルを組み合わせたい場合は、数字を足す。

 位置を指定する

pos 左上横, 左上縦

ウィンドウの広さはデフォルトでは 640 x 480

 実際に実験する際に注意すること

プログラムの実行中にHSPのプログラム以外のものが動いたりして、測定に影響を与えるといけないので、以下の点に注意すること。
1)スクリーンセーバーを切っておく
2)電源の設定で、節電にしないこと。(処理能力最優先にする)
3)ネットワークの接続をすべて無効にしておく。
4)ウイルスチェックのプログラムを止めておく。
5)WindowsUpdateなどの自動更新を止めておく。
6)画面の色を必要最低限にする。
7)デスクトップの背景に何もないようにする。

 主なコマンド

str

変数を文字列型に変更。
オプションで、ゼロを含めた桁数にできる。

str 数値を含む変数, オプション

suuji= 7
str suuji, 2

これによりsuujiには「07」という文字列が入る。




strlen

文字列の長さを調べる。

strlen 結果の変数名, 調べたい文字列

全角は2文字分。

strmid

  • 部分的に文字列を取り出す。

何文字目から何文字取り出すか、と指定する。

strmid 結果を保存する変数, 取り出し元の変数, 何文字目から, 何文字分を

text='When I was a child, I lived in Tokyo.'
strmid kekka, text, 7, 3

kekkaには、「was」が入る。
文字の位置は0から始まる。7と指定すると8文字目から。


    • 特定の文字列以降を取り出すには
text='When I was a child, I lived in Tokyo.'
instr koko, text, "," : getstr kekka, text, koko+2

カンマ以降をとりだし、kekkaには「I lived in Tokyo.」が入る。
前半でinstrでカンマの位置を調べて、後半でgetstrでカンマの位置に直後のスペース一文字分を足して「2」を足した位置から行末までをkekkaに保存する。


instr

検索文字列が何文字目にあるかを調べる。

instr 結果を保存する変数, 検索対象の変数, "検索文字列", 何文字目から検索するか

第4項目の「何文字目から検索するか」を指定しなければ行頭から。
結果は、数字で保存される。1文字目が「0」となる。
文字列がなければ「-1」が結果となる。

text='When I was a child, I lived in Tokyo.'
instr kekka, text, "was"

kekkaは「7」となる。

getstr

文字列を取り出す。

getstr 結果を保存する変数, 取り出し元の変数, 何バイト目から, どこまで

第4項目の「どこまで」を指定しなければ行末まで。
「どこまで」は区切りとする文字で指定する。例:','

kekka
text='When I was a child, I lived in Tokyo.'
getstr kekka, 0, text, ','

text中の0文字目からカンマまでを取り出して、kekkaに入れる。
kekkaには「When I was a child」が入る。


gettime 時間の情報を得る

変数 = gettime (パラメタ)

パラメタで、時間のどの情報を得るかを設定

0 年
1 月
2 曜日
3 日
4 時
5 分
6 秒
7 ミリ秒

現在、何時 何分 何秒か?

ji = gettime(4)
fun = gettime(5)
byo = gettime(6)
mes "今は"+ji+"時"+fun+"分"+byo+"秒です"

objimage 画像をボタンにする

objimage-sugiura.hsp(498)

	;
	;	画像をボタンにする
	;
	buffer 1					; 画像を事前に読み込んでおく場所の番号
	picload "flower1.jpg"		; 画像を読み込んで、bufferに入れておく

	screen 0,640,480			; ウインドウの初期化 0番、ウインドウの大きさの指定
								; bufferを使って画像を読み込んだときは、明示的にウィンドウを指定する
								
	pos 300, 200				; ボタンの位置
	objsize 180,180				; ボタンにする画像のサイズ(大きな画像を読み込んでおいて、その一部を
								;  ボタンとして使用することもできる。)
	objimage 1					; ボタン画像の指定をする。最初の番号が buffer番号
	
	;objimage 1, 0,0, 0,1, 0,2	; ボタン画像の指定をする。
								; 最初の番号が buffer番号
								; 次の数字の組み合わせが、表示する画像の中の左上の位置
								; その次の数字の組み合わせが、ボタンを押したときの位置
								; 最後の数字の組み合わせが、ボタンの上にマウスが来たときの位置
								
	button gosub "", *say		; ボタン命令で、上で設定した画像がボタンとして使われる。

	stop

*say
	mes "Hello!"
	return

flower1.jpg(3546)


絵を押すと音が鳴る

objimage-sound.hsp(110)
objimage-sound.exe(121)

; 透明ボタンと音声再生 objimage-sound.hsp
; copyleft 2022-07-14 sugiura@nagoya-u.jp

	;	画像をボタンにする

#pack "left.mp3"
#pack "right.mp3"
#pack "flower1.jpg"

bcopy "left.mp3", "left.mp3"
bcopy "right.mp3", "right.mp3"
	
	; 音声ファイル読み込み
	mmload "left.mp3", 1
	mmload "right.mp3", 2


	
	;
	buffer 1					; 画像を事前に読み込んでおく場所の番号
	picload "flower1.jpg"		; 画像を読み込んで、bufferに入れておく

	screen 0,640,480			; ウインドウの初期化 0番、ウインドウの大きさの指定
								; bufferを使って画像を読み込んだときは、明示的にウィンドウを指定する
								
	pos 100, 200				; ボタンの位置
	objsize 90,180				; ボタンにする画像のサイズ(大きな画像を読み込んでおいて、その一部を
								;  ボタンとして使用することもできる。)
	;objimage 1					; ボタン画像の指定をする。最初の番号が buffer番号
	
	objimage 1, 0,0, 0,1, 0,2	; ボタン画像の指定をする。
								; 最初の番号が buffer番号
								; 次の数字の組み合わせが、表示する画像の中の左上の位置
								; その次の数字の組み合わせが、ボタンを押したときの位置
								; 最後の数字の組み合わせが、ボタンの上にマウスが来たときの位置
								
	button gosub "", *left		; ボタン命令で、上で設定した画像がボタンとして使われる。
	
	
	pos 300, 200
	objsize 90, 180
	objimage 1, 90,0, 90,1, 90,2
	button gosub "", *right


	stop

*left
	mmplay 1
	return
	
*right
	mmplay 2
	return
	
	

rnd() ランダムな数字



 二種類の画像のボタンを使うには

  • 事前に二種類の画像を合わせた一枚の画像を用意する。
  • 二種類の画像を左右に並べたとして、
  • 左側と右側の画像をそれぞれ左上隅の座標で指定することによって、
  • 二つの画像のボタンを配置したように表示できる。

objimage-sugiura-2.hsp(527)

 チェックボックスでアンケート

  • チェックするだけ

ankeito.hsp(445)

  • 自由記載欄とチェックボックス、結果をテキストファイルに保存。

ankeito-2.hsp(477)





 システム変数

cnt

  • デフォルトでは、0から始まる。
    • あらかじめ指定しておけば、そこから始まる。


  モジュール(開発中)

  1. 被験者の入力IDを保存ファイル名にする方法
  2. 問題がランダムに出るようにする方法
  3. 選択問題(ラジオボタン)
  4. 自由記載ボックス

 CuteHSP


 開発環境

VSCode

https://qiita.com/umuy/items/8e8e6f1e4ccc0387be2c

 スマホでHSP

HSPDish

https://sites.google.com/site/simakuroneko/home/hsp3dish_course/env_const/page_1

参考サイト

キーワード一覧
https://wiki3.jp/Basicsoft/page/425