Skip to content

Instantly share code, notes, and snippets.

@aike
Created May 3, 2024 00:47
Show Gist options
  • Save aike/167900a131da5876cebc9ff8c2ec9c60 to your computer and use it in GitHub Desktop.
Save aike/167900a131da5876cebc9ff8c2ec9c60 to your computer and use it in GitHub Desktop.
Chord detection KONTAKT script
{ Chord detection KONTAKT script by aike }
{ This program is licensed under MIT License. }
on init
set_ui_height_px(470)
set_ui_width_px(970)
make_perfview
set_script_title("main")
set_control_par_str($INST_WALLPAPER_ID, $CONTROL_PAR_PICTURE, "panel")
set_skin_offset(0)
declare ui_label $lb_root(1,1)
hide_part($lb_root,$HIDE_PART_BG)
set_text ($lb_root,"C#")
set_control_par(get_ui_id($lb_root),$CONTROL_PAR_WIDTH, 500)
set_control_par(get_ui_id($lb_root),$CONTROL_PAR_HEIGHT, 60)
set_control_par(get_ui_id($lb_root),$CONTROL_PAR_POS_X, 200)
set_control_par(get_ui_id($lb_root),$CONTROL_PAR_POS_Y, 160)
set_control_par(get_ui_id($lb_root),$CONTROL_PAR_FONT_TYPE, get_font_id("font48"))
declare ui_label $lb_chord(1,1)
hide_part($lb_chord,$HIDE_PART_BG)
set_text ($lb_chord,"maj7")
set_control_par(get_ui_id($lb_chord),$CONTROL_PAR_WIDTH, 500)
set_control_par(get_ui_id($lb_chord),$CONTROL_PAR_HEIGHT, 60)
set_control_par(get_ui_id($lb_chord),$CONTROL_PAR_POS_X, 230)
set_control_par(get_ui_id($lb_chord),$CONTROL_PAR_POS_Y, 160)
set_control_par(get_ui_id($lb_chord),$CONTROL_PAR_FONT_TYPE, get_font_id("font36"))
message("")
declare $n
set_text($lb_root, "")
set_text($lb_chord, "")
declare !cd_notename[13]
!cd_notename[ 0] := "C"
!cd_notename[ 1] := "C#"
!cd_notename[ 2] := "D"
!cd_notename[ 3] := "D#"
!cd_notename[ 4] := "E"
!cd_notename[ 5] := "F"
!cd_notename[ 6] := "F#"
!cd_notename[ 7] := "G"
!cd_notename[ 8] := "G#"
!cd_notename[ 9] := "A"
!cd_notename[10] := "A#"
!cd_notename[11] := "B"
!cd_notename[12] := ""
declare %wd_notename[13]
%wd_notename[ 0] := 230
%wd_notename[ 1] := 270
%wd_notename[ 2] := 235
%wd_notename[ 3] := 275
%wd_notename[ 4] := 230
%wd_notename[ 5] := 230
%wd_notename[ 6] := 270
%wd_notename[ 7] := 230
%wd_notename[ 8] := 270
%wd_notename[ 9] := 235
%wd_notename[10] := 275
%wd_notename[11] := 230
%wd_notename[12] := 230
declare %cd_bit[12] := (2048, 1028, 512, 256, 128, 64, 32, 16, 8, 4, 2, 1)
declare %cd_roots[4096]
declare %cd_chords[4096]
declare $cd_key
declare $cd_i
declare $cd_root
declare $cd_chord
declare $cd_None := 0
declare $cd_Maj := 1
declare $cd_Maj7 := 2
declare $cd_Min := 3
declare $cd_Min7 := 4
declare $cd_7th := 5
declare $cd_Sus4 := 6
declare $cd_Dim := 7
declare !cd_chordname[8]
!cd_chordname[$cd_None] := ""
!cd_chordname[$cd_Maj ] := ""
!cd_chordname[$cd_Maj7] := "M7"
!cd_chordname[$cd_Min ] := "m"
!cd_chordname[$cd_Min7] := "m7"
!cd_chordname[$cd_7th ] := "7"
!cd_chordname[$cd_Sus4] := "sus4"
!cd_chordname[$cd_Dim ] := "dim"
declare $bit
declare $b
end on
function rotate_bit
$b := $bit .and. 1
$bit := sh_right($bit, 1)
if ($b = 1)
$bit := $bit .or. 2048
end if
end function
on persistence_changed
{ C D EF G A B }
$bit := 2192 { 100010010000 }
$n := 0
while ($n < 12)
%cd_chords[$bit] := $cd_Maj
%cd_roots[$bit] := $n
inc($n)
call rotate_bit
end while
{ C D EF G A B }
$bit := 2193 { 100010010001 }
$n := 0
while ($n < 12)
%cd_chords[$bit] := $cd_Maj7
%cd_roots[$bit] := $n
inc($n)
call rotate_bit
end while
{ C D EF G A B }
$bit := 2320 { 100100010000 }
$n := 0
while ($n < 12)
%cd_chords[$bit] := $cd_Min
%cd_roots[$bit] := $n
inc($n)
call rotate_bit
end while
{ C D EF G A B }
$bit := 2322 { 100100010010 }
$n := 0
while ($n < 12)
%cd_chords[$bit] := $cd_Min7
%cd_roots[$bit] := $n
inc($n)
call rotate_bit
end while
{ C D EF G A B }
$bit := 2194 { 100010010010 }
$n := 0
while ($n < 12)
%cd_chords[$bit] := $cd_7th
%cd_roots[$bit] := $n
inc($n)
call rotate_bit
end while
{ C D EF G A B }
$bit := 2128 { 100001010000 }
$n := 0
while ($n < 12)
%cd_chords[$bit] := $cd_Sus4
%cd_roots[$bit] := $n
inc($n)
call rotate_bit
end while
{ C D EF G A B }
$bit := 2336 { 100100100000 }
$n := 0
while ($n < 12)
%cd_chords[$bit] := $cd_Dim
%cd_roots[$bit] := $n
inc($n)
call rotate_bit
end while
end on
on note
$cd_key := 0
$cd_i := 0
while ($cd_i < 12)
$cd_key := sh_left($cd_key, 1)
if (%KEY_DOWN_OCT[$cd_i] = 1)
$cd_key := $cd_key .or. 1
end if
inc($cd_i)
end while
$cd_root := %cd_roots[$cd_key]
$cd_chord := %cd_chords[$cd_key]
if ($cd_chord # $cd_None)
set_text($lb_root, !cd_notename[$cd_root])
set_control_par(get_ui_id($lb_chord),$CONTROL_PAR_POS_X, %wd_notename[$cd_root])
set_text($lb_chord, !cd_chordname[$cd_chord])
end if
end on
on release
$cd_key := 0
$cd_i := 0
while ($cd_i < 12)
$cd_key := sh_left($cd_key, 1)
if (%KEY_DOWN_OCT[$cd_i] = 1)
$cd_key := $cd_key .or. 1
end if
inc($cd_i)
end while
$cd_root := %cd_roots[$cd_key]
$cd_chord := %cd_chords[$cd_key]
if ($cd_chord # $cd_None)
set_text($lb_root, !cd_notename[$cd_root])
set_control_par(get_ui_id($lb_chord),$CONTROL_PAR_POS_X, %wd_notename[$cd_root])
set_text($lb_chord, !cd_chordname[$cd_chord])
else
set_text($lb_root, "")
set_text($lb_chord, "")
end if
end on
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment