⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 uif_sfont.c

📁 A GTK sound font editor. Sound font files are used to synthesize instruments from audio samples for
💻 C
📖 第 1 页 / 共 5 页
字号:
  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 + -