You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							320 lines
						
					
					
						
							11 KiB
						
					
					
				
			
		
		
	
	
							320 lines
						
					
					
						
							11 KiB
						
					
					
				| # --- T2-COPYRIGHT-NOTE-BEGIN --- | |
| # This copyright note is auto-generated by ./scripts/Create-CopyPatch. | |
| #  | |
| # T2 SDE: package/.../mixmagic/pitch.patch | |
| # Copyright (C) 2004 - 2006 The T2 SDE Project | |
| # Copyright (C) 1998 - 2003 Clifford Wolf | |
| #  | |
| # More information can be found in the files COPYING and README. | |
| #  | |
| # This patch file is dual-licensed. It is available under the license the | |
| # patched project is licensed under, as long as it is an OpenSource license | |
| # as defined at http://www.opensource.org/ (e.g. BSD, X11) or under the terms | |
| # of the GNU General Public License as published by the Free Software | |
| # Foundation; either version 2 of the License, or (at your option) any later | |
| # version. | |
| # --- T2-COPYRIGHT-NOTE-END --- | |
|  | |
|  | |
| This patch adds pitch shifting to mixmagic. (by Clifford) | |
|  | |
| --- ./src/block.c.orig	Sat Mar  9 11:06:32 2002 | |
| +++ ./src/block.c	Mon May 13 20:16:56 2002 | |
| @@ -834,6 +834,7 @@ | |
|   | |
|  	b->start = block->start + MIN (block->selection_start, block->selection_end); | |
|  	b->length = ABS (block->selection_start - block->selection_end); | |
| +	block->length_unpitched = block->length * block->pitch; | |
|  	b->sample = sample_ref (block->sample); | |
|  	b->position = block->position + MIN (block->selection_start, block->selection_end);  | |
|   | |
| @@ -1143,6 +1144,8 @@ | |
|  				newBlock->sample = sample_ref (block->sample); | |
|  				newBlock->start = block->start; | |
|  				newBlock->length = block->length; | |
| +				newBlock->length_unpitched = block->length_unpitched; | |
| +				newBlock->pitch = block->pitch; | |
|  				 | |
|  				/* Position it on the same place as the popup menu */ | |
|  				newBlock->position = block->position; | |
| @@ -1183,8 +1186,8 @@ | |
|  block_draw (Block *block) | |
|  { | |
|  	gint i, width, height; | |
| -	gint offset, value; | |
| -	GString * start_gs , * len_gs ; | |
| +	gint offset, offset_start, value; | |
| +	GString * start_gs , * len_gs , * pitch_gs; | |
|   | |
|  	g_assert (IS_BLOCK(block)); | |
|   | |
| @@ -1210,11 +1213,13 @@ | |
|  			    width, | |
|  			    height); | |
|   | |
| -	offset = block->start / INDEX_RATIO; | |
| +	offset_start = block->start / INDEX_RATIO; | |
| +	offset = 0; | |
|   | |
|  	for (i = 0; i < width;i++) { | |
|  		value = index_get_average (block->sample->index,  | |
| -					   offset, block->start / INDEX_RATIO, | |
| +					   offset_start + offset * block->pitch, | |
| +		                           block->start / INDEX_RATIO, | |
|  					   block->track->song->x_scale / INDEX_RATIO,  | |
|  					   block->sample->length / INDEX_RATIO / 2) / ((float)0x7f / height); | |
|  		gdk_draw_line (block->pixmap, | |
| @@ -1254,13 +1259,42 @@ | |
|   | |
|  	/* Draw title */ | |
|   | |
| +	gdk_draw_text  (block->pixmap, | |
| +		       GTK_WIDGET(block)->style->font, | |
| +		       GTK_WIDGET(block)->style->fg_gc[GTK_WIDGET(block)->state], | |
| +		       10, 15, | |
| +		       "F:", | |
| +		       2); | |
| + | |
|  	gdk_draw_text (block->pixmap, | |
|  		       GTK_WIDGET(block)->style->font, | |
|  		       GTK_WIDGET(block)->style->fg_gc[GTK_WIDGET(block)->state], | |
| -		       0, 10, | |
| +		       25, 15, | |
|  		       block->sample->id, | |
|  		       strlen (block->sample->id)); | |
|   | |
| +	/* Draw Pitch Value */ | |
| + | |
| +	pitch_gs = g_string_sized_new(20); | |
| + | |
| +	pitch_gs->len = g_snprintf(pitch_gs->str, 20, "%c%02d.%02d %%", | |
| +		block->pitch == 0 ? '0' : (block->pitch > 0 ? '+' : '-'), | |
| +		abs(block->pitch*10000 - 10000) / 100, | |
| +		abs(block->pitch*10000 - 10000) % 100); | |
| + | |
| +	gdk_draw_text  (block->pixmap, | |
| +		       GTK_WIDGET(block)->style->font, | |
| +		       GTK_WIDGET(block)->style->fg_gc[GTK_WIDGET(block)->state], | |
| +		       10, 30, | |
| +		       "P:", | |
| +		       2); | |
| + | |
| +	gdk_draw_text (block->pixmap, | |
| +		       GTK_WIDGET(block)->style->font, | |
| +		       GTK_WIDGET(block)->style->fg_gc[GTK_WIDGET(block)->state], | |
| +		       25, 30, | |
| +		       pitch_gs->str, | |
| +		       pitch_gs->len); | |
|   | |
|  	/* Draw start time */ | |
|   | |
| @@ -1281,14 +1315,14 @@ | |
|  	gdk_draw_text  (block->pixmap, | |
|  		       GTK_WIDGET(block)->style->font, | |
|  		       GTK_WIDGET(block)->style->fg_gc[GTK_WIDGET(block)->state], | |
| -		       0, height - 20, | |
| +		       10, height - 20, | |
|  		       "S:", | |
|  		       2); | |
|   | |
|  	gdk_draw_text  (block->pixmap, | |
|  		       GTK_WIDGET(block)->style->font, | |
|  		       GTK_WIDGET(block)->style->fg_gc[GTK_WIDGET(block)->state], | |
| -		       15, height - 20, | |
| +		       25, height - 20, | |
|  		       start_gs->str, | |
|  		       start_gs->len); | |
|   | |
| @@ -1313,14 +1347,14 @@ | |
|  	gdk_draw_text (block->pixmap, | |
|  		       GTK_WIDGET(block)->style->font, | |
|  		       GTK_WIDGET(block)->style->fg_gc[GTK_WIDGET(block)->state], | |
| -		       0, height - 5, | |
| +		       10, height - 5, | |
|  		       "L:", | |
|  		       2); | |
|   | |
|  	gdk_draw_text (block->pixmap, | |
|  		       GTK_WIDGET(block)->style->font, | |
|  		       GTK_WIDGET(block)->style->fg_gc[GTK_WIDGET(block)->state], | |
| -		       15, height - 5, | |
| +		       25, height - 5, | |
|  		       len_gs->str, | |
|  		       len_gs->len); | |
|   | |
| @@ -1481,6 +1515,73 @@ | |
|  	gtk_widget_draw (GTK_WIDGET (block), NULL); | |
|  } | |
|   | |
| +static void block_set_pitch (GtkWidget *widget, Block *block, gfloat newpitch) { | |
| +	block->pitch = newpitch; | |
| +	block->length = block->length_unpitched / newpitch; | |
| +	block_update (block); | |
| +	song_set_dirty (block->track->song, TRUE); | |
| +} | |
| + | |
| +static void block_dec_pitch_1 (GtkWidget *widget, Block *block) | |
| +	{ block_set_pitch (widget, block, block->pitch - 0.0001); } | |
| + | |
| +static void block_dec_pitch_3 (GtkWidget *widget, Block *block) | |
| +	{ block_set_pitch (widget, block, block->pitch - 0.0003); } | |
| + | |
| +static void block_dec_pitch_5 (GtkWidget *widget, Block *block) | |
| +	{ block_set_pitch (widget, block, block->pitch - 0.0005); } | |
| + | |
| +static void block_dec_pitch_10 (GtkWidget *widget, Block *block) | |
| +	{ block_set_pitch (widget, block, block->pitch - 0.0010); } | |
| + | |
| +static void block_dec_pitch_30 (GtkWidget *widget, Block *block) | |
| +	{ block_set_pitch (widget, block, block->pitch - 0.0030); } | |
| + | |
| +static void block_dec_pitch_50 (GtkWidget *widget, Block *block) | |
| +	{ block_set_pitch (widget, block, block->pitch - 0.0050); } | |
| + | |
| +static void block_dec_pitch_100 (GtkWidget *widget, Block *block) | |
| +	{ block_set_pitch (widget, block, block->pitch - 0.0100); } | |
| + | |
| +static void block_dec_pitch_300 (GtkWidget *widget, Block *block) | |
| +	{ block_set_pitch (widget, block, block->pitch - 0.0300); } | |
| + | |
| +static void block_dec_pitch_500 (GtkWidget *widget, Block *block) | |
| +	{ block_set_pitch (widget, block, block->pitch - 0.0500); } | |
| + | |
| + | |
| +static void block_pitch_reset (GtkWidget *widget, Block *block) | |
| +	{ block_set_pitch (widget, block, 1); } | |
| + | |
| + | |
| +static void block_inc_pitch_1 (GtkWidget *widget, Block *block) | |
| +	{ block_set_pitch (widget, block, block->pitch + 0.0001); } | |
| + | |
| +static void block_inc_pitch_3 (GtkWidget *widget, Block *block) | |
| +	{ block_set_pitch (widget, block, block->pitch + 0.0003); } | |
| + | |
| +static void block_inc_pitch_5 (GtkWidget *widget, Block *block) | |
| +	{ block_set_pitch (widget, block, block->pitch + 0.0005); } | |
| + | |
| +static void block_inc_pitch_10 (GtkWidget *widget, Block *block) | |
| +	{ block_set_pitch (widget, block, block->pitch + 0.0010); } | |
| + | |
| +static void block_inc_pitch_30 (GtkWidget *widget, Block *block) | |
| +	{ block_set_pitch (widget, block, block->pitch + 0.0030); } | |
| + | |
| +static void block_inc_pitch_50 (GtkWidget *widget, Block *block) | |
| +	{ block_set_pitch (widget, block, block->pitch + 0.0050); } | |
| + | |
| +static void block_inc_pitch_100 (GtkWidget *widget, Block *block) | |
| +	{ block_set_pitch (widget, block, block->pitch + 0.0100); } | |
| + | |
| +static void block_inc_pitch_300 (GtkWidget *widget, Block *block) | |
| +	{ block_set_pitch (widget, block, block->pitch + 0.0300); } | |
| + | |
| +static void block_inc_pitch_500 (GtkWidget *widget, Block *block) | |
| +	{ block_set_pitch (widget, block, block->pitch + 0.0500); } | |
| + | |
| + | |
|  static void | |
|  block_select_all (GtkWidget *widget, Block *block) | |
|  { | |
| @@ -1534,6 +1635,26 @@ | |
|  	GNOMEUIINFO_SEPARATOR, | |
|  	GNOMEUIINFO_ITEM_NONE (N_("Convert to loopblock"), N_("Convert to loopblock"), block_convert_to_loopblock), | |
|  	GNOMEUIINFO_SEPARATOR, | |
| +	GNOMEUIINFO_ITEM_NONE (N_("Pitch -5.00"), N_(""), block_dec_pitch_500), | |
| +	GNOMEUIINFO_ITEM_NONE (N_("Pitch -3.00"), N_(""), block_dec_pitch_300), | |
| +	GNOMEUIINFO_ITEM_NONE (N_("Pitch -1.00"), N_(""), block_dec_pitch_100), | |
| +	GNOMEUIINFO_ITEM_NONE (N_("Pitch -0.50"), N_(""), block_dec_pitch_50), | |
| +	GNOMEUIINFO_ITEM_NONE (N_("Pitch -0.30"), N_(""), block_dec_pitch_30), | |
| +	GNOMEUIINFO_ITEM_NONE (N_("Pitch -0.10"), N_(""), block_dec_pitch_10), | |
| +	GNOMEUIINFO_ITEM_NONE (N_("Pitch -0.05"), N_(""), block_dec_pitch_5), | |
| +	GNOMEUIINFO_ITEM_NONE (N_("Pitch -0.03"), N_(""), block_dec_pitch_3), | |
| +	GNOMEUIINFO_ITEM_NONE (N_("Pitch -0.01"), N_(""), block_dec_pitch_1), | |
| +	GNOMEUIINFO_ITEM_NONE (N_("Reset Pitch"), N_(""), block_pitch_reset), | |
| +	GNOMEUIINFO_ITEM_NONE (N_("Pitch +0.01"), N_(""), block_inc_pitch_1), | |
| +	GNOMEUIINFO_ITEM_NONE (N_("Pitch +0.03"), N_(""), block_inc_pitch_3), | |
| +	GNOMEUIINFO_ITEM_NONE (N_("Pitch +0.05"), N_(""), block_inc_pitch_5), | |
| +	GNOMEUIINFO_ITEM_NONE (N_("Pitch +0.10"), N_(""), block_inc_pitch_10), | |
| +	GNOMEUIINFO_ITEM_NONE (N_("Pitch +0.30"), N_(""), block_inc_pitch_30), | |
| +	GNOMEUIINFO_ITEM_NONE (N_("Pitch +0.50"), N_(""), block_inc_pitch_50), | |
| +	GNOMEUIINFO_ITEM_NONE (N_("Pitch +1.00"), N_(""), block_inc_pitch_100), | |
| +	GNOMEUIINFO_ITEM_NONE (N_("Pitch +3.00"), N_(""), block_inc_pitch_300), | |
| +	GNOMEUIINFO_ITEM_NONE (N_("Pitch +5.00"), N_(""), block_inc_pitch_500), | |
| +	GNOMEUIINFO_SEPARATOR, | |
|  	GNOMEUIINFO_ITEM_NONE (N_("Select all"), N_("Make the selection cover the whole block"), block_select_all), | |
|  	GNOMEUIINFO_END | |
|  }; | |
| @@ -1640,24 +1761,30 @@ | |
|  mix_into_buffer (Block *block, gint16 *buffer, gint position, gint length) | |
|  { | |
|  	gint16 *data; | |
| -	gint i; | |
| +	gint i, data_offset, data_xoffset; | |
|  	 | |
| -	data = (gint16 *)(block->sample->data +  | |
| -			  (block->start + position - block->position) * block->sample->byte_p_spl); | |
| -		 | |
| -	for (i = 0;i < length / (sizeof (guint16) * 2);i++) { | |
| +	data = (gint16 *)(block->sample->data + | |
| +				(block->start - block->position) * | |
| +				block->sample->byte_p_spl); | |
| +	data_offset = position; | |
| + | |
| +	for (i = 0; i < length / (sizeof (guint16) * 2); i++) { | |
| + | |
| +		data_xoffset = data_offset * block->pitch; | |
| +		data_xoffset *= block->sample->num_channels; | |
|   | |
|  		mixer_mix_sample_into_buffer (buffer, | |
| -					      data, | |
| +					      data + data_xoffset, | |
|  					      block->amp_env,  | |
|  					      block->pan_env,  | |
|  					      block->track->amp, | |
|  					      block->track->pan, | |
| -					      position - block->position + i, block->sample->num_channels); | |
| +					      position - block->position + i, | |
| +					      block->sample->num_channels); | |
|  		 | |
| -		data += block->sample->num_channels; | |
| +		data_offset++; | |
|  		buffer += 2; | |
|  	} | |
|  } | |
|   | |
|  /* | |
| @@ -1675,8 +1813,11 @@ | |
|  	 | |
|  	block->start = atoi ((ptr = xmlGetProp (node, "start"))); | |
|  	g_free (ptr); | |
| -	block->length = atoi ((ptr = xmlGetProp (node, "length"))); | |
| +	block->length_unpitched = atoi ((ptr = xmlGetProp (node, "length"))); | |
|  	g_free (ptr); | |
| +	block->pitch = (float)atoi ((ptr = xmlGetProp (node, "pitch"))) / 10000; | |
| +	g_free (ptr); | |
| +	block->length = (float)block->length_unpitched * block->pitch; | |
|  	block->position = atoi ((ptr = xmlGetProp (node, "position"))); | |
|  	g_free (ptr); | |
|  	ptr = xmlGetProp (node, "sample"); | |
| --- ./src/track.c.orig	Tue Mar 12 06:39:42 2002 | |
| +++ ./src/track.c	Mon Mar 11 20:53:32 2002 | |
| @@ -328,6 +328,8 @@ | |
|   | |
|  		block->start = 0; | |
|  		block->length = sample_get_length(block->sample); | |
| +		block->length_unpitched = sample_get_length(block->sample); | |
| +		block->pitch=1; | |
|   | |
|  		/* Position it on the same place as the popup menu */ | |
|  		block->position = (x + (gint)(GTK_LAYOUT (track->layout)->hadjustment->value)) * track->song->x_scale; | |
| --- ./src/block.h.orig	Mon Mar 11 20:47:57 2002 | |
| +++ ./src/block.h	Mon Mar 11 20:37:16 2002 | |
| @@ -89,6 +89,9 @@ | |
|  	gint length;			/* The length of this block */ | |
|  	gint position;			/* Position in time */ | |
|   | |
| +	gfloat pitch;			/* Pitch shifting (in %) */ | |
| +	gint length_unpitched;		/* The length before pitch is applied */ | |
| + | |
|  	Sample *sample;			/* The sample assosiated with this block */ | |
|   | |
|  	GList *amp_env;			/* Pointer to this blocks amplitude envelope or NULL */
 | |
| 
 |