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 */
|
|
|