📄 uif_sfont.c
字号:
GtkWidget *widg; GtkWidget *mnuitem; gint index; gboolean sensitive; mnuitem = gtk_menu_get_active (GTK_MENU (menu)); index = g_list_index (GTK_MENU_SHELL (menu)->children, mnuitem); if (index == -1) index = 0; if (index != 0) { /* preset type NOT selected */ sensitive = FALSE; widg = gtk_object_get_data (GTK_OBJECT (findwin), "RADname"); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widg), TRUE); } else sensitive = TRUE; widg = gtk_object_get_data (GTK_OBJECT (findwin), "RADname"); gtk_widget_set_sensitive (widg, sensitive); widg = gtk_object_get_data (GTK_OBJECT (findwin), "RADbank"); gtk_widget_set_sensitive (widg, sensitive); widg = gtk_object_get_data (GTK_OBJECT (findwin), "SPBbank"); gtk_widget_set_sensitive (widg, sensitive); widg = gtk_object_get_data (GTK_OBJECT (findwin), "SPBpreset"); gtk_widget_set_sensitive (widg, sensitive); widg = gtk_object_get_data (GTK_OBJECT (findwin), "LBLpreset"); gtk_widget_set_sensitive (widg, sensitive);}/* agghh, this routine is a mess!!!! */static voiduisf_cb_find_search (GtkWidget * widg, GtkWidget * findwin){ SFItemID itemid; GtkCTreeNode *startnode; GtkCTreeNode *node, *found = NULL; SFTreeRef *ref; gint nodetype; gint alt; gboolean substr, nametog, allfiles, beginning, nofirst; gchar *name; gint bank, prenum; UISFont *uisf, *uisf2; GSList *slptr; SFPreset *preset; SFInst *inst; SFSample *sample; GtkWidget *opmenu; GtkWidget *menu; GtkWidget *mnuitem; GtkWidget *btn; GtkWidget *entry; /* selected method of name string comparison (sub string or starts with) */ btn = gtk_object_get_data (GTK_OBJECT (findwin), "RADsubstr"); substr = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (btn)); /* selected search criteria, name or bank/preset (preset search only) */ btn = gtk_object_get_data (GTK_OBJECT (findwin), "RADname"); nametog = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (btn)); /* get name entry to find */ entry = gtk_object_get_data (GTK_OBJECT (findwin), "ENname"); name = gtk_entry_get_text (GTK_ENTRY (entry)); /* get bank spin button value to find */ btn = gtk_object_get_data (GTK_OBJECT (findwin), "SPBbank"); bank = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (btn)); /* get preset number spin button value to find */ btn = gtk_object_get_data (GTK_OBJECT (findwin), "SPBpreset"); prenum = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (btn)); /* type of node to search for (preset, instrument or sample) */ opmenu = gtk_object_get_data (GTK_OBJECT (findwin), "OPtype"); UTIL_OPMENU_INDEX (nodetype, opmenu); btn = gtk_object_get_data (GTK_OBJECT (findwin), "CKBbegin"); beginning = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (btn)); /* get selected sound font file uisf ptr (or all files option) */ opmenu = gtk_object_get_data (GTK_OBJECT (findwin), "OPfile"); menu = gtk_option_menu_get_menu (GTK_OPTION_MENU (opmenu)); mnuitem = gtk_menu_get_active (GTK_MENU (menu)); itemid = GPOINTER_TO_INT (gtk_object_get_data (GTK_OBJECT (mnuitem), "sfitemid")); node = SFTREE_LOOKUP_ITEMID (itemid); allfiles = (node == NULL); if (node) uisf = SFTREE_UPFIND_UISF (node); /* use selected sound font file */ else uisf = uisf_sfonts->data; /* start with first loaded sound font */ if (!beginning) { /* start from beginning? */ /* retrieve node to start search from (or NULL) */ itemid = GPOINTER_TO_INT (gtk_object_get_data (GTK_OBJECT (findwin), "startitemid")); startnode = SFTREE_LOOKUP_ITEMID (itemid); } else startnode = NULL; alt = 0; /* toggles 0/1 for preset and sample alternate branches */ if (startnode) { /* make sure start node matches search criteria */ ref = SFTREE_NODE_REF (startnode); uisf2 = SFTREE_UPFIND_UISF (startnode); /* uisf of start node */ if (allfiles || uisf == uisf2) { uisf = uisf2; switch (ref->type) { case NODE_PRESET: if (nodetype == 0) { node = GTK_CTREE_ROW (startnode)->parent; ref = SFTREE_NODE_REF (node); if (ref->type == NODE_MELODIC) alt = 1; } else startnode = NULL; break; case NODE_INST: if (nodetype != 1) startnode = NULL; break; case NODE_SAMPLE: if (nodetype == 2) { node = GTK_CTREE_ROW (startnode)->parent; ref = SFTREE_NODE_REF (node); if (ref->type == NODE_USER) alt = 1; } else startnode = NULL; break; default: break; } } else startnode = NULL; } if (startnode) { /* startnode is last found node, so advance to next node */ startnode = GTK_CTREE_ROW (startnode)->sibling; /* NOTE: if startnode == NULL (last node of branch) the master while loop will still handle this correctly! */ node = startnode; nofirst = TRUE; } else nofirst = FALSE; while (uisf && !found) { /* while sound fonts */ if (!nofirst) { switch (nodetype) { case 1: /* instrument search */ node = uisf->nodes->inst; break; case 2: /* sample search */ if (!alt) node = uisf->nodes->loaded; else node = uisf->nodes->rom; alt ^= 1; break; default: /* preset search (0) */ if (!alt) node = uisf->nodes->melodic; else node = uisf->nodes->percuss; alt ^= 1; break; } if (node) node = GTK_CTREE_ROW (node)->children; } nofirst = FALSE; while (node && !found) { /* loop over items of same type */ slptr = (GSList *) (SFTREE_NODE_REF (node)->dptr); switch (nodetype) { case 1: /* instrument search */ inst = (SFInst *) (slptr->data); /* match instrument by name (substr or starts with) */ if ((substr && substrcmp (name, inst->name)) || (!substr && g_strncasecmp (name, inst->name, strlen (name)) == 0)) found = node; break; case 2: /* sample search */ sample = (SFSample *) (slptr->data); if ((substr && substrcmp (name, sample->name)) || (!substr && g_strncasecmp (name, sample->name, strlen (name)) == 0)) found = node; break; default: /* preset search (0) */ preset = (SFPreset *) (slptr->data); if (!nametog && (bank == -1 || bank == preset->bank) && (prenum == -1 || prenum == preset->prenum)) found = node; /* bank/preset # match */ else if (nametog && (!strlen (name) || (substr && substrcmp (name, preset->name)) || (!substr && g_strncasecmp (name, preset->name, strlen (name)) == 0))) found = node; /* name string match */ break; } node = GTK_CTREE_ROW (node)->sibling; /* next node */ } if (!alt) { /* next sound font */ if (!allfiles) break; node = uisf->nodes->sfont; node = GTK_CTREE_ROW (node)->sibling; if (node) uisf = SFTREE_UPFIND_UISF (node); else uisf = NULL; } } if (found) { /* found a matching node? */ if (uisf_selected_elem) uisf_deactivate_selection (); sftree_clear_selection (); ref = SFTREE_NODE_REF (found); gtk_object_set_data (GTK_OBJECT (findwin), "startitemid", GINT_TO_POINTER (ref->itemid)); sftree_spotlight_node (found); if (beginning) { /* turn off "start from beginning" if on */ btn = gtk_object_get_data (GTK_OBJECT (findwin), "CKBbegin"); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (btn), FALSE); } } else util_quick_popup (_("No more matching items"), NULL);}/* expects a zone, advances to the item referenced by the zone */voiduisf_goto_zone_ref (void){ SFItemID itemid; GtkCTreeNode *node; UISFont *uisf; SFTreeRef *ref; GtkCTreeNode *n, *found; GSList *finditem; SFZone *z; gint alt; /* for sample search, to alternate between branches */ if (!(itemid = sftree_get_selection_single ())) return; if (!(node = SFTREE_LOOKUP_ITEMID (itemid))) return; uisf = SFTREE_UPFIND_UISF (node); ref = SFTREE_NODE_REF (node); if (ref->type != NODE_PZONE && ref->type != NODE_IZONE) return; finditem = (GSList *) (ref->dptr); z = (SFZone *) (finditem->data); finditem = z->instsamp; if (!finditem) return; /* global zone? (no reference) */ if (ref->type == NODE_PZONE) { n = uisf->nodes->inst; n = GTK_CTREE_ROW (n)->children; while (n) { ref = SFTREE_NODE_REF (n); if (ref->dptr == finditem) break; n = GTK_CTREE_ROW (n)->sibling; } } else { n = uisf->nodes->loaded; /* user loaded samples branch */ n = GTK_CTREE_ROW (n)->children; alt = 0; while (n) { ref = SFTREE_NODE_REF (n); if (ref->dptr == finditem) break; n = GTK_CTREE_ROW (n)->sibling; if (!n && !alt) { /* done with loaded sample branch? */ alt = 1; n = uisf->nodes->rom; /* switch to rom branch */ n = GTK_CTREE_ROW (n)->children; } } } if (!(found = n)) return; /* !found??!! */ if (uisf_selected_elem) uisf_deactivate_selection (); sftree_clear_selection (); sftree_spotlight_node (found);}/***--- Sound Font NODE level NON-interactive routines ---***/static gintuisf_find_pzone_by_inst_compare (SFTreeRef * nref, GSList * pinst){ if (nref->type == NODE_PZONE && ((SFZone *) (((GSList *) (nref->dptr))->data))->instsamp == pinst) return (0); /* matched */ return (1); /* didn't match */}static gintuisf_find_izone_by_sample_compare (SFTreeRef * nref, GSList * psam){ if (nref->type == NODE_IZONE && ((SFZone *) (((GSList *) (nref->dptr))->data))->instsamp == psam) return (0); /* matched */ return (1); /* didn't match */}/* add a sound font item "parent" is the parent Preset or Inst if adding a zone, otherwise sf itemid "data" is a pointer to the SF(Preset | Inst | Sample | Zone) to add "pos" list index to insert item at SF(Inst | Sample | Zone) only,< 0 = append "type" is NODE_PRESET | NODE_INST | NODE_SAMPLE | NODE_PZONE | NODE_IZONE*/voiduisf_sfitem_add (SFItemID parent, gpointer data, gint pos, SFNodeType type){ GtkCTreeNode *node; UISFont *uisf; SFPreset *pset; SFInst *inst; GSList *p; g_return_if_fail (parent != SFITEMID_NONE); g_return_if_fail (data != NULL); if (!(node = SFTREE_LOOKUP_ITEMID (parent))) return; uisf = SFTREE_UPFIND_UISF (node); switch (type) { case NODE_PRESET: sfont_add_preset (uisf->sf, (SFPreset *)data); p = g_slist_find (uisf->sf->preset, (SFPreset *)data); sftree_add_preset_sorted (p, uisf->nodes); break; case NODE_INST: sfont_insert_inst (uisf->sf, (SFInst *)data, pos); p = g_slist_find (uisf->sf->inst, (SFInst *)data); sftree_add_inst (p, uisf->nodes, pos); break; case NODE_SAMPLE: sfont_insert_sample (uisf->sf, (SFSample *)data, pos); p = g_slist_find (uisf->sf->sample, (SFSample *)data); sftree_add_sample (p, uisf->nodes, pos); break; case NODE_PZONE: /* fetch parent preset structure */ pset = (SFPreset *)(((GSList *)(SFTREE_NODE_REF (node)->dptr))->data); sfont_add_preset_zone (uisf->sf, pset, (SFZone *)data); p = g_slist_find (pset->zone, (SFZone *)data); sftree_add_pzone (p, node, pos); if (uisf_selected_elem == pset) /* zone added to selected item? */ pianospan_update (); /* update key spans */ /* notify wavetable of changed preset */ wtbl_sfitem_changed (parent, WTBL_ITEM_CHANGE); break; case NODE_IZONE: /* fetch parent instrument structure */ inst = (SFInst *)(((GSList *)(SFTREE_NODE_REF (node)->dptr))->data); sfont_add_inst_zone (uisf->sf, inst, (SFZone *)data); p = g_slist_find (inst->zone, (SFZone *)data); sftree_add_izone (p, node, pos); if (uisf_selected_elem == inst) /* zone added to selected item? */ pianospan_update (); /* update key spans */ /* notify wavetable of changed instrument */ wtbl_sfitem_changed (parent, WTBL_ITEM_CHANGE); break; default: break; }}voiduisf_sfitem_delete (SFItemID itemid){ GtkCTreeNode *node; if (!(node = SFTREE_LOOKUP_ITEMID (itemid))) return; switch (SFTREE_NODE_REF (node)->type) { case NODE_PRESET: uisf_preset_delete (itemid); break; case NODE_PZONE: uisf_pzone_delete (itemid); break; case NODE_INST: uisf_inst_delete (itemid); break; case NODE_IZONE: uisf_izone_delete (itemid); break; case NODE_SAMPLE: uisf_sample_delete (itemid); break; case NODE_VBNK_MAP: uisf_vbank_map_delete (itemid); break; default: break; }}static voiduisf_preset_delete (SFItemID itemid){ GtkCTreeNode *node; SFTreeRef *ref; /* Node reference */ GSList *p; SFPreset *pset; UISFont *ui
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -