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
						
					
					
				# --- SDE-COPYRIGHT-NOTE-BEGIN --- | 
						|
# This copyright note is auto-generated by ./scripts/Create-CopyPatch. | 
						|
# | 
						|
# Filename: 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. | 
						|
# --- SDE-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 */
 | 
						|
 |