{
   "labels" : [
      "gui",
      "helper",
      "scale",
      "preview",
      "didactic"
   ],
   "code" : "(\r\n\r\n// Not refenrencing Ascending/descending scales\r\n// See Scale.sc\r\n\r\nvar pentatonic_scales = [ \\minorPentatonic, \\majorPentatonic, \\ritusen, \\egyptian, \\prometheus, \\scriabin ];\r\nvar pentatonic_asian_scales = [ \\kumoi, \\hirajoshi, \\iwato, \\chinese, \\indian, \\pelog ];\r\nvar pentatonic_chinese_han_scales = [ \\gong, \\shang, \\jiao, \\zhi, \\yu ];\r\nvar hexa_scales = [ \\whole, \\augmented, \\augmented2 ];\r\nvar hexatonic_no_tritones_modes = [ \\hexMajor7, \\hexDorian, \\hexPhrygian, \\hexSus, \\hexMajor6, \\hexAeolian ];\r\nvar partch_otonalities = [ \\partch_o1, \\partch_o2, \\partch_o3, \\partch_o4, \\partch_o5, \\partch_o6 ];\r\nvar partch_utonalities = [ \\partch_u1, \\partch_u2, \\partch_u3, \\partch_u4, \\partch_u5, \\partch_u6 ];\r\nvar western_modes = [ \\major, \\dorian, \\phrygian, \\lydian, \\mixolydian, \\minor, \\locrian ];\r\nvar western_harmo_melo_modes = [ \\harmonicMinor, \\harmonicMajor, \\melodicMinor, \\melodicMinorDesc, \\melodicMajor ];\r\nvar hepta_other_modes = [ \\hindu, \\spanish, \\bartok, \\superLocrian, \\romanianMinor, \\hungarianMinor, \\neapolitanMinor, \\enigmatic ];\r\nvar raga_modes = [ \\todi, \\purvi, \\marva, \\bhairav, \\ahirbhairav ];\r\nvar whole_tones_added = [ \\leadingWhole, \\lydianMinor, \\neapolitanMajor, \\locrianMajor ];\r\nvar eight_plus_scales = [ \\diminished, \\diminished2, \\chromatic, \\chromatic24 ];\r\nvar maqam_ajam = [ \\ajam, \\jiharkah, \\shawqAfza ];\r\nvar maqam_sikah = [ \\sikah, \\sikahDesc, \\huzam, \\iraq, \\bastanikar, \\mustar ];\r\nvar maqam_bayati = [ \\bayati, \\karjighar, \\husseini ];\r\nvar maqam_nahawand = [ \\nahawand, \\nahawandDesc, \\farahfaza, \\murassah, \\ushaqMashri ];\r\nvar maqam_rast = [ \\rast, \\rastDesc, \\suznak, \\nairuz, \\yakah, \\yakahDesc, \\mahur ];\r\nvar maqam_hijaz = [ \\hijaz, \\hijazDesc, \\zanjaran, \\hijazKar ];\r\nvar maqam_saba = [ \\saba, \\zamzam ];\r\nvar maqam_kurd = [ \\kurd, \\kijazKarKurd ];\r\nvar maqam_nawa_athar = [ \\nawaAthar, \\nikriz, \\atharKurd ];\r\n\r\nvar all_groups = [ pentatonic_scales, pentatonic_asian_scales, pentatonic_chinese_han_scales, hexa_scales, hexatonic_no_tritones_modes, partch_otonalities, partch_utonalities, western_modes, western_harmo_melo_modes, hepta_other_modes, raga_modes, whole_tones_added, eight_plus_scales, maqam_ajam, maqam_sikah, maqam_bayati, maqam_nahawand, maqam_rast, maqam_hijaz, maqam_saba, maqam_kurd, maqam_nawa_athar ];\r\n\r\nvar group_names = [ \"Pentatonic Scales\", \"Asian Pentatonic Scales\", \"Han Chinese Pentatonic Scales\", \"Six Notes Scales\", \"Hexatonic Modes With no Tritone\", \"Partch's Otonalities\", \"Partch's Utonalities\", \"Tonal modes\", \"Tonal harmonics and melodics modes\", \"Other heptatonic modes\", \"Raga modes\", \"Modes of whole tones with added note\", \"Eight, twelve and twenty-four notes modes\", \"Maqam Ajam\", \"Maqam Sikah\", \"Maqam Bayati\", \"Maqam Nahawand\", \"Maqam Rast\", \"Maqam Hijaz and HijazKar\", \"Maqam Saba\", \"Maqam Kurd\", \"Maqam Nawa Athar\", \"Maqam Bayati\" ];\r\n\r\nvar view = Window.new( \"Scale Listener\", Rect.new( 0, 0, 1500, 700 ) );\r\nvar subview = UserView.new( view, Rect( 0, 0, view.bounds.width, view.bounds.height * 0.2 * all_groups.size ) );\r\n\r\nvar slider = Slider.new( view, Rect( view.bounds.width * 0.95, 0, view.bounds.width * 0.05, view.bounds.height ) );\r\n\r\nvar margin = 5;\r\n\r\nvar play_scale = { | symbol |\r\n\tPbind(\r\n\t\t\\instrument, \\simple_sine,\r\n\t\t\\dur, 0.333,\r\n\t\t\\freq, Pseq( ( 440 * Scale.at( symbol ).ratios ++ [ 880 ] ) )\r\n\t).play\r\n};\r\n\r\nSynthDef(\\simple_sine, {\r\n\t| out = 0, amp = 0.25, freq = 110 |\r\n\tvar snd, env, envctl, envgen;\r\n\tenv = Env.perc( 0.01, 0.666 );\r\n\tenvgen = EnvGen.kr( env, doneAction: Done.freeSelf );\r\n\tsnd = SinOsc.ar( [ freq, freq ], mul: 0.5 * amp * envgen );\r\n\tOut.ar( out, snd );\r\n}).add;\r\n\r\nall_groups.do( { | group, i |\r\n\r\n\tvar group_title = StaticText.new( subview, Rect.new( 0, view.bounds.height * 0.2 * i, view.bounds.width, view.bounds.height * 0.1 ) ).string_( group_names[ i ] ).align_( \\center );\r\n\r\n\tvar button_width = view.bounds.width * 0.95 - ( margin + 1 * group.size ) / group.size;\r\n\r\n\tgroup.do( { | symbol, j |\r\n\t\tvar b = Button.new( subview, Rect.new( margin + ( ( button_width + margin ) * j ), view.bounds.height * 0.2 * i + ( view.bounds.height * 0.1 ), button_width, view.bounds.height * 0.1 ) );\r\n\t\tb.states = [ [ Scale.at( symbol ).name, Color.white, Color.black ] ];\r\n\t\tb.action = { play_scale.value( symbol ) };\r\n\t} );\r\n\r\n} );\r\nslider.value = 1;\r\nslider.step = ( 1 / ( all_groups.size - 5 ) );\r\nslider.thumbSize = ( view.bounds.height / ( all_groups.size - 5 ) );\r\nslider.action = {\r\n\tvar value = slider.value.linlin( 0, 1, subview.bounds.height - view.bounds.height, 0 );\r\n\tsubview.moveTo( 0, 0-value );\r\n};\r\n\r\n// Finally, bring the window to the front.\r\nview.front;\r\nCmdPeriod.doOnce({Window.closeAll}); // Kill GUI and server sounds on < Ctrl + ^ + . >, or on window closing .\r\nview.onClose = {\r\n\ts.freeAll;\r\n\tWindow.closeAll;\r\n};\r\n\r\n)",
   "id" : "1-5cL",
   "is_private" : null,
   "name" : "Scale Listener",
   "author" : "Dindoléon",
   "description" : "The Scale Listener is a simple GUI that previews every scale provided in SC, except Ascending/Descending ones. Can also serve as a template for a graphical scale selector, or for didactic purposes.",
   "ancestor_list" : []
}
