Vol.793 10.Apr.2020

スクリーンショット ジグソーパズルお助けツール? PasoconMiniPC8001(10)〜MMLによる音楽演奏

G 画面コピー(スクリーンショット)

by fjk

 Windows10パソコン画面をデータとして取り込むには、以下の方法がある。

1.[PrintScreen]キーを押す
デスクトップ全体のスクリーンショットをクリップボードに保存する。ほかのアプリで[貼り付け]をすることで、画像として取り出すことができます。
2.[Alt]+[PrintScreen]キーを押す
アクティブな(選択中の)ウィンドウだけをクリップボードに保存します。
3.[Win]+[PrintScreen]キーを押す
全画面のスクリーンショットを[ピクチャ]フォルダー内の[スクリーンショット]フォルダーに自動的に保存します。
4.[Snipping Tool]を利用する
[切り取り&スケッチ]を利用する
5.[Win]+[Shift]+[S]キーを押す
クリップボードにスクリーンショットを保存するショートカットキー


J ジグソーパズルお助けツール?

by fjk

 ジグソーパズルで、どうしてもそこに当てはまるピースを見つけたいことがある。穴にちょうどはまるピースなどを見つけたい時などである。周りの模様からピースのイメージを推測し探すのだが、思っているピースイメージと異なり、見つけられないことも多い。そこで、コピー用紙にピースの大きさに合わせた「窓」を造り、箱の絵柄の上に置いてピースのイメージを得て、ピースを探すと意外に早く見つけることができる。
この場所のピースは? エクセルで作成し窓を切抜く 箱の絵柄に窓を合わせて・・ 対象のピースが見つかった


P PasoconMiniPC8001(10) 〜MMLによる音楽演奏

by fjk

 前報(abc792)でPCGサウンド発生が確認できたので、MML(Music Macro Language)を使った音楽演奏を試みた。音源発生以外のプログラムはBASICで作成したので、処理時間の問題から制約があるが(音源は1つのみ)、なんとかそれなりのものができた。
 なお、対応するMML命令は、N88-BASICのPlay命令などを参考した。
   利用できるMML

MML演奏画面
C D E F G A B
# + −
R
n(数字)

.(付点)
O
> <
L
T

[ ]
/
 それぞれ、ドレミファソラシの音名(音符)
 音符の後につけて半音上下(#+は#、−は♭)
 休 符
 音符や休符などの後につけ、音の長さを表す
 (2=2分音符)。[1、2,4,8、16、32が利用可]
 音の長さを1.5倍する
 オクターブ指定(デフォルトは4)
 オクターブの上下(>:上げ、<:下げ)
 n(数字)をつけないときの音の長さ(初期値は4)
 テンポを指定(T120ならほぼ120BPMで演奏)
 異音程(スラー)、同音程(タイ)の音長を繋げる
 リピート(1回のみ)範囲を指定
 最後(2回目)のループでループから脱出し次へ

 @(音色指定)など、上記以外の文字や記号は無視される。そこで、”!”は無視されることを利用し、音節の区切りなどに利用している。また、”^”のスラー・タイは音を連続的に休み無く演奏しているだけ(手抜き)。オクターブを指定する”O”コマンド指定よりも”>””<”コマンドの方が処理が速くなるが、オクターブが変わるときに付け忘れしやすいので注意! 長さ指定の”L”コマンドは同じ長さの音が続く場合(特に処理時間に余裕がない短い音符)での利用が有効。
 ”[..]”の間はリピートされるが、括弧内に”/”があると、”]”の次のMMLに移動する(“/”と”]”は同じ文字列内に記述すること)。演奏が1回目と2回目が異なる場合に利用できる。”]”の後に回数の数値を付けても良いが、回数は無視し1回のみリピートする。また、リピートのネストは不可。
 デモ曲のゆっくりとした曲ではそれなりに演奏できるが、やはりテンポが速い(音符が短い)曲の演奏は難しく、和音や連符にも対応できず、BASICでは限界と思われる。また、音色(矩形波のみ)も選べないので、曲によっては違和感がある。そのため、今回のデモ曲は、本演奏方法に合うように、楽譜通りではなく少しアレンジしている。
 なお、曲名に使っているN-FONTのカナ文字はWindowsでは入力できないので、DumpListEditaでデモ用のカナ文字を1文字ずつコピーして入力した(PC8001で入力した方が楽だが・・)。

