Windows10パソコン画面をデータとして取り込むには、以下の方法がある。
ジグソーパズルで、どうしてもそこに当てはまるピースを見つけたいことがある。穴にちょうどはまるピースなどを見つけたい時などである。周りの模様からピースのイメージを推測し探すのだが、思っているピースイメージと異なり、見つけられないことも多い。そこで、コピー用紙にピースの大きさに合わせた「窓」を造り、箱の絵柄の上に置いてピースのイメージを得て、ピースを探すと意外に早く見つけることができる。
この場所のピースは? | エクセルで作成し窓を切抜く | 箱の絵柄に窓を合わせて・・ | 対象のピースが見つかった |
前報(abc792)でPCGサウンド発生が確認できたので、MML(Music Macro Language)を使った音楽演奏を試みた。音源発生以外のプログラムはBASICで作成したので、処理時間の問題から制約があるが(音源は1つのみ)、なんとかそれなりのものができた。
なお、対応するMML命令は、N88-BASICのPlay命令などを参考した。
なお、実行速度を早くするため、データは演算や条件でなく配列変数から取得する方法を多用し、プログラムもマルチステートメントを増やしたので、少しわかりにくくなった。
※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!" |