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.

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