【MML演奏プログラム使い方】
@ F9を押して「PCGタブ」でSWITCHをONにセットし、PCGを使えるようにする。
A 演奏したい曲を1−9キーで選ぶと、演奏が始まる。
B 途中で止めたいときは、スペースキーなど何かキーを押すと(タイムラグがある)演奏を中断する。
C 選曲画面で「!」を押すとプログラムが終了する。

 なお、実行速度を早くするため、データは演算や条件でなく配列変数から取得する方法を多用し、プログラムもマルチステートメントを増やしたので、少しわかりにくくなった。
※PCGへの文字コピーを機械語に変更しました(4/14)。
バグの修正をお願いします(4/18)。
  ・行番号1730に"RE=0:"を追加。(リピート時にMMLがスキップされることがある)。
    1730 IF RP=0 THEN P=P+1: RE=0: RETURN
 mml.cmt(zip) (現在のファイルは修正すみ)
10  '--- MML Play Test
100  ClEAR 500,&HDFFF: DEFINT A-Z: WIDTH 80
110  DIM MM$(9)         :'MML data
120  DIM W%(15)         :'Wave Parameter
130  DIM M$(15)         :'Scal Data
140  DIM T%(13)         :'Delay Time Data
150  DIM SD%            :'Sound Data
160  DIM OC%            :'Current Octave 
170  DIM DN%            :'Default Note Value
180  DIM TM%            :'Time Count Data
190  DIM TT%            :'Tempo
200  DEF USR0 = &HE000  :'S-Init
210  DEF USR1 = &HE00C  :'S-Clear
220  DEF USR2 = &HE01A  :'S-Off
230  DEF USR3 = &HE020  :'Ch0 Play
240  DEF USR4 = &HE024  :'Ch1 Play
250  DEF USR5 = &HE028  :'Ch2 Play
260  DEF USR6 = &HE031  :'S-On
270  DEF USR7 = &HE037  :'Copy Char to PCG
300 '
305  IF PEEK(&HE000)=62 THEN 320 :'Check "3E"
310   GOSUB 9010        :'Mashin Lang. Set
315   D=USR7(D)         :'Copy Char to PCG
320  GOSUB 9510         :'MML Data Init.
330  GOSUB 9710         :'Delay Time Data Init.
350  D=USR0(SD%)        :'Init. PCG Sound
390  SV=0

400 '-- Main Loop
410  GOSUB 10050: PRINT"[1-9]Play MML ? ";
420  K$=INPUT$(1): IF K$="!" THEN END
430  G=INSTR("123456789",K$)
440  IF G=0 THEN 410
450  GOSUB 10010: IF SV=0 THEN 410 
470  GOSUB 710          :' Play
480  GOTO 410

700 '--- Play MML
710  OC%=4: DN%=4: TM%=T%(8): TT%=120: ST=0
720  PRINT HEX$(G);":";NA$;"[";HEX$(SV);"]"
730  M=0: RM=0: RP=0: P=1
740   BF$=MM$(M): BN=LEN(BF$)
745 ' print BF$
750   IF INKEY$<>"" THEN 870
760    ER=0: ST=0: GOSUB 1020   :'Decode MML
770    IF ST=0 THEN D=USR2(1)   :'Sound Off
780    IF ER<0 THEN 820
785 '    print SD%;"/";TM%;
790    D=USR3(SD%)               :'Sound On
800    T=TM%/TT%                 :'Time Delay
810    FOR I=0 TO T:Z=Z: NEXT:GOTO 750
820   PRINT
830  M=M+1: IF M<SV THEN 740
840 '-- Play End
850  D=USR2(1): RETURN          :'Sound Off
860 '-- Pause
870  D=USR2(1): PRINT:PRINT "cont?(y or n) ";
880  K$=INPUT$(1): IF K$="y" THEN 760
890  IF K$="n" THEN RETURN ELSE 870

