void osc_veejay_new_sample(void *info,const char *path, const char *types, void **dargv, void *raw) { lo_arg **argv = (lo_arg**) dargv; int type = argv[0]->i; int token = argv[1]->i; char *str = &(argv[2]->s); veejay_t *v = (veejay_t*) info; void *sample = sample_new( type ); if(!sample) { veejay_msg(0, "Invalid type"); return; } if(sample_open( sample, str,token, v->video_info)) { int new_id = samplebank_add_sample( sample ); const char *type_str = sample_describe_type( type ); sample_set_user_data( sample,info,new_id ); veejay_msg(VEEJAY_MSG_INFO,"Created new %s from %s as Sample %d", type_str, str, new_id ); } else { veejay_msg(VEEJAY_MSG_ERROR,"Could not create sample from %s",token); } }
/* constructor */ void mixer_init(void) { debug ("initializing...\n"); amplitude = DEFAULT_AMPLITUDE; pthread_mutex_init (&preview.mutex, NULL); preview.sample = sample_new ( ); debug ("done\n"); }
sample_t * __r_update_samples(scope_state_t *scope, sample_t *sample, periph_t *pperiph, int per_mode, uint64_t time, uint64_t last_time) { if(time > last_time){ int curr_mode = pperiph->curr_mode; int curr_fvset = pperiph->curr_fvset; int n_modes = pperiph->pclass->nmodes; uint64_t mode_cost = pperiph->pclass->mode_cost[n_modes * curr_fvset + curr_mode]; uint64_t last_change = pperiph->last_change_stamp; if(sample == NULL){ // if end of list create a new sample sample = sample_new (scope, last_time); if (sample == NULL) return NULL; } // now it is not useful to update this sample for this periph anymore sample->per_costs[pperiph->idx].processed = 1; if(sample->time_stamp < last_change){ // already processed ... with previous events. sample->next = __r_update_samples(scope, sample->next, pperiph, per_mode, time, sample->time_stamp); }else{ // not processed uint64_t begin_stamp = 0; uint64_t end_stamp = 0; if(last_time < last_change) begin_stamp = last_change; // or not completely processed else begin_stamp = last_time; if(time > sample->time_stamp) end_stamp = sample->time_stamp; else end_stamp = time; sample->per_costs[pperiph->idx].energy += (end_stamp - begin_stamp) * mode_cost; if(time > sample->time_stamp) // recursion ? sample->next = __r_update_samples(scope, sample->next, pperiph, per_mode, time, sample->time_stamp); } } return sample; }
static void sample_construct (XfcePanelPlugin *plugin) { SamplePlugin *sample; /* setup transation domain */ xfce_textdomain(GETTEXT_PACKAGE, PACKAGE_LOCALE_DIR, "UTF-8"); /* create the plugin */ sample = sample_new (plugin); /* add the ebox to the panel */ gtk_container_add (GTK_CONTAINER (plugin), sample->ebox); /* show the panel's right-click menu on this ebox */ xfce_panel_plugin_add_action_widget (plugin, sample->ebox); /* connect plugin signals */ g_signal_connect (G_OBJECT (plugin), "free-data", G_CALLBACK (sample_free), sample); g_signal_connect (G_OBJECT (plugin), "save", G_CALLBACK (sample_save), sample); g_signal_connect (G_OBJECT (plugin), "size-changed", G_CALLBACK (sample_size_changed), sample); g_signal_connect (G_OBJECT (plugin), "orientation-changed", G_CALLBACK (sample_orientation_changed), sample); /* show the configure menu item and connect signal */ xfce_panel_plugin_menu_show_configure (plugin); g_signal_connect (G_OBJECT (plugin), "configure-plugin", G_CALLBACK (sample_configure), sample); /* show the about menu item and connect signal */ xfce_panel_plugin_menu_show_about (plugin); g_signal_connect (G_OBJECT (plugin), "about", G_CALLBACK (sample_about), NULL); }
Sample* sample_new_from_filename(char* path, gboolean path_alloced) { if (!file_exists(path)) { perr("file not found: %s\n", path); if (path_alloced) g_free(path); return NULL; } Sample* sample = sample_new(); sample->full_path = path_alloced ? path : g_strdup(path); MIME_type* mime_type = type_from_path(path); if (!mime_type) { perr("can not resolve mime-type of file\n"); sample_unref(sample); return NULL; } sample->mimetype = g_strdup_printf("%s/%s", mime_type->media_type, mime_type->subtype); if(mimetype_is_unsupported(mime_type, sample->mimetype)){ dbg(1, "file type \"%s\" not supported.", sample->mimetype); sample_unref(sample); return NULL; } sample->mtime = file_mtime(path); if(!sample->name){ gchar* bn = g_path_get_basename(sample->full_path); sample->name= to_utf8(bn); g_free(bn); } if(!sample->sample_dir){ gchar* dn = g_path_get_dirname(sample->full_path); sample->sample_dir = to_utf8(dn); g_free(dn); } return sample; }
sample_t * get_sample(scope_state_t *scope, uint64_t time) { sample_t *samp = scope->samples_head; if(samp == NULL) samp = sample_new (scope, scope->last_measure_stamp); if(samp->time_stamp != time) //error return NULL; periph_t *pperiph; for(pperiph = scope->head_periphs; pperiph != NULL; pperiph = pperiph->next){ int curr_mode = pperiph->curr_mode; int curr_fvset = pperiph->curr_fvset; int n_modes = pperiph->pclass->nmodes; uint64_t curr_mode_cost = pperiph->pclass->mode_cost[curr_fvset * n_modes + curr_mode]; uint64_t last_change_stamp = pperiph->last_change_stamp; uint64_t update_en = 0; if(((time - last_change_stamp) >= 0) && ((time - last_change_stamp) < scope->sample_period)){ // last mode change occured in this sample ... update the end of sample update_en = curr_mode_cost * (time - last_change_stamp); }else{ if(samp->per_costs[pperiph->idx].processed != 1) update_en = curr_mode_cost * (scope->sample_period); } samp->per_costs[pperiph->idx].energy += update_en; } scope->samples_head = samp->next; scope->last_measure_stamp = samp->time_stamp; return samp; }
int sample_selector_show(int id, GtkWidget* parent_window, SampleTab* sampletab) { enum { RESPONSE_LOAD = 1, RESPONSE_PREVIEW = 2 }; GtkWidget* dialog; raw_box* rawbox; global_settings* settings = settings_get(); last_sample = sample_new(); patch = id; dialog = gtk_file_chooser_dialog_new("Load Sample", GTK_WINDOW(parent_window), GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL); if ((rawbox = raw_box_new(dialog))) { gtk_file_chooser_set_extra_widget(GTK_FILE_CHOOSER(dialog), rawbox->box); } create_filters(dialog); sample_shallow_copy(last_sample, patch_sample_data(patch)); if (last_sample->filename && strcmp(last_sample->filename, "Default") != 0) { gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(dialog), last_sample->filename); gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog), g_path_get_dirname(last_sample->filename)); } else { if ( settings->last_sample_dir) gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog), settings->last_sample_dir); } gtk_dialog_add_button(GTK_DIALOG(dialog), "Loa_d", RESPONSE_LOAD); gtk_dialog_add_button(GTK_DIALOG(dialog), "Pre_view", RESPONSE_PREVIEW); /* we don't always want to auto-preview when the "selection-changed" signal is emitted on a) when the dialog is created, b) when the current-folder is changed. */ rawbox->dont_preview = true; g_timeout_add(250, timeout_cancel_dont_preview, rawbox); g_signal_connect(rawbox->dialog, "current-folder-changed", G_CALLBACK(folder_changed_cb), rawbox); g_signal_connect(rawbox->dialog, "selection-changed", G_CALLBACK(selection_changed_cb), rawbox); again: switch(gtk_dialog_run(GTK_DIALOG(dialog))) { case GTK_RESPONSE_ACCEPT: cb_load(rawbox); break; case RESPONSE_LOAD: cb_load(rawbox); sample_tab_update_waveforms(sampletab); goto again; case RESPONSE_PREVIEW: cb_preview(rawbox); goto again; case GTK_RESPONSE_CANCEL: cb_cancel(); default: break; } gtk_widget_destroy(dialog); sample_free(last_sample); last_sample = 0; return 0; }
Patch* patch_new(void) { int i; Patch* p; p = malloc(sizeof(*p)); if (!p) return 0; p->name[0] = '\0'; p->active = false; p->sample = sample_new(); p->display_index = -1; p->name[0] = '\0'; p->channel = 0; p->root_note = 60; p->lower_note = 60; p->upper_note = 60; p->lower_vel = 0; p->upper_vel = 127; p->cut = 0; p->cut_by = 0; p->play_start = 0; p->play_stop = 0; p->loop_start = 0; p->loop_stop = 0; p->sample_stop = 0; p->marks[WF_MARK_START] = &start_frame; p->marks[WF_MARK_STOP] = &p->sample_stop; p->marks[WF_MARK_PLAY_START] = &p->play_start; p->marks[WF_MARK_PLAY_STOP] = &p->play_stop; p->marks[WF_MARK_LOOP_START] = &p->loop_start; p->marks[WF_MARK_LOOP_STOP] = &p->loop_stop; p->fade_samples = 0; p->xfade_samples = 0; p->porta.active = true; /* but only if PORTAMENTO */ p->porta.thresh = 0.5; /* controller says so... */ p->porta.mod_id = MOD_SRC_MIDI_CC + CC_PORTAMENTO; p->porta_secs.val = 0.05; p->porta_secs.mod_amt = 1.0; p->porta_secs.mod_id = MOD_SRC_MIDI_CC + CC_PORTAMENTO_TIME; p->pitch_steps = 2; p->pitch_bend = 0; p->mono = false; p->legato.active = true; /* but only if mono is on, *AND* */ p->legato.thresh = 0.5; /* LEGATO controller says so... */ p->legato.mod_id = MOD_SRC_MIDI_CC + CC_LEGATO; p->play_mode = PATCH_PLAY_SINGLESHOT; for (i = 0; i < MAX_MOD_SLOTS; ++i) { p->amp.mod_id[i] = MOD_SRC_NONE; p->amp.mod_amt[i] = 0.0; p->pan.mod_id[i] = MOD_SRC_NONE; p->pan.mod_amt[i] = 0.0; p->ffreq.mod_id[i] = MOD_SRC_NONE; p->ffreq.mod_amt[i] = 0.0; p->freso.mod_id[i] = MOD_SRC_NONE; p->freso.mod_amt[i] = 0.0; p->pitch.mod_id[i] = MOD_SRC_NONE; p->pitch.mod_amt[i] = 0.0; p->mod_pitch_min[i] = 1.0; p->mod_pitch_max[i] = 1.0; } p->amp.val = DEFAULT_AMPLITUDE; p->amp.vel_amt = 1.0; p->amp.key_amt = 0.0; p->pan.val = 0.0; p->pan.vel_amt = 0; p->pan.key_amt = 0.0; p->ffreq.val = 1.0; p->ffreq.vel_amt = 0; p->ffreq.key_amt = 0; p->freso.val = 0.0; p->freso.vel_amt = 0; p->freso.key_amt = 0; p->pitch.val = 0.0; p->pitch.vel_amt = 0; p->pitch.key_amt = 1.0; for (i = 0; i < PATCH_MAX_LFOS; ++i) { lfo_params_init(&p->glfo_params[i], 1.0, LFO_SHAPE_SINE); p->glfo[i] = lfo_new(); /* init tables to NULL */ p->glfo_table[i] = 0; } patch_set_global_lfo_buffers(p, patch_buffersize); /* only the params for the voice lfo can be set at this stage */ for (i = 0; i < VOICE_MAX_LFOS; ++i) lfo_params_init(&p->vlfo_params[i], 1.0, LFO_SHAPE_SINE); for (i = 0; i < VOICE_MAX_ENVS; i++) adsr_params_init(&p->env_params[i], 0.005, 0.025); for (i = 0; i < PATCH_VOICE_COUNT; ++i) { p->voices[i] = patch_voice_new(); } p->last_note = -1; pthread_mutex_init(&p->mutex, NULL); debug("********************************\n"); debug("created patch:%s [%p]\n", p->name, p); debug("********************************\n"); return p; }