{
   "description" : "",
   "ancestor_list" : [],
   "name" : "Makam_tester",
   "author" : "mahatGma",
   "id" : "1-4X2",
   "is_private" : null,
   "code" : "(\r\n//developed by Aykut Caglayan aykut_caglayan@yahoo.com//\r\n//depends on turkish music database SymbTr http://compmusic.upf.edu/node/140//\r\n\r\n//!! give the path for SymbTr txt database //\r\nvar myPath = PathName.new(\"~/SymbTr-2.0/txt/\");\r\n\r\nvar file_array = Array.new(myPath.files.size);\r\n\r\nvar makam_list = Set.new;\r\nvar makam_window, sel_makam_set=Set(), sel_makam_w;\r\nvar ask_button;\r\nvar pick_a_makam, picked_makam_name;\r\n\r\nvar makam_name_slots = Set.new;\r\n\r\nvar makam_slots_dict = Dictionary.new();\r\nvar player_instance;\r\nvar user_answer_input;\r\nvar main_window_creator, makam_option_button_creator, selection_window_creator, ask_button_creator, answer_button_creator, answer_button_adder, answer_buttons_creator;\r\nvar explanation_text;\r\nvar make_pb_slider, playback_speed=1, pb_slider;\r\n\r\ns.waitForBoot();\r\n\r\n\r\n//the beginning of path//\r\n//y = \"~/\".standardizePath ++ \"database_txt/\";\r\n//y = myPath.fullPath ++ \"/\";\r\ny = myPath.fullPath;\r\n\r\n\r\n//list files in the folder//\r\nmyPath = myPath.files;\r\n\r\n\r\nmyPath.size.do{|i|\r\n\tfile_array.insert(\r\n\t\ti,\r\n\t\tmyPath[i].fullPath.asString;\r\n)};\r\n\r\n\r\n\r\n\r\n\r\npick_a_makam = {\r\n\twhile ( {})};\r\n\r\n\r\nmyPath.do({arg item;\r\n\t//item = item.fullPath.asString;\r\n\tvar makam_name_pos;\r\n\titem = item.fullPath;\r\n\tmakam_name_pos = item.find(\"--\")-1; //end of the makam name in the path string//\r\n\titem = item.at((y.size..makam_name_pos)).collectAs({arg item; item}, String);\r\n\r\n\tmakam_list.add(item);\r\n});\r\n\r\n\r\n\r\n\r\n//;converts Holdrian comma value to Hz//\r\n~hc = {arg comma;\r\n\tvar hc = (1200 / 53);\r\n\t((hc * comma.asInteger)/100).midicps;\r\n};\r\n\r\n//the most simple synth//\r\nSynthDef(\"kal\", {\r\n\targ freq, dur;\r\n\tvar sig, env;\r\n\t//dur = dur * playback_speed;\r\n\tenv = EnvGen.kr(Env.perc(0.01, dur), doneAction:2);\r\n\tsig = SinOsc.ar(freq)*env;\r\n\tOut.ar(0, Pan2.ar(sig));\r\n}).add;\r\n\r\n//input the path as string//\r\n~simple_read = {arg file;\r\n\tvar a = TabFileReader.read(file, true);\r\n\t{a.size.do {arg i; var am, in, freq, dur;\r\n\t\tin = i+2;\r\n\t\tam = a[in][8];\r\n\t\tam = am.asInteger/1000;\r\n\t\tam = am*playback_speed;\r\n\t\tfreq = a[in][5];\r\n\t\tfreq=~hc.value(freq);\r\n\t\tSynth(\"kal\", [\\freq, freq, \\dur, am]);\r\n\t\tam.wait;}\r\n}.fork;};\r\n\r\n\r\n\r\n\r\n//fills makam_slot_dictionary with makam names as keys//\r\nmakam_list.do({arg i;\r\n\tmakam_slots_dict.put(i, List.new());\r\n\t//i.postln;\r\n});\r\n\r\n\r\n//in order to shorten the time for choosing a makam randomly from the optional pool//\r\n//what program does is, index the makam files accordingly, and store them in the dictionary//\r\nmakam_list.do({arg name;\r\n\tname = name ++ \"--\";\r\n\tfile_array.size.do({arg index2; var path, indexSet;\r\n\t\tpath = file_array[index2].asString;\r\n\t\tif (\r\n\t\t\tpath.containsStringAt(y.size, name),\r\n\t\t\t{\r\n\t\t\t\t//makam_slots_file.write([name, index2].asString ++ \"\\n\");\r\n\t\t\t\tmakam_slots_dict[(name.replace(\"--\",\"\"))].add(index2);\r\n\t\t\t\tmakam_name_slots.add([name, index2]);},\r\n\t\t\t{});\r\n\t});\r\n\r\n\r\n});\r\n\r\n\r\n\r\n//main makam window creater//\r\nmain_window_creator = {\r\n\tmakam_window = Window.new(\"makams\", Rect(100, 100, 900, 600));\r\n\tmakam_window.view.decorator = FlowLayout(makam_window.view.bounds);\r\n\tmakam_window.front;\r\n\r\n\tmakam_option_button_creator.value();\r\n};\r\n\r\n\r\nmakam_option_button_creator = {\r\n\tmakam_list.size.do{arg i;\r\n\t\tvar makam_name, makam_name_o;\r\n\t\tmakam_name = makam_list.asArray.sort[i];\r\n\t\tmakam_name_o = makam_name;\r\n\r\n\t\tmakam_name_o = Button(makam_window, Rect(10, i*22, 105, 20))\r\n\r\n\t\t.states_([\r\n\t\t\t[makam_name, Color.white, Color.grey],\r\n\t\t\t[makam_name, Color.black, Color.green]])\r\n\t\t.action_({ arg butt;\r\n\t\t\tif (butt.value == 1,\r\n\t\t\t\t{ sel_makam_set.add(makam_name_o.states[0][0]);\r\n\t\t\t\t\tplayer_instance.stop;\r\n\t\t\t\t\tsel_makam_set.postcs;\r\n\t\t\t\t\tanswer_button_adder.value(makam_name_o.states[0][0]); //!!!\r\n\t\t\t\t\tsel_makam_w.front;\r\n\t\t\t},\r\n\r\n\t\t\t\t{ sel_makam_set.remove(makam_name_o.states[0][0]); //sel_button.close;\r\n\t\t\t\tsel_makam_set.postcs;\r\n\t\t\t\tsel_makam_w.close;\r\n\t\t\t\tselection_window_creator.value();\r\n\t\t\t\task_button_creator.value();\r\n\t\t\t\t\t//make_pb_slider.value();\r\n\r\n\r\n\t\t\t\tanswer_buttons_creator.value();\r\n\t\t\t},\r\n\r\n\t)});\r\n}};\r\n\r\nselection_window_creator = {\r\n\tsel_makam_w = Window.new(\"selection\", Rect(1200, 100, 120, 600));\r\n\tsel_makam_w.view.decorator = FlowLayout(sel_makam_w.view.bounds);\r\n\tmake_pb_slider.value();\r\n\r\n};\r\n\r\nask_button_creator = {\r\n\tvar ask_button;\r\n\task_button = Button(sel_makam_w, Rect(10, 10, 50, 25))\r\n\t.states_([\r\n\t\t[\"Go\", Color.black, Color.yellow],\r\n\t\t[\"Guess\", Color.black, Color.green]])\r\n\t.action_({ arg butt;\r\n\t\tif (butt.value == 1,\r\n\t\t\t{ var sel;\r\n\t\t\t\tsel = sel_makam_set.asArray.choose;\r\n\t\t\t\tpicked_makam_name = sel;\r\n\r\n\t\t\t\tsel = makam_slots_dict.at(sel).choose.postcs;\r\n\t\t\t\tplayer_instance = ~simple_read.value(file_array[sel])\r\n\t\t\t},\r\n\t\t\t{ player_instance.stop})\r\n\t});\r\n};\r\n\r\n\r\nanswer_button_adder = {\r\n\targ name;\r\n\tvar makam_name_s = name, pos;\r\n\tpos = sel_makam_set.size-1;\r\n\tmakam_name_s = Button(sel_makam_w, Rect(4, pos*22, 105, 20))\r\n\t.states_([\r\n\t\t[name, Color.white, Color.grey]])\r\n\r\n\t.mouseDownAction_({\r\n\t\tuser_answer_input = makam_name_s.states[0][0];\r\n\t\tuser_answer_input.postcs;\r\n\t\tif ( user_answer_input == picked_makam_name,\r\n\t\t\t{true.postln;\r\n\t\t\t\tmakam_name_s.states = [[makam_name_s.states[0][0], Color.black, Color.green]]},\r\n\t\t\t{false.postln;\r\n\t\t\t\tmakam_name_s.states = [[makam_name_s.states[0][0], Color.green, Color.red]]});\r\n\r\n\t})\r\n\t.mouseUpAction_({\r\n\t\tmakam_name_s.states = [[makam_name_s.states[0][0], Color.white, Color.grey]]\r\n\t});\r\n\r\n\r\n};\r\n\r\n\r\nanswer_buttons_creator = {\r\n\t//arg i, sel_button, button_name_org;\r\n\tsel_makam_set.size.do{arg i;\r\n\t\tvar makam_name = sel_makam_set.asArray.sort[i];\r\n\t\tvar makam_name_s = makam_name;\r\n\t\tmakam_name_s = Button(sel_makam_w, Rect(4, 22*i, 105, 20)) //!!!//\r\n\t\t.states_([\r\n\t\t\t[makam_name, Color.white, Color.grey]])\r\n\t\t.mouseDownAction_({\r\n\t\t\tuser_answer_input = makam_name_s.states[0][0];\r\n\t\t\tuser_answer_input.postcs;\r\n\t\t\tif ( user_answer_input == picked_makam_name,\r\n\t\t\t\t{true.postln;\r\n\t\t\t\t\tmakam_name_s.states = [[makam_name_s.states[0][0], Color.black, Color.green]]},\r\n\t\t\t\t{false.postln;\r\n\t\t\t\t\tmakam_name_s.states = [[makam_name_s.states[0][0], Color.green, Color.red]]});\r\n\r\n\t\t})\r\n\t\t.mouseUpAction_({\r\n\t\t\tmakam_name_s.states = [[makam_name_s.states[0][0], Color.white, Color.grey]]\r\n\t\t});\r\n\t};\r\n\tsel_makam_w.front;\r\n};\r\n\r\n\r\n//playback speed slider//\r\nmake_pb_slider = {\r\n\tpb_slider = Slider(sel_makam_w, Rect(60, 10, 100, 25))\r\n\t.value_(0.5)\r\n\t.action_({playback_speed = pb_slider.value.linlin(0, 1, 4, 0.25)});\r\n};\r\n\r\n\r\n\r\n//creates the ListView GUI//\r\n\r\nmain_window_creator.value();\r\n\r\nselection_window_creator.value();\r\nask_button_creator.value();\r\n\r\n\r\n)",
   "labels" : [
      "maqam music trainer"
   ]
}
