'------------------------------------------------------------------------------------------------------------
' SOUNDRA STEREO ::  INTERFACE.bas - Control creation and interface-specific functions
'------------------------------------------------------------------------------------------------------------
FUNCTION BATCH_CONFIG_CONTROLS(STR_SLIDEL_H AS TXT,STR_SLIDEL_V AS TXT) AS I32
     DIM AS TXT     TMPSTR
     DIM AS I32     I,R,N,W0,H0,X0,Y0,TEXT_WIDTH
     DIM AS RGB_PX  C0,C1
     
     'ARROW ICONS FOR SLIDELS; GRADIENTS
     FOR I = 0 TO LI_CONTROLS.LENGTH - 1
          DIM AS I32 ARROW_SIZE
          W0 = Controls[I]->W
          H0 = Controls[I]->H
          C0.CLR = 0
          C0.A   = 0
          C1.CLR = 0
          C1.A   = 170
          IF Controls[I]->text.editable   = TRUE OR _
             Controls[I]->text.selectable = TRUE THEN Controls[I]->NAV_ARROW_SUPPORT = TRUE
          'ARROWS
          IF Controls[I]->gfct_ptr = @gctrl_slidel THEN
               R  = Controls[I]->New_IMAGE(1)
               IF R THEN RETURN R
               N  = Controls[I]->NB_IMAGES-1
               TMPSTR = Controls[I]->CTRL_INFO
               IF H0 < W0 THEN
                    Controls[I]->CTRL_INFO = TMPSTR & ": " & STR_SLIDEL_H
                    Controls[I]->IMAGE[N] = ImageCreate(W0,H0,0)
                    ARROW_SIZE = H0 - BORDER_SIZE*3
                    TEXT_WIDTH = GetFT_W(CHR(&h3C), IconFont, ARROW_SIZE)
                    X0 = BORDER_SIZE *3
                    Y0 = (H0 - ARROW_SIZE)/2 + 1
                    R  = PrintFT(Controls[I]->IMAGE[N],X0,Y0,0,CHR(&h3C),IconFont,ARROW_SIZE,_
                         Controls[I]->TEXT.FONT_CLR)
                    IF R<0 THEN RETURN R
                    X0 = W0 - BORDER_SIZE *3 - TEXT_WIDTH
                    R  = PrintFT(Controls[I]->IMAGE[N],X0,Y0,0,CHR(&h3E),IconFont,ARROW_SIZE,_
                         Controls[I]->TEXT.FONT_CLR)
                    IF R<0 THEN RETURN R
               ELSE
                    Controls[I]->CTRL_INFO = TMPSTR & ": " & STR_SLIDEL_V
                    Controls[I]->IMAGE[N] = ImageCreate(W0,H0+GRID_STEP,0)
                    ARROW_SIZE = W0 - BORDER_SIZE*3
                    TEXT_WIDTH = GetFT_W(CHR(&hAF), IconFont, ARROW_SIZE)
                    Y0 = 0
                    X0 = (W0 - TEXT_WIDTH)/2
                    R  = PrintFT(Controls[I]->IMAGE[N],X0,Y0,0,CHR(&hAF),IconFont,ARROW_SIZE,_
                         Controls[I]->TEXT.FONT_CLR)
                    IF R<0 THEN RETURN R
                    Y0 = H0 - BORDER_SIZE - ARROW_SIZE
                    R  = PrintFT(Controls[I]->IMAGE[N],X0,Y0+GRID_STEP,0,CHR(&h5F),IconFont,ARROW_SIZE,_
                         Controls[I]->TEXT.FONT_CLR)
                    IF R<0 THEN RETURN R
               END IF
          ELSEIF (Controls[I]->fct_ptr = 0) OR (Controls[I]->gfct_ptr = @gctrl_label) THEN
               Controls[I]->supported_actions = 0
          END IF
          'GRADIENT
               'SIZE FILTER
          IF Controls[I]->W * Controls[I]->H > GRID_STEP*2500 THEN 'MIGHT BE TOO BIG TO BE A CONTROL
               Controls[I]->SHADED = FALSE
          END IF
               'OTHER FILTERS
          IF Controls[I]->GROUP_ONLY = TRUE THEN 'DEFINITELY NOT A CONTROL
               Controls[I]->SHADED = FALSE
          ELSEIF Controls[I]->supported_actions > CA_TEXT_FIELD THEN 'CERTAINLY NOT A BUTTON
               Controls[I]->SHADED = FALSE
          END IF
               'EXCEPTIONS
          IF Controls[I]->supported_actions = CA_BUTTON THEN Controls[I]->SHADED = TRUE
          SELECT CASE Controls[I]->gfct_ptr
          CASE @gctrl_text_field, @gctrl_fa_value, @gctrl_FRE, @gctrl_WLOAD, @gctrl_ALOAD, @gctrl_VLOAD, _
               @gctrl_CLOAD, @gctrl_mic_meter, @gctrl_play_meter, @gctrl_ctrl_info, @gctrl_msg_bar, _
               @gctrl_dialog_text
               Controls[I]->SHADED = TRUE
               Controls[I]->INVERT_SHADE = TRUE
          CASE @gctrl_button, @gctrl_SLIDEL, @gctrl_module_patch
               Controls[I]->SHADED = TRUE
          END SELECT
               'CREATE SHADE
          IF Controls[I]->SHADED = TRUE THEN
               R = Controls[I]->New_IMAGE(1)
               IF R THEN RETURN R
               N = Controls[I]->NB_IMAGES-1 
               Controls[I]->IMAGE[N] = ImageCreate(W0,H0,0)
               IF Controls[I]->INVERT_SHADE = TRUE THEN
                    GradientH(Controls[I]->IMAGE[N],0,0,W0-1,H0-1,C1,C0)
               ELSE
                    GradientH(Controls[I]->IMAGE[N],0,0,W0-1,H0-1,C0,C1)
               END IF
          END IF
          'VERY IMPORTANT
          Controls[I]->UPDATE_GDATA(TRUE)
     NEXT I
     RETURN 0
END FUNCTION

SUB SET_CONNECTORS()
     DIM AS I32     I,J,T,CE_W,D,X,Y
     DIM AS F32     C,YY
     DIM AS UI32    PTR PIXELS
     DIM AS IOS     BPP,PITCH
     'CONNECTOR ENDINGS SPRITES + LINE SWATCHES
     T    = 4*GRID_STEP
     CE_W = 4*T
     C    = CE_W/2
     CE_CENTER = C
     FOR I = 0 TO 2
          IF CONNECTOR_ENDING(I) > 0 THEN IMAGEDESTROY(CONNECTOR_ENDING(I))
          CONNECTOR_ENDING(I) = IMAGECREATE(CE_W,CE_W,0)
          'IMAGEINFO(Controls[ID]->IMAGE[0],IMGW,IMGH,BPP,PITCH,PIXELS)
          IMAGEINFO(CONNECTOR_ENDING(I),,,BPP,PITCH,PIXELS)
          PITCH /= BPP
          LINESWATCH(CONNECTOR_SWATCH(I),0,SOUNDRA.CONNECT_COLOR(I),T)
          J = 0
          FOR Y = 0 TO CE_W-1
               YY = (C-Y)*(C-Y)
               FOR X = 0 TO CE_W-1
                    D = 4*SQR((C-X)*(C-X)+YY)
                    IF D < CE_W THEN PIXELS[X+J] = CONNECTOR_SWATCH(I)[D]
               NEXT X
               J += PITCH
          NEXT Y
     NEXT I
     T = 2*GRID_STEP
     LINESWATCH(CONNECTOR_SWATCH(0),0,SOUNDRA.CONNECT_COLOR(0),T)
     LINESWATCH(CONNECTOR_SWATCH(1),0,SOUNDRA.CONNECT_COLOR(1),T)
     LINESWATCH(CONNECTOR_SWATCH(2),0,SOUNDRA.CONNECT_COLOR(2),T)
END SUB

FUNCTION CreateInterface(ZR AS F32=1) AS I32
     '! Set position relative to parent's -> ADD_CTRL will make it absolute
     '! Initialize IMAGEs before using
     DIM AS I32     R, I,J, newID, pID0,pID1,pID2,pID3, TMP_ID,  WIN_ID, k,l,m,n, TEXT_WIDTH
     DIM AS I32     X,Y, x0,y0, x1,y1, x2,y2, x3,y3,  w0,h0, w1,h1, w2,h2, w3,h3
     DIM AS I32     SP, KS, FS, WB,HB, BB_W, KB_H
     DIM AS I32     GRID_W, GRID_W1, GRID_H, NB_ROWS, NB_COLS, LIST_FONT_SIZE, NB_LINES, LINE_H
     DIM AS I32     WIN_X, WIN_Y, WIN_W, WIN_H, XSO,YSO
     DIM AS TXT     TMPSTR, STR_SLIDEL_H,STR_SLIDEL_V, STR_OK,STR_CANCEL,STR_SET,STR_RESET,STR_CURRENT,_
                    STR_FA_UNIT,STR_FA_EDIT,STR_FA_MODE,_
                    STR_ZOOM,STR_RESOLUTION,STR_VSETTINGS,STR_ASETTINGS,STR_TUNING,STR_ABOUT
     DIM AS P2D     PTR MODULE_POS
     DIM AS UI32    FLAG
     DIM AS RGB_PX  C0,C1

     '¤¤¤#286: "Current settings"
     TMPSTR = LNG_SET_EXT(286,"Current settings")
     STR_CURRENT = TMPSTR
     '¤¤¤#287: "select by sliding or clicking left or right."
     TMPSTR = LNG_SET_EXT(287,"select by sliding or clicking left or right.")
     STR_SLIDEL_H = TMPSTR
     '¤¤¤#288: "select by sliding or clicking up or down."
     TMPSTR = LNG_SET_EXT(288,"select by sliding or clicking up or down.")
     STR_SLIDEL_V = TMPSTR
     '¤¤¤#289: "OK"
     TMPSTR = LNG_SET_EXT(289,"OK")
     STR_OK = TMPSTR
     '¤¤¤#290: "Cancel"
     TMPSTR = LNG_SET_EXT(290,"Cancel")
     STR_CANCEL = TMPSTR
     '¤¤¤#291: "Set selected value"
     TMPSTR = LNG_SET_EXT(291,"Set selected value")
     STR_SET = TMPSTR
     '¤¤¤#292: "Reset selection"
     TMPSTR = LNG_SET_EXT(292,"Reset selection")
     STR_RESET = TMPSTR
     '¤¤¤#293: "Change/Convert the unit"
     TMPSTR = LNG_SET_EXT(293,"Change/Convert the unit")
     STR_FA_UNIT = TMPSTR
     '¤¤¤#294: "Change value's display mode"
     TMPSTR = LNG_SET_EXT(294,"Change value's display mode")
     STR_FA_MODE = TMPSTR
     '¤¤¤#295: "Edit this parameter by entering a floating point value"
     TMPSTR = LNG_SET_EXT(295,"Edit this parameter by entering a floating point value")
     STR_FA_EDIT = TMPSTR
     '¤¤¤#296: "Zoom"
     TMPSTR = LNG_SET_EXT(296,"Zoom")
     STR_ZOOM = TMPSTR
     '¤¤¤#297: "Resolution"
     TMPSTR = LNG_SET_EXT(297,"Resolution")
     STR_RESOLUTION = TMPSTR
     '¤¤¤#298: "Video Settings"
     TMPSTR = LNG_SET_EXT(298,"Video Settings")
     STR_VSETTINGS = TMPSTR
     '¤¤¤#299: "About this software"
     TMPSTR = LNG_SET_EXT(299,"About this software")
     STR_ABOUT = TMPSTR
     '¤¤¤#300: "Audio Settings"
     TMPSTR = LNG_SET_EXT(300,"Audio Settings")
     STR_ASETTINGS = TMPSTR
     '¤¤¤#301: "Tuning"
     TMPSTR = LNG_SET_EXT(301,"Tuning")
     STR_TUNING = TMPSTR
     
     SET_CONNECTORS()

     'SAVE MODULE POS, IF ANY, RELATIVE TO SYNTH OUTPUT AT PLANE POS (0,0)
     IF SOUNDRA.LI_MODULES.LENGTH > 0 THEN
          MODULE_POS = NEW P2D[SOUNDRA.LI_MODULES.LENGTH]
          IF ControlAccess[CS_SYNTH_OUT] > 0 THEN
               XSO = Controls[ControlAccess[CS_SYNTH_OUT]]->X
               YSO = Controls[ControlAccess[CS_SYNTH_OUT]]->Y
          END IF
          FOR I = 0 TO SOUNDRA.LI_MODULES.LENGTH - 1
               IF SOUNDRA.MODULES[I]->GUI_PTR > 0 THEN
                    MODULE_POS[I].X = SOUNDRA.MODULES[I]->GUI_PTR->X - XSO
                    MODULE_POS[I].Y = SOUNDRA.MODULES[I]->GUI_PTR->Y - YSO
               END IF
          NEXT I
     END IF
     SOUNDRA.PLANE_X = 0
     SOUNDRA.PLANE_Y = 0
     
     DELETE_CONTROLS()
     
     'SPACE PRE-CALCULATIONS     
     KS        = INT(ICON_SIZE / 10)
     FS        = INT(DEF_FONT_SIZE / 10)
     GRID_H    = INT(SCR_H / GRID_STEP)                               'NB HORIZ. STEPS TOTAL
     GRID_W    = INT(SCR_W / GRID_STEP)                               'NB VERT. STEPS TOTAL
     GRID_W1   = GRID_W / SETTINGS.MONITORS
     LINE_H    = GRID_STEP * 6
     LIST_FONT_SIZE = LINE_H - 1.5*GRID_STEP
     'BASE SIZE FOR KEYS
     SOUNDRA.BB_KEY_W = GRID_STEP * 9
     SOUNDRA.BB_KEY_H = GRID_STEP * 9
     SOUNDRA.KEY_BASE_SIZE = GRID_STEP * 9
     '-------------------------------------------------------------------------------------------------
     'Master control (0)
               '(pID,x,y,w,h, @fct,@gfct, state,visible,actions, vx,vy,vz, label,info)
     r = add_ctrl(0,0,0,SCR_W,SCR_H,@ctrl_main,,,CA_RESET,"SOUNDRA")
     IF r THEN RETURN r
     Controls[0]->CLR = BLACK
     '-------------------------------------------------------------------------------------------------
     
