SmileBASIC

プログラムリスト

SU_SIMPLE

スクリーンショット

トップメニュー「SmileBASICでプログラムを作る」からプログラムを読み込み、キーボードの「EDIT」キーを押すとこのプログラムが自由に編集できます。


'======================================
'
' Simple Effector Example
'
' Ver.1.00 2016/02/23
'
' (C)2016 SmileBoom
'
'======================================
OPTION STRICT

VAR SIZE=1024
VAR CENTER=32768

'======================================
'DELAY EFFECTOR
'  DLYTIME: 0 - 99
'   Time(msec)=DLYTIME*1024sample/32730Hz
'             =DLYTIME*31msec
'  FEEDBACK: 0 - 1.0
'======================================
VAR DLYBUFSIZE=SIZE*100
DIM DLYBUF[DLYBUFSIZE]
VAR DLY_WR,DLY_RD
DIM TMPBUF[SIZE]

DEF FX_DELAY OUTBUF,INBUF,DLYTIME,FEEDBACK
 DLY_RD=DLY_WR-SIZE*DLYTIME
 IF DLY_RD<0 THEN DLY_RD=DLY_RD+DLYBUFSIZE
 COPY TMPBUF,0,DLYBUF,DLY_RD,SIZE
 ARYOP #AOPMAD,OUTBUF,TMPBUF,FEEDBACK,INBUF
 DLY_WR=RINGCOPY(DLYBUF,DLY_WR,OUTBUF,0,SIZE)
END

'======================================
'DRAW WAVEFORM IMAGE
'======================================
VAR X=0
DEF DRAWWAVE OUTBUF,INBUF
 VAR Y,Y0
 VAR I
 FOR I=0 TO SIZE-1 STEP SIZE/4
  GLINE X,0,X,239,RGB(0,0,0)
  Y0=60
  Y=INBUF[I]*60/CENTER
  GLINE X,Y0,X,Y0+Y,RGB(255,0,0)
  Y0=180
  Y=OUTBUF[I]*60/CENTER
  GLINE X,Y0,X,Y0+Y,RGB(0,0,255)
  INC X
  IF X>=400 THEN X=0
 NEXT
 GLINE X,0,X,239,RGB(255,255,0)
END

'======================================
'SIGNAL PROCESSING
'======================================
DEF AUDIO_PROC OUTBUF,INBUF
 'CONVERT ARRAY VALUE FROM 0..65535 TO -32768..+32767
 ARYOP #AOPSUB,INBUF,INBUF,CENTER

 'SIGNAL PROCESSING FUNCTIONS
 FX_DELAY OUTBUF,INBUF,10,0.5

 'DRAW WAVEFORM IMAGE
 DRAWWAVE OUTBUF,INBUF

 'CONVERT ARRAY VALUE FROM -32768..+32767 TO 0..65535
 ARYOP #AOPADD,OUTBUF,OUTBUF,CENTER
END

'======================================
'MAIN LOOP
'======================================
DEF MAINLOOP
 VAR NUM_AREA=8
 VAR CUR_AREA=NUM_AREA-2
 VAR READPOS
 VAR LASTPOS=0
 DIM STREAMBUF[SIZE*NUM_AREA]
 DIM MICBUF[SIZE]
 DIM TMPBUF[SIZE]

 FILL STREAMBUF,0
 PCMSTREAM STREAMBUF

 XON MIC
 MICSTART 3,1,0 '32730Hz 16bit Loop

 WHILE BUTTON()==0
  'WAIT DATA
  MICREADY LASTPOS
  'UPDATE INPUT POINTER
  READPOS=LASTPOS
  LASTPOS=MICPOS
  'READ DATA FROM MIC
  MICGET READPOS,MICBUF
  'SIGNAL PROCESSING
  AUDIO_PROC TMPBUF,MICBUF
  'WRITE DATA TO STREAM
  COPY STREAMBUF,CUR_AREA*SIZE,TMPBUF,0,SIZE
  'UPDATE STREAMBUF WRITE POINTER
  CUR_AREA=(CUR_AREA+1) MOD NUM_AREA
 WEND

 XOFF MIC
 PCMSTOP
END

'======================================
'WAIT FOR MIC STATUS UNTIL ENOUGH DATA SIZE
'======================================
DEF MICREADY LASTPOS
 VAR POS,READABLE_SIZE
 REPEAT
  POS=MICPOS
  IF POS<LASTPOS THEN POS=POS+MICSIZE
  READABLE_SIZE=POS-LASTPOS
 UNTIL READABLE_SIZE>=SIZE
END

'======================================
'READ MIC DATA
'======================================
DEF MICGET POS,ARY
 DIM TMP[SIZE]
 VAR SIZE1,SIZE2
 IF (POS+SIZE)<=MICSIZE THEN
  MICSAVE POS,SIZE,ARY
 ELSE
  SIZE1=MICSIZE-POS
  SIZE2=SIZE-SIZE1
  MICSAVE POS,SIZE1,ARY
  MICSAVE 0,SIZE2,TMP
  COPY ARY,SIZE1,TMP,0,SIZE2
 ENDIF
END

'======================================
'MAIN PROGRAM
'======================================
XOFF MIC
ACLS
LOCATE 0, 0:COLOR 3:PRINT "INPUT"
LOCATE 0,17:COLOR 9:PRINT "OUTPUT"
MAINLOOP
ACLS
END


ページトップへ