1000 '-- Decode MML (BF$,frpm P)
1010 P=P+1
1020 IF BN<P THEN ER=-1: RETURN
1030 C$=MID$(BF$,P,1)
1040 S=INSTR("RCDEFGAB<>OLT^[]/",C$)
1050 IF S=0 THEN print C$;: GOTO 1010
1060 IF C$="^" THEN ST=1: print c$;: GOTO 1010
1065  print ":";c$;
1070 IF S>8 THEN 1280
1080 SS=(S-1)*2: SD%=W%(SS): IF SD%=0 THEN 1010
1090 P=P+1: IF BN<P THEN L=DN%: GOTO 1190
1100 C$=MID$(BF$,P,1)
1110 S=INSTR("#+-",C$):IF S=0 THEN 1145 ELSE PRINT C$;
1120 IF S=3 THEN SS=SS-1 ELSE SS=SS+1
1130 SD%=W%(SS): IF SD%=0 THEN 1010 ELSE P=P+1
1135 '--- Sound length
1140 IF BN<P THEN L=DN%: GOTO 1190
1145 IF C$="." THEN L=DN%+1: P=P+1: print c$;: GOTO 1190
1150 GOSUB 1510: IF S2=0 THEN L=DN%:GOTO 1190
1160 IF BN<P THEN 1190
1170 C$=MID$(BF$,P,1): IF C$="." THEN L=L+1: P=P+1: print c$;
1180 '--- Set T-Count Data
1190 TM%=T%(L): ER=0
1200 '-- Count Data Set
1210 IF SS=0 THEN SD=1   : RETURN
1220 IF OC=3 THEN SD=SD*2: RETURN
1230 IF OC=5 THEN SD=SD/2: RETURN
1240 IF OC=6 THEN SD=SD/4: RETURN
1250 RETURN
1270 '--- Special cmd
1280 ON S-8 GOSUB 1310,1330,1360,1410,1610,,1710,1730,1780
1290 GOTO 1020
1300 '--- cmd "<",">" Sub.
1310 IF OC%>3 THEN OC%=OC%-1
1320 P=P+1:RETURN
1330 IF OC%<6 THEN OC%=OC%+1
1340 P=P+1: RETURN
1350 '-- cmd "O" Sub.
1360 P=P+1: IF BN<P THEN RETURN
1370 C$=MID$(BF$,P,1): N=VAL(C$)
1375 print c$;
1380 IF N>2 AND N<7 THEN OC%=N: P=P+1
1390 RETURN
1400 '--- cmd "L" Sub.
1410 P=P+1: IF BN<P THEN RETURN
1430 GOSUB 1510: DN%=L: RETURN
1500 '--- Get Note Sub.
1510 C$=MID$(BF$,P,1) 
1520 S2=INSTR("31248",C$) :IF S2=0 THEN RETURN
1525 print c$;
1530 IF S2>2 THEN L=VAL(C$): GOTO 1590
1540 P=P+1: IF BN<P THEN L=0:RETURN
1550 C$=MID$(BF$,P,1)
1570 IF S2=1 THEN L=10:print c$;: GOTO 1590
1580 IF S2=2 AND C$="6" THEN L=6: print c$;: ELSE L=0: RETURN
1590 P=P+1: RETURN
1600 '--- cmd "T" Sub.
1610 NN=0: P=P+1
1620 IF BN<P THEN RETURN
1630 C$=MID$(BF$,P,1)
1640 S3=INSTR("1234567890",C$)
1650 IF S3=0 THEN 1680
1660 NN=VAL(C$)+NN*10
1670 P=P+1: GOTO 1620
1680 TT%=NN: PRINT tt%;" ";:RETURN
1690 'TP%=TT%/4: RETURN

