4 gdouble upperRegister
= 200.0;
6 gchar
* voicepath(gchar
*string
) {
7 gchar
*path
= g_strjoin(NULL
, base
, G_DIR_SEPARATOR_S
, string
, ".wav", NULL
);
8 if (g_access(path
, F_OK
) != 0) {
10 path
= g_strjoin(NULL
, PINYINPATH
, G_DIR_SEPARATOR_S
, string
, ".wav", NULL
);
15 static void setButtonByFileExists(GtkWidget
*button
, gchar
*path
) {
16 if (g_access(path
, F_OK
) == 0) {
17 gtk_widget_set_sensitive(button
, TRUE
);
19 gtk_widget_set_sensitive(button
, FALSE
);
24 static void setButtonExample() {
25 GtkWidget
*buttonExample
= glade_xml_get_widget(xml
, "buttonExample");
27 GtkWidget
*gimiHum
= glade_xml_get_widget(xml
, "checkmenuitemExampleHum");
28 if (!gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(gimiHum
))) {
32 gtk_tree_model_get(GTK_TREE_MODEL(liststore
), &mainIter
, COL_TEXT
, &string
, -1);
33 path
= voicepath(string
);
35 setButtonByFileExists(buttonExample
, path
);
40 gtk_widget_set_sensitive(buttonExample
, TRUE
);
43 gtk_widget_set_sensitive(buttonExample
, FALSE
);
47 static void setButtonPlay() {
48 GtkWidget
*buttonPlay
= glade_xml_get_widget(xml
, "buttonPlay");
49 gchar
*path
= g_build_filename(SCRIPTPATH
, "lastExample.wav", NULL
);
50 setButtonByFileExists(buttonPlay
, path
);
55 gboolean
setButtonsTrue() {
56 GtkWidget
*buttonRecord
= glade_xml_get_widget(xml
, "buttonRecord");
58 GtkWidget
*drawingareaPitch
= glade_xml_get_widget(xml
, "drawingareaPitch");
63 gtk_widget_set_sensitive(buttonRecord
, TRUE
);
67 gtk_widget_queue_draw(drawingareaPitch
);
69 feedbackTXT
= g_build_filename(SCRIPTPATH
, G_DIR_SEPARATOR_S
, "feedback.txt", NULL
);
71 if (g_file_get_contents(feedbackTXT
, &contents
, NULL
, NULL
) == TRUE
) {
72 // g_debug("Sets label!\n");
73 GtkWidget
*label
= glade_xml_get_widget(xml
, "labelFeedback");
74 gtk_label_set_text(GTK_LABEL(label
), contents
);
75 // g_debug("Label set!\n");
76 g_unlink(feedbackTXT
);
83 gboolean
setButtonsFalse() {
84 GtkWidget
*buttonRecord
= glade_xml_get_widget(xml
, "buttonRecord");
85 GtkWidget
*buttonPlay
= glade_xml_get_widget(xml
, "buttonPlay");
86 GtkWidget
*buttonExample
= glade_xml_get_widget(xml
, "buttonExample");
87 // g_debug("%s welcome!\n", __func__);
89 gtk_widget_set_sensitive(buttonRecord
, FALSE
);
90 gtk_widget_set_sensitive(buttonPlay
, FALSE
);
91 gtk_widget_set_sensitive(buttonExample
, FALSE
);
93 // g_debug("%s bye!\n", __func__);
98 void on_buttonRecord_clicked(GtkWidget
*widget
, gpointer user_data
) {
101 gtk_tree_model_get(GTK_TREE_MODEL(liststore
), &mainIter
, COL_TEXT
, &string
, -1);
104 if (string
== NULL
) {
105 GtkWidget
*dialog
= gtk_message_dialog_new(NULL
,
109 _("Don't have any (more) tests"));
110 gtk_dialog_run (GTK_DIALOG (dialog
));
111 gtk_widget_destroy (dialog
);
114 /* Start record Thread */
116 // g_debug("%s creates record", __func__);
118 g_thread_create((GThreadFunc
)record
, NULL
, FALSE
, NULL
);
120 // g_debug("%s is done", __func__);
126 void on_buttonExample_clicked(GtkWidget
*widget
, gpointer user_data
) {
128 /* Start example Thread */
129 g_thread_create((GThreadFunc
)example
, widget
, FALSE
, NULL
);
132 void on_buttonPlay_clicked(GtkWidget
*widget
, gpointer user_data
) {
134 /* Start play Thread */
135 g_thread_create((GThreadFunc
)play
, widget
, FALSE
, NULL
);
138 gboolean
prev(GtkWidget
*previous
) {
139 gboolean ret
= FALSE
;
141 /* Code From anchient Sylpheed */
145 path
= gtk_tree_model_get_path(GTK_TREE_MODEL(liststore
), &mainIter
);
147 if ((ret
= gtk_tree_path_prev(path
)) == TRUE
) {
148 gtk_tree_model_get_iter(GTK_TREE_MODEL(liststore
), &prev
, path
);
149 if (previous
!= NULL
) {
155 gtk_tree_path_free(path
);
162 gboolean
next(GtkWidget
*next
) {
165 return gtk_tree_model_iter_next(GTK_TREE_MODEL(liststore
), &mainIter
);
167 GtkTreeIter next
= mainIter
;
168 return gtk_tree_model_iter_next(GTK_TREE_MODEL(liststore
), &next
);
175 void updateWidgets() {
176 GtkWidget
*labelFeedback
= glade_xml_get_widget(xml
, "labelFeedback");
180 gtk_tree_model_get(GTK_TREE_MODEL(liststore
), &mainIter
, COL_TEXT
, &string
, -1);
181 GString
*label
= g_string_new(string
);
182 g_string_prepend(label
, "<span size=\"xx-large\">");
183 g_string_append(label
, "</span>");
184 gtk_label_set_markup(GTK_LABEL(labelFeedback
), label
->str
);
185 g_string_free(label
, TRUE
);
189 gtk_label_set_markup(GTK_LABEL(labelFeedback
), "");
192 gtk_widget_set_sensitive(glade_xml_get_widget(xml
, "buttonRecord"), treevalid
);
193 gtk_widget_set_sensitive(glade_xml_get_widget(xml
, "imagemenuitemSave"), treevalid
);
194 gtk_widget_set_sensitive(glade_xml_get_widget(xml
, "imagemenuitemSaveAs"), treevalid
);
196 gtk_widget_set_sensitive(glade_xml_get_widget(xml
, "buttonPrevious"), prev(NULL
));
197 gtk_widget_set_sensitive(glade_xml_get_widget(xml
, "buttonNext"), next(NULL
));
202 gtk_widget_queue_draw(glade_xml_get_widget(xml
, "drawingareaPitch"));
205 void on_Save(GtkWidget
*chooser
, gpointer user_data
) {
206 fileSave(gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(chooser
)));
209 void on_dialogAdd_close(GtkWidget
*button
, gpointer user_data
) {
210 GtkWidget
*buttonAdd
= glade_xml_get_widget(xml
, "buttonAdd");
211 gtk_widget_hide(gtk_widget_get_toplevel(button
));
212 gtk_widget_grab_focus(buttonAdd
);
215 void on_menuitemVoice_activate(GtkWidget
*widget
, gpointer user_data
) {
216 const gchar
*name
= gtk_widget_get_name(widget
);
217 GtkWidget
*drawingareaPitch
= glade_xml_get_widget(xml
, "drawingareaPitch");
218 if (g_str_equal(name
, "menuitemVoice_Male_Low") == TRUE
) upperRegister
= 150.0;
219 if (g_str_equal(name
, "menuitemVoice_Male") == TRUE
) upperRegister
= 200.0;
220 if (g_str_equal(name
, "menuitemVoice_Female") == TRUE
) upperRegister
= 300.0;
221 if (g_str_equal(name
, "menuitemVoice_Child") == TRUE
) upperRegister
= 450.0;
222 gtk_widget_queue_draw(drawingareaPitch
);
225 void paint (GtkWidget
*widget
, GdkEventExpose
*eev
, gpointer data
) {
228 gtk_tree_model_get(GTK_TREE_MODEL(liststore
), &mainIter
, COL_TEXT
, &string
, -1);
230 if (string
!= NULL
) {
232 GString
*filename
= g_string_sized_new (200);
233 GString
*cmd
= g_string_sized_new (200);
234 GString
*recordedPT
= g_string_sized_new(100);
237 g_string_printf(filename
, "%s%s%s-%0.f.PitchTier", PITCHPATH
, G_DIR_SEPARATOR_S
, string
, upperRegister
);
238 g_string_printf(recordedPT
, "%s%s%s.PitchTier", RECORDPATH
, G_DIR_SEPARATOR_S
, string
);
240 g_string_printf(filename
, "%s%s%s-%0.f.Pitch", PITCHPATH
, G_DIR_SEPARATOR_S
, string
, upperRegister
);
241 g_string_printf(recordedPT
, "%s%s%s.Pitch", RECORDPATH
, G_DIR_SEPARATOR_S
, string
);
244 if (g_access(filename
->str
, F_OK
) == -1) {
245 /* Eigenlijk wil je de system ranzigheid vervangen door een werkende versie van dit,
246 * maar eigenlijk MOET je gewoon de praat scripts naar C omzetten ;)
250 gchar *upper = g_malloc(5);
251 g_ascii_dtostr(upper, 5, upperRegister);
253 argv[1] = testList[intTestCounter];
257 g_spawn_sync((const gchar *) SCRIPTPATH, argv, NULL, (GSpawnFlags)(G_SPAWN_SEARCH_PATH | G_SPAWN_FILE_AND_ARGV_ZERO), NULL, NULL, NULL, NULL, &exit_status, &err);*/
259 g_string_printf(cmd
, "%s DrawToneContour.praat %s %0.f", PRAATBIN
, string
, upperRegister
);
260 // g_debug("%s", cmd->str);
265 cr
= gdk_cairo_create (widget
->window
);
266 cairo_set_line_width (cr
, 1);
267 cairo_select_font_face (cr
, "Sans", CAIRO_FONT_SLANT_NORMAL
,
268 CAIRO_FONT_WEIGHT_BOLD
);
271 if (g_access(filename
->str
, F_OK
) == 0) {
272 cairo_move_to (cr
, 5, 15);
273 cairo_set_source_rgb (cr
, 0,0,0);
274 cairo_show_text (cr
, _("Reference Pitch"));
277 drawPitchTier(cr
, filename
->str
,
278 widget
->allocation
.width
,
279 widget
->allocation
.height
, upperRegister
+ 100.0);
282 // g_debug("%s", recordedPT->str);
284 if (g_access(recordedPT
->str
, F_OK
) == 0) {
285 cairo_move_to (cr
, 15, 30);
286 cairo_set_source_rgb (cr
, 1,0,0);
287 cairo_show_text (cr
, _("Your Pitch"));
289 drawPitchTier(cr
, recordedPT
->str
,
290 widget
->allocation
.width
,
291 widget
->allocation
.height
, upperRegister
+ 100.0);
294 g_string_free(recordedPT
, TRUE
);
296 g_string_free(filename
, TRUE
);
302 void on_menuitemShuffle_activate(GtkWidget
*menuitem
, gpointer data
) {
305 gint amount
= gtk_tree_model_iter_n_children(GTK_TREE_MODEL(liststore
), NULL
) - 1;
307 for (i
= 0; i
<= amount
; i
++) {
308 gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(liststore
),
310 g_random_int_range(0, amount
));
311 gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(liststore
),
313 g_random_int_range(0, amount
));
314 gtk_list_store_swap(GTK_LIST_STORE(liststore
), &a
, &b
);
316 gtk_tree_model_get_iter_first(GTK_TREE_MODEL(liststore
), &mainIter
);