'--- SYS BAR ---------

     'WINDOW GROUP
     X0 = 0
     Y0 = 0
     W0 = SCR_W / SETTINGS.MONITORS
     H0 = GRID_STEP * SYSBAR_H
     r  = add_ctrl(0,X0,Y0,W0,H0,,,,CA_SLIDEL,"SYSBAR")
     IF r THEN RETURN r
     pID0 = LI_Controls.LENGTH-1
     Controls[pID0]->CLR = RGB(30,30,37)'SWATCH0.WINDOW_BG
     Windows[W_SYSBAR]   = pID0

     X0 = GRID_STEP
     Y0 = GRID_STEP
     H0 = GRID_STEP * 7
     W0 = GRID_STEP * 9
     'QUIT BUTTON
     '¤¤¤#302: "Quit program - always asks for confirmation"
     TMPSTR = LNG_SET_EXT(302,"Quit program - always asks for confirmation")
     TMPSTR &= " [CTRL-X]"
     r  = add_ctrl(pID0,X0,Y0,W0,H0,@ctrl_quit,@gctrl_button,,,"Quit",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     KB_SHORTCUTS(24) = newID
     CreateIcon(newID,TYPE<_ICON>(&h63,ICON_SIZE,IconFont,0,0,SWATCH0.FG))

     'MINIMIZE BUTTON
     X0 += W0
     '¤¤¤#303: "Minimize window"
     TMPSTR = LNG_SET_EXT(303,"Minimize window")
     TMPSTR &= "[Alt-M]"
     r  = add_ctrl(pID0,X0,Y0,W0,H0,@ctrl_min,@gctrl_button,,,"WINMIN",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     KB_SHORTCUTS(306) = newID
     CreateIcon(newID,TYPE<_ICON>(&h7C,ICON_SIZE,IconFont,0,0,SWATCH0.FG))

     'MOVE WINDOW
     X0 += W0
     '¤¤¤#304: "Move window - Click to move to the next monitor or reset position."
     TMPSTR = LNG_SET_EXT(304,"Move window - Click to move to the next monitor or reset position.")
     r  = add_ctrl(pID0,X0,Y0,W0,H0,@ctrl_move,@gctrl_button,,CA_SLIDEL,"Move",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     CreateIcon(newID,TYPE<_ICON>(&h2C,ICON_SIZE-FS,IconFont,0,0,SWATCH0.FG))
     
     'VIDEO SETTINGS
     X0 += W0
     r   = add_ctrl(pID0,X0,Y0,W0,H0,@ctrl_win_tabs,@gctrl_button_tab,,,"VSTAB",STR_VSETTINGS)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     Controls[newID]->INDEX = W_VIDEO_SETTINGS
     CreateIcon(newID,TYPE<_ICON>(&h73,ICON_SIZE,IconFont,0,0,SWATCH0.FG))
     WINTABS(W_VIDEO_SETTINGS) = newID
     
     'INFOS
     X0 += W0
     r   = add_ctrl(pID0,X0,Y0,W0,H0,@ctrl_win_tabs,@gctrl_button_tab,,,"SPLASH",STR_ABOUT)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     Controls[newID]->INDEX       = W_ABOUT
     Controls[newID]->state.POWER = TRUE
     CreateIcon(newID,TYPE<_ICON>(&h3F,ICON_SIZE,IconFont,0,0,SWATCH0.FG))
     WINTABS(W_ABOUT) = newID
     
'--- METERS ---------

     'Free RAM
     X0 += W0 + GRID_STEP*4
     W0  =  GRID_STEP * 23
     '¤¤¤#305: "Available memory"
     TMPSTR = LNG_SET_EXT(305,"Available memory")
     r = add_ctrl(pID0,X0,Y0,W0,H0,,@gctrl_FRE,,CA_HOVER,"FRE",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     ControlAccess[CS_FRE] = newID
     TMPSTR = bytes2txt(FRE)
     CreateText(newID,TMPSTR,DEF_FONT_SIZE,ALIGN_CENTER,GLYPH_ADD)

     'METER : GROUP + ICON
     'AUDIO WORK LOAD
     X0 += W0 
     W0  = GRID_STEP * 6
     '¤¤¤#306: "Audio workload"
     TMPSTR = LNG_SET_EXT(306,"Audio workload")
     r   = add_ctrl(pID0,X0,Y0,W0,H0,,@gctrl_WLOAD,,CA_HOVER,"WLOAD",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     ControlAccess[CS_LOAD0] = newID
     Controls[newID]->INDEX  = M_AUDIO
     CreateText(newID,"W",DEF_FONT_SIZE-FS,ALIGN_CENTER,GLYPH_ADD)
     
     'AUDIO LOOP SPEED
     X0 += W0
     '¤¤¤#307: "Audio loop speed"
     TMPSTR = LNG_SET_EXT(307,"Audio loop speed")
     r   = add_ctrl(pID0,X0,Y0,W0,H0,,@gctrl_ALOAD,,CA_HOVER,"ALOAD",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     Controls[newID]->INDEX  = M_AUDIO
     CreateText(newID,"A",DEF_FONT_SIZE-FS,ALIGN_CENTER,GLYPH_ADD)

     'VIDEO FRAMERATE
     X0 += W0
     '¤¤¤#308: "Video framerate"
     TMPSTR = LNG_SET_EXT(308,"Video framerate")
     r   = add_ctrl(pID0,X0,Y0,W0,H0,,@gctrl_VLOAD,,CA_HOVER,"VLOAD",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     Controls[newID]->INDEX  = M_VIDEO
     CreateText(newID,"V",DEF_FONT_SIZE-FS,ALIGN_CENTER,GLYPH_ADD)

     'CONTROL LOOP SPEED
     '¤¤¤#309: "Control interface loop speed"
     TMPSTR = LNG_SET_EXT(309,"Control interface loop speed")
     X0 += W0
     r   = add_ctrl(pID0,X0,Y0,W0,H0,,@gctrl_CLOAD,,CA_HOVER,"CLOAD",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     Controls[newID]->INDEX  = M_CONTROL
     CreateText(newID,"C",DEF_FONT_SIZE-FS,ALIGN_CENTER,GLYPH_ADD)

'--- AUDIO ---------

     'SOUND CAPTURE LEVEL
     '¤¤¤#310: "Audio input: peaks and power level"
     TMPSTR = LNG_SET_EXT(310,"Audio input: peaks and power level")
     X0 += W0 + GRID_STEP*4
     W0  = GRID_STEP * 24
     r   = add_ctrl(pID0,X0,Y0,W0,H0,@ctrl_mic_level,@gctrl_mic_meter,,CA_SLIDE OR CA_HOVER,"MicM",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     CONTROLS[NEWID]->CLR   = SWATCH0.BUTTON_BG
     ControlAccess[CS_MicM] = newID
     TMPSTR = STR(ROUND(FRACTIONAID.U2DB(VOLUME_IN,0,,FLAG),2)) & "dB"
     CreateText(newID,TMPSTR,DEF_FONT_SIZE,ALIGN_CENTER)

     'SOUND CAPTURE POWER
     '¤¤¤#311: "Audio input power switch"
     TMPSTR = LNG_SET_EXT(311,"Audio input power switch")
     X0 += W0
     W0  = GRID_STEP * 9
     r   = add_ctrl(pID0,X0,Y0,W0,H0,@ctrl_mic_power,@gctrl_mic_power,,,"MicMP",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     ControlAccess[CS_MicP] = newID
     Controls[newID]->CLR   = SWATCH0.BUTTON_BG
     CreateIcon(newID,TYPE<_ICON>(&h31,ICON_SIZE,IconFont,0,0,SWATCH0.FG))
     Controls[newID]->state.POWER = CAPTURING
     
     'SOUND STREAMING LEVEL
     '¤¤¤#312: "Audio output: stereo peaks and power levels"
     TMPSTR = LNG_SET_EXT(312,"Audio output: stereo peaks and power levels")
     X0 += W0 + GRID_STEP*1
     W0  = GRID_STEP * 24
     r   = add_ctrl(pID0,X0,Y0,W0,H0,@ctrl_play_level,@gctrl_play_meter,,CA_SLIDE OR CA_HOVER,"PlayM",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     ControlAccess[CS_PlayM] = newID
     TMPSTR = STR(ROUND(FRACTIONAID.U2DB(VOLUME_OUT,0,,FLAG),2)) & "dB"
     CreateText(newID,TMPSTR,DEF_FONT_SIZE,ALIGN_CENTER)

     'SOUND STREAMING POWER
     '¤¤¤#313: "Audio output power switch"
     TMPSTR = LNG_SET_EXT(313,"Audio output power switch")
     X0 += W0
     W0  = GRID_STEP * 9
     r   = add_ctrl(pID0,X0,Y0,W0,H0,@ctrl_play_power,@gctrl_play_power,,,"PlayMP",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     ControlAccess[CS_PlayP] = newID
     CONTROLS[NEWID]->CLR    = SWATCH0.BUTTON_BG
     CreateIcon(newID,TYPE<_ICON>(&h31,ICON_SIZE,IconFont,0,0,SWATCH0.FG))
     Controls[newID]->state.POWER = PLAYING
     
     'SOUND STREAMING RECORD
     '¤¤¤#314: "Record audio output on disk as a 16-bit 48kHz WAV file"
     TMPSTR = LNG_SET_EXT(314,"Record audio output on disk as a 16-bit 48kHz WAV file")
     X0 += W0
     W0  = GRID_STEP * 9
     r   = add_ctrl(pID0,X0,Y0,W0,H0,@ctrl_record,@gctrl_button,,,"Rec",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     ControlAccess[CS_Rec] = newID
     CONTROLS[NEWID]->CLR  = SWATCH0.BUTTON_BG
     CreateIcon(newID,TYPE<_ICON>(&h34,ICON_SIZE,IconFont,0,0,RGB(200,0,0)))

     'AUDIO SETTINGS
     X0 += W0
     W0  = GRID_STEP * 9
     r   = add_ctrl(pID0,X0,Y0,W0,H0,@ctrl_win_tabs,@gctrl_button_tab,,,"ASTAB",STR_ASETTINGS)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     Controls[newID]->INDEX = W_AUDIO_SETTINGS
     CreateIcon(newID,TYPE<_ICON>(&h73,ICON_SIZE,IconFont,0,0,SWATCH0.FG))
     WINTABS(W_AUDIO_SETTINGS) = newID
     
'--- TITLE ---------

     'SOUNDRA
     TMPSTR = SOFTWARE_NAME & " " & SOFTWARE_BIT & " v" & SOFTWARE_VERSION
     X0 += W0
     W0  = GRID_STEP * 45
     X0 -= 1
     Y0 += 1
     r   = add_ctrl(pID0,X0,Y0,W0,H0,,@gctrl_label,,,"SYSTITLE",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     CONTROLS[newID]->TEXT.FONT_CLR = SWATCH0.FRM_ON
     CreateText(newID,TMPSTR,1.2*DEF_FONT_SIZE,ALIGN_CENTER)
     X0 += 1
     Y0 -= 1
     r   = add_ctrl(pID0,X0,Y0,W0,H0,,@gctrl_label,,,"SYSTITLE2",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     CONTROLS[newID]->TEXT.FONT_CLR = SWATCH0.FRM_OFF
     CreateText(newID,TMPSTR,1.2*DEF_FONT_SIZE,ALIGN_CENTER)

'--- SYSTEM MSG ---------

     'Control Info
     '¤¤¤#315: "Live guide - hover your mouse over any control to display their function."
     TMPSTR = LNG_SET_EXT(315,"Live guide - hover your mouse over any control to display their function.")
     X0 += W0
     W0  = GRID_STEP*GRID_W1 - X0 - GRID_STEP
     r   = add_ctrl(pID0,X0,Y0,W0,H0,,@gctrl_ctrl_info,,CA_HOVER,"CTRL_INFO",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     ControlAccess[CS_CTRL_INFO] = newID
     CreateText(newID,TMPSTR,DEF_FONT_SIZE,ALIGN_LEFT)

     'Message bar
     r  = add_ctrl(pID0,X0,Y0,W0,H0,,@gctrl_msg_bar,FALSE,,"MB","")
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     CreateText(newID,"",DEF_FONT_SIZE,ALIGN_CENTER)
     ControlAccess[CS_MSG_BAR]  = newID
     
     'Dialog Box (GROUP) CS_DIALOG
     'H0 = GRID_STEP * 7
     r  = add_ctrl(pID0,X0,Y0,W0,H0,,,FALSE,,"DB","")
     IF r THEN RETURN r
     pID1 = LI_Controls.LENGTH-1
     ControlAccess[CS_DIALOG]   = pID1
     Controls[pID1]->GROUP_ONLY = TRUE

     'Dialog Box :: 1-TEXT
     X1 = 0
     Y1 = 0
     H1 = H0
     W1 = W0 - GRID_STEP * 20
     r  = add_ctrl(pID1,X1,Y1,W1,H1,,@gctrl_dialog_text,,CA_HOVER,"DB_TEXT","")
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     CreateText(newID,"  ",DEF_FONT_SIZE,ALIGN_LEFT,GLYPH_ALPHA)

     'Dialog Box :: 2-TEXT FIELD
     W1 /= 2
     X1  = W1
     r   = add_ctrl(pID1,X1,Y1,W1,H1,@ctrl_text_field,@gctrl_text_field,,CA_TEXT_FIELD,"DB_EDIT","")
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     TFAccess[TF_Dialog]            = newID
     Controls[newID]->text.editable = TRUE
     CreateText(newID,"  ",DEF_FONT_SIZE,ALIGN_LEFT)
             
     'Dialog Box :: 3-OK button
     TMPSTR = STR_OK
     TMPSTR &= " [Enter]"
     X1 += W1 + GRID_STEP
     W1  = GRID_STEP * 9
     r   = add_ctrl(pID1,X1,Y1,W1,H1,@ctrl_dialog_ok,@gctrl_button,,,"DB_OK",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     Controls[TFAccess[TF_Dialog]]->text.ok_id = newID
     Controls[newID]->state.DISABLED = TRUE
     CreateIcon(newID,TYPE<_ICON>(&h6F,ICON_SIZE,IconFont,0,0,GREEN))
     KB_SHORTCUTS(13) = newID
     
     'Dialog Box :: 4-Cancel button
     TMPSTR = STR_CANCEL
     TMPSTR &= " [Esc]"
     X1 += W1 + GRID_STEP
     r   = add_ctrl(pID1,X1,Y1,W1,H1,@ctrl_dialog_x,@gctrl_button,,,"DB_X",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     Controls[TFAccess[TF_Dialog]]->text.cancel_id = newID
     Controls[newID]->state.DISABLED = TRUE
     CreateIcon(newID,TYPE<_ICON>(&h63,ICON_SIZE,IconFont,0,0,RED))
     KB_SHORTCUTS(27) = newID
     '-------------------------------------------------------------------------------------------------
     ' RIGHT PANEL
     'PANEL WINDOW
     WIN_W = GRID_STEP * TOOLS_W
     WIN_H = SCR_H - GRID_STEP * (SYSBAR_H + 1)
     WIN_X = SCR_W - WIN_W
     WIN_Y = GRID_STEP * (SYSBAR_H + 1)
     r  = add_ctrl(0,WIN_X,WIN_Y,WIN_W,WIN_H,,,,CA_HOVER,"PANEL")
     IF r THEN RETURN r
     WIN_ID = LI_Controls.LENGTH-1
     Windows[W_PANEL] = WIN_ID
     Controls[WIN_ID]->GROUP_ONLY = TRUE

     'SESSION FILE BAR
     X0  = 0
     Y0  = 0
     W0  = GRID_STEP * TOOLS_W
     H0  = GRID_STEP * 8
     r   = add_ctrl(WIN_ID,X0,Y0,W0,H0,,,TRUE,,"SFB")
     IF r THEN RETURN r
     pID0 = LI_Controls.LENGTH-1
     Controls[pID0]->GROUP_ONLY = TRUE

     'SESSION
     '¤¤¤#316: "Current synth - click to display in file browser"
     TMPSTR = LNG_SET_EXT(316,"Current synth - click to display in file browser")
     X1 = 0
     Y1 = 0
     W1 = W0 - GRID_STEP*9
     H1 = GRID_STEP*9
     r   = add_ctrl(pID0,X1,Y1,W1,H1,@ctrl_browser_tabs,@gctrl_button_tab,,,"TABSES",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     Controls[newID]->INDEX = T_SESSIONS
     CreateText(newID,"  " & SETTINGS.SESSION_NAME,DEF_FONT_SIZE,ALIGN_LEFT)
     ControlAccess[CS_SESSION_TAB0] = newID
     
     'NEW SYNTH
     '¤¤¤#317: "New synthesizer file"
     TMPSTR = LNG_SET_EXT(317,"New synthesizer file")
     TMPSTR &= " [CTRL+N]"
     X1  = W0 - GRID_STEP*9
     W1  = GRID_STEP * 9
     r   = add_ctrl(pID0,X1,Y1,W1,H1,@ctrl_new_synth,@gctrl_button,,,"SNEW",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     CreateIcon(newID,TYPE<_ICON>(&h51,ICON_SIZE,IconFont,0,0,WHITE))
     ControlAccess[CS_NEW_SYNTH] = newID
     KB_SHORTCUTS(14) = newID
     
     'TOOLS GROUP
     W0 = GRID_STEP * TOOLS_W
     H0 = GRID_STEP * INT(.39*(GRID_H - SYSBAR_H))
     X0 = 0
     Y0 = GRID_STEP*10
     r  = add_ctrl(WIN_ID,X0,Y0,W0,H0,,@gctrl_basic_window,,CA_RESET,"TOOLS")
     IF r THEN RETURN r
     pID0 = LI_Controls.LENGTH-1
     Controls[pID0]->CLR = SWATCH0.WINDOW_BG
     Controls[pID0]->state.DISABLED = (SOUNDRA.SELECTED_MODULE = 0)
     ControlAccess[CS_TOOLS] = pID0

     'SELECTED MODULE :: TITLE
     X1 = BORDER_SIZE + GRID_STEP
     Y1 = BORDER_SIZE + GRID_STEP
     W1 = W0 - BORDER_SIZE * 2
     H1 = GRID_STEP * 7
     r  = add_ctrl(pID0,X1,Y1,W1,H1,,@gctrl_label,,,"MTLBL","")
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     '¤¤¤#318: "[NO ACTIVE SELECTION]"
     TMPSTR = LNG_SET_EXT(318,"[NO ACTIVE SELECTION]")
     IF SOUNDRA.SELECTED_MODULE THEN _
        TMPSTR = SOUNDRA.SELECTED_MODULE->Label & " " & STR(SOUNDRA.SELECTED_MODULE->TYPE_ID)
     CreateText(newID,TMPSTR,DEF_FONT_SIZE+2*FS,ALIGN_CENTER)
     ControlAccess[CS_MODULE_INFOS] = newID
     
     'SELECTED MODULE :: BUTTONS
     Y1 += H1 + GRID_STEP
     W1  = GRID_STEP * 8
          'PLAY/STOP
     '¤¤¤#319: "Toggle playback ON/OFF"
     TMPSTR = LNG_SET_EXT(319,"Toggle playback ON/OFF")
     TMPSTR &= " [CTRL-P]"
     r   = add_ctrl(pID0,X1,Y1,W1,H1,@ctrl_module_flags,@gctrl_button,,,"PLAY",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     CreateIcon(newID,TYPE<_ICON>(&h31,ICON_SIZE,IconFont,0,0,SWATCH0.FG))
     'CreateIcon(newID,TYPE<_ICON>(&h32,ICON_SIZE,IconFont,0,0,SWATCH0.FG)) 'STOP ICON
     Controls[newID]->STATE.DISABLED = TRUE
     Controls[newID]->INDEX = SOUNDRA.MF_PLAY_POWER
     ControlAccess[CS_MOD_CONTROLS] = newID
     KB_SHORTCUTS(16) = newID
          'HOLD
     '¤¤¤#320: "Hold value"
     TMPSTR = LNG_SET_EXT(320,"Hold value")
     r   = add_ctrl(pID0,X1,Y1,W1,H1,@ctrl_module_flags,@gctrl_button,FALSE,,"HOLD",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     CreateIcon(newID,TYPE<_ICON>(&h48,ICON_SIZE,IconFont,0,0,SWATCH0.FG))
     Controls[newID]->INDEX = SOUNDRA.MF_HOLD
          'RECORD
     '¤¤¤#321: "Toggle recording ON/OFF"
     TMPSTR = LNG_SET_EXT(321,"Toggle recording ON/OFF")
     TMPSTR &= " [CTRL-R]"
     X1 += W1
     r   = add_ctrl(pID0,X1,Y1,W1,H1,@ctrl_sample_record,@gctrl_state_button,,,"REC",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     Controls[newID]->STATE.DISABLED = TRUE
     CreateIcon(newID,TYPE<_ICON>(&h34,ICON_SIZE,IconFont,0,0,RGB(200,0,0)))
     Controls[newID]->INDEX = SOUNDRA.MF_RECORD
     KB_SHORTCUTS(18) = newID
          'LOOP FLAG
     '¤¤¤#322: "Toggle looping ON/OFF"
     TMPSTR = LNG_SET_EXT(322,"Toggle looping ON/OFF")
     X1 += W1
     r   = add_ctrl(pID0,X1,Y1,W1,H1,@ctrl_module_flags,@gctrl_button,,,"LOOP",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     CreateIcon(newID,TYPE<_ICON>(&h42,ICON_SIZE,IconFont,0,0,SWATCH0.FG))
     Controls[newID]->INDEX = SOUNDRA.MF_LOOP
          'AUTO REWIND
     '¤¤¤#323: "Toggle autorewind ON/OFF"
     TMPSTR = LNG_SET_EXT(323,"Toggle autorewind ON/OFF")
     X1 += W1
     r   = add_ctrl(pID0,X1,Y1,W1,H1,@ctrl_module_flags,@gctrl_button,,,"ARWD",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     CreateIcon(newID,TYPE<_ICON>(&h54,ICON_SIZE,IconFont,0,0,SWATCH0.FG))
     Controls[newID]->INDEX = SOUNDRA.MF_AUTOREWIND
          'REWIND CLOCKS
     '¤¤¤#324: "Rewind module clocks and reset playback"
     TMPSTR = LNG_SET_EXT(324,"Rewind module clocks and reset playback")
     X1 += W1
     r   = add_ctrl(pID0,X1,Y1,W1,H1,@ctrl_rewind,@gctrl_button,,,"RWD",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     CreateIcon(newID,TYPE<_ICON>(&h36,ICON_SIZE,IconFont,0,0,SWATCH0.FG))
     
          'GENERAL PURPOSE SWITCH 1 - WILL HAVE TO UPDATE ICON AND TEXT ON SELECTION
     '¤¤¤#325: "Module mode 1|2 (specific to each module)"
     TMPSTR = LNG_SET_EXT(325,"Module mode 1|2 (specific to each module)")
     X1 += W1 + GRID_STEP*2
     W1  = GRID_STEP * 6
     r   = add_ctrl(pID0,X1,Y1,W1,H1,@ctrl_module_flags,@gctrl_button_sicon,TRUE,,"SW1",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     Controls[newID]->INDEX = SOUNDRA.MF_SWITCH1
     Controls[newID]->state.DISABLED = TRUE
     Controls[newID]->text.si = 0
     CreateText(newID,"1",DEF_FONT_SIZE,ALIGN_CENTER)
     CreateText(newID,"2",DEF_FONT_SIZE,ALIGN_CENTER)
          'GENERAL PURPOSE SWITCH 2 - WILL HAVE TO UPDATE ICON AND TEXT ON SELECTION
     X1 += W1
     W1  = GRID_STEP * 7
     r   = add_ctrl(pID0,X1,Y1,W1,H1,@ctrl_module_flags,@gctrl_button,TRUE,,"SW2",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     Controls[newID]->INDEX = SOUNDRA.MF_SWITCH2
     Controls[newID]->state.DISABLED = TRUE
     CreateText(newID,"x2",DEF_FONT_SIZE,ALIGN_CENTER)
          'ISLAND KEYS
     '¤¤¤#326: "Island key mode : outputs a zero between notes"
     TMPSTR = LNG_SET_EXT(326,"Island key mode : outputs a zero between notes")
     X1 += W1
     r   = add_ctrl(pID0,X1,Y1,W1,H1,@ctrl_module_flags,@gctrl_button,TRUE,,"0OUT",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     'CreateIcon(newID,TYPE<_ICON>(&h44,ICON_SIZE,IconFont,0,0,SWATCH0.FG))
     Controls[newID]->INDEX = SOUNDRA.MF_ZERO_OUT
     Controls[newID]->state.DISABLED = TRUE
     Controls[newID]->state.POWER    = TRUE
     CreateIcon(newID,TYPE<_ICON>(&h38,ICON_SIZE,IconFont,0,0,SWATCH0.BUTTON_FG))
          'DUAL PARAM
     '¤¤¤#327: "Control both inputs at once in a complementary manner."
     TMPSTR = LNG_SET_EXT(327,"Control both inputs at once in a complementary manner.")
     X1 += W1
     r   = add_ctrl(pID0,X1,Y1,W1,H1,@ctrl_module_flags,@gctrl_button,TRUE,,"DUAL",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     CreateIcon(newID,TYPE<_ICON>(&h44,ICON_SIZE,IconFont,0,0,SWATCH0.FG))
     Controls[newID]->INDEX = SOUNDRA.MF_DUAL
     Controls[newID]->state.DISABLED = TRUE

     'ENVELOPE MODE
     '¤¤¤#328: "Set module as an envelope for voice mix scaling."
     TMPSTR = LNG_SET_EXT(328,"Set module as an envelope for voice mix scaling.")
     X1 += W1
     r   = add_ctrl(pID0,X1,Y1,W1,H1,@ctrl_module_flags,@gctrl_button,,,"ENV",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     CreateIcon(newID,TYPE<_ICON>(&h45,ICON_SIZE,IconFont,0,0,SWATCH0.BUTTON_FG))
     ControlAccess[CS_ENV]  = newID
     Controls[newID]->INDEX = SOUNDRA.MF_ENVELOPE
     
     X1 = W0 - BORDER_SIZE - GRID_STEP
     'MIDI
     '¤¤¤#329: "Map a MIDI control to control a specific parameter of any selected module."
     TMPSTR = LNG_SET_EXT(329,"Map a MIDI control to control a specific parameter of any selected module.")
     W1  = GRID_STEP * 11
     X1 -= W1
     r   = add_ctrl(pID0,X1,Y1,W1,H1,@ctrl_map_MIDI1,@gctrl_button3,,,"MIDI1",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     CreateText(newID,"MIDI",DEF_FONT_SIZE,ALIGN_CENTER)
     ControlAccess[CS_MIDI1] = newID
     
'TABS
     'TAB0 - PARAMS
     '¤¤¤#330: "Module parameters (inputs and settings)"
     TMPSTR = LNG_SET_EXT(330,"Module parameters (inputs and settings)")
     X1  = GRID_STEP + BORDER_SIZE
     Y1 += H1 + GRID_STEP*2
     W1  = GRID_STEP * 30
     r   = add_ctrl(pID0,X1,Y1,W1,H1,@ctrl_param_tabs,@gctrl_button_tab,,,"MODTAB0",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     ControlAccess[CS_PARAM_TAB0] = newID
     '¤¤¤#331: "Settings"
     TMPSTR = LNG_SET_EXT(331,"Settings")
     CreateText(newID,TMPSTR,DEF_FONT_SIZE+FS,ALIGN_CENTER)
     Controls[newID]->INDEX = PARAM_INPUTS
     Controls[newID]->state.POWER = TRUE
     
     'TAB1A - SHAPES
     '¤¤¤#332: "Oscillator wave shapes"
     TMPSTR = LNG_SET_EXT(332,"Oscillator wave shapes")
     X1 += W1
     r   = add_ctrl(pID0,X1,Y1,W1,H1,@ctrl_param_tabs,@gctrl_button_tab,FALSE,,"MODTAB1A",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     '¤¤¤#333: "Shapes"
     TMPSTR = LNG_SET_EXT(333,"Shapes")
     CreateText(newID,TMPSTR,DEF_FONT_SIZE+FS,ALIGN_CENTER)
     Controls[newID]->INDEX = PARAM_SHAPES
     
     'TAB1B - SAMPLES
     '¤¤¤#334: "Samples that are loaded in memory"
     TMPSTR = LNG_SET_EXT(334,"Samples that are loaded in memory")
     r   = add_ctrl(pID0,X1,Y1,W1,H1,@ctrl_param_tabs,@gctrl_button_tab,FALSE,,"MODTAB1B",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     '¤¤¤#335: "Samples"
     TMPSTR = LNG_SET_EXT(335,"Samples")
     CreateText(newID,TMPSTR,DEF_FONT_SIZE+FS,ALIGN_CENTER)
     Controls[newID]->INDEX = PARAM_SAMPLES

     'TAB1C - FILTERS
     '¤¤¤#336: "Filter shapes"
     TMPSTR = LNG_SET_EXT(336,"Filter shapes")
     r   = add_ctrl(pID0,X1,Y1,W1,H1,@ctrl_param_tabs,@gctrl_button_tab,FALSE,,"MODTAB1C",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     '¤¤¤#337: "Shapes"
     TMPSTR = LNG_SET_EXT(337,"Shapes")
     CreateText(newID,TMPSTR,DEF_FONT_SIZE+FS,ALIGN_CENTER)
     Controls[newID]->INDEX = PARAM_FILTERS

     'TAB1D - MELODIES
     '¤¤¤#338: "Melodies"
     TMPSTR = LNG_SET_EXT(338,"Melodies")
     r   = add_ctrl(pID0,X1,Y1,W1,H1,@ctrl_param_tabs,@gctrl_button_tab,FALSE,,"MODTAB1D",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     CreateText(newID,TMPSTR,DEF_FONT_SIZE+FS,ALIGN_CENTER)
     Controls[newID]->INDEX = PARAM_MELODIES

     'TAB1E - DEVICES
     '¤¤¤#339: "Devices"
     TMPSTR = LNG_SET_EXT(339,"Devices")
     r   = add_ctrl(pID0,X1,Y1,W1,H1,@ctrl_param_tabs,@gctrl_button_tab,FALSE,,"MODTAB1E",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     CreateText(newID,TMPSTR,DEF_FONT_SIZE+FS,ALIGN_CENTER)
     Controls[newID]->INDEX = PARAM_DEVICES

     'TAB1F - SUB SCALE PATTERNS
     '¤¤¤#340: "Scale patterns"
     TMPSTR = LNG_SET_EXT(340,"Scale patterns")
     r   = add_ctrl(pID0,X1,Y1,W1,H1,@ctrl_param_tabs,@gctrl_button_tab,FALSE,,"MODTAB1F",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     '¤¤¤#341: "Patterns"
     TMPSTR = LNG_SET_EXT(341,"Patterns")
     CreateText(newID,TMPSTR,DEF_FONT_SIZE+FS,ALIGN_CENTER)
     Controls[newID]->INDEX = PARAM_SP
     
     X1 = W0 - BORDER_SIZE - GRID_STEP
     
     'POWER ON/OFF
     '¤¤¤#342: "Toggle module power ON/OFF"
     TMPSTR = LNG_SET_EXT(342,"Toggle module power ON/OFF")
     W1  = GRID_STEP * 8
     X1 -= W1
     r   = add_ctrl(pID0,X1,Y1,W1,H1,@ctrl_module_flags,@gctrl_button,,,"MFP",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     CreateIcon(newID,TYPE<_ICON>(&h50,ICON_SIZE,IconFont,0,0,SWATCH0.FG))
     Controls[newID]->INDEX      = SOUNDRA.MF_POWER
     ControlAccess[CS_MOD_POWER] = newID

     'SEED FEEDBACK
     '¤¤¤#343: "Kickstart module's feedback loops, if any, using its seed."
     TMPSTR = LNG_SET_EXT(343,"Kickstart module's feedback loops, if any, using its seed.")
     W1  = GRID_STEP * 8
     X1 -= W1
     r   = add_ctrl(pID0,X1,Y1,W1,H1,@ctrl_seed,@gctrl_button,,,"FBS",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     CreateIcon(newID,TYPE<_ICON>(&h2F,ICON_SIZE,IconFont,0,0,SWATCH0.FG))
     ControlAccess[CS_SEED] = newID

     'POLYPHONY
     '¤¤¤#344: "Toggle polyphonic mode ON/OFF"
     TMPSTR = LNG_SET_EXT(344,"Toggle polyphonic mode ON/OFF")
     W1  = GRID_STEP * 8
     X1 -= W1
     r   = add_ctrl(pID0,X1,Y1,W1,H1,@ctrl_module_flags,@gctrl_button,,,"POLY",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     CreateIcon(newID,TYPE<_ICON>(&hF6,ICON_SIZE,IconFont,0,0,SOUNDRA.MODULE_COLOR(4)))
     Controls[newID]->INDEX = SOUNDRA.MF_VOICE_MODE
     ControlAccess[CS_POLY] = newID
     
'LISTS

     'GROUP 1 - PARAM LIST
     X1  = BORDER_SIZE + GRID_STEP
     Y1 += H1
     W1  = GRID_STEP * (TOOLS_W - 2) - BORDER_SIZE * 2
     H1  = H0 - Y1 - BORDER_SIZE*2
     r  = add_ctrl(pID0,X1,Y1,W1,H1,,,,CA_RESET,"PARAM")
     IF r THEN RETURN r
     pID1 = LI_Controls.LENGTH-1
     Controls[pID1]->GROUP_ONLY = TRUE
     ControlAccess[CS_PARAM]    = pID1

     'FRAME
     '¤¤¤#345: "Parameter controls"
     TMPSTR = LNG_SET_EXT(345,"Parameter controls")
     X2 = 0
     Y2 = 0
     W2 = W1
     H2 = GRID_STEP*8 + BORDER_SIZE * 2
     r  = add_ctrl(pID1,X2,Y2,W2,H2,,@gctrl_basic_frame,,CA_RESET,"PCF",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     Controls[newID]->GROUP_ONLY = TRUE

     'BUTTONS
     X2 = BORDER_SIZE
     Y2 = BORDER_SIZE
     W2 = GRID_STEP * 5
     H2 = GRID_STEP * 7
     SP = (W1-GRID_STEP * 73 - BORDER_SIZE *2)/2

     'DOMAIN
     '¤¤¤#346: "Toggle input domain [Time | Energy]"
     TMPSTR = LNG_SET_EXT(346,"Toggle input domain [Time | Energy]")
     r = add_ctrl(pID1,X2,Y2,W2,H2,@ctrl_param_domain,@gctrl_button,,,"PDOM",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     CreateText(newID," ",DEF_FONT_SIZE,ALIGN_CENTER)
     ControlAccess[CS_PARAM_DOMAIN] = newID
     
     'GLOBAL VALUE
     '¤¤¤#347: "Global value ON/OFF: Use master module's value"
     TMPSTR = LNG_SET_EXT(347,"Global value ON/OFF: Use master module's value")
     X2 += W2
     W2  = GRID_STEP * 7
     r   = add_ctrl(pID1,X2,Y2,W2,H2,@ctrl_param_global,@gctrl_button,,,"PGV",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     CreateIcon(newID,TYPE<_ICON>(&h47,ICON_SIZE,IconFont,0,0,SWATCH0.FG))
     ControlAccess[CS_PARAM_GLOBAL] = newID

     'VOICE MAP SOURCE
     '¤¤¤#348: "Set port as voice map source or reset to default if none selected."
     TMPSTR = LNG_SET_EXT(348,"Set port as voice map source or reset to default if none selected.")
     X2 += W2
     W2  = GRID_STEP * 6
     r   = add_ctrl(pID1,X2,Y2,W2,H2,@ctrl_param_vmap,@gctrl_button,,,"PVM",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     CreateText(newID,"V",DEF_FONT_SIZE,ALIGN_CENTER)
     ControlAccess[CS_PARAM_VHOST] = newID
     
     'SPACE CHANNEL SELECTOR
     '¤¤¤#349: "Select spatial channel"
     TMPSTR = LNG_SET_EXT(349,"Select spatial channel")
     X2 += W2 + SP
     W2  = GRID_STEP * 18
     r   = add_ctrl(pID1,X2,Y2,W2,H2,@ctrl_param_schan,@gctrl_slidel,,CA_SLIDEL,"PSC",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     Controls[newID]->text.si = 0
     CreateText(newID,"L",DEF_FONT_SIZE,ALIGN_CENTER,,W2 - BORDER_SIZE*2 - ICON_SIZE*2)
     ControlAccess[CS_PARAM_SCHAN] = newID
     
     'SPACE CHANNEL LINK
     '¤¤¤#350: "Link spatial channels (toggle mono or stereo for parameter / set module to mono)"
 TMPSTR = LNG_SET_EXT(350,"Link spatial channels (toggle mono or stereo for parameter / set module to mono)")
     X2 += W2
     W2  = GRID_STEP * 7
     r   = add_ctrl(pID1,X2,Y2,W2,H2,@ctrl_param_s_link,@gctrl_button,,,"PSCL",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     CreateIcon(newID,TYPE<_ICON>(&h26,ICON_SIZE,IconFont,0,0,SWATCH0.FG))
     ControlAccess[CS_PARAM_SLINK] = newID
     
     'MIDI
     '¤¤¤#351: "Map a MIDI control to a specific parameter of a specific module."
     TMPSTR = LNG_SET_EXT(351,"Map a MIDI control to a specific parameter of a specific module.")
     X2 += W2 + SP
     W2  = GRID_STEP * 11
     r   = add_ctrl(pID1,X2,Y2,W2,H2,@ctrl_map_MIDI2,@gctrl_button3,,,"MIDI2",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     CreateText(newID,"MIDI",DEF_FONT_SIZE,ALIGN_CENTER)
     ControlAccess[CS_MIDI2] = newID

     'MIDI RANGE MIN
     '¤¤¤#352: "Set the minimum value of the MIDI control for the selected parameter."
     TMPSTR = LNG_SET_EXT(352,"Set the minimum value of the MIDI control for the selected parameter.")
     X2 += W2
     W2  = GRID_STEP * 6
     r   = add_ctrl(pID1,X2,Y2,W2,H2,@ctrl_MIDI_MIN,@gctrl_button3,,,"MMIN",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     CreateIcon(newID,TYPE<_ICON>(&h64,ICON_SIZE,IconFont,0,0,SWATCH0.FG))
     ControlAccess[CS_MIDI_MIN] = newID
     'MIDI RANGE MAX
     '¤¤¤#353: "Set the maximum value of the MIDI control for the selected parameter."
     TMPSTR = LNG_SET_EXT(353,"Set the maximum value of the MIDI control for the selected parameter.")
     X2 += W2
     W2  = GRID_STEP * 6
     r   = add_ctrl(pID1,X2,Y2,W2,H2,@ctrl_MIDI_MAX,@gctrl_button3,,,"MMAX",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     CreateIcon(newID,TYPE<_ICON>(&h65,ICON_SIZE,IconFont,0,0,SWATCH0.FG))
     ControlAccess[CS_MIDI_MAX] = newID
     'MIDI RESOLUTION
     '¤¤¤#354: "Set the resolution for endless encoders."
     TMPSTR = LNG_SET_EXT(354,"Set the resolution for endless encoders.")
     X2 += W2
     W2  = GRID_STEP * 7
     r   = add_ctrl(pID1,X2,Y2,W2,H2,@ctrl_MIDI_RES,@gctrl_button3,,,"MRES",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     CreateText(newID,"#",DEF_FONT_SIZE,ALIGN_CENTER)
     ControlAccess[CS_MIDI_RES] = newID

     'LIST
     '¤¤¤#355: "List of selected module's settings"
     TMPSTR = LNG_SET_EXT(355,"List of selected module's settings")
     NB_LINES = INT((H1 - GRID_STEP*17 - BORDER_SIZE*2) / LINE_H)
     X2  = 0
     Y2 += H2
     W2  = W1
     H2  = LINE_H*NB_LINES + BORDER_SIZE*2
          SP = H1 - H2 - GRID_STEP * 17
          FLOOR(SP,0)
     r   = add_ctrl(pID1,X2,Y2,W2,H2,@ctrl_param_list,@gctrl_param_list,,CA_TEXT_LIST,"PLIST",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     ControlAccess[CS_PARAM_LIST]     = newID
     Controls[newID]->text.selectable = TRUE
     CreateIcon(newID,TYPE<_ICON>(&h27,ICON_SIZE-FS*2,IconFont,0,0,SWATCH0.BUTTON_FG),,ICON_SIZE,LINE_H)
     CreateIcon(newID,TYPE<_ICON>(&h22,ICON_SIZE-FS*2,IconFont,0,0,SWATCH0.BUTTON_FG),,ICON_SIZE,LINE_H)
     CreateIcon(newID,TYPE<_ICON>(&h34,ICON_SIZE-FS*2,IconFont,0,0,SWATCH0.BUTTON_FG),,ICON_SIZE,LINE_H)
     CreateIcon(newID,TYPE<_ICON>(&hEF,ICON_SIZE-FS*2,IconFont,0,0,SWATCH0.BUTTON_FG),,ICON_SIZE,LINE_H)
     CreateList(newID,LIST_FONT_SIZE, NB_LINES, LINE_H)
     
     'DISPLAY MODE
     TMPSTR = STR_FA_MODE
     X2  = 0
     Y2 += H2 '+ SP
     W2  = GRID_STEP * 9
     H2  = GRID_STEP * 8
     r   = add_ctrl(pID1,X2,Y2,W2,H2,@ctrl_fa_mode,@gctrl_button,,,"FAD_PP",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     CreateIcon(newID,TYPE<_ICON>(&h25,ICON_SIZE,IconFont,0,0,SWATCH0.BUTTON_FG))
     Controls[newID]->INDEX = FAC_MODE
     Controls[newID]->state.DISABLED = TRUE
     ControlAccess[CS_PARAM_FA] = newID

     'ENTER VALUE
     TMPSTR = STR_FA_EDIT
     X2 += W2
     r  = add_ctrl(pID1,X2,Y2,W2,H2,@ctrl_fa_edit,@gctrl_button,,,"FAE_PP",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     CreateText(newID,"v =",DEF_FONT_SIZE+FS,ALIGN_CENTER)
     Controls[newID]->INDEX = FAC_EDIT
     Controls[newID]->state.DISABLED = TRUE
     
     'VALUE
     '¤¤¤#356: "Value of selected module's parameter"
     TMPSTR = LNG_SET_EXT(356,"Value of selected module's parameter")
     X2 += W2
     W2  = W1 - GRID_STEP * 30
     r   = add_ctrl(pID1,X2,Y2,W2,H2,@ctrl_fa_value,@gctrl_fa_value,,CA_SLIDEL,"FAV_PP",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     Controls[newID]->INDEX = FAC_VALUE
     Controls[newID]->state.DISABLED = TRUE
     Controls[newID]->TEXT.FONT_CLR = WHITE
     WB = W2-BORDER_SIZE*2
     HB = H2-BORDER_SIZE*2
     Controls[newID]->NEW_IMAGE(1)
     Controls[newID]->IMAGE[0] = IMAGECREATE(WB,HB,0)

     'UNIT
     TMPSTR = STR_FA_UNIT
     X2 += W2
     W2  = GRID_STEP * 12
     r   = add_ctrl(pID1,X2,Y2,W2,H2,@ctrl_fa_unit,@gctrl_button,,,"FAU_PP",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     CreateText(newID,"Hz",DEF_FONT_SIZE+FS,ALIGN_CENTER)
     Controls[newID]->INDEX = FAC_UNIT
     Controls[newID]->state.DISABLED = TRUE

'GROUP 2 - SHAPE LIST
     r  = add_ctrl(pID0,X1,Y1,W1,H1,,,FALSE,CA_RESET,"SHAPE")
     IF r THEN RETURN r
     pID1 = LI_Controls.LENGTH-1
     Controls[pID1]->GROUP_ONLY = TRUE
     ControlAccess[CS_SHAPE]    = pID1

     'LIST
     '¤¤¤#357: "List of wave functions"
     TMPSTR = LNG_SET_EXT(357,"List of wave functions")
     NB_LINES = INT((H1 - GRID_STEP * 14 - BORDER_SIZE*2) / LINE_H)
     X2  = 0
     Y2  = 0
     W2  = W1
     H2  = LINE_H*NB_LINES + BORDER_SIZE*2
          SP = H1 - H2 - GRID_STEP * 13
          FLOOR(SP,0)
     r = add_ctrl(pID1,X2,Y2,W2,H2,@ctrl_shape_list,@gctrl_shape_list,,CA_TEXT_LIST,"SLIST",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     ControlAccess[CS_SHAPE_LIST]     = newID
     Controls[newID]->text.selectable = TRUE
     CreateList(newID,LIST_FONT_SIZE, NB_LINES, LINE_H)
     
     'GRAPH
     '¤¤¤#358: "Wave function preview"
     TMPSTR = LNG_SET_EXT(358,"Wave function preview")
     Y2 += H2 '+ SP
     H2  = GRID_STEP * 13
     r   = add_ctrl(pID1,X2,Y2,W2,H2,@ctrl_shape_graph,@gctrl_shape_graph,,,"PGRAPH",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     ControlAccess[CS_SHAPE_GRAPH] = newID
     Controls[newID]->CLR = SWATCH0.DARKER_BG
     Controls[newID]->new_IMAGE(1)
     Controls[newID]->set_IMAGE(0,W2-BORDER_SIZE*2,H2-BORDER_SIZE*2)

'GROUP 3 - SAMPLES
     r  = add_ctrl(pID0,X1,Y1,W1,H1,,,FALSE,CA_RESET,"SAMPLE")
     IF r THEN RETURN r
     pID1 = LI_Controls.LENGTH-1
     Controls[pID1]->GROUP_ONLY = TRUE
     ControlAccess[CS_SAMPLE] = pID1
     
     'LIST
     '¤¤¤#359: "List of samples loaded in memory"
     TMPSTR = LNG_SET_EXT(359,"List of samples loaded in memory")
     NB_LINES = INT((H1 - GRID_STEP * 8 - BORDER_SIZE*2) / LINE_H)
     X2  = 0
     Y2  = 0
     W2  = W1
     H2  = LINE_H*NB_LINES + BORDER_SIZE*2
          SP = H1 - H2 - GRID_STEP * 8
          FLOOR(SP,0)
     r = add_ctrl(pID1,X2,Y2,W2,H2,@ctrl_sample_list_m,@gctrl_sample_list_m,,CA_TEXT_LIST,"WLIST",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     ControlAccess[CS_SAMPLE_LIST_M]  = newID
     Controls[newID]->text.selectable = TRUE
     'CHECK, LOCK, !
     CreateIcon(newID,TYPE<_ICON>(&h6F,ICON_SIZE,IconFont,0,0,SWATCH0.FG),,ICON_SIZE,LINE_H)
     CreateIcon(newID,TYPE<_ICON>(&h6C,ICON_SIZE,IconFont,0,0,SWATCH0.BUTTON_BG_REC),,ICON_SIZE,LINE_H)
     CreateIcon(newID,TYPE<_ICON>(&h21,ICON_SIZE,IconFont,0,0,SWATCH0.BUTTON_BG_REC),,ICON_SIZE+2*FS,LINE_H)
     CreateList(newID,LIST_FONT_SIZE, NB_LINES, LINE_H)

     'SAVE
     '¤¤¤#360: "Save selected sample to disk"
     TMPSTR = LNG_SET_EXT(360,"Save selected sample to disk")
     X2  = W1 - GRID_STEP*26
     Y2 += H2
     W2  = GRID_STEP * 8
     H2  = GRID_STEP * 7
     r   = add_ctrl(pID1,X2,Y2,W2,H2,@ctrl_sample_save,@gctrl_button,,,"SSAV",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     CreateIcon(newID,TYPE<_ICON>(&h53,ICON_SIZE,IconFont,0,0,SWATCH0.FG))
     
     'DEL
     '¤¤¤#361: "Unload selected sample from memory"
     TMPSTR = LNG_SET_EXT(361,"Unload selected sample from memory")
     X2 += W2 + GRID_STEP
     r   = add_ctrl(pID1,X2,Y2,W2,H2,@ctrl_sample_del,@gctrl_button,,,"SDEL",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     CreateIcon(newID,TYPE<_ICON>(&h2D,ICON_SIZE,IconFont,0,0,RGB(200,0,0)))
     
     'SET
     '¤¤¤#362: "Set selected sample"
     TMPSTR = LNG_SET_EXT(362,"Set selected sample")
     X2 += W2 + GRID_STEP
     r   = add_ctrl(pID1,X2,Y2,W2,H2,@ctrl_sample_set,@gctrl_button,,,"SSET",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     CreateIcon(newID,TYPE<_ICON>(&h6F,ICON_SIZE,IconFont,0,0,RGB(0,200,0)))

'GROUP 4 - FILTER LIST
     r  = add_ctrl(pID0,X1,Y1,W1,H1,,,FALSE,CA_RESET,"FILTER")
     IF r THEN RETURN r
     pID1 = LI_Controls.LENGTH-1
     Controls[pID1]->GROUP_ONLY = TRUE
     ControlAccess[CS_FILTER]   = pID1

     'LIST
     '¤¤¤#363: "List of filter coefficient files"
     TMPSTR = LNG_SET_EXT(363,"List of filter coefficient files")
     NB_LINES = INT((H1 - GRID_STEP * 27 - BORDER_SIZE*2) / LINE_H)
     X2  = 0
     Y2  = 0
     W2  = W1
     H2  = LINE_H*NB_LINES + BORDER_SIZE*2
          SP = H1 - H2 - GRID_STEP * 27
          FLOOR(SP,0)
     r = add_ctrl(pID1,X2,Y2,W2,H2,@ctrl_filter_list,@gctrl_filter_list,,CA_TEXT_LIST,"FLIST",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     ControlAccess[CS_FILTER_LIST]    = newID
     Controls[newID]->text.selectable = TRUE
     CreateIcon(newID,TYPE<_ICON>(&h6F,ICON_SIZE,IconFont,0,0,SWATCH0.FG),,ICON_SIZE,LINE_H)
     CreateIcon(newID,TYPE<_ICON>(&h6C,ICON_SIZE,IconFont,0,0,SWATCH0.BUTTON_BG_REC),,ICON_SIZE,LINE_H)
   CreateIcon(newID,TYPE<_ICON>(&h21,ICON_SIZE-FS,IconFont,0,0,SWATCH0.BUTTON_BG_REC),,ICON_SIZE+2*FS,LINE_H)
     CreateList(newID,LIST_FONT_SIZE, NB_LINES, LINE_H)
     
     'GRAPH
     '¤¤¤#364: "Filter coefficients"
     TMPSTR = LNG_SET_EXT(364,"Filter coefficients")
     X2  = 0
     Y2 += H2
     H2  = GRID_STEP * 13
     r   = add_ctrl(pID1,X2,Y2,W2,H2,@ctrl_filter_graph,@gctrl_filter_graph,,CA_SLIDEL,"FGRAPH",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     ControlAccess[CS_FILTER_GRAPH] = newID
     Controls[newID]->CLR = SWATCH0.DARKER_BG
     Controls[newID]->new_IMAGE(1)
     Controls[newID]->set_IMAGE(0,W2-BORDER_SIZE*2,H2-BORDER_SIZE*2)
     
     'WINDOW SELECTOR
     '¤¤¤#365: "Select the window to apply"
     TMPSTR = LNG_SET_EXT(365,"Select the window to apply")
     X2  = 0
     Y2 += H2
     W2  = GRID_STEP * 41
     H2  = GRID_STEP * 7
     r   = add_ctrl(pID1,X2,Y2,W2,H2,@ctrl_filter_win,@gctrl_slidel,,CA_SLIDEL,"FWS",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     Controls[newID]->text.si = 0
     '¤¤¤#366: "Square (none)"
     TMPSTR = LNG_SET_EXT(366,"Square (none)")
     CreateText(newID,TMPSTR,DEF_FONT_SIZE,ALIGN_CENTER,,W2 - BORDER_SIZE*2 - ICON_SIZE*2)
     ControlAccess[CS_FILTER_WINDOW] = newID

     'HI
     '¤¤¤#367: "Filter mode: High pass"
     TMPSTR = LNG_SET_EXT(367,"Filter mode: High pass")
     X2 += W2
     W2  = GRID_STEP*7
     r   = add_ctrl(pID1,X2,Y2,W2,H2,@ctrl_filter_HI,@gctrl_button,,,"FHI",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     CreateText(newID,"HI",DEF_FONT_SIZE,ALIGN_CENTER)

     'ADD
     '¤¤¤#368: "Create a new filter file from selected settings"
     TMPSTR = LNG_SET_EXT(368,"Create a new filter file from selected settings")
     X2  = W1 - GRID_STEP*26
     W2  = GRID_STEP * 8
     r   = add_ctrl(pID1,X2,Y2,W2,H2,@ctrl_filter_add,@gctrl_button,,,"FADD",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     CreateIcon(newID,TYPE<_ICON>(&h2B,ICON_SIZE,IconFont,0,0,WHITE))
     
     'DEL
     '¤¤¤#369: "Unload selected filter from memory"
     TMPSTR = LNG_SET_EXT(369,"Unload selected filter from memory")
     X2 += W2 + GRID_STEP
     r   = add_ctrl(pID1,X2,Y2,W2,H2,@ctrl_filter_del,@gctrl_button,,,"FDEL",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     CreateIcon(newID,TYPE<_ICON>(&h2D,ICON_SIZE,IconFont,0,0,RGB(200,0,0)))
     
     'SET
     '¤¤¤#370: "Set selected filter"
     TMPSTR = LNG_SET_EXT(370,"Set selected filter")
     X2 += W2 + GRID_STEP
     r   = add_ctrl(pID1,X2,Y2,W2,H2,@ctrl_filter_set,@gctrl_button,,,"FSET",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     CreateIcon(newID,TYPE<_ICON>(&h6F,ICON_SIZE,IconFont,0,0,RGB(0,200,0)))
     
     'WINDOW SIZE
     '¤¤¤#371: "Select the window size of the new filter"
     TMPSTR = LNG_SET_EXT(371,"Select the window size of the new filter")
     X2  = 0
     Y2 += H2
     W2  = GRID_STEP * 24
     r   = add_ctrl(pID1,X2,Y2,W2,H2,@ctrl_filter_size,@gctrl_slidel,,CA_SLIDEL,"FWS",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     Controls[newID]->text.si = 0
     CreateText(newID,"N = 3",DEF_FONT_SIZE,ALIGN_CENTER,,W2 - BORDER_SIZE*2 - ICON_SIZE*2)
     ControlAccess[CS_FILTER_SIZE] = newID

     'K SPAN
     '¤¤¤#372: "Select the size of the filter lobe"
     TMPSTR = LNG_SET_EXT(372,"Select the size of the filter lobe")
     TMPSTR &= " K = [0..N-1]"
     X2 += W2
     W2  = GRID_STEP * 24
     r   = add_ctrl(pID1,X2,Y2,W2,H2,@ctrl_filter_slope,@gctrl_slidel,,CA_SLIDEL,"FKS",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     Controls[newID]->text.si = 2
     CreateText(newID,"K = 2",DEF_FONT_SIZE,ALIGN_CENTER,,W2 - BORDER_SIZE*2 - ICON_SIZE*2)
     ControlAccess[CS_FILTER_K] = newID


'GROUP 5 - MELODY LIST
     r  = add_ctrl(pID0,X1,Y1,W1,H1,,,FALSE,CA_RESET,"MELODY")
     IF r THEN RETURN r
     pID1 = LI_Controls.LENGTH-1
     Controls[pID1]->GROUP_ONLY = TRUE
     ControlAccess[CS_MELODY]   = pID1

     'LIST
     '¤¤¤#373: "List of melodies"
     TMPSTR = LNG_SET_EXT(373,"List of melodies")
     NB_LINES = INT((H1 - GRID_STEP * 8 - BORDER_SIZE*2) / LINE_H)
     X2  = 0
     Y2  = 0
     W2  = W1
     H2  = LINE_H*NB_LINES + BORDER_SIZE*2
     r = add_ctrl(pID1,X2,Y2,W2,H2,@ctrl_melody_list,@gctrl_melody_list,,CA_TEXT_LIST,"MLIST",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     ControlAccess[CS_MELODY_LIST]    = newID
     Controls[newID]->text.selectable = TRUE
          'CHECK, LOCK, ! ICONS
     CreateIcon(newID,TYPE<_ICON>(&h6F,ICON_SIZE,IconFont,0,0,SWATCH0.FG),,ICON_SIZE,LINE_H)
     CreateIcon(newID,TYPE<_ICON>(&h6C,ICON_SIZE,IconFont,0,0,SWATCH0.BUTTON_BG_REC),,ICON_SIZE,LINE_H)
     CreateIcon(newID,TYPE<_ICON>(&h21,ICON_SIZE,IconFont,0,0,SWATCH0.BUTTON_BG_REC),,ICON_SIZE+2*FS,LINE_H)
     CreateList(newID,LIST_FONT_SIZE, NB_LINES, LINE_H)
     
     'SAVE
     '¤¤¤#374: "Save selected melody to disk"
     TMPSTR = LNG_SET_EXT(374,"Save selected melody to disk")
     X2  = W1 - GRID_STEP*26
     Y2 += H2
     W2  = GRID_STEP * 8
     H2  = GRID_STEP * 7
     r   = add_ctrl(pID1,X2,Y2,W2,H2,@ctrl_melody_save,@gctrl_button,,,"MSAV",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     CreateIcon(newID,TYPE<_ICON>(&h53,ICON_SIZE,IconFont,0,0,SWATCH0.FG))
     
     'DEL
     '¤¤¤#375: "Unload the selected melody from memory"
     TMPSTR = LNG_SET_EXT(375,"Unload the selected melody from memory")
     X2 += W2 + GRID_STEP
     r   = add_ctrl(pID1,X2,Y2,W2,H2,@ctrl_melody_del,@gctrl_button,,,"MDEL",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     CreateIcon(newID,TYPE<_ICON>(&h2D,ICON_SIZE,IconFont,0,0,RGB(200,0,0)))
     
     'SET
     '¤¤¤#376: "Set the selected melody"
     TMPSTR = LNG_SET_EXT(376,"Set the selected melody")
     X2 += W2 + GRID_STEP
     r   = add_ctrl(pID1,X2,Y2,W2,H2,@ctrl_melody_set,@gctrl_button,,,"MSET",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     CreateIcon(newID,TYPE<_ICON>(&h6F,ICON_SIZE,IconFont,0,0,RGB(0,200,0)))

'GROUP 6 - DEVICE LIST
     r  = add_ctrl(pID0,X1,Y1,W1,H1,,,FALSE,CA_RESET,"DEVICES")
     IF r THEN RETURN r
     pID1 = LI_Controls.LENGTH-1
     Controls[pID1]->GROUP_ONLY = TRUE
     ControlAccess[CS_MM_DEVS]  = pID1

     'LIST
     '¤¤¤#377: "List of MIDI devices"
     TMPSTR = LNG_SET_EXT(377,"List of MIDI devices")
     NB_LINES = INT((H1 - GRID_STEP * 7 - BORDER_SIZE*2) / LINE_H)
     X2  = 0
     Y2  = 0
     W2  = W1
     H2  = LINE_H*NB_LINES + BORDER_SIZE*2
     r = add_ctrl(pID1,X2,Y2,W2,H2,@ctrl_MIDIKB_DEVLIST,@gctrl_mdevs_list,,CA_TEXT_LIST,"KBDEVS",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     ControlAccess[CS_MM_DEVS_LIST]   = newID
     Controls[newID]->text.selectable = TRUE
     CreateList(newID,LIST_FONT_SIZE, NB_LINES, LINE_H)

     Y2 += H2
     H2  = GRID_STEP * 7
     W2  = W1
     'MIDI CHANNEL
     '¤¤¤#378: "MIDI Channel (0=any):"
     TMPSTR = LNG_SET_EXT(378,"MIDI Channel (0=any):")
     r = add_ctrl(pID1,X2,Y2,W2,H2,@ctrl_MIDIKB_CHAN,@gctrl_slidel,,CA_SLIDEL,"KBCH",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     ControlAccess[CS_MIDIKB_CHAN] = newID
     Controls[newID]->text.si      = 0
     CreateText(newID,TMPSTR & " 0 ",DEF_FONT_SIZE,ALIGN_CENTER,,W2 - BORDER_SIZE*2 - ICON_SIZE*2)
     

'GROUP 7 - SCALES
     r = add_ctrl(pID0,X1,Y1,W1,H1,,,FALSE,CA_RESET,"SCALES")
     IF r THEN RETURN r
     pID1 = LI_Controls.LENGTH-1
     Controls[pID1]->GROUP_ONLY = TRUE
     ControlAccess[CS_SP] = pID1
     
     'LIST
     '¤¤¤#379: "List of scales loaded in memory"
     TMPSTR = LNG_SET_EXT(379,"List of scales loaded in memory")
     NB_LINES = INT((H1 - GRID_STEP * 8 - BORDER_SIZE*2) / LINE_H)
     X2  = 0
     Y2  = 0
     W2  = W1
     H2  = LINE_H*NB_LINES + BORDER_SIZE*2
     r = add_ctrl(pID1,X2,Y2,W2,H2,@ctrl_sp_list,@gctrl_sp_list,,CA_TEXT_LIST,"SCALELIST",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     ControlAccess[CS_SP_LIST]        = newID
     Controls[newID]->INDEX           = PARAM_SP
     Controls[newID]->text.selectable = TRUE
     CreateList(newID,LIST_FONT_SIZE, NB_LINES, LINE_H)

' BROWSER

'TABS (GROUP)
     X0 = 0
     Y0 = H0 + GRID_STEP * 11
     W0 = GRID_STEP * TOOLS_W
     H0 = GRID_STEP * 7
     r  = add_ctrl(WIN_ID,X0,Y0,W0,H0,,,,CA_RESET,"TABS")
     IF r THEN RETURN r
     pID0 = LI_Controls.LENGTH-1
     Controls[pID0]->GROUP_ONLY = TRUE
     
     'TAB 0 : MESSAGES
     '¤¤¤#380: "Display the message console"
     TMPSTR = LNG_SET_EXT(380,"Display the message console")
     Y1 = 0
     W1 = INT(W0 / 5)
     X1 = 0
     H1 = GRID_STEP * 7
     SP = W0 - 5*W1
     r  = add_ctrl(pID0,X1,Y1,W1,H1,@ctrl_browser_tabs,@gctrl_button_tab,,,"TABMSG",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     ControlAccess[CS_BROWSER_TAB0] = newID
     Controls[newID]->INDEX         = T_MESSAGES
     Controls[newID]->state.POWER   = TRUE
     CreateIcon(newID,TYPE<_ICON>(&h40,ICON_SIZE,IconFont,0,-1,SWATCH0.BUTTON_FG))
     
     'TAB 1 : FILES
     '¤¤¤#381: "Display the file browser"
     TMPSTR = LNG_SET_EXT(381,"Display the file browser")
     X1 += W1
     r   = add_ctrl(pID0,X1,Y1,W1+SP,H1,@ctrl_browser_tabs,@gctrl_button_tab,,,"TABFIL",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     Controls[newID]->INDEX = T_FILES
     CreateIcon(newID,TYPE<_ICON>(&h46,ICON_SIZE,IconFont,0,1,SWATCH0.BUTTON_FG))
     
     'TAB 2 : MODULES
     '¤¤¤#382: "Display the module libraries"
     TMPSTR = LNG_SET_EXT(382,"Display the module libraries")
     X1 += W1+SP
     r   = add_ctrl(pID0,X1,Y1,W1,H1,@ctrl_browser_tabs,@gctrl_button_tab,,,"TABMOD",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     Controls[newID]->INDEX = T_MODULES
     CreateIcon(newID,TYPE<_ICON>(&h4E,ICON_SIZE,IconFont,0,0,SWATCH0.BUTTON_FG))

     'TAB 3 : SAMPLES
     '¤¤¤#383: "Display the audio sample libraries"
     TMPSTR = LNG_SET_EXT(383,"Display the audio sample libraries")
     X1 += W1
     r   = add_ctrl(pID0,X1,Y1,W1,H1,@ctrl_browser_tabs,@gctrl_button_tab,,,"TABSAM",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     Controls[newID]->INDEX = T_SAMPLES
     CreateIcon(newID,TYPE<_ICON>(&h7E,ICON_SIZE,IconFont,0,1,SWATCH0.BUTTON_FG))

     'TAB 4 : MIDI CC
     '¤¤¤#384: "Display the MIDI devices and controls"
     TMPSTR = LNG_SET_EXT(384,"Display the MIDI devices and controls")
     X1 += W1
     r   = add_ctrl(pID0,X1,Y1,W1,H1,@ctrl_browser_tabs,@gctrl_button_tab,,,"TABMCC",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     Controls[newID]->INDEX = T_MIDICC
     CreateIcon(newID,TYPE<_ICON>(&h4B,ICON_SIZE,IconFont,0,1,SWATCH0.BUTTON_FG))
     
'BROWSER WINDOW (GROUP)
     Y0 += H0
     H0  = WIN_H - Y0 - 1 'REMAINING HEIGHT
     r   = add_ctrl(WIN_ID,X0,Y0,W0,H0,,@gctrl_basic_window,,CA_RESET,"BROWSER")
     IF r THEN RETURN r
     pID0 = LI_Controls.LENGTH-1
     Controls[pID0]->CLR = SWATCH0.WINDOW_BG

     Y1 = GRID_STEP * 4
     W1 = GRID_STEP * 9
     H1 = GRID_STEP * 7
     X1 = (W0 - 6*W1) / 2
     
     'ORDER         LIST
     '¤¤¤#385: "Change the list order"
     TMPSTR = LNG_SET_EXT(385,"Change the list order")
     r = add_ctrl(pID0,X1,Y1,W1,H1,@ctrl_list_order,@gctrl_button_sicon,,,"LSORDER",TMPSTR)
     newID = LI_Controls.LENGTH-1
     Controls[newID]->INDEX = 1 'NORMAL order
     CreateIcon(newID,TYPE<_ICON>(&h7D,ICON_SIZE,IconFont,0,0,SWATCH0.BUTTON_FG))
     CreateIcon(newID,TYPE<_ICON>(&h7B,ICON_SIZE,IconFont,0,0,SWATCH0.BUTTON_FG))
     ControlAccess[CS_LI_ORDER] = newID 

     'RENAME        ITEM
     '¤¤¤#386: "Rename the selected list item"
     TMPSTR = LNG_SET_EXT(386,"Rename the selected list item")
     X1 += W1 + GRID_STEP
     r   = add_ctrl(pID0,X1,Y1,W1,H1,@ctrl_li_ren,@gctrl_button,,,"LIREN",TMPSTR)
     newID = LI_Controls.LENGTH-1
     CreateIcon(newID,TYPE<_ICON>(&h41,ICON_SIZE,IconFont,0,0,SWATCH0.BUTTON_FG))
     
     'COPY          ITEM
     '¤¤¤#387: "Copy the selected list item"
     TMPSTR = LNG_SET_EXT(387,"Copy the selected list item")
     TMPSTR &= " [CTRL-C]"
     X1 += W1 + GRID_STEP
     r   = add_ctrl(pID0,X1,Y1,W1,H1,@ctrl_li_copy,@gctrl_button,,,"LICOPY",TMPSTR)
     newID = LI_Controls.LENGTH-1
     CreateIcon(newID,TYPE<_ICON>(&h2A,ICON_SIZE,IconFont,0,0,SWATCH0.BUTTON_FG))
     KB_SHORTCUTS(3) = newID
     
     'DELETE        ITEM
     '¤¤¤#388: "Delete the selected list item OR the selected module, if any"
     TMPSTR = LNG_SET_EXT(388,"Delete the selected list item OR the selected module, if any")
     TMPSTR &= " [DEL]"
     X1 += W1 + GRID_STEP
     r   = add_ctrl(pID0,X1,Y1,W1,H1,@ctrl_li_del,@gctrl_button,,,"LIDEL",TMPSTR)
     newID = LI_Controls.LENGTH-1
     CreateIcon(newID,TYPE<_ICON>(&h2D,ICON_SIZE,IconFont,0,0,SWATCH0.BUTTON_FG))
     KB_SHORTCUTS(339) = newID
     
     'SAVE          ITEM
     '¤¤¤#389: "Save session OR selected item, if can be"
     TMPSTR = LNG_SET_EXT(389,"Save session OR selected item, if can be")
     TMPSTR &= " [CTRL+S]"
     X1 += W1 + GRID_STEP
     r   = add_ctrl(pID0,X1,Y1,W1,H1,@ctrl_li_save,@gctrl_button,,,"LISAVE",TMPSTR)
     newID = LI_Controls.LENGTH-1
     CreateIcon(newID,TYPE<_ICON>(&h53,ICON_SIZE,IconFont,0,0,SWATCH0.BUTTON_FG))
     KB_SHORTCUTS(19) = newID
     
     'LOAD          ITEM
     '¤¤¤#390: "Load"
     TMPSTR = LNG_SET_EXT(390,"Load")
     TMPSTR &= " [CTRL+L]"
     X1 += W1 + GRID_STEP
     r   = add_ctrl(pID0,X1,Y1,W1,H1,@ctrl_li_load,@gctrl_button,,,"LILOAD",TMPSTR)
     newID = LI_Controls.LENGTH-1
     CreateIcon(newID,TYPE<_ICON>(&h24,ICON_SIZE,IconFont,0,0,SWATCH0.BUTTON_FG))
     KB_SHORTCUTS(12) = newID

     
'MESSAGE CONSOLE
     X1  = BORDER_SIZE + GRID_STEP
     Y1 += H1 + GRID_STEP
     H1  = H0 - Y1 - BORDER_SIZE - GRID_STEP
     W1  = GRID_STEP * (TOOLS_W - 3)
     r   = add_ctrl(pID0,X1,Y1,W1,H1,,,TRUE,,"MSGB")
     IF r THEN RETURN r
     pID1 = LI_Controls.LENGTH-1
     ControlAccess[CS_CONSOLE]  = pID1
     Controls[pID1]->GROUP_ONLY = TRUE

     'LIST SIZE & VERTICAL SPACING CALCULATIONS
     NB_LINES = INT((SCR_H-Controls[ControlAccess[CS_CONSOLE]]->Y - GRID_STEP*14 - BORDER_SIZE*2) / LINE_H)
     SP  = (SCR_H-Controls[ControlAccess[CS_CONSOLE]]->Y - GRID_STEP*8 - BORDER_SIZE*2) - (NB_LINES*LINE_H)
     SP /= 3
     Y1 += SP*2
     Controls[ControlAccess[CS_CONSOLE]]->Y = Controls[ControlAccess[CS_CONSOLE]]->Y + SP*2

     'TAB1 : SYSTEM (INFOS, WARNINGS AND ERRORS)
     '¤¤¤#391: "System messages, warnings and errors"
     TMPSTR = LNG_SET_EXT(391,"System messages, warnings and errors")
     X2 = 0
     Y2 = 0
     W2 = GRID_STEP * 30
     H2 = GRID_STEP * 7
     r  = add_ctrl(pID1,X2,Y2,W2,H2,@ctrl_console_tabs,@gctrl_button_tab,,,"MSGT1",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     Controls[newID]->INDEX         = MSG_SYSTEM
     Controls[newID]->state.POWER   = TRUE
     ControlAccess[CS_CONSOLE_TAB0] = newID
     '¤¤¤#392: "Messages"
     TMPSTR = LNG_SET_EXT(392,"Messages")
     CreateText(newID,TMPSTR,DEF_FONT_SIZE,ALIGN_CENTER)
     
     'TAB2 : ACTIONS (THAT ARE REVERSIBLE)
     '¤¤¤#393: "Action history"
     TMPSTR = LNG_SET_EXT(393,"Action history")
     X2 += W2
     r   = add_ctrl(pID1,X2,Y2,W2,H2,@ctrl_console_tabs,@gctrl_button_tab,,,"MSGT2",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     Controls[newID]->INDEX = MSG_ACTIONS
     '¤¤¤#394: "Actions"
     TMPSTR = LNG_SET_EXT(394,"Actions")
     CreateText(newID,TMPSTR,DEF_FONT_SIZE,ALIGN_CENTER)
     
     'LIST 0 - SYSTEM
     '¤¤¤#395: "System messages"
     TMPSTR = LNG_SET_EXT(395,"System messages")
     X2  = 0
     Y2 += H2
     W2  = W1
     H2  = NB_LINES * LINE_H + BORDER_SIZE * 2
     r   = add_ctrl(pID1,X2,Y2,W2,H2,@ctrl_system_list,@gctrl_system_list,TRUE,CA_TEXT_LIST,"MSGS",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     Controls[newID]->text.reversed_index = TRUE
     Controls[newID]->INDEX               = MSG_SYSTEM
     CreateList(newID,LIST_FONT_SIZE, NB_LINES, LINE_H)
     ControlAccess[CS_CONSOLE_LIST]       = newID

     'LIST 1 - ACTIONS
     '¤¤¤#396: "Action history"
     TMPSTR = LNG_SET_EXT(396,"Action history")
     r = add_ctrl(pID1,X2,Y2,W2,H2,@ctrl_action_list,@gctrl_action_list,FALSE,CA_TEXT_LIST,"MSGA",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     Controls[newID]->text.reversed_index = TRUE
     Controls[newID]->text.selectable     = TRUE
     Controls[newID]->INDEX               = MSG_ACTIONS
     CreateList(newID,LIST_FONT_SIZE, NB_LINES, LINE_H)

'FILE BROWSER
     r = add_ctrl(pID0,X1,Y1,W1,H1,,,FALSE,,"FB")
     IF r THEN RETURN r
     pID1 = LI_Controls.LENGTH-1
     ControlAccess[CS_FILES] = pID1
     Controls[pID1]->GROUP_ONLY = TRUE

     'GO UP
     '¤¤¤#397: "File browser : Go up one level."
     TMPSTR = LNG_SET_EXT(397,"File browser : Go up one level.")
     X2 = 0
     Y2 = 0
     W2 = GRID_STEP * 9
     H2 = GRID_STEP * 7
     r  = add_ctrl(pID1,X2,Y2,W2,H2,@ctrl_file_up,@gctrl_button,,,"BUP",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     CreateIcon(newID,TYPE<_ICON>(&h62,ICON_SIZE,IconFont,0,0,SWATCH0.BUTTON_FG))
     
     'HOME          FOLDER
     '¤¤¤#398: "File browser : Go to home folder"
     TMPSTR = LNG_SET_EXT(398,"File browser : Go to home folder")
     X2 += W2
     r   = add_ctrl(pID1,X2,Y2,W2,H2,@ctrl_file_home,@gctrl_button,,,"BHOME",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     CreateIcon(newID,TYPE<_ICON>(&h68,ICON_SIZE,IconFont,0,0,SWATCH0.BUTTON_FG))

     'REFRESH       FOLDER
     '¤¤¤#399: "File browser : Refresh folder content"
     TMPSTR = LNG_SET_EXT(399,"File browser : Refresh folder content")
     X2 += W2
     r   = add_ctrl(pID1,X2,Y2,W2,H2,@ctrl_file_ref,@gctrl_button,,,"BREF",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     CreateIcon(newID,TYPE<_ICON>(&h42,ICON_SIZE,IconFont,0,0,SWATCH0.BUTTON_FG))

     'DRIVES
     '¤¤¤#400: "File browser : Available drives"
     TMPSTR = LNG_SET_EXT(400,"File browser : Available drives")
     X2 += W2
     W2  = W1 - 3*W2
     r   = add_ctrl(pID1,X2,Y2,W2,H2,@ctrl_file_drives,@gctrl_file_drives,,,"BDRV",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     ControlAccess[CS_DRIVES]         = newID
     Controls[newID]->text.font_size  = DEF_FONT_SIZE
     Controls[newID]->TEXT.si         = DRIVES.CurDriveIndex()
     CreateText(newID,"      ",DEF_FONT_SIZE,ALIGN_CENTER)

     'FILE LIST
     '¤¤¤#401: "File browser"
     TMPSTR = LNG_SET_EXT(401,"File browser")
     X2  = 0
     Y2 += GRID_STEP * 7
     W2  = W1
     H2  = NB_LINES * LINE_H + BORDER_SIZE * 2
     r   = add_ctrl(pID1,X2,Y2,W2,H2,@ctrl_file_list,@gctrl_file_list,,CA_TEXT_LIST,"FILES",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     Controls[newID]->text.selectable     = TRUE
     Controls[newID]->text.reversed_index = TRUE
     CreateList(newID,LIST_FONT_SIZE, NB_LINES, LINE_H)
     ControlAccess[CS_FILE_LIST] = newID

     'MODULE LIBRARIES
     r = add_ctrl(pID0,X1,Y1,W1,H1,,,FALSE,,"LIB")
     IF r THEN RETURN r
     pID1 = LI_Controls.LENGTH-1
     ControlAccess[CS_MODULES]  = pID1
     Controls[pID1]->GROUP_ONLY = TRUE
     
     'TAB1 : REFERENCE
     '¤¤¤#402: "Module masters - used as reference and for global control"
     TMPSTR = LNG_SET_EXT(402,"Module masters - used as reference and for global control")
     X2 = 0
     Y2 = 0
     W2 = GRID_STEP * 30
     H2 = GRID_STEP * 7
     r  = add_ctrl(pID1,X2,Y2,W2,H2,@ctrl_mod_tabs,@gctrl_button_tab,,,"LIBT1",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     Controls[newID]->INDEX         = MOD_REFERENCE
     Controls[newID]->state.POWER   = TRUE
     ControlAccess[CS_MODULE_TAB0]  = newID
     '¤¤¤#403: "Catalog"
     TMPSTR = LNG_SET_EXT(403,"Catalog")
     CreateText(newID,TMPSTR,DEF_FONT_SIZE,ALIGN_CENTER)
     
     'TAB2 : LIBRARY
     '¤¤¤#404: "Modules created"
     TMPSTR = LNG_SET_EXT(404,"Modules created")
     X2 += W2
     r   = add_ctrl(pID1,X2,Y2,W2,H2,@ctrl_mod_tabs,@gctrl_button_tab,,,"LIBT2",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     Controls[newID]->INDEX = MOD_LIBRARY
     '¤¤¤#405: "Modules"
     TMPSTR = LNG_SET_EXT(405,"Modules")
     CreateText(newID,TMPSTR,DEF_FONT_SIZE,ALIGN_CENTER)
     
     'LIST 0 - REFERENCE MODULES
     '¤¤¤#406: "Module catalog"
     TMPSTR = LNG_SET_EXT(406,"Module catalog")
     X2  = 0
     Y2 += GRID_STEP * 7
     W2  = W1
     H2  = NB_LINES * LINE_H + BORDER_SIZE * 2
     r   = add_ctrl(pID1,X2,Y2,W2,H2,@ctrl_reference_list,@gctrl_reference_list,TRUE, _
           CA_TEXT_LIST OR CA_DRAG,"REFM",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     Controls[newID]->text.selectable = TRUE
     Controls[newID]->INDEX           = MOD_REFERENCE
     ControlAccess[CS_MODULE_LIST]    = newID
     CreateIcon(newID,TYPE<_ICON>(&hF6,ICON_SIZE-2*FS,IconFont,0,0,SWATCH0.FG),,ICON_SIZE,LINE_H)
     CreateList(newID,LIST_FONT_SIZE, NB_LINES, LINE_H)
     
     'LIST 1 - MODULE LIBRARY
     '¤¤¤#407: "List of modules created"
     TMPSTR = LNG_SET_EXT(407,"List of modules created")
     r = add_ctrl(pID1,X2,Y2,W2,H2,@ctrl_library_list,@gctrl_library_list,FALSE, CA_TEXT_LIST OR CA_DRAG,_
         "LIBM",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     Controls[newID]->text.selectable = TRUE
     Controls[newID]->INDEX           = MOD_LIBRARY
     CreateIcon(newID,TYPE<_ICON>(&hF6,ICON_SIZE-2*FS,IconFont,0,0,SWATCH0.FG),,ICON_SIZE,LINE_H)
     CreateList(newID,LIST_FONT_SIZE, NB_LINES, LINE_H)

     'SAMPLE LIBRARIES
     r = add_ctrl(pID0,X1,Y1,W1,H1,,,FALSE,,"LIB")
     IF r THEN RETURN r
     pID1 = LI_Controls.LENGTH-1
     ControlAccess[CS_SAMPLES]  = pID1
     Controls[pID1]->GROUP_ONLY = TRUE

     X2 = 0
     Y2 = 0
     W2 = (W1 - 2*BORDER_SIZE) / 2
     H2 = GRID_STEP * 7

     'SAMPLE CHANNEL LOAD MODE
     '¤¤¤#408: "Sample library - channels to load"
     TMPSTR = LNG_SET_EXT(408,"Sample library - channels to load")
     X2 += W2
     W2  = W1 - W2
     r   = add_ctrl(pID1,X2,Y2,W2,H2,@ctrl_sample_chan,@gctrl_slidel,,CA_SLIDEL,"SLIBC",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     ControlAccess[CS_SAMPLE_C] = newID
     Controls[newID]->text.si = MONO_IO
     Controls[newID]->state.DISABLED = TRUE
     CreateText(newID,SCHAN_NAME(1),DEF_FONT_SIZE,ALIGN_CENTER,,W2 - BORDER_SIZE*2 - ICON_SIZE*2)
     
     'LIST - AUDIO SAMPLES
     '¤¤¤#409: "List of audio samples loaded in memory"
     TMPSTR = LNG_SET_EXT(409,"List of audio samples loaded in memory")
     X2  = 0
     Y2 += GRID_STEP * 7
     W2  = W1
     H2  = NB_LINES * LINE_H + BORDER_SIZE * 2
     r   = add_ctrl(pID1,X2,Y2,W2,H2,@ctrl_sample_list,@gctrl_sample_list,TRUE,CA_TEXT_LIST,"SAM",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     Controls[newID]->text.selectable = TRUE
     ControlAccess[CS_SAMPLE_LIST]    = newID
     CreateList(newID,LIST_FONT_SIZE, NB_LINES, LINE_H)
     
     'MIDI DEVICES & CONTROLS
     r = add_ctrl(pID0,X1,Y1,W1,H1,,,FALSE,,"MCC")
     IF r THEN RETURN r
     pID1 = LI_Controls.LENGTH-1
     ControlAccess[CS_MIDICC]   = pID1
     Controls[pID1]->GROUP_ONLY = TRUE

     X2 = 0
     Y2 = 0
     H2 = GRID_STEP * 7
     W2 = .33*W1
     
     'MIDI CHANNEL
     '¤¤¤#410: "MIDI Channel"
     TMPSTR = LNG_SET_EXT(410,"MIDI Channel")
     r = add_ctrl(pID1,X2,Y2,W2,H2,@ctrl_MIDICC_CHAN,@gctrl_slidel,,CA_SLIDEL,"MIDICCCH",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     ControlAccess[CS_MIDICC_CHAN]   = newID
     Controls[newID]->text.si        = 0
     Controls[newID]->state.DISABLED = TRUE
     CreateText(newID,"Ch. 1 ",DEF_FONT_SIZE,ALIGN_CENTER,,W2 - BORDER_SIZE*2 - ICON_SIZE*2)
     
     X2 += W2
     W2  = W1 - W2

     'MIDI CONTROL TYPE
     '¤¤¤#411: "MIDI Controller type"
     TMPSTR = LNG_SET_EXT(411,"MIDI Controller type")
     r   = add_ctrl(pID1,X2,Y2,W2,H2,@ctrl_MIDICT,@gctrl_slidel,,CA_SLIDEL,"MIDICCCT",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     ControlAccess[CS_MIDICT] = newID
     Controls[newID]->text.si = MIDI_STD
     Controls[newID]->state.DISABLED = TRUE
     CreateText(newID,MIDICT_TEXT(MIDI_STD),DEF_FONT_SIZE,ALIGN_CENTER,,W2 - BORDER_SIZE*2 - ICON_SIZE*2)
     
     'LIST - MIDI
     '¤¤¤#412: "List of MIDI devices"
     TMPSTR = LNG_SET_EXT(412,"List of MIDI devices")
     X2  = 0
     Y2 += GRID_STEP * 7
     W2  = W1
     H2  = (NB_LINES-2) * LINE_H + BORDER_SIZE * 2
     r   = add_ctrl(pID1,X2,Y2,W2,H2,@ctrl_MIDI_DEVS_list,@gctrl_MIDI_DEVS_list,TRUE,CA_TEXT_LIST,_
           "MIDIDEVS",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     Controls[newID]->text.selectable = TRUE
     ControlAccess[CS_MIDI_DEVS_LIST]  = newID
     CreateIcon(newID,TYPE<_ICON>(&h22,ICON_SIZE-2*FS,IconFont,0,0,SWATCH0.FG),,ICON_SIZE,LINE_H) 'CONNECTED
     CreateIcon(newID,TYPE<_ICON>(&h27,ICON_SIZE-2*FS,IconFont,0,0,SWATCH0.FG),,ICON_SIZE,LINE_H) 'NOT CONN.
     CreateList(newID,LIST_FONT_SIZE, NB_LINES-2, LINE_H)

     '¤¤¤#413: "List of MIDI controls"
     TMPSTR = LNG_SET_EXT(413,"List of MIDI controls")
     r   = add_ctrl(pID1,X2,Y2,W2,H2,@ctrl_MIDICC_list,@gctrl_MIDICC_list,TRUE,CA_TEXT_LIST,"MIDICC",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     Controls[newID]->text.selectable = TRUE
     CreateIcon(newID,TYPE<_ICON>(&h62,ICON_SIZE-2*FS,IconFont,0,0,SWATCH0.FG),,ICON_SIZE,LINE_H) 'BACK
     CreateIcon(newID,TYPE<_ICON>(&h70,ICON_SIZE-2*FS,IconFont,0,0,SWATCH0.FG),,ICON_SIZE,LINE_H) 'STD
     CreateIcon(newID,TYPE<_ICON>(&h64,ICON_SIZE-2*FS,IconFont,0,0,SWATCH0.FG),,ICON_SIZE,LINE_H) 'BUTTON
     CreateIcon(newID,TYPE<_ICON>(&h2f,ICON_SIZE-2*FS,IconFont,0,0,SWATCH0.FG),,ICON_SIZE,LINE_H) 'ENDLESS
     CreateList(newID,LIST_FONT_SIZE, NB_LINES-2, LINE_H)

          'MIDI IN - CHECK BOX
     Y2 += H2
     W2  = GRID_STEP*7
     H2  = LINE_H
     '¤¤¤#414: "Toggle MIDI input display ON/OFF"
     TMPSTR = LNG_SET_EXT(414,"Toggle MIDI input display ON/OFF")
     r   = add_ctrl(pID1,X2,Y2,W2,H2,@ctrl_setting_toggle,@gctrl_button_sicon2,,,"VS_FCT",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     Controls[newID]->INDEX = ST_DISPLAY_MIDIIN
     Controls[newID]->text.si = ABS(SETTINGS.DISPLAY_MIDIIN)
     CreateIcon(newID,TYPE<_ICON>(&h78,ICON_SIZE+3*FS,IconFont,0,0,SWATCH0.BUTTON_FG))
     CreateIcon(newID,TYPE<_ICON>(&h58,ICON_SIZE+3*FS,IconFont,0,0,SWATCH0.BUTTON_FG))
          'MIDI IN - LABEL
     '¤¤¤#415: "Display MIDI input"
     TMPSTR = LNG_SET_EXT(415,"Display MIDI input")
     X2 += W2 + GRID_STEP * 2
     W2  = W1 - GRID_STEP * 12
     r   = add_ctrl(pID1,X2,Y2,W2,H2,,@gctrl_label,,,"MIDIIN_LBL",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     CreateText(newID,TMPSTR,DEF_FONT_SIZE,ALIGN_LEFT,,W2)
          'MIDI IN - CONTENT LABEL
     X2  = 0
     Y2 += H2 + GRID_STEP
     r   = add_ctrl(pID1,X2,Y2,W2,H2,,@gctrl_midiin_display,,,"MIDIIN_DATA","")
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     ControlAccess[CS_MIDICC_DISPLAY] = newID
     CreateText(newID,"",DEF_FONT_SIZE,ALIGN_CENTER,,W2)
     
'--- SYNTHESIZER ---------

     WIN_W = SCR_W - GRID_STEP * (TOOLS_W + 1)
     WIN_H = SCR_H - GRID_STEP * (SYSBAR_H + 1)
     WIN_X = 0
     WIN_Y = GRID_STEP * (SYSBAR_H + 1)
     IF SETTINGS.MONITORS < 2 THEN 
          WIN_H -= GRID_STEP * (SYSBAR_H + 1)
          WIN_Y += WIN_Y
     END IF
     X0 = WIN_X
     Y0 = WIN_Y
     W0 = WIN_W
     H0 = WIN_H
     
     'SCOPE - BEHIND SYNTH
     r = add_ctrl(0,WIN_X,WIN_Y,WIN_W,WIN_H,,@gctrl_scope,TRUE,0,"SCOPE","SCOPE")
     IF r THEN RETURN r
     WIN_ID = LI_Controls.LENGTH-1
     Controls[WIN_ID]->GROUP_ONLY = TRUE
     ControlAccess[CS_SCOPE]      = WIN_ID
     
     'WINDOW
     '¤¤¤#416: "Synthesizer window"
     TMPSTR = LNG_SET_EXT(416,"Synthesizer window")
     r = add_ctrl(0,WIN_X,WIN_Y,WIN_W,WIN_H,@ctrl_synth_plane,@gctrl_synth_plane,TRUE,CA_MAP,"SYNTH",TMPSTR)
     IF r THEN RETURN r
     WIN_ID = LI_Controls.LENGTH-1
     Controls[WIN_ID]->WINDOWING = TRUE
     Controls[WIN_ID]->set_IMAGE(0)
     Windows[W_SYNTH] = WIN_ID

     'OUTPUT BUTTON
     '¤¤¤#417: "Synthesizer output"
     TMPSTR = LNG_SET_EXT(417,"Synthesizer output")
     W1 = GRID_STEP * 10
     H1 = GRID_STEP * 8
     X1 = SOUNDRA.BB_KEY_W + (W0-W1)/2
     Y1 = H0 - SOUNDRA.KEY_BASE_SIZE - grid_step * 17
     r = add_ctrl(WIN_ID,X1,Y1,W1,H1,@ctrl_module_patch,@gctrl_synth_output,TRUE,CA_BUTTON,"SOUT",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     CreateIcon(newID,TYPE<_ICON>(&hFF,ICON_SIZE+3*FS,IconFont,0,0,WHITE),,,ICON_SIZE+3*FS)
     CreateIcon(newID,TYPE<_ICON>(&h4F,ICON_SIZE,IconFont,0,0,WHITE),,,ICON_SIZE)
     Controls[NewID]->state.POWER = (SOUNDRA.ROOT_MODULE > 0)
     ControlAccess[CS_SYNTH_OUT]  = newID

     'REFERENCE MODULE GROUPS (NEVER VISIBLE)
     FOR I = 0 TO SOUNDRA.CATALOG_SIZE - 1
          W1 = BORDER_SIZE * 2 + GRID_STEP * SOUNDRA.REFERENCE_MODULE(I).W
          H1 = BORDER_SIZE * 2 + GRID_STEP * SOUNDRA.REFERENCE_MODULE(I).H
          'MODULE GROUP ID0
          r = add_ctrl(0,0,0,W1,H1,@ctrl_module_group,@gctrl_module_group,FALSE,CA_SLIDEL,"MOD",_
              SOUNDRA.REFERENCE_MODULE(I).Label)
          IF r THEN RETURN r
          PID0 = LI_Controls.LENGTH-1
          IF SOUNDRA.REFERENCE_MODULE(I).NB_PORTS = 0 THEN _
             Controls[PID0]->text.tm = -(SOUNDRA.INPUT_BUTTON_HEIGHT*GRID_STEP+1)
          CreateText(PID0,SOUNDRA.REFERENCE_MODULE(I).Abbrev,DEF_FONT_SIZE,ALIGN_CENTER,,,GRID_STEP*5)
          CreateIcon(PID0,TYPE<_ICON>(&hF6,ICON_SIZE,IconFont,0,0,RGB(0,85,200)),,ICON_SIZE,GRID_STEP*5)
          CreateText(PID0,"M",DEF_FONT_SIZE,ALIGN_RIGHT,,,GRID_STEP*5)
          CreateText(PID0,"S",DEF_FONT_SIZE,ALIGN_RIGHT,,,GRID_STEP*5)

          'LINK CONTROL GROUP TO MODULE
          SOUNDRA.REFERENCE_MODULE(I).GUI_PTR = Controls[PID0]
          Controls[PID0]->CLR = SOUNDRA.MODULE_COLOR(SOUNDRA.REFERENCE_MODULE(I).CATEGORY)
          Controls[PID0]->set_image(4)
          
          C0.CLR = Controls[PID0]->CLR
          C0.A   = 170
          C0.R   = .33*C0.R
          C0.G   = .33*C0.G
          C0.B   = .33*C0.B
          LINE Controls[PID0]->IMAGE[4],(3,3)-(W1-4,H1-4),C0.CLR,BF
          C1.A   = 255
          C1.R   = .5*C1.R
          C1.G   = .5*C1.G
          C1.B   = .5*C1.B
          GradientH(Controls[PID0]->IMAGE[4],3,H1-GRID_STEP*5-BORDER_SIZE,W1-4,H1-4,C0,C1)

          'SUB GROUP 1 - PATCH MODE ID0 + 1
          r = add_ctrl(PID0,0,0,W1,H1,,,FALSE,CA_SLIDEL,"PMOD","")
          IF r THEN RETURN r
          PID1 = LI_Controls.LENGTH-1
          Controls[PID1]->GROUP_ONLY = TRUE

          'SUB GROUP 2 - CONTROL MODE ID0 + 2
          r = add_ctrl(PID0,0,0,W1,H1,,,,0,"CMOD","")
          IF r THEN RETURN r
          PID2 = LI_Controls.LENGTH-1
          Controls[PID2]->GROUP_ONLY = TRUE
          
          'SETUP FA DISPLAYS
          W1 = Controls[ControlAccess[CS_PARAM_FA]+FAC_VALUE]->W - BORDER_SIZE*2
          H1 = Controls[ControlAccess[CS_PARAM_FA]+FAC_VALUE]->H - BORDER_SIZE*2
          FOR J = 0 TO SOUNDRA.REFERENCE_MODULE(I).NB_PARAMS-1
               SOUNDRA.REFERENCE_MODULE(I).PARAM(J).FA.DISP_SETUP(W1,H1)
          NEXT J
     NEXT I

     'MODULE PATCH BUTTONS
     FOR I = 0 TO SOUNDRA.CATALOG_SIZE - 1
          PID0 = SOUNDRA.REFERENCE_MODULE(I).GUI_PTR->ID
          PID1 = Controls[PID0]->family.children[0]
          N  = SOUNDRA.REFERENCE_MODULE(I).NB_PORTS
          W0 = Controls[PID1]->W - BORDER_SIZE * 2
          H1 = GRID_STEP*6
          X1 = BORDER_SIZE
          Y1 = BORDER_SIZE
          'INPUT BUTTONS
          '¤¤¤#418: "Module input"
          TMPSTR = LNG_SET_EXT(418,"Module input")
          TMPSTR &= " #"
          IF N THEN
               W1 = W0 / N
               SP = W0 - N*W1
               CEIL(SP,0)
               FOR J = 0 TO N - 1
                    r = add_ctrl(PID1,X1,Y1,W1+SP,H1,@ctrl_module_patch,@gctrl_module_patch,,CA_SLIDEL,_
                                 "MODIN",TMPSTR & STR(J))
                    IF r THEN RETURN r
                    newID = LI_Controls.LENGTH-1
                    CreateText(newID,SOUNDRA.REFERENCE_MODULE(I).Param(J).VarName,DEF_FONT_SIZE-FS,_
                               ALIGN_CENTER)
                    Controls[newID]->INDEX = J
                    X1 += W1 + SP
                    SP  = 0
               NEXT J
          END IF
          'OUTPUT BUTTON
          '¤¤¤#419: "Module output"
          TMPSTR = LNG_SET_EXT(419,"Module output")
          W1 = GRID_STEP*10
          H1 = GRID_STEP*5
          X1 = (Controls[PID1]->W - W1) / 2
          Y1 = Controls[PID1]->H - BORDER_SIZE - H1
          r  = add_ctrl(PID1,X1,Y1,W1,H1,@ctrl_module_patch,@gctrl_module_patch,,CA_BUTTON,"MODOUT",TMPSTR)
          IF r THEN RETURN r
          newID = LI_Controls.LENGTH-1
          CreateIcon(newID,TYPE<_ICON>(&hFF,ICON_SIZE+3*FS,IconFont,0,-BORDER_SIZE,SWATCH0.FG))
          Controls[newID]->INDEX = -1
     NEXT I

     'RECREATE EXISTING MODULES
     IF SOUNDRA.LI_MODULES.LENGTH THEN
          W1 = Controls[ControlAccess[CS_PARAM_FA]+FAC_VALUE]->W - BORDER_SIZE*2
          H1 = Controls[ControlAccess[CS_PARAM_FA]+FAC_VALUE]->H - BORDER_SIZE*2
          FOR I = 0 TO SOUNDRA.LI_MODULES.LENGTH - 1
               IF SOUNDRA.MODULES[I] THEN
                    'COPY CONTROLS
                    X0 = 0
                    Y0 = 0
                    IF MODULE_POS THEN
                         X0 = ZR*MODULE_POS[I].X + Controls[ControlAccess[CS_SYNTH_OUT]]->X
                         Y0 = ZR*MODULE_POS[I].Y + Controls[ControlAccess[CS_SYNTH_OUT]]->Y
                    END IF
                    R = CreateModControls(SOUNDRA.MODULES[I],X0,Y0)
                    IF R < 1 THEN RETURN R
                    'SETUP FA DISPLAYS
                    FOR J = 0 TO SOUNDRA.MODULES[I]->NB_PARAMS-1
                         SOUNDRA.MODULES[I]->PARAM(J).FA.DISP_SETUP(W1,H1)
                    NEXT J
               END IF
          NEXT I
     END IF
     IF MODULE_POS > 0 THEN DELETE[] MODULE_POS
     
'--- TOOL BOX ---------

     'WINDOW GROUP
     X0  = SCR_W - Controls[Windows[W_PANEL]]->W - GRID_STEP*140
     Y0  = WIN_Y + BORDER_SIZE
     W0  = GRID_STEP * 120
     H0  = GRID_STEP * 7
     r   = add_ctrl(0,X0,Y0,W0,H0,,,TRUE,CA_RESET,"STB_WIN","")
     IF r THEN RETURN r
     WIN_ID = LI_Controls.LENGTH-1
     Controls[WIN_ID]->GROUP_ONLY = TRUE
     WINDOWS[W_SYNTH_TOOLS] = WIN_ID
     
     'AUTO-SAVE LABEL
     X1 = 0
     Y1 = 0
     W1 = GRID_STEP * 35
     H1 = GRID_STEP * 7
     r  = add_ctrl(WIN_ID,X1,Y1,W1,H1,,@gctrl_label,,CA_RESET,"SS_ASL","")
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     Controls[newID]->text.FONT_CLR = GREY(200)
     '¤¤¤#420: "Auto-save"
     TMPSTR = LNG_SET_EXT(420,"Auto-save")
     CreateText(newID,TMPSTR,DEF_FONT_SIZE+FS,ALIGN_RIGHT)
     'AUTO-SAVE
     '¤¤¤#421: "Toggle the auto-saving of the synthesizer ON/OFF"
     TMPSTR = LNG_SET_EXT(421,"Toggle the auto-saving of the synthesizer ON/OFF")
     X1 += W1
     W1  = GRID_STEP * 7
     r   = add_ctrl(WIN_ID,X1,Y1,W1,H1,@ctrl_setting_toggle,@gctrl_button_sicon2,,CA_BUTTON,"SS_AS",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     Controls[newID]->INDEX   = ST_AUTO_SAVE
     Controls[newID]->text.si = ABS(SETTINGS.AUTOSAVE)
     CreateIcon(newID,TYPE<_ICON>(&h78,ICON_SIZE+3*FS,IconFont,0,0,SWATCH0.BUTTON_FG))
     CreateIcon(newID,TYPE<_ICON>(&h58,ICON_SIZE+3*FS,IconFont,0,0,SWATCH0.BUTTON_FG))

     'DRAW MODE
     '¤¤¤#422: "Change synthesizer visualization mode"
     TMPSTR = LNG_SET_EXT(422,"Change synthesizer visualization mode")
     X1 += W1 + GRID_STEP*3
     W1 = GRID_STEP * 9
     H1 = GRID_STEP * 7
     r  = add_ctrl(WIN_ID,X1,Y1,W1,H1,@ctrl_draw_mode,@gctrl_button,,,"STB_DM",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     Controls[newID]->state.POWER_LEVEL = SETTINGS.SCOPE_MODE
     Controls[newID]->CLR = SOUNDRA.SCOPE_BUTTON_COLORS(SETTINGS.SCOPE_MODE)
     CreateIcon(newID,TYPE<_ICON>(&h76,ICON_SIZE,IconFont,0,0,SWATCH0.BUTTON_FG))
     ControlAccess[CS_DRAW_MODE] = newID
     
     'SHOW/HIDE BOARDS
     '¤¤¤#423: "Toggle the visibility of the virtual keyboards"
     TMPSTR = LNG_SET_EXT(423,"Toggle the visibility of the virtual keyboards")
     X1 += W1
     r   = add_ctrl(WIN_ID,X1,Y1,W1,H1,@ctrl_boards_visibility,@gctrl_button,,,"STB_SHB",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     Controls[NewID]->state.POWER = TRUE
     CreateIcon(newID,TYPE<_ICON>(&h4B,ICON_SIZE,IconFont,0,0,SWATCH0.FG))
     ControlAccess[CS_KB_VISIBLITY] = NewID
     
     'RECENTER SYNTH PLANE
     '¤¤¤#424: "Reset synthesizer plane position"
     TMPSTR = LNG_SET_EXT(424,"Reset synthesizer plane position")
     X1 += W1
     r   = add_ctrl(WIN_ID,X1,Y1,W1,H1,@ctrl_synth_center,@gctrl_button,,,"STB_CP",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     CreateIcon(newID,TYPE<_ICON>(&hA4,ICON_SIZE,IconFont,0,0,SWATCH0.FG))
     ControlAccess[CS_SYNTH_CENTER] = NewID

     'MIDI MAPPING (FREE CONTROL)
     '¤¤¤#425: "Map a MIDI control to control any selected module parameter."
     TMPSTR = LNG_SET_EXT(425,"Map a MIDI control to control any selected module parameter.")
     X1 += W1
     W1  = GRID_STEP*13
     r   = add_ctrl(WIN_ID,X1,Y1,W1,H1,@ctrl_map_MIDI0,@gctrl_button3,,,"MIDI0",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     CreateText(newID,"MIDI",DEF_FONT_SIZE,ALIGN_CENTER)
     ControlAccess[CS_MIDI0] = newID

     'POSITION DISPLAY
     X1 += W1 + GRID_STEP * 4
     W1  = GRID_STEP * 30
     r   = add_ctrl(WIN_ID,X1,Y1,W1,H1,,@gctrl_label,,CA_RESET,"STB_XYPOS","")
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     ControlAccess[CS_XYPOS] = newID
     Controls[newID]->text.FONT_CLR = GREY(170)
     TMPSTR = "   "
     CreateText(newID,TMPSTR,DEF_FONT_SIZE,ALIGN_CENTER,,W1)

     'POSITION DISPLAY
     X1 += W1
     W1  = GRID_STEP * 20
     r   = add_ctrl(WIN_ID,X1,Y1,W1,H1,,@gctrl_label,,CA_RESET,"STB_FPS","")
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     ControlAccess[CS_FPS] = newID
     Controls[newID]->text.FONT_CLR = GREY(170)
     TMPSTR = "   "
     CreateText(newID,TMPSTR,DEF_FONT_SIZE,ALIGN_CENTER,,W1)
     '-------------------------------------------------------------------------------------------------
     ':: BEATBOARD ::
     
     'GROUP
     X0 = 0
     Y0 = GRID_STEP * (SYSBAR_H + 1)
     W0 = GRID_STEP * 9 + BORDER_SIZE * 2
     H0 = SCR_H - GRID_STEP * (SYSBAR_H + 1)
     IF SETTINGS.MONITORS < 2 THEN
          H0 -= Y0
          Y0 += Y0
     END IF
     r  = add_ctrl(0,X0,Y0,W0,H0,,@gctrl_bb_frame,FALSE,CA_HOVER,"BBGROUP")
     IF r THEN RETURN r
     pID0 = LI_Controls.LENGTH-1
     Controls[pID0]->CLR = SWATCH0.FRM_OFF
     Windows[W_BB] = pID0
     
     '# OF KEYS
     H1 = (H0 - GRID_STEP * 42 - BORDER_SIZE * 2)
     SOUNDRA.NB_KEYS_BB = INT(H1 / SOUNDRA.BB_KEY_H)
     IF SOUNDRA.NB_KEYS_BB > SOUNDRA.NB_POWERS(0).OCTAVE THEN
          SOUNDRA.NB_KEYS_BB = SOUNDRA.NB_POWERS(0).OCTAVE
          SOUNDRA.BB_KEY_H   = INT(H1 / SOUNDRA.NB_KEYS_BB)
     END IF
     SOUNDRA.BB_Y0 = H0 - GRID_STEP * 36 - SOUNDRA.NB_KEYS_BB*SOUNDRA.BB_KEY_H - BORDER_SIZE
     SOUNDRA.BB[0]->K_OFFSET.OCTAVE = INT((SOUNDRA.NB_POWERS(0).OCTAVE - SOUNDRA.NB_KEYS_BB) / 2)
     
     CreateIcon(pID0,TYPE<_ICON>(&h6D,ICON_SIZE-FS*2,IconFont,0,0,SWATCH0.BUTTON_FG),,,_
        SOUNDRA.BB_Y0-BORDER_SIZE)

     'BEATBOARD
     '¤¤¤#426: "Octave board"
     TMPSTR = LNG_SET_EXT(426,"Octave board")
     X1 = BORDER_SIZE
     Y1 = SOUNDRA.BB_Y0
     W1 = SOUNDRA.BB_KEY_W
     H1 = SOUNDRA.NB_KEYS_BB * SOUNDRA.BB_KEY_H
     r  = add_ctrl(pID0,X1,Y1,W1,H1,@ctrl_bb,@gctrl_bb,,CA_SLIDEL,"BB",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     Controls[newID]->CLR = SWATCH0.WINDOW_BG
     ControlAccess[CS_BB] = newID
          'TEXT IMAGES (FOR ALL POSSIBLE VALUES)
     FOR I = 0 TO SOUNDRA.NB_POWERS(0).OCTAVE - 1
          CreateText(newID,"",DEF_FONT_SIZE-3*FS,ALIGN_CENTER,,SOUNDRA.BB_KEY_W,SOUNDRA.BB_KEY_H)
     NEXT I

     'LOCK
     '¤¤¤#427: "Lock keys : ON = stay active when released | OFF = unlock all"
     TMPSTR = LNG_SET_EXT(427,"Lock keys : ON = stay active when released | OFF = unlock all")
     Y1 += H1
     H1  = SOUNDRA.KEY_BASE_SIZE
     W1  = SOUNDRA.KEY_BASE_SIZE
     r   = add_ctrl(pID0,X1,Y1,W1,H1,@ctrl_bb_lock,@gctrl_button,,,"BBLOCK",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     CreateIcon(newID,TYPE<_ICON>(&h6C,ICON_SIZE,IconFont,0,0,SWATCH0.BUTTON_FG))
     ControlAccess[CS_BB_LOCK] = newID
     
     'KEY MODE
     '¤¤¤#428: "Island keys : sliding keys will not preserve frequency channel"
     TMPSTR = LNG_SET_EXT(428,"Island keys : sliding keys will not preserve frequency channel")
     Y1 += H1
     r   = add_ctrl(pID0,X1,Y1,W1,H1,@ctrl_bb_mode,@gctrl_button,,,"BBIK",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     Controls[newID]->state.POWER = TRUE
     Controls[newID]->text.si     = SOUNDRA.KEY_MODES.ISLAND '0
     CreateIcon(newID,TYPE<_ICON>(&h38,ICON_SIZE,IconFont,0,0,SWATCH0.BUTTON_FG))
     ControlAccess[CS_BB_MODE] = newID
     
     'BEATBOARD NUMBER
     '¤¤¤#429: "Board number"
     TMPSTR = LNG_SET_EXT(429,"Board number")
     Y1 += H1
     H1 = SOUNDRA.KEY_BASE_SIZE * 2
     r  = add_ctrl(pID0,X1,Y1,W1,H1,@ctrl_bb_num,@gctrl_slidel,,CA_SLIDEL,"BBNUM",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     Controls[newID]->text.si = 0
     CreateText(newID,"#1",DEF_FONT_SIZE,ALIGN_CENTER)


     'KB GROUP
     X0 = W0 + GRID_STEP
     H0 = SOUNDRA.KEY_BASE_SIZE + BORDER_SIZE*4 + GRID_STEP*5
     Y0 = SCR_H - H0
     W0 = SCR_W - GRID_STEP * (TOOLS_W + 2) - W0
     
     r  = add_ctrl(0,X0,Y0,W0,H0,,@gctrl_kb_frame,FALSE,CA_HOVER,"KBGROUP")
     IF r THEN RETURN r
     pID0 = LI_Controls.LENGTH-1
     Controls[pID0]->CLR = SWATCH0.FRM_OFF
     Windows[W_KB] = pID0
     
     '# OF KEYS
     W1 = (W0 - GRID_STEP*51 - BORDER_SIZE*2)
     SOUNDRA.NB_KEYS_KB = INT(W1 / SOUNDRA.KEY_BASE_SIZE)
     SOUNDRA.KB_X0 = W0 - GRID_STEP * 45 - SOUNDRA.KEY_BASE_SIZE*SOUNDRA.NB_KEYS_KB - BORDER_SIZE
     IF SOUNDRA.KEY_COLOR THEN DELETE[] SOUNDRA.KEY_COLOR
     SOUNDRA.KEY_COLOR = NEW HSB_PX[SOUNDRA.NB_KEYS_KB]
     FOR I = 0 TO SOUNDRA.NB_KEYS_KB -1
          SOUNDRA.KEY_COLOR[I] = TYPE(1,1,1)
     NEXT I
     
     CreateIcon(pID0,TYPE<_ICON>(&h6D,ICON_SIZE-FS*2,IconFont,0,-GRID_STEP*3,SWATCH0.BUTTON_FG),,_
        SOUNDRA.KB_X0-BORDER_SIZE)
     
     'KEYBOARD
     '¤¤¤#430: "Keyboard"
     TMPSTR = LNG_SET_EXT(430,"Keyboard")
     X1 = SOUNDRA.KB_X0
     Y1 = BORDER_SIZE
     H1 = SOUNDRA.KEY_BASE_SIZE
     W1 = SOUNDRA.NB_KEYS_KB * SOUNDRA.KEY_BASE_SIZE
     r  = add_ctrl(pID0,X1,Y1,W1,H1,@ctrl_kb,@gctrl_kb,,CA_SLIDEL OR CA_KB,"KB",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     Controls[newID]->CLR = SWATCH0.WINDOW_BG
     ControlAccess[CS_KB] = newID
          'TEXT IMAGES FOR ALL KEYS
     FOR I = 0 TO SOUNDRA.NB_KEYS_KB - 1
      CreateText(newID,"",DEF_FONT_SIZE-2*FS,ALIGN_CENTER,,SOUNDRA.KEY_BASE_SIZE,SOUNDRA.KEY_BASE_SIZE)
     NEXT I
     Controls[newID]->text.release_support = TRUE
     DEFAULT_CR_ID = newID
     CR.ID = DEFAULT_CR_ID
     
     'KEY MODE
     '¤¤¤#431: "Island keys : sliding keys will not preserve frequency channel"
     TMPSTR = LNG_SET_EXT(431,"Island keys : sliding keys will not preserve frequency channel")
     X1 += W1
     W1  = SOUNDRA.KEY_BASE_SIZE
     r   = add_ctrl(pID0,X1,Y1,W1,H1,@ctrl_kb_mode,@gctrl_button,,,"KBIK",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     Controls[newID]->state.POWER = TRUE
     Controls[newID]->text.si     = SOUNDRA.KEY_MODES.ISLAND '0
     CreateIcon(newID,TYPE<_ICON>(&h38,ICON_SIZE,IconFont,0,0,SWATCH0.BUTTON_FG))
     ControlAccess[CS_KB_MODE] = newID
     
     'LOCK
     '¤¤¤#432: "Lock keys : ON = stay active when released | OFF = unlock all"
     TMPSTR = LNG_SET_EXT(432,"Lock keys : ON = stay active when released | OFF = unlock all")
     X1 += W1
     W1  = SOUNDRA.KEY_BASE_SIZE
     r  = add_ctrl(pID0,X1,Y1,W1,H1,@ctrl_kb_lock,@gctrl_button,,,"KBLOCK",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     CreateIcon(newID,TYPE<_ICON>(&h6C,ICON_SIZE,IconFont,0,0,SWATCH0.BUTTON_FG))
     ControlAccess[CS_KB_LOCK] = newID
     
     'KEYBOARD NUMBER
     '¤¤¤#433: "Keyboard number"
     TMPSTR = LNG_SET_EXT(433,"Keyboard number")
     X1 += W1
     W1 = SOUNDRA.KEY_BASE_SIZE * 2
     r  = add_ctrl(pID0,X1,Y1,W1,H1,@ctrl_kb_num,@gctrl_slidel,,CA_SLIDEL,"KBNUM",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     Controls[newID]->text.si = 0
     CreateText(newID,"#1",DEF_FONT_SIZE,ALIGN_CENTER,,W1 - BORDER_SIZE*2 - ICON_SIZE*2)

     'TUNING TAB
     X1 += W1
     W1  = SOUNDRA.KEY_BASE_SIZE
     r  = add_ctrl(pID0,X1,Y1,W1,H1,@ctrl_win_tabs,@gctrl_button_tab,,,"KB_SETTINGS",STR_TUNING)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     CreateIcon(newID,TYPE<_ICON>(&h73,ICON_SIZE,IconFont,0,0,SWATCH0.FG))
     Controls[newID]->INDEX = W_TUNING
     WINTABS(W_TUNING) = newID
     
     'SLIDER
     '¤¤¤#434: "Key position"
     TMPSTR = LNG_SET_EXT(434,"Key position")
     X1 = BORDER_SIZE
     W1 = W0 - BORDER_SIZE*2
     Y1 += H1
     H1 = GRID_STEP*5 + BORDER_SIZE*2
     r  = add_ctrl(pID0,X1,Y1,W1,H1,@ctrl_kb_slider,@gctrl_slidel,,CA_SLIDEL,"KBPOS",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     Controls[newID]->text.si = SOUNDRA.KB[SOUNDRA.KB_NUM]->K_OFFSET.KEY-_
        SOUNDRA.OCTAVE_MIN*TUNINGS(TUNING_CURRENT).NB_KEYS
     CreateText(newID,"",DEF_FONT_SIZE,ALIGN_CENTER,,W1 - BORDER_SIZE*2 - ICON_SIZE*2)
     ControlAccess[CS_KB_POS] = newID
     
     '-------------------------------------------------------------------------------------------------
     'POWER DISPLAY BAR
     H0 = GRID_STEP*SYSBAR_H
     IF SETTINGS.MONITORS < 2 THEN
          X0 = 0
          Y0 = GRID_STEP*(SYSBAR_H+1)
          W0 = SCR_W - GRID_STEP * (TOOLS_W + 1)
     ELSE
          X0 = DESK_W
          Y0 = 0
          W0 = SCR_W-DESK_W
     END IF
     '¤¤¤#435: "Temporal display of synth output power (stereo)"
     TMPSTR = LNG_SET_EXT(435,"Temporal display of synth output power (stereo)")
     r = add_ctrl(0,X0,Y0,W0,H0,@ctrl_pp_display,@gctrl_pp_display,TRUE,,"PPDISP",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     Controls[newID]->CLR         = 1
     ControlAccess[CS_PP_DISPLAY] = newID

'--- VIDEO SETTINGS ---------

     ' WINDOW
     W0 = GRID_STEP * 126
     H0 = GRID_STEP * 76
     X0 = Controls[WINTABS(W_VIDEO_SETTINGS)]->x
     Y0 = Controls[WINTABS(W_VIDEO_SETTINGS)]->y + Controls[WINTABS(W_VIDEO_SETTINGS)]->h
     r  = add_ctrl(0,X0,Y0,W0,H0,,@gctrl_basic_window,FALSE,CA_HOVER,"VS_WIN",STR_VSETTINGS)
     IF r THEN RETURN r
     WIN_ID = LI_Controls.LENGTH-1
     Controls[WIN_ID]->CLR = SWATCH0.WINDOW_BG
     Windows[W_VIDEO_SETTINGS] = WIN_ID
     
          'TOP LABEL
     X1 = GRID_STEP * 2
     Y1 = GRID_STEP * 3
     W1 = W0 - GRID_STEP * 4
     H1 = GRID_STEP * 7
     r  = add_ctrl(WIN_ID,X1,Y1,W1,H1,,@gctrl_label,,,"VS_LABEL",STR_VSETTINGS)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     CreateText(newID,STR_VSETTINGS,1.33*DEF_FONT_SIZE,ALIGN_CENTER)
     
     'SUB GROUP
     X1  = GRID_STEP * 3
     Y1 += H1 + GRID_STEP*3
     W1  = W0 - GRID_STEP * 6
     H1  = H0 - GRID_STEP*16
     r   = add_ctrl(WIN_ID,X1,Y1,W1,H1,,@gctrl_basic_frame,,CA_RESET,"VS_G")
     IF r THEN RETURN r
     pID1 = LI_Controls.LENGTH-1
     Controls[pID1]->GROUP_ONLY = TRUE
          'VIDEO INFO
     X2  = GRID_STEP*2
     Y2  = GRID_STEP
     W2  = W1 - GRID_STEP*4
     H2  = GRID_STEP * 5
     r   = add_ctrl(pID1,X2,Y2,W2,H2,,@gctrl_label,,CA_RESET,"VS_INFO",STR_CURRENT)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     TMPSTR = DISPLAY_DRIVER_NAME(DisplayDriverNum) & ", " & SCR_W & " x " & SCR_H & " @ 32-bit"
     CreateText(newID,TMPSTR,DEF_FONT_SIZE,ALIGN_CENTER)
     ControlAccess[CS_VINFOS] = newID
          'DISPLAY DRIVER
     '¤¤¤#436: "Driver"
     TMPSTR = LNG_SET_EXT(436,"Driver")
     Y2 += H2 + GRID_STEP*2
     W2  = W1 - GRID_STEP*23
     H2  = GRID_STEP * 7
     r   = add_ctrl(pID1,X2,Y2,W2,H2,@ctrl_display_driver,@gctrl_SLIDEL,,CA_SLIDEL,"VS_DRIVER",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     Controls[newID]->text.si = DisplayDriverNum
     TMPSTR = TMPSTR & " " & STR(DisplayDriverNum+1) & ") " & DISPLAY_DRIVER_NAME(DisplayDriverNum)
     CreateText(newID,TMPSTR,DEF_FONT_SIZE+FS,ALIGN_CENTER,,W2 - BORDER_SIZE*2 - ICON_SIZE*2)     
          'DISPLAY DRIVER SET
     X2 += W2 + GRID_STEP
     W2  = GRID_STEP * 9
     r   = add_ctrl(pID1,X2,Y2,W2,H2,@ctrl_display_set,@gctrl_button,,,"VS_DRIVER_SET",STR_SET)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     CreateIcon(newID,TYPE<_ICON>(&h6F,ICON_SIZE,IconFont,0,0,RGB(0,255,0)))
          'DISPLAY DRIVER CANCEL
     X2 += W2
     r   = add_ctrl(pID1,X2,Y2,W2,H2,@ctrl_display_cancel,@gctrl_button,,,"VS_DRIVER_RESET",STR_RESET)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     CreateIcon(newID,TYPE<_ICON>(&h63,ICON_SIZE,IconFont,0,0,RGB(255,0,0)))
     
          'DISPLAY RESOLUTION
     X2 = GRID_STEP*2
     Y2 += H2 + GRID_STEP
     W2 = W1 - GRID_STEP*43
     r  = add_ctrl(pID1,X2,Y2,W2,H2,@ctrl_resolution,@gctrl_SLIDEL,,CA_SLIDEL,"VS_RESOLUTION",STR_RESOLUTION)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     ControlAccess[CS_VRES] = newID
     Controls[newID]->text.si      = SCREENMODE_ID
     TMPSTR = STR_RESOLUTION
     TMPSTR &= ": " & STR(SCREENMODES(SCREENMODE_ID).X) & " x " & STR(SCREENMODES(SCREENMODE_ID).Y)
     CreateText(newID,TMPSTR,DEF_FONT_SIZE+FS,ALIGN_CENTER,,W2 - BORDER_SIZE*2 - ICON_SIZE*2)
     ControlAccess[CS_DISPLAY_RES] = newID
          'MONITORS
     X2 += W2
     W2  = GRID_STEP*20
     '¤¤¤#437: "Number of monitors"
     TMPSTR = LNG_SET_EXT(437,"Number of monitors")
     r   = add_ctrl(pID1,X2,Y2,W2,H2,@ctrl_monitors,@gctrl_SLIDEL,,CA_SLIDEL,"VS_NBMON",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     Controls[newID]->text.si = 1
     TMPSTR = "x" & STR(Controls[newID]->text.si)
     CreateText(newID,TMPSTR,DEF_FONT_SIZE+FS,ALIGN_CENTER,,W2 - BORDER_SIZE*2 - ICON_SIZE*2)
     ControlAccess[CS_NB_MONITORS] = newID
          'DISPLAY RESOLUTION SET
     X2 += W2 + GRID_STEP
     W2  = GRID_STEP * 9
     r   = add_ctrl(pID1,X2,Y2,W2,H2,@ctrl_resolution_set,@gctrl_button,,,"VS_RES_SET",STR_SET)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     CreateIcon(newID,TYPE<_ICON>(&h6F,ICON_SIZE,IconFont,0,0,RGB(0,255,0)))
          'DISPLAY RESOLUTION CANCEL
     X2 += W2
     r   = add_ctrl(pID1,X2,Y2,W2,H2,@ctrl_resolution_cancel,@gctrl_button,,,"VS_RES_RESET",STR_RESET)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     CreateIcon(newID,TYPE<_ICON>(&h63,ICON_SIZE,IconFont,0,0,RGB(255,0,0)))
     
          'INTERFACE ZOOM
     X2  = GRID_STEP*2
     Y2 += H2 + GRID_STEP
     W2  = W1 - GRID_STEP*23
     H2  = GRID_STEP * 7
     r   = add_ctrl(pID1,X2,Y2,W2,H2,@ctrl_GUI_zoom,@gctrl_SLIDEL,,CA_SLIDEL,"VS_ZOOM",STR_ZOOM)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     Controls[newID]->text.si = 5*(SETTINGS.ZOOM_FACTOR - SETTINGS.ZMIN)
     TMPSTR = STR_ZOOM & ": " & STR(SETTINGS.ZOOM_FACTOR) & "x"
     CreateText(newID,TMPSTR,DEF_FONT_SIZE+FS,ALIGN_CENTER,,W2 - BORDER_SIZE*2 - ICON_SIZE*2)
          'INTERFACE ZOOM SET
     X2 += W2 + GRID_STEP
     W2  = GRID_STEP * 9
     r   = add_ctrl(pID1,X2,Y2,W2,H2,@ctrl_GUI_zoom_set,@gctrl_button,,,"VS_ZSET",STR_SET)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     CreateIcon(newID,TYPE<_ICON>(&h6F,ICON_SIZE,IconFont,0,0,RGB(0,255,0)))
          'INTERFACE ZOOM CANCEL
     X2 += W2
     r   = add_ctrl(pID1,X2,Y2,W2,H2,@ctrl_GUI_zoom_cancel,@gctrl_button,,,"VS_ZRESET",STR_RESET)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     CreateIcon(newID,TYPE<_ICON>(&h63,ICON_SIZE,IconFont,0,0,RGB(255,0,0)))
     ControlAccess[CS_VZOOM_CANCEL] = newID

     'FORCE THROTTLE
     '¤¤¤#438: "Toggle CPU-Saving ON/OFF (Throttles input loop = less responsive)"
     TMPSTR = LNG_SET_EXT(438,"Toggle CPU-Saving ON/OFF (Throttles input loop = less responsive)")
     X2  = GRID_STEP*2
     Y2 += H2 + GRID_STEP*2
     W2  = GRID_STEP * 8
     H2  = GRID_STEP * 8
     r   = add_ctrl(pID1,X2,Y2,W2,H2,@ctrl_setting_toggle,@gctrl_button_sicon2,,,"VS_FCT0",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     Controls[newID]->INDEX   = ST_FORCE_CTHROTTLE
     Controls[newID]->text.si = ABS(SETTINGS.FORCE_CTHROTTLE)
     CreateIcon(newID,TYPE<_ICON>(&h78,ICON_SIZE+3*FS,IconFont,0,0,SWATCH0.BUTTON_FG))
     CreateIcon(newID,TYPE<_ICON>(&h58,ICON_SIZE+3*FS,IconFont,0,0,SWATCH0.BUTTON_FG))
          'FORCE THROTTLE LABEL
     X2 += W2 + GRID_STEP
     W2  = W1 - GRID_STEP * 13
     r   = add_ctrl(pID1,X2,Y2,W2,H2,,@gctrl_label,,CA_RESET,"VS_FCT1","")
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     '¤¤¤#439: "CPU-Saving (less responsive)"
     TMPSTR = LNG_SET_EXT(439,"CPU-Saving (less responsive)")
     CreateText(newID,TMPSTR,DEF_FONT_SIZE+FS,ALIGN_LEFT)
     
     'SHADER
     '¤¤¤#440: "Toggle graphic shader ON/OFF (Adds a gradient over graphic controls)"
     TMPSTR = LNG_SET_EXT(440,"Toggle graphic shader ON/OFF (Adds a gradient over graphic controls)")
     X2  = GRID_STEP*2
     Y2 += H2
     W2  = GRID_STEP * 8
     H2  = GRID_STEP * 8
     r   = add_ctrl(pID1,X2,Y2,W2,H2,@ctrl_setting_toggle,@gctrl_button_sicon2,,,"VS_SHADER0",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     Controls[newID]->INDEX   = ST_SHADER
     Controls[newID]->text.si = ABS(SETTINGS.USE_SHADER)
     CreateIcon(newID,TYPE<_ICON>(&h78,ICON_SIZE+3*FS,IconFont,0,0,SWATCH0.BUTTON_FG))
     CreateIcon(newID,TYPE<_ICON>(&h58,ICON_SIZE+3*FS,IconFont,0,0,SWATCH0.BUTTON_FG))
          'LABEL
     X2 += W2 + GRID_STEP
     W2  = W1 - GRID_STEP * 13
     r   = add_ctrl(pID1,X2,Y2,W2,H2,,@gctrl_label,,CA_RESET,"VS_SHADER1","")
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     '¤¤¤#441: "Shader"
     TMPSTR = LNG_SET_EXT(441,"Shader")
     CreateText(newID,TMPSTR,DEF_FONT_SIZE+FS,ALIGN_LEFT)
     
          'LANGUAGE LABEL
     '¤¤¤#442: "Language"
     TMPSTR = LNG_SET_EXT(442,"Language")
     X2  = GRID_STEP*2
     Y2 += H2 + GRID_STEP
     W2  = GRID_STEP * 25
     H2  = GRID_STEP * 7
     r   = add_ctrl(pID1,X2,Y2,W2,H2,,@gctrl_LABEL,,,"VS_LNLBL",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     Controls[newID]->text.si = SETTINGS.LANGUAGE
     CreateText(newID,TMPSTR & ":",DEF_FONT_SIZE,ALIGN_LEFT,,W2)
          'LANGUAGE
     X2 += W2
     W2  = W1 - GRID_STEP * 48
     H2  = GRID_STEP * 7
     r   = add_ctrl(pID1,X2,Y2,W2,H2,@ctrl_language,@gctrl_SLIDEL,,CA_SLIDEL,"VS_LNS",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     Controls[newID]->text.si = SETTINGS.LANGUAGE
     TMPSTR = LANG_NAME(SETTINGS.LANGUAGE)
     CreateText(newID,TMPSTR,DEF_FONT_SIZE,ALIGN_CENTER,,W2 - BORDER_SIZE*2 - ICON_SIZE*2)
          'LANGUAGE SET
     X2 += W2 + GRID_STEP
     W2  = GRID_STEP * 9
     r   = add_ctrl(pID1,X2,Y2,W2,H2,@ctrl_language_set,@gctrl_button,,,"VS_LNSET",STR_SET)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     CreateIcon(newID,TYPE<_ICON>(&h6F,ICON_SIZE,IconFont,0,0,RGB(0,255,0)))
          'LANGUAGE CANCEL
     X2 += W2
     r   = add_ctrl(pID1,X2,Y2,W2,H2,@ctrl_language_cancel,@gctrl_button,,,"VS_LNRES",STR_RESET)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     CreateIcon(newID,TYPE<_ICON>(&h63,ICON_SIZE,IconFont,0,0,RGB(255,0,0)))
     
'--- AUDIO SETTINGS ---------

     'WINDOW
     W0 = GRID_STEP * 126
     H0 = GRID_STEP * 84
     X0 = Controls[WINTABS(W_AUDIO_SETTINGS)]->x
     Y0 = Controls[WINTABS(W_AUDIO_SETTINGS)]->y + Controls[WINTABS(W_AUDIO_SETTINGS)]->h
     r  = add_ctrl(0,X0,Y0,W0,H0,,@gctrl_basic_window,FALSE,CA_HOVER,"W_AUDIO_SETTINGS",STR_ASETTINGS)
     IF r THEN RETURN r
     WIN_ID = LI_Controls.LENGTH-1
     Controls[WIN_ID]->CLR = SWATCH0.WINDOW_BG
     Windows[W_AUDIO_SETTINGS] = WIN_ID
     
          'TOP LABEL
     X1 = GRID_STEP*2
     Y1 = GRID_STEP*3
     W1 = W0 - GRID_STEP*4
     H1 = GRID_STEP*7
     r  = add_ctrl(WIN_ID,X1,Y1,W1,H1,,@gctrl_label,,,"AS_LABEL",STR_ASETTINGS)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     CreateText(newID,STR_ASETTINGS,1.33*DEF_FONT_SIZE,ALIGN_CENTER)

     'SUB GROUP
     X1  = GRID_STEP*3
     Y1 += H1 + GRID_STEP*3
     W1  = W0 - GRID_STEP*6
     H1  = H0 - H1 - GRID_STEP*9
     r   = add_ctrl(WIN_ID,X1,Y1,W1,H1,,@gctrl_basic_frame,,CA_RESET,"AS_G")
     IF r THEN RETURN r
     pID1 = LI_Controls.LENGTH-1
     Controls[pID1]->GROUP_ONLY = TRUE

     'AUDIO OUT SECTION TITLE
     '¤¤¤#443: "OUTPUT"
     TMPSTR = LNG_SET_EXT(443,"OUTPUT")
     X2  = GRID_STEP*2
     Y2  = GRID_STEP
     W2  = W1 - GRID_STEP*4
     H2  = GRID_STEP*5
     r   = add_ctrl(pID1,X2,Y2,W2,H2,,@gctrl_label,,CA_RESET,"AS_OUTTIT")
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     CreateText(newID,TMPSTR,DEF_FONT_SIZE,ALIGN_CENTER)
     
     'AUDIO OUT INFO LINE
     Y2 += H2+GRID_STEP
     r   = add_ctrl(pID1,X2,Y2,W2,H2,,@gctrl_label,,CA_RESET,"AS_INFO",STR_CURRENT)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     TMPSTR = "32-bit Stereo @ " & STR(SETTINGS.SAMPLE_RATE/1000) & " kHz"
     CreateText(newID,TMPSTR,DEF_FONT_SIZE,ALIGN_CENTER)
     ControlAccess[CS_AOINFOS] = newID
     
          'AUDIO OUT DEVICE
     '¤¤¤#444: "Output device"
     TMPSTR = LNG_SET_EXT(444,"Output device")
     Y2 += H2 + GRID_STEP*2
     W2  = W1 - GRID_STEP*23
     H2  = GRID_STEP * 7
     r   = add_ctrl(pID1,X2,Y2,W2,H2,@ctrl_output_driver,@gctrl_SLIDEL,,CA_SLIDEL,"AS_DRIVER",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     Controls[newID]->text.si = OUTPUT_DEVICE_INDEX
     TMPSTR = STR(OUTPUT_DEVICE_INDEX+1) & ") " & OUTPUT_DEVICES(OUTPUT_DEVICE_INDEX)
     CreateText(newID,TMPSTR,DEF_FONT_SIZE,ALIGN_CENTER,,W2 - BORDER_SIZE*2 - ICON_SIZE*2)
          'AUDIO OUT DRIVER SET
     X2 += W2 + GRID_STEP
     W2  = GRID_STEP * 9
     r   = add_ctrl(pID1,X2,Y2,W2,H2,@ctrl_output_set,@gctrl_button,,,"AS_SET",STR_SET)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     CreateIcon(newID,TYPE<_ICON>(&h6F,ICON_SIZE,IconFont,0,0,RGB(0,255,0)))
          'AUDIO OUT DRIVER CANCEL
     X2 += W2
     r   = add_ctrl(pID1,X2,Y2,W2,H2,@ctrl_output_cancel,@gctrl_button,,,"AS_RESET",STR_RESET)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     CreateIcon(newID,TYPE<_ICON>(&h63,ICON_SIZE,IconFont,0,0,RGB(255,0,0)))
     
     'AUDIO OUT BUFFER SIZE
     '¤¤¤#445: "Audio playback buffer length (ms)"
     TMPSTR = LNG_SET_EXT(445,"Audio playback buffer length (ms)")
     X2  = GRID_STEP*2
     Y2 += H2 + GRID_STEP
     W2  = W1 - GRID_STEP*23
     H2  = GRID_STEP * 7
     r   = add_ctrl(pID1,X2,Y2,W2,H2,@ctrl_outputbs,@gctrl_SLIDEL,,CA_SLIDEL,"AS_OBS",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     ControlAccess[CS_OUTBS] = newID
     Controls[newID]->text.si = SETTINGS.OUTPUT_BUFFER_LENGTH-1
     '¤¤¤#446: "Playback buffer: {$}ms"
     TMPSTR = LNG_SET_EXT(446,"Playback buffer: {$}ms")
     TMPSTR = TXTINSERT(TMPSTR,STR(Controls[newID]->text.si + 1))
     CreateText(newID,TMPSTR,DEF_FONT_SIZE+FS,ALIGN_CENTER,,W2 - BORDER_SIZE*2 - ICON_SIZE*2)
          'AUDIO OUT BUFFER SIZE SET
     X2 += W2 + GRID_STEP
     W2  = GRID_STEP * 9
     r   = add_ctrl(pID1,X2,Y2,W2,H2,@ctrl_outputbs_set,@gctrl_button,,,"AS_BSSET",STR_SET)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     CreateIcon(newID,TYPE<_ICON>(&h6F,ICON_SIZE,IconFont,0,0,RGB(0,255,0)))
          'AUDIO OUT BUFFER SIZE CANCEL
     X2 += W2
     r   = add_ctrl(pID1,X2,Y2,W2,H2,@ctrl_outputbs_cancel,@gctrl_button,,,"AS_BSRES",STR_RESET)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     CreateIcon(newID,TYPE<_ICON>(&h63,ICON_SIZE,IconFont,0,0,RGB(255,0,0)))

     'AUDIO IN SECTION TITLE
     '¤¤¤#447: "INPUT"
     TMPSTR = LNG_SET_EXT(447,"INPUT")
     X2  = GRID_STEP*2
     Y2 += H2 + GRID_STEP
     W2  = W1 - GRID_STEP*4
     H2  = GRID_STEP*5
     r   = add_ctrl(pID1,X2,Y2,W2,H2,,@gctrl_label,,CA_RESET,"AS_OUTTIT")
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     CreateText(newID,TMPSTR,DEF_FONT_SIZE,ALIGN_CENTER)

          'AUDIO IN INFO
     Y2 += H2 + GRID_STEP
     H2  = GRID_STEP * 5
     r   = add_ctrl(pID1,X2,Y2,W2,H2,,@gctrl_label,,CA_RESET,"AS_IINFO",STR_CURRENT)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     TMPSTR = "32-bit Stereo @ " & STR(SETTINGS.SAMPLE_RATE/1000) & " kHz"
     CreateText(newID,TMPSTR,DEF_FONT_SIZE,ALIGN_CENTER)
     ControlAccess[CS_AIINFOS] = newID
          'AUDIO IN DEVICE
     '¤¤¤#448: "Input device"
     TMPSTR = LNG_SET_EXT(448,"Input device")
     Y2 += H2 + GRID_STEP
     W2  = W1 - GRID_STEP*23
     H2  = GRID_STEP * 7
     r   = add_ctrl(pID1,X2,Y2,W2,H2,@ctrl_input_driver,@gctrl_SLIDEL,,CA_SLIDEL,"AS_IDRV",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     Controls[newID]->text.si = INPUT_DEVICE_INDEX
     TMPSTR = STR(INPUT_DEVICE_INDEX+1) & ") " & INPUT_DEVICES(INPUT_DEVICE_INDEX)
     CreateText(newID,TMPSTR,DEF_FONT_SIZE,ALIGN_CENTER,,W2 - BORDER_SIZE*2 - ICON_SIZE*2)
     'AUDIO IN DRIVER SET
     X2 += W2 + GRID_STEP
     W2  = GRID_STEP * 9
     r   = add_ctrl(pID1,X2,Y2,W2,H2,@ctrl_input_set,@gctrl_button,,,"AS_ISET",STR_SET)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     CreateIcon(newID,TYPE<_ICON>(&h6F,ICON_SIZE,IconFont,0,0,RGB(0,255,0)))
     'AUDIO IN DRIVER CANCEL
     X2 += W2
     r   = add_ctrl(pID1,X2,Y2,W2,H2,@ctrl_input_cancel,@gctrl_button,,,"AS_IRES",STR_RESET)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     CreateIcon(newID,TYPE<_ICON>(&h63,ICON_SIZE,IconFont,0,0,RGB(255,0,0)))

     'AUTO-CONNECT
     '¤¤¤#449: "Toggle Auto-connect ON/OFF (at startup if none selected & on disconnection)"
     TMPSTR = LNG_SET_EXT(449,"Toggle Auto-connect ON/OFF (at startup if none selected & on disconnection)")
     X2  = GRID_STEP*2
     Y2 += H2 + GRID_STEP*2
     W2  = GRID_STEP * 8
     H2  = GRID_STEP * 8
     r   = add_ctrl(pID1,X2,Y2,W2,H2,@ctrl_setting_toggle,@gctrl_button_sicon2,,,"AS_AC0",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     Controls[newID]->INDEX   = ST_AUTO_CONNECT
     Controls[newID]->text.si = ABS(SETTINGS.AUTO_CONNECT)
     CreateIcon(newID,TYPE<_ICON>(&h78,ICON_SIZE+3*FS,IconFont,0,0,SWATCH0.BUTTON_FG))
     CreateIcon(newID,TYPE<_ICON>(&h58,ICON_SIZE+3*FS,IconFont,0,0,SWATCH0.BUTTON_FG))
          'LABEL
     X2 += W2 + GRID_STEP
     W2  = W1 - GRID_STEP * 13
     r   = add_ctrl(pID1,X2,Y2,W2,H2,,@gctrl_label,,CA_RESET,"AS_AC1","")
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     '¤¤¤#450: "Auto-connect"
     TMPSTR = LNG_SET_EXT(450,"Auto-connect")
     CreateText(newID,TMPSTR,DEF_FONT_SIZE+FS,ALIGN_LEFT)

     'USE DEFAULT
     '¤¤¤#451: "Toggle the use default device ON/OFF (on auto-connect)"
     TMPSTR = LNG_SET_EXT(451,"Toggle the use default device ON/OFF (on auto-connect)")
     X2  = GRID_STEP*2
     Y2 += H2
     W2  = GRID_STEP * 8
     H2  = GRID_STEP * 8
     r   = add_ctrl(pID1,X2,Y2,W2,H2,@ctrl_setting_toggle,@gctrl_button_sicon2,,,"AS_UD0",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     Controls[newID]->INDEX   = ST_USE_DEFAULT
     Controls[newID]->text.si = ABS(SETTINGS.USE_DEFAULT)
     ControlAccess[CS_USE_DEFAULT] = newID
     Controls[newID]->state.DISABLED = NOT(SETTINGS.AUTO_CONNECT)
     CreateIcon(newID,TYPE<_ICON>(&h78,ICON_SIZE+3*FS,IconFont,0,0,SWATCH0.BUTTON_FG))
     CreateIcon(newID,TYPE<_ICON>(&h58,ICON_SIZE+3*FS,IconFont,0,0,SWATCH0.BUTTON_FG))
          'LABEL
     X2 += W2 + GRID_STEP
     W2  = W1 - GRID_STEP * 13
     r   = add_ctrl(pID1,X2,Y2,W2,H2,,@gctrl_label,,CA_RESET,"AS_UD1","")
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     Controls[newID]->state.DISABLED = NOT(SETTINGS.AUTO_CONNECT)
     '¤¤¤#452: "Use default device"
     TMPSTR = LNG_SET_EXT(452,"Use default device")
     CreateText(newID,TMPSTR,DEF_FONT_SIZE+FS,ALIGN_LEFT)
     
'--- TUNING ---------

     'WINDOW GROUP
     W0 = GRID_STEP * 200
     H0 = GRID_STEP * 154
     X0 = Controls[WINTABS(W_TUNING)]->x - W0 + Controls[WINTABS(W_TUNING)]->w
     Y0 = Controls[WINTABS(W_TUNING)]->y - H0
     r  = add_ctrl(0,X0,Y0,W0,H0,,@gctrl_basic_window,FALSE,CA_HOVER,"TNG",STR_TUNING)
     IF r THEN RETURN r
     WIN_ID = LI_Controls.LENGTH-1
     Controls[WIN_ID]->CLR  = SWATCH0.WINDOW_BG  
     ControlAccess[CS_TNGS] = WIN_ID
     Windows[W_TUNING] = WIN_ID
          'TUNING SETTINGS LABEL
     X1 = GRID_STEP * 2
     Y1 = GRID_STEP * 3
     W1 = W0 - GRID_STEP * 4
     H1 = GRID_STEP * 7
     r  = add_ctrl(WIN_ID,X1,Y1,W1,H1,,@gctrl_label,,CA_RESET,"TNGL",STR_TUNING)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     CreateText(newID,STR_TUNING,1.33*DEF_FONT_SIZE,ALIGN_CENTER)
          'NEW TUNING
     '¤¤¤#453: "Create a new tuning file"
     TMPSTR = LNG_SET_EXT(453,"Create a new tuning file")
     Y1 += H1 - GRID_STEP*4
     X1  = W0 - GRID_STEP * 39
     W1  = GRID_STEP * 12
     H1  = GRID_STEP * 7
     r   = add_ctrl(WIN_ID,X1,Y1,W1,H1,@ctrl_tuning_new,@gctrl_button,,,"TNEW",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     CreateIcon(newID,TYPE<_ICON>(&h51,ICON_SIZE,IconFont,0,0,WHITE))
          'SET TUNING
     '¤¤¤#454: "Save the changes in memory and file."
     TMPSTR = LNG_SET_EXT(454,"Save the changes in memory and file.")
     X1 += W1
     r   = add_ctrl(WIN_ID,X1,Y1,W1,H1,@ctrl_tuning_set,@gctrl_button,,,"TNG_SET",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     CreateIcon(newID,TYPE<_ICON>(&h6F,ICON_SIZE,IconFont,0,0,RGB(0,255,0)))
          'CANCEL TUNING
     '¤¤¤#455: "Cancel the changes in memory."
     TMPSTR = LNG_SET_EXT(455,"Cancel the changes in memory.")
     X1 += W1
     r   = add_ctrl(WIN_ID,X1,Y1,W1,H1,@ctrl_tuning_cancel,@gctrl_button,,,"TNG_SET",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     CreateIcon(newID,TYPE<_ICON>(&h63,ICON_SIZE,IconFont,0,0,RGB(255,0,0)))
     
     'TUNING BOX
     X1  = GRID_STEP*3
     Y1 += H1
     H1  = GRID_STEP * 124
     W1  = W0 - GRID_STEP*6
     r   = add_ctrl(WIN_ID,X1,Y1,W1,H1,,@gctrl_basic_frame,,CA_RESET,"TNG",STR_TUNING)
     IF r THEN RETURN r
     pID1 = LI_Controls.LENGTH-1
          'TUNING NAME LABEL
     X2 = GRID_STEP*2
     Y2 = GRID_STEP*2
     W2 = W1 - GRID_STEP*4
     H2 = GRID_STEP * 5
     r  = add_ctrl(pID1,X2,Y2,W2,H2,,@gctrl_tuning_name,,CA_RESET,"TNGNAME","")
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     CreateText(newID,TUNINGS(TUNING_COPY).FILENAME,DEF_FONT_SIZE+FS,ALIGN_CENTER)    
     ControlAccess[CS_TNG_NAME] = newID
          'SCALE display
     '¤¤¤#456: "Keys : display of the relative key steps."
     TMPSTR = LNG_SET_EXT(456,"Keys : display of the relative key steps.")
     X2  = GRID_STEP*2
     Y2 += H2 + GRID_STEP*2
     H2  = GRID_STEP*8
     r   = add_ctrl(pID1,X2,Y2,W2,H2,,@gctrl_tuning_scale,,,"TNGSCLD",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     ControlAccess[CS_TNG_SCALE] = newID
          'SCALE buttons
     '¤¤¤#457: "Keys : click to edit their values or set the reference key"
     TMPSTR = LNG_SET_EXT(457,"Keys : click to edit their values or set the reference key")
     Y2 += H2
     H2  = GRID_STEP * 7
     r   = add_ctrl(pID1,X2,Y2,W2,H2,@ctrl_tuning_keys,@gctrl_tuning_keys,,,"TNGSCL",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     Controls[newID]->CLR = SWATCH0.FRM_OFF
     CreateText(newID,"",DEF_FONT_SIZE+3,ALIGN_LEFT,GLYPH_ADD)
     ControlAccess[CS_TNG_KEYS] = newID
          'SUB-SCALE buttons
     '¤¤¤#458: "Scale pattern : click to turn keys ON/OFF."
     TMPSTR = LNG_SET_EXT(458,"Scale pattern : click to turn keys ON/OFF.")
     Y2 += H2 + GRID_STEP * 2
     H2  = GRID_STEP * 7
     r   = add_ctrl(pID1,X2,Y2,W2,H2,@ctrl_tuning_sp,@gctrl_tuning_sp,,,"TNGSS",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     Controls[newID]->CLR = SWATCH0.FRM_ON
     ControlAccess[CS_TNG_SP] = newID
     
          'NB KEYS LABEL
     Y2 += H2 + GRID_STEP * 2
     W2  = GRID_STEP * 37
     H2  = GRID_STEP * 5
     r   = add_ctrl(pID1,X2,Y2,W2,H2,,@gctrl_label,,CA_RESET,"TNGNBL","")
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     '¤¤¤#459: "Keys"
     TMPSTR = LNG_SET_EXT(459,"Keys")
     TMPSTR = STR(TUNINGS(TUNING_COPY).NB_KEYS) & " " & TMPSTR
     CreateText(newID,TMPSTR,DEF_FONT_SIZE+FS,ALIGN_CENTER)   
     ControlAccess[CS_TNG_NBK_LBL] = newID
          'REFERENCE FREQUENCY LABEL
     X2 += W2 + GRID_STEP*2
     W2  = W1 - GRID_STEP * 60 - BORDER_SIZE*2
     r   = add_ctrl(pID1,X2,Y2,W2,H2,,@gctrl_label,,CA_RESET,"TNGRFL","")
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     '¤¤¤#460: "Reference frequency"
     TMPSTR = LNG_SET_EXT(460,"Reference frequency")
     CreateText(newID,TMPSTR,DEF_FONT_SIZE+FS,ALIGN_CENTER)   
          'REFERENCE KEY LABEL
     X2 += W2 + GRID_STEP * 2
     W2  = GRID_STEP * 11
     r   = add_ctrl(pID1,X2,Y2,W2,H2,,@gctrl_label,,CA_RESET,"TNGRKL","")
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     '¤¤¤#461: "Key"
     TMPSTR = LNG_SET_EXT(461,"Key")
     CreateText(newID,TMPSTR,DEF_FONT_SIZE+FS,ALIGN_LEFT)

     X2  = BORDER_SIZE + GRID_STEP
     Y2 += H2 + GRID_STEP
     W2  = GRID_STEP * 9
     H2  = GRID_STEP * 8
          'SET EQUAL
     '¤¤¤#462: "Set scale to equal temperament (default)"
     TMPSTR = LNG_SET_EXT(462,"Set scale to equal temperament (default)")
     r   = add_ctrl(pID1,X2,Y2,W2,H2,@ctrl_tuning_equal,@gctrl_button,,,"TNG=",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     CreateIcon(newID,TYPE<_ICON>(&h44,ICON_SIZE,IconFont,0,0,SWATCH0.FG))
          'SET GEO
     '¤¤¤#463: "Set scale to geometric progression"
     TMPSTR = LNG_SET_EXT(463,"Set scale to geometric progression")
     X2 += W2
     r   = add_ctrl(pID1,X2,Y2,W2,H2,@ctrl_tuning_geo,@gctrl_button,,,"TNGo",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     CreateIcon(newID,TYPE<_ICON>(&h47,ICON_SIZE,IconFont,0,0,SWATCH0.FG))
          'REMOVE A KEY
     '¤¤¤#464: "Reduce the number of keys"
     TMPSTR = LNG_SET_EXT(464,"Reduce the number of keys")
     X2 += W2 + GRID_STEP
     r   = add_ctrl(pID1,X2,Y2,W2,H2,@ctrl_tuning_keym,@gctrl_button,,,"TNGK-",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     CreateIcon(newID,TYPE<_ICON>(&h2D,ICON_SIZE,IconFont,0,0,SWATCH0.FG))
          'ADD A KEY
     '¤¤¤#465: "Increase the number of keys"
     TMPSTR = LNG_SET_EXT(465,"Increase the number of keys")
     X2 += W2
     r   = add_ctrl(pID1,X2,Y2,W2,H2,@ctrl_tuning_keyp,@gctrl_button,,,"TNGK+",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     CreateIcon(newID,TYPE<_ICON>(&h2B,ICON_SIZE,IconFont,0,0,SWATCH0.FG))
     'REFERENCE FREQUENCY
          'DISPLAY MODE
     TMPSTR = STR_FA_MODE
     X2 += W2 + GRID_STEP * 2
     W2  = GRID_STEP*7
     r   = add_ctrl(pID1,X2,Y2,W2,H2,@ctrl_fa_mode,@gctrl_button,,,"FAD_RF",TMPSTR)
     newID = LI_Controls.LENGTH-1
     Controls[newID]->DATA = @SOUNDRA.FA_RF
     CreateIcon(newID,TYPE<_ICON>(&h25,ICON_SIZE,IconFont,0,0,SWATCH0.BUTTON_FG))
          'ENTER VALUE
     TMPSTR = STR_FA_EDIT
     X2 += W2
     W2 = GRID_STEP * 9
     r  = add_ctrl(pID1,X2,Y2,W2,H2,@ctrl_fa_edit,@gctrl_button,,,"FAE_RF",TMPSTR)
     newID = LI_Controls.LENGTH-1
     Controls[newID]->DATA = @SOUNDRA.FA_RF
     CreateText(newID,"f=",DEF_FONT_SIZE+FS,ALIGN_CENTER)
          'VALUE
     '¤¤¤#466: "Reference frequency (linked to the reference key)."
     TMPSTR = LNG_SET_EXT(466,"Reference frequency (linked to the reference key).")
     X2 += W2
     W2  = W1 - GRID_STEP * 83 - BORDER_SIZE*2
     r   = add_ctrl(pID1,X2,Y2,W2,H2,@ctrl_fa_value,@gctrl_fa_value,,CA_SLIDEL,"FAV_RF",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     Controls[newID]->DATA = @SOUNDRA.FA_RF
          'VALUE :: CONFIGURE FA DISPLAY
     WB = W2-BORDER_SIZE*2
     HB = H2-BORDER_SIZE*2
     Controls[newID]->NEW_IMAGE(1)
     Controls[newID]->IMAGE[0] = IMAGECREATE(WB,HB,0)
     SOUNDRA.FA_RF.EXPORT_FCT = @SET_RF
     SOUNDRA.FA_RF.DISP_SETUP(WB,HB)
     SOUNDRA.FA_RF.FORM_SETUP(DECIMAL,FRACTIONAID.TIME,FRACTIONAID.FREQUENCY)
     SOUNDRA.FA_RF.IMPORT_VALUE(440)
          'UNIT
     TMPSTR = STR_FA_UNIT
     X2 += W2
     W2 = GRID_STEP * 12
     r  = add_ctrl(pID1,X2,Y2,W2,H2,@ctrl_fa_unit,@gctrl_button,,,"FAU_RF",TMPSTR)
     newID = LI_Controls.LENGTH-1
     Controls[newID]->DATA = @SOUNDRA.FA_RF
     CreateText(newID,"Hz",DEF_FONT_SIZE+FS,ALIGN_CENTER)

     'REREFENCE KEY
     '¤¤¤#467: "Set the selected key as the first key of the scale."
     TMPSTR = LNG_SET_EXT(467,"Set the selected key as the first key of the scale.")
     X2 += W2 + GRID_STEP * 2
     W2  = GRID_STEP * 12
     r   = add_ctrl(pID1,X2,Y2,W2,H2,@ctrl_tuning_RK,@gctrl_button,TRUE,,"TNG_RFK",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     TMPSTR = TUNINGS(TUNING_COPY).KEY_NAME(0)
     CreateText(newID,TMPSTR,DEF_FONT_SIZE+FS,ALIGN_CENTER)
     ControlAccess[CS_TNG_RFK] = newID
     
     'ABSOLUTE KEY VALUE
          'DISPLAY MODE
     TMPSTR = STR_FA_MODE
     X2  = BORDER_SIZE + GRID_STEP
     Y2 += H2 + GRID_STEP * 2
     W2  = GRID_STEP * 7
     r   = add_ctrl(pID1,X2,Y2,W2,H2,@ctrl_fa_mode,@gctrl_button,,,"FAD_AK",TMPSTR)
     newID = LI_Controls.LENGTH-1
     CreateIcon(newID,TYPE<_ICON>(&h25,ICON_SIZE,IconFont,0,0,SWATCH0.BUTTON_FG))
     Controls[newID]->DATA = @SOUNDRA.FA_ABS_K
          'ENTER VALUE
     TMPSTR = STR_FA_EDIT
     X2 += W2
     W2  = GRID_STEP * 9
     r   = add_ctrl(pID1,X2,Y2,W2,H2,@ctrl_fa_edit,@gctrl_button,,,"FAE_AK",TMPSTR)
     newID = LI_Controls.LENGTH-1
     CreateText(newID,"a=",DEF_FONT_SIZE+FS,ALIGN_CENTER)
     Controls[newID]->DATA = @SOUNDRA.FA_ABS_K
          'VALUE
     '¤¤¤#468: "Absolute value of key (frequency ratio to first key)"
     TMPSTR = LNG_SET_EXT(468,"Absolute value of key (frequency ratio to first key)")
     X2 += W2
     W2  = (W1 - GRID_STEP * 46  - BORDER_SIZE * 2) / 2
     r   = add_ctrl(pID1,X2,Y2,W2,H2,@ctrl_fa_value,@gctrl_fa_value,,CA_SLIDEL,"FAV_AK",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     ControlAccess[CS_TNG_ABS] = newID
     Controls[newID]->DATA = @SOUNDRA.FA_ABS_K
          'VALUE :: CONFIGURE FA DISPLAY
     WB = W2-BORDER_SIZE*2
     HB = H2-BORDER_SIZE*2
     Controls[newID]->NEW_IMAGE(1)
     Controls[newID]->IMAGE[0] = IMAGECREATE(WB,HB,0)
     SOUNDRA.FA_ABS_K.EXPORT_FCT = @SET_AK
     SOUNDRA.FA_ABS_K.DISP_SETUP(WB,HB)
     SOUNDRA.FA_ABS_K.FORM_SETUP(DECIMAL,FRACTIONAID.NONE,FRACTIONAID.NONE)

     'RELATIVE KEY VALUE
          'DISPLAY MODE 'fraction on/off
     TMPSTR = STR_FA_MODE
     X2 += W2 + GRID_STEP * 2
     W2  = GRID_STEP * 7
     r   = add_ctrl(pID1,X2,Y2,W2,H2,@ctrl_fa_mode,@gctrl_button,,,"FAD_RK",TMPSTR)
     newID = LI_Controls.LENGTH-1
     Controls[newID]->DATA = @SOUNDRA.FA_REL_K
     CreateIcon(newID,TYPE<_ICON>(&h25,ICON_SIZE,IconFont,0,0,SWATCH0.BUTTON_FG))
          'ENTER VALUE
     TMPSTR = STR_FA_EDIT
     X2 += W2
     W2 = GRID_STEP * 9
     r  = add_ctrl(pID1,X2,Y2,W2,H2,@ctrl_fa_edit,@gctrl_button,,,"FAE_RK",TMPSTR)
     newID = LI_Controls.LENGTH-1
     Controls[newID]->DATA = @SOUNDRA.FA_REL_K
     CreateText(newID,"r=",DEF_FONT_SIZE+FS,ALIGN_CENTER)
          'VALUE
     '¤¤¤#469: "Relative value of key (frequency ratio to previous key)"
     TMPSTR = LNG_SET_EXT(469,"Relative value of key (frequency ratio to previous key)")
     X2 += W2
     W2  = (W1 - GRID_STEP * 46  - BORDER_SIZE * 2) / 2
     r   = add_ctrl(pID1,X2,Y2,W2,H2,@ctrl_fa_value,@gctrl_fa_value,,CA_SLIDEL,"FAV_RK",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     ControlAccess[CS_TNG_REL] = newID
     Controls[newID]->DATA = @SOUNDRA.FA_REL_K
          'VALUE :: CONFIGURE FA DISPLAY
     WB = W2-BORDER_SIZE*2
     HB = H2-BORDER_SIZE*2
     Controls[newID]->NEW_IMAGE(1)
     Controls[newID]->IMAGE[0] = IMAGECREATE(WB,HB,0)
     SOUNDRA.FA_REL_K.EXPORT_FCT = @SET_RK
     SOUNDRA.FA_REL_K.DISP_SETUP(WB,HB)
     SOUNDRA.FA_REL_K.FORM_SETUP(DECIMAL,FRACTIONAID.NONE,FRACTIONAID.NONE)
          'RENAME KEY
     '¤¤¤#470: "Rename the selected key"
     TMPSTR = LNG_SET_EXT(470,"Rename the selected key")
     X2    += W2 + GRID_STEP*1
     W2     = GRID_STEP * 9
     r      = add_ctrl(pID1,X2,Y2,W2,H2,@ctrl_tuning_kren,@gctrl_button,,,"FAE_KR",TMPSTR)
     newID  = LI_Controls.LENGTH-1
     ControlAccess[CS_TNG_KR] = newID
     CreateIcon(newID,TYPE<_ICON>(&h41,ICON_SIZE,IconFont,0,0,SWATCH0.BUTTON_FG))
     
     'DISABLE CONTROLS THAT REQUIRE A KEY TO BE SELECTED
     Controls[ControlAccess[CS_TNG_REL]]->STATE.DISABLED   = TRUE
     Controls[ControlAccess[CS_TNG_REL]-1]->STATE.DISABLED = TRUE
     Controls[ControlAccess[CS_TNG_REL]-2]->STATE.DISABLED = TRUE
     Controls[ControlAccess[CS_TNG_ABS]]->STATE.DISABLED   = TRUE
     Controls[ControlAccess[CS_TNG_ABS]-1]->STATE.DISABLED = TRUE
     Controls[ControlAccess[CS_TNG_ABS]-2]->STATE.DISABLED = TRUE
     Controls[ControlAccess[CS_TNG_RFK]]->STATE.DISABLED   = TRUE
     Controls[ControlAccess[CS_TNG_KR]]->STATE.DISABLED    = TRUE

     'SCALE MODES LIST
     '¤¤¤#471: "List of scale patterns."
     TMPSTR = LNG_SET_EXT(471,"List of scale patterns.")
     X2  = BORDER_SIZE + GRID_STEP * 1
     Y2 += H2 + GRID_STEP*2
     W2  = W1 - GRID_STEP * 10 - BORDER_SIZE * 2
     NB_LINES = 10
     H2  = NB_LINES * LINE_H + BORDER_SIZE * 2
     r = add_ctrl(pID1,X2,Y2,W2,H2,@ctrl_tuning_sp_list,@gctrl_tuning_sp_list,TRUE,CA_TEXT_LIST,"SAM",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     Controls[newID]->text.selectable = TRUE
     Controls[newID]->text.si         = 0
     ControlAccess[CS_TNG_SP_LIST]    = newID
     Controls[newID]->CLR             = SWATCH0.LIST_FRM_OFF
     CreateList(newID,LIST_FONT_SIZE, NB_LINES, LINE_H)

     'ADD A PATTERN
     '¤¤¤#472: "Add a new pattern."
     TMPSTR = LNG_SET_EXT(472,"Add a new pattern.")
     X2 += W2
     W2  = GRID_STEP * 8
     H2  = GRID_STEP * 7
     r   = add_ctrl(pID1,X2,Y2,W2,H2,@ctrl_tuning_sp_add,@gctrl_button,,,"TNGSS+",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     CreateIcon(newID,TYPE<_ICON>(&h2B,ICON_SIZE,IconFont,0,0,SWATCH0.FG))
     'REMOVE A PATTERN
     '¤¤¤#473: "Delete the selected pattern."
     TMPSTR = LNG_SET_EXT(473,"Delete the selected pattern.")
     Y2 += H2
     r   = add_ctrl(pID1,X2,Y2,W2,H2,@ctrl_tuning_sp_del,@gctrl_button,,,"TNGSS-",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     CreateIcon(newID,TYPE<_ICON>(&h2D,ICON_SIZE,IconFont,0,0,SWATCH0.FG))
          'RENAME PATTERN
     '¤¤¤#474: "Rename the selected pattern"
     TMPSTR = LNG_SET_EXT(474,"Rename the selected pattern")
     Y2 += H2
     r   = add_ctrl(pID1,X2,Y2,W2,H2,@ctrl_tuning_sp_ren,@gctrl_button,,,"TNGSSR",TMPSTR)
     newID = LI_Controls.LENGTH-1
     CreateIcon(newID,TYPE<_ICON>(&h41,ICON_SIZE,IconFont,0,0,SWATCH0.BUTTON_FG))

     'TIME SCALE BOX
     '¤¤¤#475: "Time scale"
     TMPSTR = LNG_SET_EXT(475,"Time scale")
     X1 = GRID_STEP*3
     Y1 = H1 + GRID_STEP * 15
     W1 = W0 - GRID_STEP*6
     H1 = GRID_STEP * 12
     r  = add_ctrl(WIN_ID,X1,Y1,W1,H1,,@gctrl_basic_frame,,CA_RESET,"TSG",TMPSTR)
     IF r THEN RETURN r
     pID1 = LI_Controls.LENGTH-1

     'TIME BASE (PRIME NUMBERS)
          'LABEL
     X2 = GRID_STEP*2
     Y2 = GRID_STEP*2
     W2 = (W0 - GRID_STEP*31) * .65
     H2 = GRID_STEP * 8
     r  = add_ctrl(pID1,X2,Y2,W2,H2,,@gctrl_label,,CA_RESET,"TSTBL","")
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     '¤¤¤#476: "Octave board multiplier: "
     TMPSTR = LNG_SET_EXT(476,"Octave board multiplier: ")
     CreateText(newID,TMPSTR,DEF_FONT_SIZE+FS,ALIGN_CENTER,,W2-BORDER_SIZE*2-ICON_SIZE*2)
          'SLIDEL
     '¤¤¤#477: "Number base of the octave board multiplier."
     TMPSTR = LNG_SET_EXT(477,"Number base of the octave board multiplier.")
     X2 += W2 + GRID_STEP
     H2  = GRID_STEP * 8
     W2  = (W0 - GRID_STEP*31) * .35
     r   = add_ctrl(pID1,X2,Y2,W2,H2,@ctrl_time_base,@gctrl_SLIDEL,,CA_SLIDEL,"TSTB",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     Controls[newID]->TEXT.si = SOUNDRA.TIME_BASE
     '¤¤¤#478: "Base"
     TMPSTR = LNG_SET_EXT(478,"Base")
     TMPSTR &= ": " & STR(PRIME(SOUNDRA.TIME_BASE))
     CreateText(newID,TMPSTR,DEF_FONT_SIZE+FS*3,ALIGN_CENTER,,W2-BORDER_SIZE*2-ICON_SIZE*2)
     ControlAccess[CS_TS_BASE] = newID
          'SET
     X2  += W2 + GRID_STEP
     W2  = GRID_STEP * 9
     H2  = GRID_STEP * 8
     r   = add_ctrl(pID1,X2,Y2,W2,H2,@ctrl_ts_set,@gctrl_button,,,"TSS","")
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     CreateIcon(newID,TYPE<_ICON>(&h6F,ICON_SIZE,IconFont,0,0,RGB(0,255,0)))
          'RESET
     X2 += W2 + GRID_STEP
     r   = add_ctrl(pID1,X2,Y2,W2,H2,@ctrl_ts_cancel,@gctrl_button,,,"TSC","")
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     CreateIcon(newID,TYPE<_ICON>(&h63,ICON_SIZE,IconFont,0,0,RGB(255,0,0)))

'--- INFORMATION (ABOUT) ---------
     
     'WINDOW
     '¤¤¤#479: "Information window"
     TMPSTR = LNG_SET_EXT(479,"Information window")
     WIN_W = 720 + GRID_STEP*20
     WIN_H = GRID_STEP * (144/GRID_STEP+90)
     WIN_X = (SCR_W - WIN_W)/2
     WIN_Y = (SCR_H - WIN_H)/2
     r  = add_ctrl(0,WIN_X,WIN_Y,WIN_W,WIN_H,,@gctrl_trans_window,TRUE,CA_HOVER,"ABOUT",TMPSTR)
     IF r THEN RETURN r
     WIN_ID = LI_Controls.LENGTH-1
     Controls[WIN_ID]->set_image(0)
     Windows[W_ABOUT] = WIN_ID
     
     C0.A   = 200
     C0.R   = 50
     C0.G   = 50
     C0.B   = 60
     C1.A   = 255
     C1.R   = 0
     C1.G   = 0
     C1.B   = 0
     GradientH(Controls[WIN_ID]->IMAGE[0],0,0,WIN_W-1,WIN_H-1,C0,C1)

     'LOGO
     '¤¤¤#480: "Software logo"
     TMPSTR = LNG_SET_EXT(480,"Software logo")
     X2 = GRID_STEP*10
     Y2 = GRID_STEP*10
     W2 = 720
     H2 = 144
     r  = add_ctrl(WIN_ID,X2,Y2,W2,H2,,@gctrl_img,TRUE,CA_RESET,"LOGO",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     Controls[newID]->INDEX = PUT_ALPHA
     Controls[newID]->new_IMAGE(1)
     R = FI_Load(EXEPATH & "\SoundraSoft.png", Controls[newID]->IMAGE[0],FIF_PNG)
     IF Controls[newID]->IMAGE[0] = 0 THEN Controls[newID]->Set_Image(0)
     
     'TEXT LINE 1
     '¤¤¤#481: "Software version"
     TMPSTR = LNG_SET_EXT(481,"Software version")
     Y2 += H2 + GRID_STEP * 5
     H2 = INT(DEF_FONT_SIZE*1.75) + GRID_STEP * 2
     X2 = GRID_STEP*10
     r  = add_ctrl(WIN_ID,X2,Y2,W2,H2,,@gctrl_label,TRUE,,"VER1",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     Controls[newID]->TEXT.FONT_CLR = WHITE
     TMPSTR = MID(SOFTWARE_BIT,1,1) & " " & MID(SOFTWARE_BIT,2,1) & " - b i t    S T E R E O"
     CreateText(newID,TMPSTR,INT(DEF_FONT_SIZE*1.75),ALIGN_CENTER)

     'TEXT LINE 2
     '¤¤¤#482: "Software release type"
     TMPSTR = LNG_SET_EXT(482,"Software release type")
     Y2 += H2 + GRID_STEP
     H2 = INT(DEF_FONT_SIZE*1.5) + GRID_STEP * 2
     r  = add_ctrl(WIN_ID,X2,Y2,W2,H2,,@gctrl_label,TRUE,,"VER2",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     Controls[newID]->TEXT.FONT_CLR = WHITE
     TMPSTR = "v" & SOFTWARE_VERSION
     #IFDEF DEVMODE
     TMPSTR &= " DEV.MODE"
     #ELSE
     IF UCASE(SOFTWARE_STATUS) = "BETA" THEN TMPSTR &= " Beta"
     #ENDIF
     TMPSTR &= "  (" & MID(__DATE__,7,4) & "/" & MID(__DATE__,1,2) & "/" & MID(__DATE__,4,2) & ")"
     CreateText(newID,TMPSTR,INT(DEF_FONT_SIZE*1.5),ALIGN_CENTER)     

     'LINK
     '¤¤¤#483: "Visit Soundra's website for ressources and documentation."
     TMPSTR = LNG_SET_EXT(483,"Visit Soundra's website for ressources and documentation.")
     Y2 += H2 + GRID_STEP * 12
     H2 = INT(DEF_FONT_SIZE*2) + GRID_STEP * 2
     r  = add_ctrl(WIN_ID,X2,Y2,W2,H2,@ctrl_link,@gctrl_link,TRUE,,"LINK",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     Controls[newID]->INDEX = LINK_SOUNDRA
     Controls[newID]->TEXT.FONT_CLR = SWATCH0.BUTTON_BG_ACTIVE
     CreateText(newID,"jimmygervais.net/soundra",INT(DEF_FONT_SIZE*2),ALIGN_CENTER)
     Controls[newID]->TEXT.FONT_CLR = WHITE
     CreateText(newID,"jimmygervais.net/soundra",INT(DEF_FONT_SIZE*2),ALIGN_CENTER)

     'COPYRIGHT
     '¤¤¤#484: "Click to visit my web portal for contact and other projects."
     TMPSTR = LNG_SET_EXT(484,"Click to visit my web portal for contact and other projects.")
     Y2 += H2 + GRID_STEP * 12
     H2 = INT(DEF_FONT_SIZE*1.5) + GRID_STEP * 2
     r  = add_ctrl(WIN_ID,X2,Y2,W2,H2,@ctrl_link,@gctrl_link,TRUE,,"BY",TMPSTR)
     IF r THEN RETURN r
     newID = LI_Controls.LENGTH-1
     Controls[newID]->INDEX = LINK_PORTAL
     Controls[newID]->TEXT.FONT_CLR = SWATCH0.BUTTON_BG_ACTIVE
     CreateText(newID,CHR(169) & " Jimmy Gervais 2020-2026",INT(DEF_FONT_SIZE*1.5),ALIGN_CENTER)
     Controls[newID]->TEXT.FONT_CLR = WHITE
     CreateText(newID,CHR(169) & " Jimmy Gervais 2020-2026",INT(DEF_FONT_SIZE*1.5),ALIGN_CENTER)
     
     '-------------------------------------------------------------------------------------------------------
     
     IF BATCH_CONFIG_CONTROLS(STR_SLIDEL_H,STR_SLIDEL_V) < 0 THEN RETURN R

     '-------------------------------------------------------------------------------------------------
     'SET/REFRESH CONTENT (on recreation)
     
     'CLICKS TABS AND SHOW MESSAGES
     'TMP_ID = ControlAccess[CS_BROWSER_TAB0] + T_MESSAGES
     'ctrl_browser_tabs(CA_MD,0,0,TMP_ID) 
     'TMP_ID = ControlAccess[CS_CONSOLE_TAB0] + MSG_SYSTEM
     'ctrl_console_tabs(CA_MD,0,0,TMP_ID)

     InterfaceSet = TRUE
     RETURN 0
END FUNCTION 
'------------------------------------------------------------------------------------------------------------