1700 '--- Set Repeat "["
1710 P=P+1:RM=M: RP=P: RETURN
1720 '--- Jump Repeat "]"
1730 IF RP=0 THEN P=P+1: RE=0: RETURN
1740 RE=P+1: PRINT"[";
1750 M=RM: P=RP: RP=0
1760 BF$=MM$(M): BN=LEN(BF$): RETURN
1770 '--- Break Roop "/"
1780 IF RE>0 THEN P=RE: RE=0: PRINT "]"; ELSE P=P+1
1790 RETURN
9010 RESTORE 9030: A=&HE000
9020 FOR I=0 TO 80: READ B: POKE A+I,B: NEXT: RETURN
9030 '--- Sound Init.    *S_INI:   $E000H
9040 DATA &H3E,&H36      :'E000  LD   A,00110110B ;Mode3
9050 DATA &HD3,&H0F      :'E002  OUT  (0FH),A     ;Ch0
9060 DATA &H3E,&H76      :'E004  LD   A,01110110B
9070 DATA &HD3,&H0F      :'E006  OUT  (0FH),A     ;Ch1
9080 DATA &H3E,&HB6      :'E008  LD   A,10110110B
9090 DATA &HD3,&H0F      :'E00A  OUT  (0FH),A     ;Ch2
9100 DATA &H3E,&H01      :'E00C  LD   A,01H
9110 DATA &HD3,&H0C      :'E00E  OUT  (0CH),A     ;Ch0
9120 DATA &HD3,&H0C      :'E010  OUT  (0CH),A
9130 DATA &HD3,&H0D      :'E012  OUT  (0DH),A     ;Ch1
9140 DATA &HD3,&H0D      :'E014  OUT  (0DH),A
9150 DATA &HD3,&H0E      :'E016  OUT  (0EH),A     ;Ch2
9160 DATA &HD3,&H0E      :'E018  OUT  (0EH),A
9170 '--- Sound Off      *S_OFF:    $E008H
9180 DATA &H3E,&H00      :'E01A  LD   A,00000000B
9190 DATA &HD3,&H02      :'E01C  OUT  (02H),A
9200 DATA &HC9	         :'E01E  RET
9210 DATA 0              :'E01F  DB   0
9220 '--- Play Sub. (OUTI)        $E020
9230 DATA &H0E,&H0C      :'E020  LD   C,0CH      ;<-Ch0
9240 DATA &H18,&H06      :'E022  JR   E02A (+6)
9250 DATA &H0E,&H0D      :'E024  LD   C,0DH      ;<-Ch1
9260 DATA &H18,&H02      :'E026  JR   E02A (+2)
9270 DATA &H0E,&H0E      :'E028  LD   C,0EH      ;<-Ch2
9280 DATA &HFE,&H02      :'E02A  CP   02H
9290 DATA &HC0           :'E02C  RET  NZ
9300 DATA &HED,&HA3      :'E02D  OUTI    ;(HL)->(C),HL=HL+1
9310 DATA &HED,&HA3      :'E02F  OUTI    ;(HL)->(C),HL=HL+1
9320 '--- Sound On       *S_ON:   $E031
9330 DATA &H3E,&HC8      :'E031  LD   A,11001000B
9340 DATA &HD3,&H02      :'E033  OUT  (02H),A
9350 DATA &HC9	         :'E035  RET
9360 DATA 0              :'E036  DB   0
9370 '--- Copy Char2PCG  *CP_CHR  $E037
9380 DATA &H21,&H00,&H00 :'E037  LD   HL,0000H
9385 DATA &H01,&H00,&H04 :'E03A  LD   BC,0400H
9390 DATA &H7D           :'E03D  LD   A,L
9395 DATA &HD3,&H01      :'E03E  OUT  (01H),A
9400 DATA &H7C           :'E040  LD   A,H
9405 DATA &HF6,&H30      :'E041  OR   30H
9410 DATA &HD3,&H02      :'E043  OUT  (02H),A
9415 DATA &HE6,&HCF      :'E045  AND  0CFH
9420 DATA &HD3,&H02      :'E047  OUT  (02H),A
9425 DATA &H23           :'E049  INC  HL
9430 DATA &H10,&HF1      :'E04A  DJNZ 0E03CH
9435 DATA &H0D           :'E04C  DEC  C
9440 DATA &H20,&HEE      :'E04D  JR   NZ,0E03CH
9445 DATA &HC9           :'E04F  RET
9450 DATA 0              :'E050  DB   0

