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