9500 '--- Sound Generate Data  n = 3993600/f
9510 RESTORE 9530
9520 FOR I=0 TO 15: READ W%(I),M$(I): NEXT: RETURN
9530 DATA 1     ,R  :' rest
9540 DATA 0     ,B3 :'
9550 DATA 15264 ,C4 :' 261.63 Hz (3BA0H)
9560 DATA 14408 ,C#4:' 277.18 Hz (3848H)
9570 DATA 13599 ,D4 :' 293.66 Hz (351FH)
9580 DATA 12836 ,D#4:' 311.13 Hz (3224H)
9590 DATA 12115 ,E4 :' 329.63 Hz (2F53H)
9600 DATA 0     ,E#?:'
9610 DATA 11435 ,F4 :' 349.23 Hz (2CABH)
9620 DATA 10794 ,F#4:' 369.99 Hz (2A2AH)
9630 DATA 10188 ,G4 :' 392.00 Hz (27CCH)
9640 DATA 9616  ,G#4:' 415.30 Hz (2590H)
9650 DATA 9076  ,A4 :' 440.00 Hz (2374H)
9660 DATA 8567  ,A#4:' 466.16 Hz (2177H)
9670 DATA 8086  ,B4 :' 493.88 Hz (1F96H)
9680 DATA 0     ,C5 :' 523.25 Hz (1DD0H)

9700 '--- Time Delay
9710 RESTORE 9730
9720 FOR I=0 TO 11: READ T%(I): NEXT: RETURN
9730 DATA 24000,24000 :'1
9740 DATA 12000,18000 :'2
9750 DATA  6000, 9000 :'4
9760 DATA  1100, 1650 :'16
9770 DATA  3000, 4500 :'8
9780 DATA   400,  600 :'32

10000 '--- MML Sample Data
10010 ON G GOSUB 10100,10200,10300,10400,10500,10600,10700,10800,10900
10020 READ NA$,SV
10030 FOR I=0 TO SV-1: READ MM$(I): NEXT: RETURN

10050 PRINT: FOR I=1 TO 9
10060  ON I GOSUB 10100,10200,10300,10400,10500,10600,10700,10800,10900
10070  READ N$: PRINT HEX$(I);":";N$;: AM=I MOD 3
10080  IF AM=0 THEN PRINT ELSE PRINT TAB(AM*25);
10090 NEXT: RETURN

10100 RESTORE 10110 : RETURN
10110 DATA "シキノ ウタ",1
10120 DATA "T120L8!O4B4BAGAGF#E4E4E2!>C4C<BAGA>C<B1!>C4C<BA4A>C<B4BGE2!F#4B4AGF#GE1"

10200 RESTORE 10210 : RETURN
10210 DATA "サクラ サクラ",1
10220 DATA "T060L4!O4[AAB2]!AB>C<BAB8A8F2!ECEFEE8C8<B2>AB>C<BAB8A8F2!ECEFEE8C8<B2!>AAB2!AAB2!EFB8A8FE1"

10300 RESTORE 10310 : RETURN
10310 DATA "エーデルワイス",2
10320 DATA "T096L4!O4E2G>D2.!C2<GF2R!E2EEFGA2.G2R!E2G>D2.C2<GF2R!E2GGAB>C2.C2R!"
10330 DATA "D<G8GBAGE2G>C2R!<A2>CD2C<B2.G2R!E2G>D2.C2<GF2R!E2GGAB>C2.C2R"

10400 RESTORE 10410 : RETURN
10410 DATA "イエスタディ",2
10420 DATA "T100[L8!O4GFF2.R4!AB>C+DEFE4.DD2R!DDC<B-AGB-4.!L4A8AGFAGDFA8A8^A2]!"
10430 DATA "A2A2>DEFE8D8E.D8CD<A1!A2A2>DEFE8D8E.D8CEFC<B-AG8F8F2."

10500 RESTORE 10510 : RETURN
10510 DATA "セイヤ(キヨシコノヨル)",2
10520 DATA "T088L4!O5G.A8GE2.R8!G.A8GE2R!>D2D<B2.!>C2C<G2R!A2A>C.<B8AG.A8GE2R!"
10530 DATA "A2A>C.<B8AG.A8GE2R!>D2DF.D8<B>C2.E2R!C<GEG.F8DC2.^C2R"

10600 RESTORE 10610 : RETURN
10610 DATA "セトノ ハナヨメ",3
10620 DATA "T090L8!O4EFG2^GGAEG2R4!>CDE4.ED4C4<B2R!AB>C4.C<B4A4G2R!FED4.DB4A4G2R!EFGG4.^GGAEG2R!"
10630 DATA ">CDE4.ED4C4<B2R!AB>C4.C<B4A4G2R!G>CED2C4<B4>C2.R!<AEEE^EEA>C<B2.R!BEEE^EEB>DC2.R!"
10640 DATA "C<AAA^AA>DC<G2R!FED4D4E4D4C2R!EFG2^GGAEG2R!>CDE4.ED4C4<B2R!AB>C4.C<B4A4G2R!G>CED2C4<B4>C1"

10700 RESTORE 10710 : RETURN
10710 DATA "シレトコ リョジョウ",2
10720 DATA "T120L4!O4CF2A>C2FFDFC2.<AB-AG2>C<AGAF2!CF2A>C2FFDFC2^C<AB-AG2>C<C2GF2.!"
10730 DATA "GGGGFGA2>C^C2.!DDDD<B-4.>D8F2.^F2.!GFDC2F<A2>DC2.!<AB-AGCGF2.^F2."

10800 RESTORE 10810 : RETURN
10810 DATA "ビワコ シュウコウノ ウタ",2
10820 DATA "T120L8!O4FB-4B-B-^AG>D4.D!D^F4^DD^C<B->C4.^CR4!<FB-4B-B-^AG>D4.D4D<F4.G4L16A^B-L8^B-4.^B-RR!"
10830 DATA "O4F4F>F4FD4C<B-4.!B-4B->C4L16C^DL8^F4.^F4FG4FD^C<B->C4^<B-G4.F4FG4L16^A^B-B-4.^B-8"

10900 RESTORE 10910 :RETURN
10910 DATA "セカイニ ヒトツダケノ ハナ",7
10920 DATA "T099L16!O4A8AA8.>E8E8.D8.C#8<B8^B4>C#^C#8D8C#C#<B^B4!A8AB8.>C#8C#8<BB8.A>C#4<B8A8A1R!"
10930 DATA "[R8E8A8AA8.A8A8AA8.A8B8.B8.>C#8C#4R!<A8AA8.>E8E8.D8.C#8<B8.F#8.A8G#4R!E8A8AA8.A8A8AA8AA8B8.B8.>C#8.C#4R!"
10940 DATA "<A8AA8.>E8E8.D8.C#8C#8.<B8.A8A4R!E8A8AA8.A8A8AA8.AAB8BB8>C#8C#8C#4R!<A8AA8.>E8E8.D8.C#8<B8BF#8.A8G#4R!"
10950 DATA "E8A8AA8.A8A4A8A8B8.B8.>C#8C#4R!<A8.A8.>E8E8.D8.C#8C#8.<B8.BA8A4R!B8BB8.B8B8.B8.>C#8C#8.<B^B8A8A4R!"
10960 DATA "B8BB8.B8B8.>C#8.C#8D8DC#8.<BAA4R!B8BB8.B8B8BB>C#C#DDD8DC#8.<B8B4R!A8B8BB8.>F#8F#C#8.<BAB1!"
10970 DATA "B8.>C#C#8D8C#4<BA8.A8AA8>E8E8.D8.C#8<B8.>C#8.8D8C#4<BA8.!A8AA8.R!F#8A8AA8.B8>C#4<BA8.!"
10980 DATA "A8AA8.>E8E8.D8.C#8<B8B>C#8.D8C#4<BA8.!A8AA8.>C#8C#8.<B8.A8/A8AG#8.A8A4]!O5C#4<B8A8A4R!"


スクリーンショット ジグソーパズルお助けツール? PasoconMiniPC8001(10)〜MMLによる音楽演奏