diff -urN soundtracker-0.5.1/AUTHORS soundtracker-0.5.2/AUTHORS --- soundtracker-0.5.1/AUTHORS Sat Mar 25 11:30:29 2000 +++ soundtracker-0.5.2/AUTHORS Mon Mar 27 12:17:47 2000 @@ -58,6 +58,8 @@ (track editor IT-style stuff) Jason Nunn (gz zip bz2 archive handler) +Luc Tanguay + (MIDI controller input) Translations diff -urN soundtracker-0.5.1/ChangeLog soundtracker-0.5.2/ChangeLog --- soundtracker-0.5.1/ChangeLog Sat Mar 25 11:30:45 2000 +++ soundtracker-0.5.2/ChangeLog Mon Mar 27 12:43:28 2000 @@ -1,4 +1,35 @@ +2000-03-27 Michael Krause + + * Released v0.5.2 + + * po: Updated ja.po + +2000-03-27 Luc Tanguay + + * app/midi.[ch], app/midi-utils.[ch]: code to add MIDI input. + +2000-03-26 Michael Krause + + * app/gui.c (gui_init): Status bar is in a GNOME dock item now and + can be moved around. Non-GNOME bar is at the bottom of the window + by default. + + * app/gui-subs.c (statusbar_update): Added new argument + "force_update" which forces a GUI update in order to make the + "Loading XXX..." messages actually visible. + + * app/envelope-box.c (envelope_box_point_event): If a point is + dragged out of sight, the canvas scrolls to the new location as + soon as the button has been released. + 2000-03-25 Michael Krause + + * app/envelope-box.c (envelope_box_canvas_event): Middle mouse + button scrolls the canvas (just like the sample display widget). + (envelope_box_canvas_event): Middle mouse button plus Shift zooms + in and out. + (spin_offset_changed): + (envelope_box_delete_point): Adjust canvas max x. * Released v0.5.1 diff -urN soundtracker-0.5.1/Makefile.am soundtracker-0.5.2/Makefile.am --- soundtracker-0.5.1/Makefile.am Wed Mar 15 21:02:34 2000 +++ soundtracker-0.5.2/Makefile.am Sat Mar 25 11:44:03 2000 @@ -31,11 +31,11 @@ ## disthelp is to be executed by root so that the rpm -tb works well disthelp: make dist - cp soundtracker-$(VERSION).tar.gz /home/rawstyle/dev/soundtracker/FTP/soundtracker/v0.3/ + cp soundtracker-$(VERSION).tar.gz /home/rawstyle/dev/soundtracker/FTP/soundtracker/v0.5/ make bindist - cp soundtracker-$(VERSION)-bin.tar.gz /home/rawstyle/dev/soundtracker/FTP/soundtracker/v0.3/ + cp soundtracker-$(VERSION)-bin.tar.gz /home/rawstyle/dev/soundtracker/FTP/soundtracker/v0.5/ rpm -tb soundtracker-$(VERSION).tar.gz - cp /usr/src/redhat/RPMS/i386/soundtracker-$(VERSION)-* /home/rawstyle/dev/soundtracker/FTP/soundtracker/v0.3/ + cp /usr/src/redhat/RPMS/i386/soundtracker-$(VERSION)-* /home/rawstyle/dev/soundtracker/FTP/soundtracker/v0.5/ chown -R rawstyle.rawstyle /home/rawstyle/dev/soundtracker/* diff -urN soundtracker-0.5.1/Makefile.in soundtracker-0.5.2/Makefile.in --- soundtracker-0.5.1/Makefile.in Sat Mar 25 11:35:09 2000 +++ soundtracker-0.5.2/Makefile.in Mon Mar 27 12:45:00 2000 @@ -422,11 +422,11 @@ disthelp: make dist - cp soundtracker-$(VERSION).tar.gz /home/rawstyle/dev/soundtracker/FTP/soundtracker/v0.3/ + cp soundtracker-$(VERSION).tar.gz /home/rawstyle/dev/soundtracker/FTP/soundtracker/v0.5/ make bindist - cp soundtracker-$(VERSION)-bin.tar.gz /home/rawstyle/dev/soundtracker/FTP/soundtracker/v0.3/ + cp soundtracker-$(VERSION)-bin.tar.gz /home/rawstyle/dev/soundtracker/FTP/soundtracker/v0.5/ rpm -tb soundtracker-$(VERSION).tar.gz - cp /usr/src/redhat/RPMS/i386/soundtracker-$(VERSION)-* /home/rawstyle/dev/soundtracker/FTP/soundtracker/v0.3/ + cp /usr/src/redhat/RPMS/i386/soundtracker-$(VERSION)-* /home/rawstyle/dev/soundtracker/FTP/soundtracker/v0.5/ chown -R rawstyle.rawstyle /home/rawstyle/dev/soundtracker/* # Tell versions [3.59,3.63) of GNU make to not export all variables. diff -urN soundtracker-0.5.1/NEWS soundtracker-0.5.2/NEWS --- soundtracker-0.5.1/NEWS Sat Mar 25 11:32:38 2000 +++ soundtracker-0.5.2/NEWS Mon Mar 27 12:43:28 2000 @@ -4,6 +4,12 @@ responsible for having coded a particular feature (full names in AUTHORS file). +What is new in soundtracker-0.5.2 (27-Mar-2000): + +* Simple MIDI input support for ALSA (ltanguay) +* Improved and debugged envelope editor (see README) +* Draggable status bar + What is new in soundtracker-0.5.1 (25-Mar-2000): * Status bar with online tracker command help and a diff -urN soundtracker-0.5.1/README soundtracker-0.5.2/README --- soundtracker-0.5.1/README Sat Mar 25 11:08:30 2000 +++ soundtracker-0.5.2/README Mon Mar 27 12:43:30 2000 @@ -4,7 +4,7 @@ http://www.soundtracker.org/ -------------------------------------------------------------- - v0.5.1 --- THIS IS A DEVELOPMENT VERSION! + v0.5.2 --- THIS IS A DEVELOPMENT VERSION! Written and (C) 1998-2000 by Michael Krause [ raw style / lego ] @@ -104,10 +104,26 @@ Delete Clear part of the channel the cursor is over Backspace Delete current position and pull rest of track upwards -Insert Shift rest of track upwards and insert a row +Insert Shift rest of track downwards and insert a row Any other keys Play notes on the keyboard. +If SoundTracker is unable to configure the notes on your keyboard on +its own, you must use the "Keyboard Configuration" dialog to set up +your keyboard. In any case, there you will also have to configure the +key that inserts the "key off" note into a pattrern. + +Some of the other short cuts can be changed in the usual GTK+ way - go +to the relevant menu entry, put the mouse over it, and just before +releasing the mouse button, hit the desired key combination! + + INSTRUMENT EDITOR + ----------------- + +In the Envelope editor, use Ctrl + middle mouse button in order to +zoom in and out of the envelope. Use middle mouse button alone to pan +the display. Use left mouse button to move and add points. + SAMPLE EDITOR ------------- @@ -134,7 +150,9 @@ SoundTracker still needs a detailed documentation. If you want to help out with this, you should become familiar with DocBook or similar SGML -tools first. +tools first. I'd like to have the documentation in a format that makes +it easy to generate both printed output (read: "TeX") and online +documentation. You may of course ask for help in the mailing list (see below)! @@ -165,10 +183,9 @@ Note that if you have joined `soundtracker-discuss', there's no need to join `soundtracker-announce', as I crosspost all the announcements -to both lists. Think of `soundtracker-announce' as a subset of -`soundtracker-discuss' :-) +to both lists. -Use `unsubscribe' to cancel your list membership. +Use `unsubscribe' in the Subject to cancel your list membership. Once you have joined `soundtracker-discuss', you send mails to the list by writing to `soundtracker-discuss@soundtracker.org'. diff -urN soundtracker-0.5.1/TODO soundtracker-0.5.2/TODO --- soundtracker-0.5.1/TODO Sat Mar 25 11:14:59 2000 +++ soundtracker-0.5.2/TODO Mon Mar 27 12:24:11 2000 @@ -1,15 +1,6 @@ things to do and known bugs (in no particular order) ------------------------------------------------------- -"enable/disable status bar" feature; - -make gnome status bar movable, like the menu bar - -call gtk_main() or something after status bar updating, so that while -loading modules/samples the status bar actually changes... - -trackersettings -> tracker_settings - > press CAPSLOCK or something, to enter "hex chooser mode" > type A3 or B0 or 45 or whatever the 2-digit hex code is for your sample > program automatically leaves hexmode and functions return to normal. @@ -40,6 +31,8 @@ ====== GUI ========= +statusbar: gtk_widget_usize() on gtk_clock is ugly... + > * 'Delete' and 'Rename' functions in File page. > * Settings dialog for 'Render WAV' (begin postion, end position, > amplification, WAV frequency, etc.) @@ -122,13 +115,6 @@ MIXER POSITION / CLIPPING INDICATOR: update more often -ENVELOPE-BOX: canvas should scroll if points are moved outside the -current displayed region. - -ENVELOPE-BOX: expand/shrink scroll region after adding points - -ENVELOPE-BOX: init dragging after new point has been set - ENVELOPE-BOX: add a kind of "mixer position" like display ENVELOPE-BOX: make sustain and loop points graphically editable @@ -281,7 +267,7 @@ ====== FUTURE ======= -MIDI +MIDI out Module format plugins (Might be interesting to see what the linux-audio-dev guys are developing) diff -urN soundtracker-0.5.1/app/Makefile.am soundtracker-0.5.2/app/Makefile.am --- soundtracker-0.5.1/app/Makefile.am Sun Mar 19 10:11:15 2000 +++ soundtracker-0.5.2/app/Makefile.am Mon Mar 27 12:19:20 2000 @@ -21,6 +21,8 @@ keys.c keys.h \ main.c main.h \ menubar.c menubar.h \ + midi.c midi.h \ + midi-utils.c midi-utils.h \ mixer.h \ module-info.c module-info.h \ playlist.c playlist.h \ diff -urN soundtracker-0.5.1/app/Makefile.in soundtracker-0.5.2/app/Makefile.in --- soundtracker-0.5.1/app/Makefile.in Sat Mar 25 11:35:21 2000 +++ soundtracker-0.5.2/app/Makefile.in Mon Mar 27 12:45:07 2000 @@ -99,7 +99,7 @@ bin_PROGRAMS = soundtracker -soundtracker_SOURCES = audio.c audio.h audioconfig.c audioconfig.h cheat-sheet.c cheat-sheet.h clavier.c clavier.h driver.h driver-in.h driver-out.h endian-conv.h envelope-box.c envelope-box.h errors.c errors.h extspinbutton.c extspinbutton.h file-operations.c file-operations.h gui-settings.c gui-settings.h gui-subs.c gui-subs.h gui.c gui.h i18n.h instrument-editor.c instrument-editor.h keys.c keys.h main.c main.h menubar.c menubar.h mixer.h module-info.c module-info.h playlist.c playlist.h poll.c poll.h preferences.c preferences.h recode.c recode.h sample-display.c sample-display.h sample-editor.c sample-editor.h scope-group.c scope-group.h st-subs.c st-subs.h time-buffer.c time-buffer.h tips-dialog.c tips-dialog.h track-editor.c track-editor.h tracker.c tracker.h tracker-settings.c tracker-settings.h transposition.c transposition.h xm.c xm.h xm-player.c xm-player.h +soundtracker_SOURCES = audio.c audio.h audioconfig.c audioconfig.h cheat-sheet.c cheat-sheet.h clavier.c clavier.h driver.h driver-in.h driver-out.h endian-conv.h envelope-box.c envelope-box.h errors.c errors.h extspinbutton.c extspinbutton.h file-operations.c file-operations.h gui-settings.c gui-settings.h gui-subs.c gui-subs.h gui.c gui.h i18n.h instrument-editor.c instrument-editor.h keys.c keys.h main.c main.h menubar.c menubar.h midi.c midi.h midi-utils.c midi-utils.h mixer.h module-info.c module-info.h playlist.c playlist.h poll.c poll.h preferences.c preferences.h recode.c recode.h sample-display.c sample-display.h sample-editor.c sample-editor.h scope-group.c scope-group.h st-subs.c st-subs.h time-buffer.c time-buffer.h tips-dialog.c tips-dialog.h track-editor.c track-editor.h tracker.c tracker.h tracker-settings.c tracker-settings.h transposition.c transposition.h xm.c xm.h xm-player.c xm-player.h soundtracker_LDADD = drivers/libdrivers.a mixers/libmixers.a @@ -122,10 +122,10 @@ soundtracker_OBJECTS = audio.o audioconfig.o cheat-sheet.o clavier.o \ envelope-box.o errors.o extspinbutton.o file-operations.o \ gui-settings.o gui-subs.o gui.o instrument-editor.o keys.o main.o \ -menubar.o module-info.o playlist.o poll.o preferences.o recode.o \ -sample-display.o sample-editor.o scope-group.o st-subs.o time-buffer.o \ -tips-dialog.o track-editor.o tracker.o tracker-settings.o \ -transposition.o xm.o xm-player.o +menubar.o midi.o midi-utils.o module-info.o playlist.o poll.o \ +preferences.o recode.o sample-display.o sample-editor.o scope-group.o \ +st-subs.o time-buffer.o tips-dialog.o track-editor.o tracker.o \ +tracker-settings.o transposition.o xm.o xm-player.o soundtracker_DEPENDENCIES = drivers/libdrivers.a mixers/libmixers.a soundtracker_LDFLAGS = CFLAGS = @CFLAGS@ @@ -356,13 +356,15 @@ main.o: main.c ../config.h i18n.h gui.h xm.h mixer.h audio.h \ driver-out.h driver.h time-buffer.h keys.h gui-settings.h \ audioconfig.h tips-dialog.h menubar.h track-editor.h tracker.h \ - tracker-settings.h + tracker-settings.h midi.h menubar.o: menubar.c ../config.h i18n.h menubar.h gui.h gui-subs.h \ main.h xm.h mixer.h st-subs.h keys.h module-info.h \ preferences.h scope-group.h sample-display.h track-editor.h \ tracker.h tracker-settings.h audioconfig.h gui-settings.h \ tips-dialog.h transposition.h cheat-sheet.h file-operations.h \ instrument-editor.h +midi.o: midi.c ../config.h +midi-utils.o: midi-utils.c ../config.h module-info.o: module-info.c i18n.h ../config.h module-info.h gui.h \ gui-subs.h xm.h mixer.h st-subs.h main.h sample-editor.h \ driver-in.h driver.h instrument-editor.h keys.h track-editor.h \ diff -urN soundtracker-0.5.1/app/drivers/Makefile.in soundtracker-0.5.2/app/drivers/Makefile.in --- soundtracker-0.5.1/app/drivers/Makefile.in Sat Mar 25 11:35:26 2000 +++ soundtracker-0.5.2/app/drivers/Makefile.in Mon Mar 27 12:45:11 2000 @@ -221,7 +221,9 @@ alsa2-output.o: alsa2-output.c ../../config.h alsa-input.o: alsa-input.c ../../config.h alsa-output.o: alsa-output.c ../../config.h -esd-output.o: esd-output.c ../../config.h +esd-output.o: esd-output.c ../../config.h ../i18n.h ../driver-out.h \ + ../driver.h ../mixer.h ../errors.h ../gui-subs.h \ + ../preferences.h file-output.o: file-output.c ../../config.h ../i18n.h ../driver-out.h \ ../driver.h ../mixer.h ../errors.h ../gui-subs.h \ ../preferences.h diff -urN soundtracker-0.5.1/app/envelope-box.c soundtracker-0.5.2/app/envelope-box.c --- soundtracker-0.5.1/app/envelope-box.c Sat Feb 19 11:58:33 2000 +++ soundtracker-0.5.2/app/envelope-box.c Sun Mar 26 13:22:24 2000 @@ -112,9 +112,9 @@ EnvelopeBox *e) { double newval = (double)GTK_WIDGET(c)->allocation.height / (64 + 10); - if(newval != e->zoomfactor) { - gnome_canvas_set_pixels_per_unit(c, newval); - e->zoomfactor = newval; + if(newval != e->zoomfactor_base) { + gnome_canvas_set_pixels_per_unit(c, newval * e->zoomfactor_mult); + e->zoomfactor_base = newval; } } @@ -347,6 +347,7 @@ gnome_canvas_item_request_update(e->lines[n - 1]); } gtk_widget_queue_draw(GTK_WIDGET(e->canvas)); // Is needed for anti-aliased canvas + envelope_box_canvas_set_max_x(e, e->current->points[e->current->num_points - 1].pos); #endif } @@ -385,6 +386,70 @@ } #ifdef USE_GNOME + +/* This function returns world coordinates for a click on an item, if + it is given, or else (if item == NULL), assumes the click was on + the root canvas (event->button.x/y contain screen pixel coords in + that case). A little confusing, I admit. */ + +static void +envelope_box_get_world_coords (GnomeCanvasItem *item, + GdkEvent *event, + EnvelopeBox *e, + double *worldx, + double *worldy) +{ + if(item == NULL) { + gnome_canvas_window_to_world(e->canvas, event->button.x, event->button.y, worldx, worldy); + } else { + *worldx = event->button.x; + *worldy = event->button.y; + } +} + +static void +envelope_box_initialize_point_dragging (EnvelopeBox *e, + GnomeCanvasItem *eventitem, + GdkEvent *event, + GnomeCanvasItem *point) +{ + GdkCursor *cursor; + int i; + double x, y; + + envelope_box_get_world_coords(eventitem, event, e, &x, &y); + + cursor = gdk_cursor_new (GDK_FLEUR); + gnome_canvas_item_grab (point, + GDK_POINTER_MOTION_MASK | GDK_BUTTON_RELEASE_MASK, + cursor, + event->button.time); + gdk_cursor_destroy (cursor); + + e->dragfromx = x; + e->dragfromy = y; + + gnome_canvas_get_scroll_offsets(e->canvas, &e->dragging_canvas_from_x, &e->dragging_canvas_from_y); + + e->dragpoint = -1; + for(i = 0; i < 12; i++) { + if(e->points[i] == point) { + e->dragpoint = i; + break; + } + } + g_assert(e->dragpoint != -1); + + e->dragging_item_from_x = e->current->points[e->dragpoint].pos; + e->dragging_item_from_y = e->current->points[e->dragpoint].val; + + envelope_box_block_loop_spins(e, TRUE); + gtk_spin_button_set_value(e->spin_pos, e->dragpoint); + gtk_spin_button_set_value(e->spin_offset, e->current->points[e->dragpoint].pos); + gtk_spin_button_set_value(e->spin_value, e->current->points[e->dragpoint].val); + envelope_box_block_loop_spins(e, FALSE); +} + static gint envelope_box_canvas_event (GnomeCanvas *canvas, GdkEvent *event, @@ -393,34 +458,90 @@ EnvelopeBox *e = ENVELOPE_BOX(data); double x, y; GnomeCanvasItem *item; + GdkCursor *cursor; int i, insert_after = -1; -// GdkEvent ev; switch (event->type) { case GDK_BUTTON_PRESS: - // We need to check if some point has been clicked - gnome_canvas_window_to_world(canvas, event->button.x, event->button.y, &x, &y); - item = gnome_canvas_get_item_at(canvas, x, y); - for(i = 0, insert_after = -1; i < e->current->num_points && e->points[i]; i++) { - if(e->points[i] == item) - return FALSE; - if(e->current->points[i].pos < (int)x) - insert_after = i; + if(event->button.button == 2) { + /* Middle button */ + if(event->button.state & GDK_SHIFT_MASK) { + /* Zoom in/out */ + cursor = gdk_cursor_new (GDK_SIZING); + gnome_canvas_item_grab (GNOME_CANVAS_ITEM(e->group), + GDK_POINTER_MOTION_MASK | GDK_BUTTON_RELEASE_MASK, + cursor, + event->button.time); + gdk_cursor_destroy (cursor); + + e->zooming_canvas = TRUE; + e->dragfromy = event->button.y; + e->zooming_canvas_from_val = e->zoomfactor_mult; + } else { + /* Drag canvas */ + cursor = gdk_cursor_new (GDK_FLEUR); + gnome_canvas_item_grab (GNOME_CANVAS_ITEM(e->group), + GDK_POINTER_MOTION_MASK | GDK_BUTTON_RELEASE_MASK, + cursor, + event->button.time); + gdk_cursor_destroy (cursor); + + e->dragging_canvas = TRUE; + e->dragfromx = event->button.x; + e->dragfromy = event->button.y; + gnome_canvas_get_scroll_offsets(e->canvas, &e->dragging_canvas_from_x, &e->dragging_canvas_from_y); + } + return TRUE; } - // Insert new point - if(envelope_box_insert_point(e, insert_after + 1, (int)x, 64 - CLAMP(y, 0, 64))) { -#if 0 - // Initialize dragging - ev.type = GDK_BUTTON_PRESS; - ev.button.time = event->button.time; - ev.button.x = event->button.x; - ev.button.y = event->button.y; - envelope_box_point_event(e->points[insert_after + 1], &ev, e); -#endif + if(event->button.button == 1) { + /* Find out where to insert new point */ + gnome_canvas_window_to_world(canvas, event->button.x, event->button.y, &x, &y); + item = gnome_canvas_get_item_at(canvas, x, y); + + for(i = 0, insert_after = -1; i < e->current->num_points && e->points[i]; i++) { + if(e->points[i] == item) { + /* An already existing point has been selected. Will + be handled by envelope_box_point_event(). */ + return FALSE; + } + if(e->current->points[i].pos < (int)x) { + insert_after = i; + } + } + + /* Insert new point and start dragging */ + envelope_box_insert_point(e, insert_after + 1, (int)x, 64 - CLAMP(y, 0, 64)); + envelope_box_initialize_point_dragging(e, NULL, event, e->points[insert_after + 1]); + return TRUE; + } + break; + + case GDK_BUTTON_RELEASE: + if(event->button.button == 2) { + gnome_canvas_item_ungrab (GNOME_CANVAS_ITEM(e->group), event->button.time); + e->dragging_canvas = FALSE; + e->zooming_canvas = FALSE; + return TRUE; } break; + + case GDK_MOTION_NOTIFY: + if(e->dragging_canvas) { + int dx = event->motion.x - e->dragfromx; + int dy = event->motion.y - e->dragfromy; + gnome_canvas_scroll_to(e->canvas, (e->dragging_canvas_from_x - dx), e->dragging_canvas_from_y - dy); + } else if(e->zooming_canvas) { + int dy = event->motion.y - e->dragfromy; + e->zoomfactor_mult = e->zooming_canvas_from_val + (-(double)dy / 20); + if(e->zoomfactor_mult < 1.0) { + e->zoomfactor_mult = 1.0; + } + gnome_canvas_set_pixels_per_unit(e->canvas, e->zoomfactor_base * e->zoomfactor_mult); + } + break; + default: break; } @@ -428,14 +549,23 @@ return FALSE; } +static gboolean +envelope_box_canvas_point_out_of_sight (EnvelopeBox *e, + int xpos) +{ + double xposwindow; + + gnome_canvas_world_to_window(e->canvas, xpos, 0, &xposwindow, NULL); + + return xposwindow < 0 || xposwindow >= GTK_WIDGET(e->canvas)->allocation.width; +} + static gint envelope_box_point_event (GnomeCanvasItem *item, GdkEvent *event, gpointer data) { EnvelopeBox *e = ENVELOPE_BOX(data); - GdkCursor *fleur; - int i; switch (event->type) { case GDK_ENTER_NOTIFY: @@ -443,53 +573,47 @@ break; case GDK_LEAVE_NOTIFY: - if (!(event->crossing.state & GDK_BUTTON1_MASK)) + if(!(event->crossing.state & GDK_BUTTON1_MASK)) { gnome_canvas_item_set(item, "fill_color", "#ff0000", NULL); + } break; case GDK_BUTTON_PRESS: - fleur = gdk_cursor_new (GDK_FLEUR); - gnome_canvas_item_grab (item, - GDK_POINTER_MOTION_MASK | GDK_BUTTON_RELEASE_MASK, - fleur, - event->button.time); - gdk_cursor_destroy (fleur); - - e->dragfromx = event->button.x; - e->dragfromy = event->button.y; - e->dragpoint = -1; - for(i = 0; i < 12; i++) { - if(e->points[i] == item) { - e->dragpoint = i; - break; - } - } - g_assert(e->dragpoint != -1); - - envelope_box_block_loop_spins(e, TRUE); - gtk_spin_button_set_value(e->spin_pos, e->dragpoint); - gtk_spin_button_set_value(e->spin_offset, e->current->points[e->dragpoint].pos); - gtk_spin_button_set_value(e->spin_value, e->current->points[e->dragpoint].val); - envelope_box_block_loop_spins(e, FALSE); + envelope_box_initialize_point_dragging(e, item, event, item); + return TRUE; break; case GDK_BUTTON_RELEASE: - gnome_canvas_item_ungrab (item, event->button.time); + if(e->dragpoint != -1) { + gnome_canvas_item_ungrab (item, event->button.time); - // Horizontal adjustment of scrolling region - if(e->dragpoint == e->current->num_points - 1 && e->current->points[e->dragpoint].pos < e->canvas_max_x) { - envelope_box_canvas_set_max_x(e, e->current->points[e->dragpoint].pos); - } + /* Shrink scrolling region horizontally, if necessary */ + if(e->dragpoint == e->current->num_points - 1 && e->current->points[e->dragpoint].pos < e->canvas_max_x) { + envelope_box_canvas_set_max_x(e, e->current->points[e->dragpoint].pos); + } - e->dragpoint = -1; + /* If new location is out of sight, jump there */ + if(envelope_box_canvas_point_out_of_sight(e, e->current->points[e->dragpoint].pos)) { + int dx = e->current->points[e->dragpoint].pos - e->dragging_item_from_x; + int dy = e->current->points[e->dragpoint].val - e->dragging_item_from_y; + double zoom = e->zoomfactor_base * e->zoomfactor_mult; + gnome_canvas_scroll_to(e->canvas, + e->dragging_canvas_from_x + dx * zoom, + e->dragging_canvas_from_y - dy * zoom); + } + + e->dragpoint = -1; + } break; case GDK_MOTION_NOTIFY: if(e->dragpoint != -1 && event->motion.state & GDK_BUTTON1_MASK) { - // Snap to integer grid + /* Snap movement to integer grid */ int dx, dy; + dx = event->motion.x - e->dragfromx; dy = e->dragfromy - event->motion.y; + if(dx || dy) { envelope_box_clip_point_movement(e, e->dragpoint, &dx, &dy); @@ -498,14 +622,14 @@ e->dragfromx += dx; e->dragfromy -= dy; - // Horizontal expansion of scrolling region + /* Expand scrolling region horizontally, if necessary */ if(e->dragpoint == e->current->num_points - 1 && e->current->points[e->dragpoint].pos > e->canvas_max_x) { envelope_box_canvas_set_max_x(e, e->current->points[e->dragpoint].pos); } } } break; - + default: break; } @@ -661,6 +785,13 @@ envelope_box_clip_point_movement(e, p, &dx, NULL); envelope_box_move_point(e, p, dx, 0); + +#ifdef USE_GNOME + // Horizontal adjustment of scrolling region + if(p == e->current->num_points - 1) { + envelope_box_canvas_set_max_x(e, e->current->points[p].pos); + } +#endif } static void @@ -694,14 +825,6 @@ envelope_box_delete_point(e, gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(e->spin_pos))); } -static void envelope_box_init(EnvelopeBox *e) -{ -} - -static void envelope_box_class_init(EnvelopeBoxClass *class) -{ -} - GtkWidget* envelope_box_new(const gchar *label) { EnvelopeBox *e; @@ -779,7 +902,8 @@ memset(e->points, 0, sizeof(e->points)); memset(e->lines, 0, sizeof(e->lines)); - e->zoomfactor = 0.0; + e->zoomfactor_base = 0.0; + e->zoomfactor_mult = 1.0; e->dragpoint = -1; envelope_box_canvas_paint_grid(e); @@ -889,8 +1013,8 @@ "EnvelopeBox", sizeof(EnvelopeBox), sizeof(EnvelopeBoxClass), - (GtkClassInitFunc) envelope_box_class_init, - (GtkObjectInitFunc) envelope_box_init, + (GtkClassInitFunc) NULL, + (GtkObjectInitFunc) NULL, (GtkArgSetFunc) NULL, (GtkArgGetFunc) NULL, }; diff -urN soundtracker-0.5.1/app/envelope-box.h soundtracker-0.5.2/app/envelope-box.h --- soundtracker-0.5.1/app/envelope-box.h Sat Feb 19 11:58:33 2000 +++ soundtracker-0.5.2/app/envelope-box.h Sun Mar 26 12:03:07 2000 @@ -43,6 +43,8 @@ { GtkVBox vbox; + STEnvelope *current; + GtkSpinButton *spin_length; GtkSpinButton *spin_pos; GtkSpinButton *spin_offset; @@ -61,12 +63,18 @@ GnomeCanvasItem *points[ST_MAX_ENVELOPE_POINTS]; GnomeCanvasItem *lines[ST_MAX_ENVELOPE_POINTS - 1]; int canvas_max_x; - double zoomfactor; - double dragfromx, dragfromy; + double zoomfactor_base; + double zoomfactor_mult; + + int dragging_canvas_from_x, dragging_canvas_from_y; /* world coordinates */ + int dragging_item_from_x, dragging_item_from_y; /* world coordinates */ + double dragfromx, dragfromy; /* screen pixel coordinates */ + double zooming_canvas_from_val; + int dragpoint; + gboolean dragging_canvas; + gboolean zooming_canvas; #endif - - STEnvelope *current; }; struct _EnvelopeBoxClass diff -urN soundtracker-0.5.1/app/gui-subs.c soundtracker-0.5.2/app/gui-subs.c --- soundtracker-0.5.1/app/gui-subs.c Wed Mar 22 17:06:33 2000 +++ soundtracker-0.5.2/app/gui-subs.c Sun Mar 26 13:32:58 2000 @@ -47,7 +47,7 @@ }; void -statusbar_update (int message) +statusbar_update (int message, gboolean force_update) { #ifdef USE_GNOME gnome_appbar_set_status(GNOME_APPBAR(status_bar), status_messages[message]); @@ -55,6 +55,10 @@ gtk_statusbar_pop(GTK_STATUSBAR(status_bar), statusbar_context_id); gtk_statusbar_push(GTK_STATUSBAR(status_bar), statusbar_context_id, status_messages[message]); #endif + if(force_update) { + while (gtk_events_pending()) + gtk_main_iteration(); + } } int diff -urN soundtracker-0.5.1/app/gui-subs.h soundtracker-0.5.2/app/gui-subs.h --- soundtracker-0.5.1/app/gui-subs.h Wed Mar 22 17:06:33 2000 +++ soundtracker-0.5.2/app/gui-subs.h Sun Mar 26 13:29:13 2000 @@ -26,7 +26,7 @@ /* values for status bar messages */ enum { - STATUS_IDLE, + STATUS_IDLE = 0, STATUS_PLAYING_SONG, STATUS_PLAYING_PATTERN, STATUS_LOADING_MODULE, @@ -47,7 +47,8 @@ extern GtkWidget *status_bar; extern GtkWidget *st_clock; -void statusbar_update (int message); +void statusbar_update (int message, + gboolean force_gui_update); GtkWidget* file_selection_create (const gchar *title, void(*clickfunc)()); diff -urN soundtracker-0.5.1/app/gui.c soundtracker-0.5.2/app/gui.c --- soundtracker-0.5.1/app/gui.c Sat Mar 25 11:00:52 2000 +++ soundtracker-0.5.2/app/gui.c Sun Mar 26 14:28:48 2000 @@ -385,8 +385,10 @@ if(b) { /* toggle editing mode (only if we haven't been in playing mode) */ gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(editing_toggle), !GUI_EDITING); - if (GTK_TOGGLE_BUTTON(editing_toggle)->active) show_editmode_status(); - else statusbar_update(STATUS_IDLE); + if (GTK_TOGGLE_BUTTON(editing_toggle)->active) + show_editmode_status(); + else + statusbar_update(STATUS_IDLE, FALSE); } handled = TRUE; break; @@ -395,8 +397,10 @@ break; /* toggle editing mode, even if we're in playing mode */ gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(editing_toggle), !GUI_EDITING); - if (GTK_TOGGLE_BUTTON(editing_toggle)->active) show_editmode_status(); - else statusbar_update(STATUS_IDLE); + if (GTK_TOGGLE_BUTTON(editing_toggle)->active) + show_editmode_status(); + else + statusbar_update(STATUS_IDLE, FALSE); handled = TRUE; break; } @@ -670,10 +674,10 @@ switch(a) { case AUDIO_BACKPIPE_PLAYING_STOPPED: - statusbar_update(STATUS_IDLE); - #ifdef USE_GNOME + statusbar_update(STATUS_IDLE, FALSE); +#ifdef USE_GNOME gtk_clock_stop(GTK_CLOCK(st_clock)); - #endif +#endif if(startstop_count > 0) { /* can be equal to zero when the audio subsystem decides to stop playing on its own. */ @@ -686,14 +690,16 @@ break; case AUDIO_BACKPIPE_PLAYING_STARTED: - statusbar_update(STATUS_PLAYING_SONG); - case AUDIO_BACKPIPE_PLAYING_PATTERN_STARTED: + statusbar_update(STATUS_PLAYING_SONG, FALSE); + /* fall through */ - if(a==AUDIO_BACKPIPE_PLAYING_PATTERN_STARTED) statusbar_update(STATUS_PLAYING_PATTERN); - #ifdef USE_GNOME + case AUDIO_BACKPIPE_PLAYING_PATTERN_STARTED: + if(a == AUDIO_BACKPIPE_PLAYING_PATTERN_STARTED) + statusbar_update(STATUS_PLAYING_PATTERN, FALSE); +#ifdef USE_GNOME gtk_clock_set_seconds(GTK_CLOCK(st_clock), 0); gtk_clock_start(GTK_CLOCK(st_clock)); - #endif +#endif startstop_count--; gui_playing_mode = (a == AUDIO_BACKPIPE_PLAYING_STARTED) ? PLAYING_SONG : PLAYING_PATTERN; @@ -726,7 +732,7 @@ case AUDIO_BACKPIPE_ERROR_MESSAGE: case AUDIO_BACKPIPE_WARNING_MESSAGE: - statusbar_update(STATUS_IDLE); + statusbar_update(STATUS_IDLE, FALSE); readpipe(source, &x, sizeof(x)); if(msgbuflen < x + 1) { g_free(msgbuf); @@ -1144,6 +1150,9 @@ { GtkWidget *thing, *mainvbox, *table, *hbox, *frame, *mainvbox0; GdkColormap *colormap; +#ifdef USE_GNOME + GtkWidget *dockitem; +#endif #ifdef USE_GNOME gnome_init("SoundTracker", VERSION, argc, argv); @@ -1422,18 +1431,43 @@ gtk_widget_show(gui_cursmpl_name); gtk_widget_set_usize(gui_cursmpl_name, 100, gui_cursmpl_name->requisition.height); + /* The notebook */ + + notebook = gtk_notebook_new(); + gtk_box_pack_start(GTK_BOX(mainvbox), notebook, TRUE, TRUE, 0); + gtk_notebook_set_tab_pos(GTK_NOTEBOOK(notebook), GTK_POS_TOP); + gtk_widget_show(notebook); + gtk_container_border_width(GTK_CONTAINER(notebook), 0); + gtk_signal_connect(GTK_OBJECT(notebook), "switch_page", + GTK_SIGNAL_FUNC(notebook_page_switched), NULL); + + fileops_page_create(GTK_NOTEBOOK(notebook)); + tracker_page_create(GTK_NOTEBOOK(notebook)); + instrument_page_create(GTK_NOTEBOOK(notebook)); + sample_editor_page_create(GTK_NOTEBOOK(notebook)); + modinfo_page_create(GTK_NOTEBOOK(notebook)); + + // Activate tracker page + gtk_notebook_set_page(GTK_NOTEBOOK(notebook), + 1); + notebook_current_page = 1; + /* Status Bar */ #ifdef USE_GNOME + dockitem = gnome_dock_item_new("Status Bar", (GNOME_DOCK_ITEM_BEH_EXCLUSIVE | GNOME_DOCK_ITEM_BEH_NEVER_VERTICAL)); + gnome_app_add_dock_item(GNOME_APP(mainwindow), GNOME_DOCK_ITEM(dockitem), GNOME_DOCK_BOTTOM, 0, 0, 0); + gtk_widget_show(dockitem); + hbox = gtk_hbox_new(FALSE, 2); - gtk_box_pack_start(GTK_BOX(mainvbox), hbox, FALSE, TRUE, 0); + gtk_container_border_width(GTK_CONTAINER(hbox), 2); + gtk_container_add(GTK_CONTAINER(dockitem), hbox); gtk_widget_show(hbox); status_bar = gnome_appbar_new (FALSE, TRUE, GNOME_PREFERENCES_NEVER); gtk_widget_show (status_bar); - gtk_box_pack_start (GTK_BOX (hbox), status_bar, TRUE, TRUE, 0); - gtk_widget_set_usize (status_bar, -2, 20); + gtk_widget_set_usize (status_bar, 300 , 20); /* so that it doesn't vanish when undocked */ thing = gtk_frame_new (NULL); gtk_widget_show (thing); @@ -1463,27 +1497,6 @@ gtk_statusbar_push(GTK_STATUSBAR(status_bar), statusbar_context_id, WELCOME_MESSAGE); #endif - /* The notebook */ - - notebook = gtk_notebook_new(); - gtk_box_pack_start(GTK_BOX(mainvbox), notebook, TRUE, TRUE, 0); - gtk_notebook_set_tab_pos(GTK_NOTEBOOK(notebook), GTK_POS_TOP); - gtk_widget_show(notebook); - gtk_container_border_width(GTK_CONTAINER(notebook), 0); - gtk_signal_connect(GTK_OBJECT(notebook), "switch_page", - GTK_SIGNAL_FUNC(notebook_page_switched), NULL); - - fileops_page_create(GTK_NOTEBOOK(notebook)); - tracker_page_create(GTK_NOTEBOOK(notebook)); - instrument_page_create(GTK_NOTEBOOK(notebook)); - sample_editor_page_create(GTK_NOTEBOOK(notebook)); - modinfo_page_create(GTK_NOTEBOOK(notebook)); - - // Activate tracker page - gtk_notebook_set_page(GTK_NOTEBOOK(notebook), - 1); - notebook_current_page = 1; - /* capture all key presses */ gtk_widget_add_events(GTK_WIDGET(mainwindow), GDK_KEY_RELEASE_MASK); gtk_signal_connect(GTK_OBJECT(mainwindow), "key_press_event", GTK_SIGNAL_FUNC(keyevent), (gpointer)1); diff -urN soundtracker-0.5.1/app/instrument-editor.c soundtracker-0.5.2/app/instrument-editor.c --- soundtracker-0.5.1/app/instrument-editor.c Sat Mar 25 11:06:09 2000 +++ soundtracker-0.5.2/app/instrument-editor.c Sun Mar 26 13:30:48 2000 @@ -148,9 +148,9 @@ f = fopen(fn, "rb"); if(f) { - statusbar_update(STATUS_LOADING_INSTRUMENT); + statusbar_update(STATUS_LOADING_INSTRUMENT, TRUE); xm_load_xi(instr, f); - statusbar_update(STATUS_INSTRUMENT_LOADED); + statusbar_update(STATUS_INSTRUMENT_LOADED, FALSE); fclose(f); } else { error_error(_("Can't open file.")); @@ -171,9 +171,9 @@ f = fopen(fn, "wb"); if(f) { - statusbar_update(STATUS_SAVING_INSTRUMENT); + statusbar_update(STATUS_SAVING_INSTRUMENT, TRUE); xm_save_xi(instr, f); - statusbar_update(STATUS_INSTRUMENT_SAVED); + statusbar_update(STATUS_INSTRUMENT_SAVED, FALSE); fclose(f); } else { error_error(_("Can't open file.")); diff -urN soundtracker-0.5.1/app/main.c soundtracker-0.5.2/app/main.c --- soundtracker-0.5.1/app/main.c Thu Mar 23 19:56:53 2000 +++ soundtracker-0.5.2/app/main.c Mon Mar 27 12:22:24 2000 @@ -35,6 +35,7 @@ #include "tips-dialog.h" #include "menubar.h" #include "track-editor.h" +#include "midi.h" #include #include @@ -155,6 +156,9 @@ if(gui_init(argc, argv)) { audioconfig_load_config(); track_editor_load_config(); +#if defined(DRIVER_ALSA_050) + midi_init(); +#endif gtk_main(); diff -urN soundtracker-0.5.1/app/midi-utils.c soundtracker-0.5.2/app/midi-utils.c --- soundtracker-0.5.1/app/midi-utils.c Thu Jan 1 01:00:00 1970 +++ soundtracker-0.5.2/app/midi-utils.c Mon Mar 27 12:20:50 2000 @@ -0,0 +1,454 @@ +/* + * Copyright (C) 2000 Luc Tanguay + * Copyright (C) 1998-2000 Michael Krause + * + * This program is free software; you can redistribute it and/or modify + * it 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. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#include + +#if defined(DRIVER_ALSA_050) + +#include +#include "midi-utils.h" + +/* Next array taken from alsa-lib-0.5.5/test/seq-decode.c */ + +static char *event_names[256] = { + /* 0 */ "System", + /* 1 */ "Result", + /* 2 */ "Reserved 2", + /* 3 */ "Reserved 3", + /* 4 */ "Reserved 4", + /* 5 */ "Note", + /* 6 */ "Note On", + /* 7 */ "Note Off", + /* 8 */ "Key Pressure", + /* 9 */ "Reserved 9", + /* 10 */ "Controller", + /* 11 */ "Program Change", + /* 12 */ "Channel Pressure", + /* 13 */ "Pitchbend", + /* 14 */ "Control14", + /* 15 */ "Nonregparam", + /* 16 */ "Regparam", + /* 17 */ "Reserved 17", + /* 18 */ "Reserved 18", + /* 19 */ "Reserved 19", + /* 20 */ "Song Position", + /* 21 */ "Song Select", + /* 22 */ "Qframe", + /* 23 */ "SMF Time Signature", + /* 24 */ "SMF Key Signature", + /* 25 */ "Reserved 25", + /* 26 */ "Reserved 26", + /* 27 */ "Reserved 27", + /* 28 */ "Reserved 28", + /* 29 */ "Reserved 29", + /* 30 */ "Start", + /* 31 */ "Continue", + /* 32 */ "Stop", + /* 33 */ "Set Position Tick", + /* 34 */ "Set Position Time", + /* 35 */ "Tempo", + /* 36 */ "Clock", + /* 37 */ "Tick", + /* 38 */ "Reserved 38", + /* 39 */ "Reserved 39", + /* 40 */ "Tune Request", + /* 41 */ "Reset", + /* 42 */ "Active Sensing", + /* 43 */ "Reserved 43", + /* 44 */ "Reserved 44", + /* 45 */ "Reserved 45", + /* 46 */ "Reserved 46", + /* 47 */ "Reserved 47", + /* 48 */ "Reserved 48", + /* 49 */ "Reserved 49", + /* 50 */ "Echo", + /* 51 */ "OSS", + /* 52 */ "Reserved 52", + /* 53 */ "Reserved 53", + /* 54 */ "Reserved 54", + /* 55 */ "Reserved 55", + /* 56 */ "Reserved 56", + /* 57 */ "Reserved 57", + /* 58 */ "Reserved 58", + /* 59 */ "Reserved 59", + /* 60 */ "Client Start", + /* 61 */ "Client Exit", + /* 62 */ "Client Change", + /* 63 */ "Port Start", + /* 64 */ "Port Exit", + /* 65 */ "Port Change", + /* 66 */ "Port Subscribed", + /* 67 */ "Port Used", + /* 68 */ "Port Unsubscribed", + /* 69 */ "Port Unused", + /* 70 */ "Sample", + /* 71 */ "Sample Cluster", + /* 72 */ "Sample Start", + /* 73 */ "Sample Stop", + /* 74 */ "Sample Freq", + /* 75 */ "Sample Volume", + /* 76 */ "Sample Loop", + /* 77 */ "Sample Position", + /* 78 */ "Sample Private1", + /* 79 */ "Reserved 79", + /* 80 */ "Reserved 80", + /* 81 */ "Reserved 81", + /* 82 */ "Reserved 82", + /* 83 */ "Reserved 83", + /* 84 */ "Reserved 84", + /* 85 */ "Reserved 85", + /* 86 */ "Reserved 86", + /* 87 */ "Reserved 87", + /* 88 */ "Reserved 88", + /* 89 */ "Reserved 89", + /* 90 */ "User 0", + /* 91 */ "User 1", + /* 92 */ "User 2", + /* 93 */ "User 3", + /* 94 */ "User 4", + /* 95 */ "User 5", + /* 96 */ "User 6", + /* 97 */ "User 7", + /* 98 */ "User 8", + /* 99 */ "User 9", + /* 100 */ "Instr Begin", + /* 101 */ "Instr End", + /* 102 */ "Instr Info", + /* 103 */ "Instr Info Result", + /* 104 */ "Instr Finfo", + /* 105 */ "Instr Finfo Result", + /* 106 */ "Instr Reset", + /* 107 */ "Instr Status", + /* 108 */ "Instr Status Result", + /* 109 */ "Instr Put", + /* 110 */ "Instr Get", + /* 111 */ "Instr Get Result", + /* 112 */ "Instr Free", + /* 113 */ "Instr List", + /* 114 */ "Instr List Result", + /* 115 */ "Instr Cluster", + /* 116 */ "Instr Cluster Get", + /* 117 */ "Instr Cluster Result", + /* 118 */ "Instr Change", + /* 119 */ "Reserved 119", + /* 120 */ "Reserved 120", + /* 121 */ "Reserved 121", + /* 122 */ "Reserved 122", + /* 123 */ "Reserved 123", + /* 124 */ "Reserved 124", + /* 125 */ "Reserved 125", + /* 126 */ "Reserved 126", + /* 127 */ "Reserved 127", + /* 128 */ "Reserved 128", + /* 129 */ "Reserved 129", + /* 130 */ "Sysex", + /* 131 */ "Bounce", + /* 132 */ "Reserved 132", + /* 133 */ "Reserved 133", + /* 134 */ "Reserved 134", + /* 135 */ "User Var0", + /* 136 */ "User Var1", + /* 137 */ "User Var2", + /* 138 */ "User Var3", + /* 139 */ "User Var4", + /* 140 */ "IPC Shm", + /* 141 */ "Reserved 141", + /* 142 */ "Reserved 142", + /* 143 */ "Reserved 143", + /* 144 */ "Reserved 144", + /* 145 */ "User IPC0", + /* 146 */ "User IPC1", + /* 147 */ "User IPC2", + /* 148 */ "User IPC3", + /* 149 */ "User IPC4", + /* 150 */ "Reserved 150", + /* 151 */ "Reserved 151", + /* 152 */ "Reserved 152", + /* 153 */ "Reserved 153", + /* 154 */ "Reserved 154", + /* 155 */ "Reserved 155", + /* 156 */ "Reserved 156", + /* 157 */ "Reserved 157", + /* 158 */ "Reserved 158", + /* 159 */ "Reserved 159", + /* 160 */ "Reserved 160", + /* 161 */ "Reserved 161", + /* 162 */ "Reserved 162", + /* 163 */ "Reserved 163", + /* 164 */ "Reserved 164", + /* 165 */ "Reserved 165", + /* 166 */ "Reserved 166", + /* 167 */ "Reserved 167", + /* 168 */ "Reserved 168", + /* 169 */ "Reserved 169", + /* 170 */ "Reserved 170", + /* 171 */ "Reserved 171", + /* 172 */ "Reserved 172", + /* 173 */ "Reserved 173", + /* 174 */ "Reserved 174", + /* 175 */ "Reserved 175", + /* 176 */ "Reserved 176", + /* 177 */ "Reserved 177", + /* 178 */ "Reserved 178", + /* 179 */ "Reserved 179", + /* 180 */ "Reserved 180", + /* 181 */ "Reserved 181", + /* 182 */ "Reserved 182", + /* 183 */ "Reserved 183", + /* 184 */ "Reserved 184", + /* 185 */ "Reserved 185", + /* 186 */ "Reserved 186", + /* 187 */ "Reserved 187", + /* 188 */ "Reserved 188", + /* 189 */ "Reserved 189", + /* 190 */ "Reserved 190", + /* 191 */ "Reserved 191", + /* 192 */ "Reserved 192", + /* 193 */ "Reserved 193", + /* 194 */ "Reserved 194", + /* 195 */ "Reserved 195", + /* 196 */ "Reserved 196", + /* 197 */ "Reserved 197", + /* 198 */ "Reserved 198", + /* 199 */ "Reserved 199", + /* 200 */ "Reserved 200", + /* 201 */ "Reserved 201", + /* 202 */ "Reserved 202", + /* 203 */ "Reserved 203", + /* 204 */ "Reserved 204", + /* 205 */ "Reserved 205", + /* 206 */ "Reserved 206", + /* 207 */ "Reserved 207", + /* 208 */ "Reserved 208", + /* 209 */ "Reserved 209", + /* 210 */ "Reserved 210", + /* 211 */ "Reserved 211", + /* 212 */ "Reserved 212", + /* 213 */ "Reserved 213", + /* 214 */ "Reserved 214", + /* 215 */ "Reserved 215", + /* 216 */ "Reserved 216", + /* 217 */ "Reserved 217", + /* 218 */ "Reserved 218", + /* 219 */ "Reserved 219", + /* 220 */ "Reserved 220", + /* 221 */ "Reserved 221", + /* 222 */ "Reserved 222", + /* 223 */ "Reserved 223", + /* 224 */ "Reserved 224", + /* 225 */ "Reserved 225", + /* 226 */ "Reserved 226", + /* 227 */ "Reserved 227", + /* 228 */ "Reserved 228", + /* 229 */ "Reserved 229", + /* 230 */ "Reserved 230", + /* 231 */ "Reserved 231", + /* 232 */ "Reserved 232", + /* 233 */ "Reserved 233", + /* 234 */ "Reserved 234", + /* 235 */ "Reserved 235", + /* 236 */ "Reserved 236", + /* 237 */ "Reserved 237", + /* 238 */ "Reserved 238", + /* 239 */ "Reserved 239", + /* 240 */ "Reserved 240", + /* 241 */ "Reserved 241", + /* 242 */ "Reserved 242", + /* 243 */ "Reserved 243", + /* 244 */ "Reserved 244", + /* 245 */ "Reserved 245", + /* 246 */ "Reserved 246", + /* 247 */ "Reserved 247", + /* 248 */ "Reserved 248", + /* 249 */ "Reserved 249", + /* 250 */ "Reserved 250", + /* 251 */ "Reserved 251", + /* 252 */ "Reserved 252", + /* 253 */ "Reserved 253", + /* 254 */ "Reserved 254", + /* 255 */ "None" +}; + +/* Local functions prototypes */ + +/************************************************************************/ + +/*********************************************** + * Print MIDI event. + * Adapted from alsa-lib-0.5.5/test/seq-decode.c. + */ + +void midi_print_event(snd_seq_event_t *ev) +{ + static char *space = " "; + + if (ev->type == SND_SEQ_EVENT_SENSING) { + return; + } + + g_print("EVENT>>> Type = %d, flags = 0x%x", ev->type, ev->flags); + switch (ev->flags & SND_SEQ_TIME_STAMP_MASK) { + case SND_SEQ_TIME_STAMP_TICK: + g_print(", time = %d ticks", ev->time.tick); + break; + + case SND_SEQ_TIME_STAMP_REAL: + g_print(", time = %d.%09d", + (int)ev->time.time.tv_sec, + (int)ev->time.time.tv_nsec); + break; + } + + g_print("\n%sSource = %d.%d, dest = %d.%d, queue = %d\n", + space, + ev->source.client, + ev->source.port, + ev->dest.client, + ev->dest.port, + ev->queue); + + g_print("%sEvent = %s", space, event_names[ev->type]); + + /* decode actual event data... */ + + switch (ev->type) { + case SND_SEQ_EVENT_NOTE: + g_print("; ch=%d, note=%d, velocity=%d, off_velocity=%d, duration=%d\n", + ev->data.note.channel, + ev->data.note.note, + ev->data.note.velocity, + ev->data.note.off_velocity, + ev->data.note.duration); + break; + + case SND_SEQ_EVENT_NOTEON: + g_print("; ch=%d, note ON=%d, velocity=%d\n", + ev->data.note.channel, + ev->data.note.note, + ev->data.note.velocity); + break; + + case SND_SEQ_EVENT_NOTEOFF: + g_print("; ch=%d, note OFF=%d, velocity=%d\n", + ev->data.note.channel, + ev->data.note.note, + ev->data.note.velocity); + break; + + case SND_SEQ_EVENT_KEYPRESS: + g_print("; ch=%d, keypress=%d, velocity=%d\n", + ev->data.note.channel, + ev->data.note.note, + ev->data.note.velocity); + break; + + case SND_SEQ_EVENT_CONTROLLER: + g_print("; ch=%d, param=%i, value=%i\n", + ev->data.control.channel, + ev->data.control.param, + ev->data.control.value); + break; + + case SND_SEQ_EVENT_PGMCHANGE: + g_print("; ch=%d, program=%i\n", + ev->data.control.channel, + ev->data.control.value); + break; + + case SND_SEQ_EVENT_CHANPRESS: + case SND_SEQ_EVENT_PITCHBEND: + g_print("; ch=%d, value=%i\n", + ev->data.control.channel, + ev->data.control.value); + break; + + case SND_SEQ_EVENT_SYSEX: + { + unsigned char *sysex = (unsigned char *) ev + sizeof(snd_seq_event_t); + int c; + + g_print("; len=%d [", ev->data.ext.len); + + for (c = 0; c < ev->data.ext.len; c++) { + g_print("%02x%s", sysex[c], c < ev->data.ext.len - 1 ? ":" : ""); + } + g_print("]\n"); + } + break; + + case SND_SEQ_EVENT_QFRAME: + g_print("; frame=%i\n", ev->data.control.value); + break; + + case SND_SEQ_EVENT_CLOCK: + case SND_SEQ_EVENT_START: + case SND_SEQ_EVENT_CONTINUE: + case SND_SEQ_EVENT_STOP: + g_print("; queue = %i\n", ev->data.queue.queue); + break; + + case SND_SEQ_EVENT_SENSING: + g_print("\n"); + break; + + case SND_SEQ_EVENT_ECHO: + { + int i; + + g_print("; "); + for (i = 0; i < 8; i++) { + g_print("%02i%s", ev->data.raw8.d[i], i < 7 ? ":" : "\n"); + } + } + break; + + case SND_SEQ_EVENT_CLIENT_START: + case SND_SEQ_EVENT_CLIENT_EXIT: + case SND_SEQ_EVENT_CLIENT_CHANGE: + g_print("; client=%i\n", ev->data.addr.client); + break; + + case SND_SEQ_EVENT_PORT_START: + case SND_SEQ_EVENT_PORT_EXIT: + case SND_SEQ_EVENT_PORT_CHANGE: + case SND_SEQ_EVENT_PORT_SUBSCRIBED: + case SND_SEQ_EVENT_PORT_USED: + case SND_SEQ_EVENT_PORT_UNSUBSCRIBED: + case SND_SEQ_EVENT_PORT_UNUSED: + g_print("; client=%i, port = %i\n", ev->data.addr.client, ev->data.addr.port); + break; + + default: + g_print("; not implemented\n"); + } + + + switch (ev->flags & SND_SEQ_EVENT_LENGTH_MASK) { + case SND_SEQ_EVENT_LENGTH_FIXED: + return; /* sizeof(snd_seq_event_t);*/ + + case SND_SEQ_EVENT_LENGTH_VARIABLE: + return; /* sizeof(snd_seq_event_t) + ev->data.ext.len; */ + } + + return; + +} /* midi_print_event() */ + +#endif /* defined(DRIVER_ALSA_050) */ diff -urN soundtracker-0.5.1/app/midi-utils.h soundtracker-0.5.2/app/midi-utils.h --- soundtracker-0.5.1/app/midi-utils.h Thu Jan 1 01:00:00 1970 +++ soundtracker-0.5.2/app/midi-utils.h Mon Mar 27 12:20:50 2000 @@ -0,0 +1,33 @@ +/* + * Copyright (C) 2000 Luc Tanguay + * Copyright (C) 1998-2000 Michael Krause + * + * This program is free software; you can redistribute it and/or modify + * it 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. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifndef _MIDI_UTILS_H +#define _MIDI_UTILS_H + +#include + +#if ! defined(DRIVER_ALSA_050) +#error "Support only ALSA API" +#endif + +#include + +void midi_print_event(snd_seq_event_t *ev); + +#endif /* _MIDI_UTILS_H */ diff -urN soundtracker-0.5.1/app/midi.c soundtracker-0.5.2/app/midi.c --- soundtracker-0.5.1/app/midi.c Thu Jan 1 01:00:00 1970 +++ soundtracker-0.5.2/app/midi.c Mon Mar 27 12:20:50 2000 @@ -0,0 +1,484 @@ +/* + * Copyright (C) 2000 Luc Tanguay + * Copyright (C) 1998-2000 Michael Krause + * + * This program is free software; you can redistribute it and/or modify + * it 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. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +/* + * For ALSA driver, we use the ALSA sequencer API (not the rawmidi API). + */ + +#include + +#if defined(DRIVER_ALSA_050) + +#include +#include +#include +#include "midi.h" +#include "midi-utils.h" +#include "gui.h" +#include "tracker.h" +#include "xm.h" +#include "gui-settings.h" + +/********************************************************* + * Macro to transform a MIDI note (pitch) into a XM note + * and vice versa. + * + * Translation goes like this: + * MIDI XM + * note pitch note + * C-0 12 1 + * B-7 107 96 + * + * i.e. xm_note = midi_pitch - (12+1) + * + * NOTE: C-4 (middle C) is MIDI note 60. + * + * The sustain pedal is used to input XM note off. + ********************************************************/ + +#define midi_note_2_xm_note(inote) ((inote)-12+1) +#define xm_note_2_midi_note(inote) ((inote)-1+12) + +/* Other macros. */ + +#define SND_SEQ_CTRL_SUSTAIN 0x40 +#define MIDI_VELOCITY_MAX 127 + + +extern Tracker *tracker; /* from track-editor.c */ + +/* Handle to sequencer device. */ + +static snd_seq_t *midi_handle = NULL; + +/* Number and port of kernel-level client we will receive data from. */ +/* Needs to be more dynamic... */ + +static int src_client = 64; +static int src_port = 0; + +/* Count the number of notes on to later turn them off gracefully...*/ + +static int nb_notes_on = 0; + +/* Local functions prototypes */ + +static void midi_in_cb (gpointer data, int fd, GdkInputCondition condition); +static int set_seq_name( snd_seq_t *handle); +static void close_handle( snd_seq_t *handle); +static void midi_process_note_on( snd_seq_ev_note *pnote); +static void midi_process_controller( snd_seq_ev_ctrl *pcontrol); +static void midi_process_program_change( snd_seq_ev_ctrl *pcontrol); + +/************************************************************************/ + +/*********************************************** + * Create and initialize the MIDI device. + * + * We create a sequencer client and port, + * then connect the kernel client to our user-level client. + * Finally we setup a callback function to handle MIDI events. + */ + +void midi_init() { + int rc; + snd_seq_port_info_t port; + snd_seq_port_subscribe_t sub; + int client; + + + /* Open the sequencer device, in non-block mode. + Don't use O_NONBLOCK here, it crashes the application + as for ALSA 0.5.5. (15-mar-2000) */ + + rc = snd_seq_open( &midi_handle, SND_SEQ_OPEN_IN); + if (rc < 0) { + g_print( "error opening ALSA MIDI input stream (%s)\n", + snd_strerror(rc)); + return; + } + + /* Set nonblock mode i.e. enable==0. */ + + rc = snd_seq_block_mode( midi_handle, 0); + if (rc < 0) { + close_handle( midi_handle); + g_print( "error disabling sequencer block mode (%s)\n", + snd_strerror(rc)); + return; + } + + /* Get client id. Needed to subscribe to the kernel-level client. */ + + client = snd_seq_client_id( midi_handle); + + if (client < 0) { + close_handle( midi_handle); + g_print( "error naming sequencer client (%s)\n", snd_strerror(client)); + return; + } + + + /* Set client name. Visible with 'cat /proc/asound/seq/clients'. */ + + rc = set_seq_name( midi_handle); + + if (rc < 0) { + close_handle( midi_handle); + g_print( "error naming sequencer client (%s)\n",snd_strerror(rc)); + return; + } + + /* Create a port for our user-level client. */ + + memset( &port, 0, sizeof(port)); + strcpy( port.name, "tracker"); + port.capability = SND_SEQ_PORT_CAP_READ | SND_SEQ_PORT_CAP_WRITE; + port.capability |= SND_SEQ_PORT_CAP_SUBS_WRITE; /* necessary??? */ + port.type = SND_SEQ_PORT_TYPE_APPLICATION; + + rc = snd_seq_create_port( midi_handle, &port); + + if (rc < 0) { + close_handle( midi_handle); + g_print( "error creating sequencer port (%s)\n", snd_strerror(rc)); + return; + } + + /* Subscribe to the kernel client. */ + + memset( &sub, 0, sizeof(sub)); + sub.sender.client = src_client; + sub.sender.port = src_port; + sub.dest.client = client; + sub.dest.port = port.port; + + rc = snd_seq_subscribe_port( midi_handle, &sub); + + if (rc < 0) { + close_handle( midi_handle); + g_print( "error subscribing to client %d port %d (%s)\n", + sub.sender.client, sub.sender.port, snd_strerror(rc)); + return; + } + + /* Install callback to process MIDI input. */ + + rc = gdk_input_add( snd_seq_file_descriptor( midi_handle), + GDK_INPUT_READ, + (GdkInputFunction)midi_in_cb, + midi_handle); + if (rc < 0) { + close_handle( midi_handle); + + g_print( "error installing MIDI input callback (%s)\n",g_strerror(rc)); + return; + } + + return; + +} /* midi_init() */ + +/************************************************************************ + ************************* local functions ****************************** + ************************************************************************/ + +/************************************************** + * Callback for MIDI input events. + * + * NOTE: + * before leaving, "data" must be freed. + * It was created in snd_seq_event_input(). + */ + +static void midi_in_cb (gpointer data, int fd, GdkInputCondition condition) +{ + snd_seq_t *handle = (snd_seq_t *)data; + snd_seq_event_t *pev; + int rc; + + /* Perform sanity checks. */ + + if ((int)condition != GDK_INPUT_READ) { + g_print( "wrong condition (%d). %d was expected\n", + condition, GDK_INPUT_READ); + return; + } + + if (handle == NULL) { + g_print( "NULL handle detected\n"); + return; + } + + /* Process MIDI event. Don't forget to free the event after usage. */ + + rc = snd_seq_event_input( handle, &pev); + if (rc < 0) { + g_print("unable to get event"); + return; + } + + switch (pev->type) { + case SND_SEQ_EVENT_NOTEOFF: + /* Simulate a note on event. */ + pev->data.note.velocity = 0; + /* no break here. Go to next case...*/ + case SND_SEQ_EVENT_NOTE: + case SND_SEQ_EVENT_NOTEON: + midi_process_note_on( &(pev->data.note)); + break; + + case SND_SEQ_EVENT_CONTROLLER: + midi_process_controller( &(pev->data.control)); + break; + + case SND_SEQ_EVENT_PGMCHANGE: + midi_process_program_change( &(pev->data.control)); + break; + + default: + midi_print_event( pev); + break; + } + + rc = snd_seq_free_event( pev); + if (rc < 0) { + g_print("unable to free event"); + return; + } + + return; + +} /* midi_in_cb() */ + +/***************************************** + * Set name of our sequencer client. + */ + +static int set_seq_name(snd_seq_t *handle) +{ + int err; + snd_seq_client_info_t info; + + memset(&info, 0, sizeof(info)); + info.client = snd_seq_client_id(handle); + info.type = USER_CLIENT; + snprintf(info.name, sizeof(info.name), "SoundTracker(%i)", getpid()); + if ((err = snd_seq_set_client_info(handle, &info)) < 0) { + fprintf(stderr, "Set client info error: %s\n", snd_strerror(err)); + return -1; + } + + return 0; + +} /* set_seq_name() */ + +/********************************** + * Close sequencer handle. + */ + +static void close_handle(snd_seq_t *handle) +{ + int rc; + + rc = snd_seq_close( handle); + if (rc < 0) { + g_print( "error closing handle (%s)\n", snd_strerror(rc)); + } + + return; + +} /* close_handle() */ + +/******************************************************* + * Process MIDI program change event. + * Called from the MIDI input callback. + * + * Change the XM instrument. + */ + +static void midi_process_program_change( snd_seq_ev_ctrl *pcontrol) +{ + gui_set_current_instrument(pcontrol->value); + + if ( 0 ) { + g_print( "program change: param %#x, channel %d, value %#x\n", + pcontrol->param, pcontrol->channel, pcontrol->value); + } + + return; + +} /* midi_process_program_change() */ + +/******************************************************* + * Process MIDI controller event. + * Called from the MIDI input callback. + * + * If we receive Sustain event, transform it into a XM note off. + */ + +static void midi_process_controller( snd_seq_ev_ctrl *pcontrol) +{ + snd_seq_ev_note note; + + + switch (pcontrol->param) { + case SND_SEQ_CTRL_SUSTAIN: + /* Build a pseudo-note. */ + + memset( ¬e, 0, sizeof(note)); + note.note = xm_note_2_midi_note(XM_PATTERN_NOTE_OFF); + note.channel = pcontrol->channel; + + /* Based on MIDI standard, a value less than 63 means + sustain off. */ + + if (pcontrol->value < 63) { + note.velocity = 0; + } else { + note.velocity = MIDI_VELOCITY_MAX; + } + midi_process_note_on( ¬e); + break; + + default: + g_print( "control event not processed %#x\n", pcontrol->param); + break; + } + + return; + +} /* midi_process_controller() */ + + +/******************************************************* + * Process MIDI note ON. + * Called from the MIDI input callback (most of the time). + * + * If the note velocity is 0, just turn off the sound. Don't + * see it as a XM note off event. + * + * We keep track on the number of note ON events. With slow fingers + * on the MIDI controller, it is easy to press a second key before + * releasing the previous one. If we did turned the note off when + * a MIDI note off was received (i.e. when the first finger released + * the first key), we would turn off the sound of the second + * note. With the counter, the note off is done at the right time, + * when the last key is released... + */ + +static void midi_process_note_on( snd_seq_ev_note *pnote) +{ + gint note; + + + /* Perform some validation on the event. + - is the note a valid XM note ? + - is the channel in the valid range of channels ? + */ + + note = midi_note_2_xm_note(pnote->note); + + if (note != XM_PATTERN_NOTE_OFF && (note < XM_PATTERN_NOTE_MIN || note > XM_PATTERN_NOTE_MAX)) { + g_print("note out of range\n"); + return; + } + + if (pnote->channel > tracker->num_channels) { + g_warning( "MIDI channel too high"); + return; + } + + g_print( "note %d velocity %d channel %d, xmnote %d\n", + pnote->note, pnote->velocity, + pnote->channel, + note); + + /* If necessary, jump to channel */ + + if (tracker->cursor_ch != pnote->channel) { + int diff = pnote->channel - tracker->cursor_ch; + + /*g_warning("MIDI channel and current channel are not the same..."); */ + + tracker_step_cursor_channel( tracker, diff); + } + + /* Play (and record) the note. */ + + if ( pnote->velocity > 0) { + int row; + XMNote *xmnote; + + /* Increment the number of notes on. */ + + nb_notes_on++; + + /* Play the note in the channel specified by the MIDI channel. */ + + gui_play_note( pnote->channel, note); + + /* Give warning when MIDI channel and cursor channel are different. */ + + if(tracker->cursor_ch != pnote->channel) { + g_warning( "MIDI channel and current channel are not the same..."); + } + + /* Edit track. */ + + /* Current position in channel. */ + + row = tracker->patpos; + + /* Get and set current XM note pitch. */ + + xmnote = &(tracker->curpattern->channels[pnote->channel][row]); + + xmnote->note = note; + xmnote->instrument = gui_get_current_instrument(); + + /* Redraw screen and if not in ASYNCEDIT mode, + jump to next position in the channel. */ + + tracker_redraw_current_row(tracker); + if (!ASYNCEDIT) { + tracker_step_cursor_row(tracker, gui_get_current_jump_value()); + } + + /* Don't forget: the XM has been changed... */ + + xm_set_modified(1); + + } else { + /* Decrement the number of note on. + If it is 0, then turn the note off in the track (channel). */ + + nb_notes_on--; + + if (nb_notes_on <= 0) { + gui_play_note_keyoff( pnote->channel); + nb_notes_on = 0; + } + } + + return; + +} /* midi_process_note_on() */ + +#endif /* defined(DRIVER_ALSA_050) */ diff -urN soundtracker-0.5.1/app/midi.h soundtracker-0.5.2/app/midi.h --- soundtracker-0.5.1/app/midi.h Thu Jan 1 01:00:00 1970 +++ soundtracker-0.5.2/app/midi.h Mon Mar 27 12:21:39 2000 @@ -0,0 +1,33 @@ +/* + * Copyright (C) 2000 Luc Tanguay + * Copyright (C) 1998-2000 Michael Krause + * + * This program is free software; you can redistribute it and/or modify + * it 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. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifndef _MIDI_H +#define _MIDI_H + +#include + +#if defined(DRIVER_ALSA_050) + +#include + +void midi_init (void); + +#endif + +#endif /* _MIDI_H */ diff -urN soundtracker-0.5.1/app/sample-editor.c soundtracker-0.5.2/app/sample-editor.c --- soundtracker-0.5.1/app/sample-editor.c Sat Mar 25 10:57:05 2000 +++ soundtracker-0.5.2/app/sample-editor.c Sun Mar 26 13:30:48 2000 @@ -1057,7 +1057,7 @@ int len; int i, count; - statusbar_update(STATUS_LOADING_SAMPLE); + statusbar_update(STATUS_LOADING_SAMPLE, TRUE); len = 2 * wavload_frameCount * wavload_channelCount; if(!(sbuf = malloc(len))) { @@ -1125,11 +1125,11 @@ xm_set_modified(1); afCloseFile(wavload_file); - statusbar_update(STATUS_SAMPLE_LOADED); + statusbar_update(STATUS_SAMPLE_LOADED, FALSE); return; errnodata: - statusbar_update(STATUS_IDLE); + statusbar_update(STATUS_IDLE, FALSE); free(sbuf); errnobuf: afCloseFile(wavload_file); @@ -1301,7 +1301,7 @@ AFfilehandle outfile; AFfilesetup outfilesetup; - statusbar_update(STATUS_SAVING_SAMPLE); + statusbar_update(STATUS_SAVING_SAMPLE, TRUE); file_selection_save_path(fn, gui_settings.savesmpl_path); @@ -1339,7 +1339,7 @@ afCloseFile(outfile); - statusbar_update(STATUS_SAMPLE_SAVED); + statusbar_update(STATUS_SAMPLE_SAVED, FALSE); } static void diff -urN soundtracker-0.5.1/app/xm.c soundtracker-0.5.2/app/xm.c --- soundtracker-0.5.1/app/xm.c Wed Mar 22 17:06:33 2000 +++ soundtracker-0.5.2/app/xm.c Sun Mar 26 13:30:48 2000 @@ -723,7 +723,7 @@ int i, n; guint8 mh[8]; - statusbar_update(STATUS_LOADING_MODULE); + statusbar_update(STATUS_LOADING_MODULE, TRUE); xm = calloc(1, sizeof(XM)); if(!xm) @@ -831,14 +831,14 @@ } } - statusbar_update(STATUS_MODULE_LOADED); + statusbar_update(STATUS_MODULE_LOADED, FALSE); return xm; ende: XM_Free(xm); fileerr: fclose(f); - statusbar_update(STATUS_IDLE); + statusbar_update(STATUS_IDLE, FALSE); return NULL; } @@ -850,7 +850,7 @@ guint8 xh[80]; int i, j, num_patterns, num_instruments; - statusbar_update(STATUS_LOADING_MODULE); + statusbar_update(STATUS_LOADING_MODULE, TRUE); *status = 0; f = fopen(filename, "r"); @@ -935,14 +935,14 @@ xm->num_channels++; } - statusbar_update(STATUS_MODULE_LOADED); + statusbar_update(STATUS_MODULE_LOADED, FALSE); return xm; ende: XM_Free(xm); fileerr: fclose(f); - statusbar_update(STATUS_IDLE); + statusbar_update(STATUS_IDLE, FALSE); return NULL; } @@ -955,7 +955,7 @@ guint8 xh[80]; int num_patterns, num_instruments; - statusbar_update(STATUS_SAVING_MODULE); + statusbar_update(STATUS_SAVING_MODULE, TRUE); f = fopen(filename, "w"); if(!f) @@ -990,12 +990,12 @@ xm_save_xm_instrument(&xm->instruments[i], f); if(ferror(f)) { - statusbar_update(STATUS_IDLE); + statusbar_update(STATUS_IDLE, FALSE); fclose(f); return 0; } - statusbar_update(STATUS_MODULE_SAVED); + statusbar_update(STATUS_MODULE_SAVED, FALSE); fclose(f); return 1; } diff -urN soundtracker-0.5.1/app/xm.h soundtracker-0.5.2/app/xm.h --- soundtracker-0.5.1/app/xm.h Mon Mar 13 13:47:01 2000 +++ soundtracker-0.5.2/app/xm.h Mon Mar 27 12:17:03 2000 @@ -33,6 +33,10 @@ /* -- Pattern definitions -- */ +#define XM_PATTERN_NOTE_MIN 0 +#define XM_PATTERN_NOTE_MAX 95 +#define XM_PATTERN_NOTE_OFF 97 + typedef struct XMNote { unsigned char note; unsigned char instrument; diff -urN soundtracker-0.5.1/configure soundtracker-0.5.2/configure --- soundtracker-0.5.1/configure Sat Mar 25 11:33:02 2000 +++ soundtracker-0.5.2/configure Mon Mar 27 12:44:20 2000 @@ -722,7 +722,7 @@ PACKAGE=soundtracker -VERSION=0.5.1 +VERSION=0.5.2 if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then { echo "configure: error: source directory already configured; run "make distclean" there first" 1>&2; exit 1; } diff -urN soundtracker-0.5.1/configure.in soundtracker-0.5.2/configure.in --- soundtracker-0.5.1/configure.in Sat Mar 25 11:30:27 2000 +++ soundtracker-0.5.2/configure.in Mon Mar 27 12:43:30 2000 @@ -1,7 +1,7 @@ dnl Process this file with autoconf to produce a configure script. AC_INIT(app/endian-conv.h) -AM_INIT_AUTOMAKE(soundtracker, 0.5.1) +AM_INIT_AUTOMAKE(soundtracker, 0.5.2) AM_CONFIG_HEADER(config.h) dnl ----------------------------------------------------------------------- diff -urN soundtracker-0.5.1/doc/Makefile.am soundtracker-0.5.2/doc/Makefile.am --- soundtracker-0.5.1/doc/Makefile.am Sun Nov 14 15:30:02 1999 +++ soundtracker-0.5.2/doc/Makefile.am Mon Mar 27 12:44:56 2000 @@ -1,5 +1,7 @@ -EXTRA_DIST = hacking.texi hacking.html hacking.txt +EXTRA_DIST = \ + hacking.texi hacking.html hacking.txt \ + xm.txt xi.txt dist-hook: hacking.html: diff -urN soundtracker-0.5.1/doc/Makefile.in soundtracker-0.5.2/doc/Makefile.in --- soundtracker-0.5.1/doc/Makefile.in Sat Mar 25 11:35:14 2000 +++ soundtracker-0.5.2/doc/Makefile.in Mon Mar 27 12:45:02 2000 @@ -95,7 +95,8 @@ l = @l@ sedpath = @sedpath@ -EXTRA_DIST = hacking.texi hacking.html hacking.txt +EXTRA_DIST = hacking.texi hacking.html hacking.txt xm.txt xi.txt + mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = ../config.h CONFIG_CLEAN_FILES = diff -urN soundtracker-0.5.1/doc/xi.txt soundtracker-0.5.2/doc/xi.txt --- soundtracker-0.5.1/doc/xi.txt Thu Jan 1 01:00:00 1970 +++ soundtracker-0.5.2/doc/xi.txt Mon Mar 27 12:25:36 2000 @@ -0,0 +1,71 @@ +-------------------------------------------------------------------------- + XI format description + (FastTracker II Extended Instrument) + reverse engineered by KB / The Obsessed Maniacs / Reflex +-------------------------------------------------------------------------- +C = Chars, B = Byte, W = Word, D = Double word + +Pos(h) Len(h) Meaning +-------------------------------------------------------------- file header +0000 C15 "Extended Instrument: " +0015 C16 Instrument name, padded w/ spaces + +002b B01 $1a +002c C14 Tracker name, padded w/ spaces +0040 W02 Version Number (current $0102) + +-------------------------------------------------------------- inst header +0042 B60 Sample number for notes 1..96 + +00a2 W30 12 volume envelope points: + +0 Time index for Point 1 (ticks since note) + +2 Volume for Point 1 (00..40) + +4 Time index for Point 2 + +6 Volume for Point 2 + [...] +00d2 W30 12 panning envelope points + (Same structure as volume envelope) + +0102 B01 Number of volume points +0103 B01 Number of panning points +0104 B01 Volume sustain point +0105 B01 Volume loop start point +0106 B01 Volume loop end point +0107 B01 Panning sustain point +0108 B01 Panning loop start point +0109 B01 Panning loop end point +010a B01 Volume type; b0=on, b1=sustain, b2=loop +010b B01 Panning type; b0=on, b1=sustain, b2=loop + +010c B01 Vibrato type +010d B01 Vibrato sweep +010e B01 Vibrato depth +010f B01 Vibrato rate + +0110 W02 Volume fadeout (0..fff) +0112 B16 ????? (Zeroes) + +0128 W02 Number of Samples + +---------------------------------------------------------- sample headers + +012a D04 Sample Length +012e D04 Sample loop start +0132 D04 Sample loop length +0136 B01 Volume +0137 B01 Finetune (signed) +0138 B01 Sample Type; b0,1=loop: 0=none 1=fwd 2=bidi + b4=16bit sample +0139 B01 Panning +0140 B01 Relative Note (signed, 00=C-4) (call it Transpose) +0141 B01 Sample Name Length +0142 C16 Sample Name, padded w/ zeroes + +And so on w/ samples 1 to x +Length: $28 bytes for each sample + +------------------------------------------------------------- sample data + +$012a+(number of samples)*$28 : sample data for all samples in delta values + (signed) + diff -urN soundtracker-0.5.1/doc/xm.txt soundtracker-0.5.2/doc/xm.txt --- soundtracker-0.5.1/doc/xm.txt Thu Jan 1 01:00:00 1970 +++ soundtracker-0.5.2/doc/xm.txt Mon Mar 27 12:25:13 2000 @@ -0,0 +1,276 @@ + + The XM module format description for XM files version $0104. + + By Mr.H of Triton in 1994. + + - Be prepared! Are you sure you want to know? :-) + + ============================================================================ + + + ****************************** + * The XM file structure: * + ****************************** + + Offset Length Type + + 0 17 (char) ID text: 'Extended module: ' + 17 20 (char) Module name, padded with zeroes + 37 1 (char) $1a + 38 20 (char) Tracker name + 58 2 (word) Version number, hi-byte major and low-byte minor + The current format is version $0103 + + 60 4 (dword) Header size + +4 2 (word) Song length (in patten order table) + +6 2 (word) Restart position + +8 2 (word) Number of channels (2,4,6,8,10,...,32) + +10 2 (word) Number of patterns (max 256) + +12 2 (word) Number of instruments (max 128) + +14 2 (word) Flags: bit 0: 0 = Amiga frequency table (see below); + 1 = Linear frequency table + +16 2 (word) Default tempo + +18 2 (word) Default BPM + +20 256 (byte) Pattern order table + + Patterns: + --------- + + ? 4 (dword) Pattern header length + +4 1 (byte) Packing type (always 0) + +5 2 (word) Number of rows in pattern (1..256) + +7 2 (word) Packed patterndata size + + ? ? Packed pattern data + + Instruments: + ------------ + + ? 4 (dword) Instrument size + +4 22 (char) Instrument name + +26 1 (byte) Instrument type (always 0) + +27 2 (word) Number of samples in instrument + + If the number of samples > 0, then the this will follow: + + ! +29 4 (dword) Sample header size + ! +33 96 (byte) Sample number for all notes + ! +129 48 (byte) Points for volume envelope + ! +177 48 (byte) Points for panning envelope + ! +225 1 (byte) Number of volume points + ! +226 1 (byte) Number of panning points + ! +227 1 (byte) Volume sustain point + ! +228 1 (byte) Volume loop start point + ! +229 1 (byte) Volume loop end point + ! +230 1 (byte) Panning sustain point + ! +231 1 (byte) Panning loop start point + ! +232 1 (byte) Panning loop end point + ! +233 1 (byte) Volume type: bit 0: On; 1: Sustain; 2: Loop + ! +234 1 (byte) Panning type: bit 0: On; 1: Sustain; 2: Loop + ! +235 1 (byte) Vibrato type + ! +236 1 (byte) Vibrato sweep + ! +237 1 (byte) Vibrato depth + ! +238 1 (byte) Vibrato rate + ! +239 2 (word) Volume fadeout + ! +241 2 (word) Reserved + ! + ! Sample headers: + ! --------------- + ! + ! ? 4 (dword) Sample length + ! +4 4 (dword) Sample loop start + ! +8 4 (dword) Sample loop length + ! +12 1 (byte) Volume + ! +13 1 (byte) Finetune (signed byte -16..+15) + ! +14 1 (byte) Type: Bit 0-1: 0 = No loop, 1 = Forward loop, + ! 2 = Ping-pong loop; + ! 4: 16-bit sampledata + ! +15 1 (byte) Panning (0-255) + ! +16 1 (byte) Relative note number (signed byte) + ! +17 1 (byte) Reserved + ! +18 22 (char) Sample name + ! + ! Sample data: + ! ------------ + ! + ! ? ? Sample data (signed): The samples are stored + ! as delta values. To convert to real data: + ! + ! old=0; + ! for i=1 to len + ! new=sample[i]+old; + ! sample[i]=new; + ! old=new; + + + + *********************** + * Pattern format: * + *********************** + + The patterns are stored as ordinary MOD patterns, except that each + note is stored as 5 bytes: + + ? 1 (byte) Note (0-71, 0 = C-0) + +1 1 (byte) Instrument (0-128) + +2 1 (byte) Volume column byte (see below) + +3 1 (byte) Effect type + +4 1 (byte) Effect parameter + + A simle packing scheme is also adopted, so that the patterns not become + TOO large: Since the MSB in the note value is never used, if is used for + the compression. If the bit is set, then the other bits are interpreted + as follows: + + bit 0 set: Note follows + 1 set: Instrument follows + 2 set: Volume column byte follows + 3 set: Effect type follows + 4 set: Guess what! + + It is very simple, but far from optimal. If you want a better, + you can always repack the patterns in your loader. + + + + ****************************** + * Volumes and envelopes: * + ****************************** + + The volume formula: + + FinalVol=(FadeOutVol/65536)*(EnvelopeVol/64)*(GlobalVol/64)*(Vol/64)*Scale; + + The panning formula: + + FinalPan=Pan+(EnvelopePan-32)*(128-Abs(Pan-128))/32; + + Envelope: + --------- + + The envelopes are processed once per frame, instead of every frame where + no new notes are read. This is also true for the instrument vibrato and + the fadeout. Since I am so lazy and the tracker is rather self-explaining + I am not going to write any more for the moment. + + + ******************************** + * Periods and frequencies: * + ******************************** + + PatternNote = 0..95 (0 = C-0, 95 = B-7) + + FineTune = -128..+127 (-128 = -1 halftone, +127 = +127/128 halftones) + RelativeTone = -96..95 (0 => C-4 = C-4) + + RealNote = PatternNote + RelativeTone; (0..118, 0 = C-0, 118 = A#9) + + Linear frequence table: + ----------------------- + + Period = 10*12*16*4 - Note*16*4 - FineTune/2; + Frequency = 8363*2^((6*12*16*4 - Period) / (12*16*4)); + + Amiga frequence table: + ---------------------- + + Period = (PeriodTab[(Note MOD 12)*8 + FineTune/16]*(1-Frac(FineTune/16)) + + PeriodTab[(Note MOD 12)*8 + FineTune/16]*(Frac(FineTune/16))) + *16/2^(Note DIV 12); + (The period is interpolated for finer finetune values) + Frequency = 8363*1712/Period; + + PeriodTab = Array[0..12*8-1] of Word = ( + 907,900,894,887,881,875,868,862,856,850,844,838,832,826,820,814, + 808,802,796,791,785,779,774,768,762,757,752,746,741,736,730,725, + 720,715,709,704,699,694,689,684,678,675,670,665,660,655,651,646, + 640,636,632,628,623,619,614,610,604,601,597,592,588,584,580,575, + 570,567,563,559,555,551,547,543,538,535,532,528,524,520,516,513, + 508,505,502,498,494,491,487,484,480,477,474,470,467,463,460,457); + + + ************************* + * Standard effects: * + ************************* + + 0 Appregio + 1 (*) Porta up + 2 (*) Porta down + 3 (*) Tone porta + 4 (*) Vibrato + 5 (*) Tone porta+Volume slide + 6 (*) Vibrato+Volume slide + 7 (*) Tremolo + 8 Set panning + 9 Sample offset + A (*) Volume slide + B Position jump + C Set volume + D Pattern break + E1 (*) Fine porta up + E2 (*) Fine porta down + E3 Set gliss control + E4 Set vibrato control + E5 Set finetune + E6 Set loop begin/loop + E7 Set tremolo control + E9 Retrig note + EA (*) Fine volume slide up + EB (*) Fine volume slide down + EC Note cut + ED Note delay + EE Pattern delay + F Set tempo/BPM + G Set global volume + H (*) Global volume slide + K Key off + L Set envelope position + P (*) Panning slide + R (*) Multi retrig note + T Tremor + X1 (*) Extra fine porta up + X2 (*) Extra fine porta down + + (*) = If the command byte is zero, the last nonzero byte for the + command should be used. + + ********************************* + * Effects in volume column: * + ********************************* + + All effects in the volume column should work as the standard effects. + The volume column is interpreted before the standard effects, so + some standard effects may override volume column effects. + + Value Meaning + + 0 Do nothing + $10-$50 Set volume Value-$10 + : : : + : : : + $60-$6f Volume slide down + $70-$7f Volume slide up + $80-$8f Fine volume slide down + $90-$9f Fine volume slide up + $a0-$af Set vibrato speed + $b0-$bf Vibrato + $c0-$cf Set panning + $d0-$df Panning slide left + $e0-$ef Panning slide right + $f0-$ff Tone porta + + + ============================================================================ + + This should be just about everything (I hope?). You will probably need + some information about the MOD format and maybe about S3M. + + Have fun! + + Fredrik Huss / Mr.H of Triton + + + + + + Binary files soundtracker-0.5.1/po/de.gmo and soundtracker-0.5.2/po/de.gmo differ diff -urN soundtracker-0.5.1/po/de.po soundtracker-0.5.2/po/de.po --- soundtracker-0.5.1/po/de.po Sat Mar 25 11:35:10 2000 +++ soundtracker-0.5.2/po/de.po Mon Mar 27 12:45:00 2000 @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: soundtracker-0.3.3\n" -"POT-Creation-Date: 2000-03-25 11:24+0100\n" +"POT-Creation-Date: 2000-03-27 12:44+0200\n" "PO-Revision-Date: 1999-09-21 23:00+02:00\n" "Last-Translator: Colin Marquardt \n" "Language-Team: German \n" @@ -177,31 +177,31 @@ "Konnte /dev/dsp nicht zur Soundausgabe öffnen:\n" "%s" -#: app/envelope-box.c:740 +#: app/envelope-box.c:863 msgid "Length" msgstr "Länge" -#: app/envelope-box.c:741 +#: app/envelope-box.c:864 msgid "Current" msgstr "Aktuell" -#: app/envelope-box.c:742 +#: app/envelope-box.c:865 msgid "Offset" msgstr "Offset" -#: app/envelope-box.c:743 +#: app/envelope-box.c:866 msgid "Value" msgstr "Wert" -#: app/envelope-box.c:749 app/playlist.c:301 +#: app/envelope-box.c:872 app/playlist.c:301 msgid "Insert" msgstr "Einfügen" -#: app/envelope-box.c:755 app/playlist.c:307 +#: app/envelope-box.c:878 app/playlist.c:307 msgid "Delete" msgstr "Löschen" -#: app/envelope-box.c:843 +#: app/envelope-box.c:967 msgid "" "Graphical\n" "Envelope\n" @@ -215,23 +215,23 @@ "nur in der\n" "GNOME-Version" -#: app/envelope-box.c:858 +#: app/envelope-box.c:982 msgid "Sustain" msgstr "Sustain" -#: app/envelope-box.c:866 +#: app/envelope-box.c:990 msgid "Point" msgstr "Punkt" -#: app/envelope-box.c:868 +#: app/envelope-box.c:992 msgid "Loop" msgstr "Loop" -#: app/envelope-box.c:876 app/sample-editor.c:225 +#: app/envelope-box.c:1000 app/sample-editor.c:225 msgid "Start" msgstr "Anfang" -#: app/envelope-box.c:877 app/sample-editor.c:226 +#: app/envelope-box.c:1001 app/sample-editor.c:226 msgid "End" msgstr "Ende" @@ -409,20 +409,20 @@ msgid "Instrument saved." msgstr "Instrumentenname" -#: app/gui-subs.c:459 +#: app/gui-subs.c:463 msgid "Question" msgstr "Frage" -#: app/gui-subs.c:476 app/keys.c:702 app/sample-editor.c:1227 +#: app/gui-subs.c:480 app/keys.c:702 app/sample-editor.c:1227 #: app/sample-editor.c:1418 msgid "Cancel" msgstr "Abbrechen" -#: app/gui-subs.c:494 +#: app/gui-subs.c:498 msgid "Warning" msgstr "Warnung" -#: app/gui-subs.c:520 +#: app/gui-subs.c:524 msgid "Error!" msgstr "Fehler!" @@ -442,59 +442,59 @@ msgid "Are you sure you want to overwrite the file?" msgstr "Sind sie sicher, daß Sie die Datei überschreiben wollen?" -#: app/gui.c:1167 +#: app/gui.c:1176 msgid "Load XM..." msgstr "Lade XM..." -#: app/gui.c:1169 +#: app/gui.c:1178 msgid "Save XM..." msgstr "Speichere XM..." -#: app/gui.c:1172 +#: app/gui.c:1181 msgid "Render module as WAV..." msgstr "" -#: app/gui.c:1224 +#: app/gui.c:1233 msgid "Play Song" msgstr "Spiele Song" -#: app/gui.c:1230 +#: app/gui.c:1239 msgid "Play Pattern" msgstr "Spiele Pattern" -#: app/gui.c:1236 +#: app/gui.c:1245 msgid "Stop" msgstr "Stop" -#: app/gui.c:1255 +#: app/gui.c:1264 msgid "Number of Channels:" msgstr "Anzahl der Kanäle:" -#: app/gui.c:1271 app/playlist.c:294 +#: app/gui.c:1280 app/playlist.c:294 msgid "Pattern" msgstr "Pattern" -#: app/gui.c:1287 +#: app/gui.c:1296 msgid "PatLength" msgstr "PatLänge" -#: app/gui.c:1379 +#: app/gui.c:1388 msgid "Octave" msgstr "Oktave" -#: app/gui.c:1387 +#: app/gui.c:1396 msgid "Jump" msgstr "Springe" -#: app/gui.c:1395 +#: app/gui.c:1404 msgid "Instr" msgstr "Instr" -#: app/gui.c:1410 +#: app/gui.c:1419 msgid "Sample" msgstr "Sample" -#: app/gui.c:1448 +#: app/gui.c:1482 msgid "%M:%S" msgstr "" Binary files soundtracker-0.5.1/po/ja.gmo and soundtracker-0.5.2/po/ja.gmo differ diff -urN soundtracker-0.5.1/po/ja.po soundtracker-0.5.2/po/ja.po --- soundtracker-0.5.1/po/ja.po Tue Mar 14 18:59:15 2000 +++ soundtracker-0.5.2/po/ja.po Mon Mar 27 12:37:24 2000 @@ -1,4 +1,4 @@ -# ja.po(0.5.0-0) for SoundTracker +# ja.po(0.5.1-0) for SoundTracker # Copyright (C) 1998-2000 Michael Krause . # Translators: Atsushi Yamagata , 1999, 2000. # Yuuki NINOMIYA , 1999, 2000. @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: SoundTracker 0.3.10\n" -"POT-Creation-Date: 2000-03-13 13:56+0100\n" -"PO-Revision-Date: 2000-03-14 10:36+09:00\n" +"POT-Creation-Date: 2000-03-25 11:24+0100\n" +"PO-Revision-Date: 2000-03-27 11:02+09:00\n" "Last-Translator: Atsushi Yamagata \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=EUC-JP\n" @@ -16,7 +16,7 @@ #: app/audioconfig.c:59 msgid "Playback Output" -msgstr "ºÆÀ¸½ÐÎÏ" +msgstr "±éÁÕ½ÐÎÏ" #: app/audioconfig.c:65 msgid "Editing Output" @@ -50,7 +50,7 @@ msgid "Mixers" msgstr "¥ß¥­¥µ" -#: app/audioconfig.c:320 app/gui-settings.c:319 app/sample-editor.c:1607 +#: app/audioconfig.c:320 app/gui-settings.c:377 app/sample-editor.c:1613 #: app/tips-dialog.c:165 app/transposition.c:313 msgid "Close" msgstr "ÊĤ¸¤ë" @@ -151,7 +151,7 @@ msgid "no settings (yet), sorry!" msgstr "¤¹¤ß¤Þ¤»¤ó¡¢(¤Þ¤À)ÀßÄꤵ¤ì¤Æ¤¤¤Þ¤»¤ó!" -#: app/drivers/file-output.c:161 app/sample-editor.c:1312 +#: app/drivers/file-output.c:161 app/sample-editor.c:1316 msgid "Can't open file for writing." msgstr "½ñ¤­¹þ¤ß¤Î¤¿¤á¤Ë¥Õ¥¡¥¤¥ë¤¬³«¤±¤Þ¤»¤ó¡£" @@ -272,76 +272,144 @@ msgid "Operation not supported." msgstr "¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Ê¤¤Áàºî¤Ç¤¹¡£" -#: app/gui-settings.c:86 +#: app/gui-settings.c:83 msgid "Scopes Frequency" msgstr "¥¹¥³¡¼¥×¼þÇÈ¿ô" -#: app/gui-settings.c:89 +#: app/gui-settings.c:86 msgid "Tracker Frequency" msgstr "¥È¥é¥Ã¥«¡¼¼þÇÈ¿ô" -#: app/gui-settings.c:188 app/gui-settings.c:191 +#: app/gui-settings.c:211 app/gui-settings.c:214 msgid "GUI Configuration" msgstr "GUIÀßÄê" -#: app/gui-settings.c:217 +#: app/gui-settings.c:248 msgid "Use Hexadecimal Numbers" msgstr "16¿Ê¿ô¤ò»ÈÍÑ" -#: app/gui-settings.c:224 +#: app/gui-settings.c:255 msgid "Use upper case letters for hex numbers" msgstr "16¿Ê¿ô¤Ë¤ÏÂçʸ»ú¤ò»È¤Ã¤Æ¤¯¤À¤µ¤¤" -#: app/gui-settings.c:231 +#: app/gui-settings.c:262 msgid "Advance cursor horizontally in effect columns" -msgstr "¥¨¥Õ¥§¥¯¥ÈÎó¤Ç¥«¡¼¥½¥ë¤ò¿Ê¤á¤ë" +msgstr "" -#: app/gui-settings.c:238 +#: app/gui-settings.c:269 msgid "Asynchronous Editing" msgstr "È󯱴üÊÔ½¸" -#: app/gui-settings.c:245 +#: app/gui-settings.c:276 +msgid "Show zeroes" +msgstr "" + +#: app/gui-settings.c:283 +msgid "Channel numbering" +msgstr "" + +#: app/gui-settings.c:290 msgid "Use anti-aliased envelope editor" msgstr "¥¢¥ó¥Á¡¦¥¨¥¤¥ê¥¢¥¹¡¦¥¨¥ó¥Ù¥í¡¼¥×¡¦¥¨¥Ç¥£¥¿»ÈÍÑ" -#: app/gui-settings.c:251 +#: app/gui-settings.c:296 msgid "You need to restart SoundTracker for this change to come into effect." msgstr "¤³¤ÎÊѹ¹¤òÈ¿±Ç¤¹¤ë¤Ë¤ÏSoundTracker¤òºÆµ¯Æ°¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£" -#: app/gui-settings.c:260 +#: app/gui-settings.c:305 msgid "Scopes buffer size [MB]" msgstr "¥¹¥³¡¼¥×¡¦¥Ð¥Ã¥Õ¥¡¡¦¥µ¥¤¥º [MB]" -#: app/gui-settings.c:279 +#: app/gui-settings.c:324 msgid "Highlight rows:" -msgstr "¥í¥¦¶¯Ä´:" +msgstr "" -#: app/gui-settings.c:297 +#: app/gui-settings.c:342 msgid "`Save XM' saves all non-empty patterns" msgstr "`ÊݸXM'¤ÇÁ´¤Æ¤Î¶õ¤Ç¤Ê¤¤¥Ñ¥¿¡¼¥ó¤òÊݸ" -#: app/gui-subs.c:430 +#: app/gui-subs.c:32 +msgid "Idle." +msgstr "¥¢¥¤¥É¥ë¡£" + +#: app/gui-subs.c:33 +msgid "Playing song..." +msgstr "¶Ê±éÁÕ..." + +#: app/gui-subs.c:34 +msgid "Playing pattern..." +msgstr "¥Ñ¥¿¡¼¥ó±éÁÕ" + +#: app/gui-subs.c:35 +msgid "Loading module..." +msgstr "¥â¥¸¥å¡¼¥ë¡¦¥í¡¼¥É..." + +#: app/gui-subs.c:36 +msgid "Module loaded." +msgstr "" + +#: app/gui-subs.c:37 +msgid "Saving module..." +msgstr "¥â¥¸¥å¡¼¥ëÊݸ..." + +#: app/gui-subs.c:38 +msgid "Module saved." +msgstr "" + +#: app/gui-subs.c:39 +msgid "Loading sample..." +msgstr "¥µ¥ó¥×¥ë¡¦¥í¡¼¥É..." + +#: app/gui-subs.c:40 +msgid "Sample loaded." +msgstr "" + +#: app/gui-subs.c:41 +msgid "Saving sample..." +msgstr "¥µ¥ó¥×¥ëÊݸ..." + +#: app/gui-subs.c:42 +msgid "Sample saved." +msgstr "" + +#: app/gui-subs.c:43 +msgid "Loading instrument..." +msgstr "³Ú´ï¥í¡¼¥É..." + +#: app/gui-subs.c:44 +msgid "Instrument loaded." +msgstr "" + +#: app/gui-subs.c:45 +msgid "Saving instrument..." +msgstr "³Ú´ïÊݸ..." + +#: app/gui-subs.c:46 +msgid "Instrument saved." +msgstr "" + +#: app/gui-subs.c:459 msgid "Question" msgstr "¼ÁÌä" -#: app/gui-subs.c:447 app/keys.c:702 app/sample-editor.c:1225 -#: app/sample-editor.c:1412 +#: app/gui-subs.c:476 app/keys.c:702 app/sample-editor.c:1227 +#: app/sample-editor.c:1418 msgid "Cancel" msgstr "¼è¾Ã" -#: app/gui-subs.c:465 +#: app/gui-subs.c:494 msgid "Warning" msgstr "·Ù¹ð" -#: app/gui-subs.c:491 +#: app/gui-subs.c:520 msgid "Error!" msgstr "¥¨¥é¡¼!" -#: app/gui.c:83 +#: app/gui.c:87 msgid "Tempo" msgstr "¥Æ¥ó¥Ý" -#: app/gui.c:217 +#: app/gui.c:221 msgid "" "Are you sure you want to free the current project?\n" "All changes will be lost!" @@ -349,62 +417,66 @@ "¥«¥ì¥ó¥È¡¦¥×¥í¥¸¥§¥¯¥È¤ò²òÊü¤·¤¿¤¤¤Î¤Ï³Î¤«¤Ç¤¹¤«?\n" "Á´¤Æ¤ÎÊѹ¹¤¬¼º¤ï¤ì¤Þ¤¹!" -#: app/gui.c:231 app/gui.c:245 +#: app/gui.c:235 app/gui.c:249 msgid "Are you sure you want to overwrite the file?" msgstr "¥Õ¥¡¥¤¥ë¤ò¾å½ñ¤­¤·¤¿¤¤¤Î¤Ï³Î¤«¤Ç¤¹¤«?" -#: app/gui.c:1145 +#: app/gui.c:1167 msgid "Load XM..." msgstr "XM¥í¡¼¥É..." -#: app/gui.c:1147 +#: app/gui.c:1169 msgid "Save XM..." msgstr "XMÊݸ..." -#: app/gui.c:1150 +#: app/gui.c:1172 msgid "Render module as WAV..." msgstr "WAV¤È¤·¤Æ¥â¥¸¥å¡¼¥ë¤ò¥ì¥ó¥À¥ê¥ó¥°¤¹¤ë..." -#: app/gui.c:1202 +#: app/gui.c:1224 msgid "Play Song" -msgstr "¶ÊºÆÀ¸" +msgstr "¶Ê±éÁÕ" -#: app/gui.c:1208 +#: app/gui.c:1230 msgid "Play Pattern" -msgstr "¥Ñ¥¿¡¼¥óºÆÀ¸" +msgstr "¥Ñ¥¿¡¼¥ó±éÁÕ" -#: app/gui.c:1214 +#: app/gui.c:1236 msgid "Stop" msgstr "Ää»ß" -#: app/gui.c:1233 +#: app/gui.c:1255 msgid "Number of Channels:" msgstr "¥Á¥ã¥ó¥Í¥ë¿ô:" -#: app/gui.c:1249 app/playlist.c:294 +#: app/gui.c:1271 app/playlist.c:294 msgid "Pattern" msgstr "¥Ñ¥¿¡¼¥ó" -#: app/gui.c:1265 +#: app/gui.c:1287 msgid "PatLength" msgstr "¥Ñ¥¿¡¼¥óĹ" -#: app/gui.c:1357 +#: app/gui.c:1379 msgid "Octave" msgstr "¥ª¥¯¥¿¡¼¥Ö" -#: app/gui.c:1365 +#: app/gui.c:1387 msgid "Jump" msgstr "¥¸¥ã¥ó¥×" -#: app/gui.c:1373 +#: app/gui.c:1395 msgid "Instr" msgstr "³Ú´ï" -#: app/gui.c:1388 +#: app/gui.c:1410 msgid "Sample" msgstr "¥µ¥ó¥×¥ë" +#: app/gui.c:1448 +msgid "%M:%S" +msgstr "" + #: app/instrument-editor.c:75 msgid "VolFade" msgstr "²»ÎÌ¥Õ¥§¡¼¥É" @@ -421,63 +493,63 @@ msgid "VibSweep" msgstr "¥Ð¥¤¥Ö¥ì¡¼¥·¥ç¥ó¡¦¥¹¥¤¡¼¥×" -#: app/instrument-editor.c:154 app/instrument-editor.c:175 +#: app/instrument-editor.c:156 app/instrument-editor.c:179 msgid "Can't open file." msgstr "¥Õ¥¡¥¤¥ë¤¬³«¤±¤Þ¤»¤ó¡£" -#: app/instrument-editor.c:212 +#: app/instrument-editor.c:216 msgid "Sine" msgstr "Àµ¸¹ÇÈ" -#: app/instrument-editor.c:212 +#: app/instrument-editor.c:216 msgid "Square" msgstr "¶ë·ÁÇÈ" -#: app/instrument-editor.c:212 +#: app/instrument-editor.c:216 msgid "Saw Down" msgstr "²¼¸þµøÇÈ" -#: app/instrument-editor.c:212 +#: app/instrument-editor.c:216 msgid "Saw Up" msgstr "¾å¸þµøÇÈ" -#: app/instrument-editor.c:216 +#: app/instrument-editor.c:220 msgid "Instrument Editor" msgstr "³Ú´ïÊÔ½¸" -#: app/instrument-editor.c:225 +#: app/instrument-editor.c:229 msgid "Volume envelope" msgstr "²»ÎÌ¥¨¥ó¥Ù¥í¡¼¥×" -#: app/instrument-editor.c:233 +#: app/instrument-editor.c:237 msgid "Panning envelope" -msgstr "¥Ñ¥ó¡¦¥¨¥ó¥Ù¥í¡¼¥×" +msgstr "" -#: app/instrument-editor.c:250 +#: app/instrument-editor.c:254 msgid "Load Instrument..." msgstr "³Ú´ï¥í¡¼¥É..." -#: app/instrument-editor.c:252 +#: app/instrument-editor.c:256 msgid "Save Instrument..." msgstr "³Ú´ïÊݸ..." -#: app/instrument-editor.c:254 +#: app/instrument-editor.c:258 msgid "Load XI" msgstr "XI¥í¡¼¥É" -#: app/instrument-editor.c:260 +#: app/instrument-editor.c:264 msgid "Save XI" msgstr "XIÊݸ" -#: app/instrument-editor.c:279 +#: app/instrument-editor.c:283 msgid "Vibrato Type:" msgstr "¥Ó¥Ö¥é¡¼¥È·¿:" -#: app/instrument-editor.c:351 +#: app/instrument-editor.c:355 msgid "Note:" msgstr "²»Éä" -#: app/instrument-editor.c:369 +#: app/instrument-editor.c:373 msgid "Initialize" msgstr "½é´ü²½" @@ -559,7 +631,7 @@ "¤ªË¾¤ß¤ÎÁȹ礻¤Î¥­¡¼¤ò²¡¤·¤Æ¤¯¤À¤µ¤¤!\n" "¼è¾Ã¤¹¤Ë¤Ïº¸¤Î°ìÍ÷¤Ç¥¯¥ê¥Ã¥¯¤·¤Æ¤¯¤À¤µ¤¤" -#: app/keys.c:682 app/menubar.c:94 +#: app/keys.c:682 app/menubar.c:95 msgid "Ok" msgstr "λ²ò" @@ -585,7 +657,7 @@ "ÀßÄê¥á¥Ë¥å¡¼¤Î¥­¡¼¥Ü¡¼¥ÉÀßÄê¥À¥¤¥¢¥í¥°¤ò»ÈÍÑ\n" "¤·¤Æ¤¯¤À¤µ¤¤¡£" -#: app/menubar.c:130 +#: app/menubar.c:131 msgid "" "Are you sure you want to do this?\n" "All changes will be lost!" @@ -593,7 +665,7 @@ "¤³¤¦¤·¤¿¤¤¤Î¤Ï³Î¤«¤Ç¤¹¤«?\n" "Á´¤Æ¤ÎÊѹ¹¤¬¼º¤ï¤ì¤Þ¤¹!" -#: app/menubar.c:152 +#: app/menubar.c:153 msgid "" "Are you sure you want to quit?\n" "All changes will be lost!" @@ -601,387 +673,411 @@ "½ªÎ»¤·¤¿¤¤¤Î¤Ï³Î¤«¤Ç¤¹¤«?\n" "Á´¤Æ¤ÎÊѹ¹¤¬¼º¤ï¤ì¤Þ¤¹!" -#: app/menubar.c:223 +#: app/menubar.c:237 msgid "_Open..." msgstr "³«¤¯(_O)..." -#: app/menubar.c:225 +#: app/menubar.c:239 msgid "Save _as..." msgstr "Êݸ(_a)..." -#: app/menubar.c:231 +#: app/menubar.c:245 msgid "Save Module as _WAV..." msgstr "_WAV¤È¤·¤Æ¥â¥¸¥å¡¼¥ë¤òÊݸ..." -#: app/menubar.c:236 +#: app/menubar.c:250 msgid "_Quit" msgstr "½ªÎ»(_Q)" -#: app/menubar.c:243 +#: app/menubar.c:257 msgid "Clear _All" msgstr "Á´¤Æ¾Ãµî(_A)" -#: app/menubar.c:245 +#: app/menubar.c:259 msgid "Clear _Patterns Only" msgstr "¥Ñ¥¿¡¼¥ó¤Î¤ß¾Ãµî(_P)" -#: app/menubar.c:247 +#: app/menubar.c:261 msgid "_Optimize Module" msgstr "¥â¥¸¥å¡¼¥ëºÇŬ²½(_O)" -#: app/menubar.c:254 app/menubar.c:265 app/menubar.c:283 +#: app/menubar.c:268 app/menubar.c:279 app/menubar.c:297 msgid "C_ut" msgstr "ÀÚ¼è(_u)" -#: app/menubar.c:256 app/menubar.c:267 app/menubar.c:285 +#: app/menubar.c:270 app/menubar.c:281 app/menubar.c:299 msgid "_Copy" msgstr "¥³¥Ô¡¼(_C)" -#: app/menubar.c:258 app/menubar.c:269 app/menubar.c:287 +#: app/menubar.c:272 app/menubar.c:283 app/menubar.c:301 msgid "_Paste" msgstr "ŽÉÕ(_P)" -#: app/menubar.c:271 +#: app/menubar.c:285 msgid "_Insert" msgstr "ÁÞÆþ(_I)" -#: app/menubar.c:273 +#: app/menubar.c:287 msgid "_Delete" msgstr "ºï½ü(_D)" -#: app/menubar.c:281 +#: app/menubar.c:295 msgid "_Mark" msgstr "¥Þ¡¼¥¯(_M)" -#: app/menubar.c:294 +#: app/menubar.c:308 msgid "_Jazz Edit Mode" msgstr "_JazzÊÔ½¸¥â¡¼¥É" -#: app/menubar.c:299 +#: app/menubar.c:313 msgid "Transp_osition..." msgstr "°ÜÄ´(_o)..." -#: app/menubar.c:304 app/menubar.c:387 +#: app/menubar.c:318 app/menubar.c:413 msgid "_Pattern" msgstr "¥Ñ¥¿¡¼¥ó(_P)" -#: app/menubar.c:305 +#: app/menubar.c:319 msgid "_Track" msgstr "¥È¥é¥Ã¥¯(_T)" -#: app/menubar.c:306 +#: app/menubar.c:320 msgid "_Selection" msgstr "ÁªÂò(_S)" -#: app/menubar.c:312 +#: app/menubar.c:326 msgid "_Find Unused Pattern" msgstr "̤»ÈÍѥѥ¿¡¼¥ó¸¡º÷(_F)" -#: app/menubar.c:314 +#: app/menubar.c:328 msgid "_Copy Current to Unused Pattern" msgstr "̤»ÈÍѥѥ¿¡¼¥ó¤Ë¥«¥ì¥ó¥È¤ò¥³¥Ô¡¼(_C)" -#: app/menubar.c:316 +#: app/menubar.c:330 msgid "C_lear Unused Patterns" msgstr "̤»ÈÍѥѥ¿¡¼¥ó¾Ãµî(_l)" -#: app/menubar.c:318 +#: app/menubar.c:332 msgid "_Pack Patterns" msgstr "¥Ñ¥¿¡¼¥ó¡¦¥Ñ¥Ã¥¯(_P)" -#: app/menubar.c:325 +#: app/menubar.c:339 msgid "_Load XI..." msgstr "XI¥í¡¼¥É(_L)..." -#: app/menubar.c:327 +#: app/menubar.c:341 msgid "_Save XI..." msgstr "XIÊݸ(_S)..." -#: app/menubar.c:332 +#: app/menubar.c:346 msgid "_Clear Current" msgstr "¥«¥ì¥ó¥È¾Ãµî(_C)" -#: app/menubar.c:337 +#: app/menubar.c:351 msgid "_Delete Unused Instruments" msgstr "̤»ÈÍѳڴïºï½ü(_D)" -#: app/menubar.c:345 +#: app/menubar.c:358 +msgid "Use _Backing Store" +msgstr "_Backing Store»ÈÍÑ" + +#: app/menubar.c:361 +msgid "_Previous font" +msgstr "Á°¤Î¥Õ¥©¥ó¥È(_P)" + +#: app/menubar.c:363 +msgid "_Next font" +msgstr "¼¡¤Î¥Õ¥©¥ó¥È(_N)" + +#: app/menubar.c:371 msgid "Display _Oscilloscopes" msgstr "¥ª¥·¥í¥¹¥³¡¼¥×ɽ¼¨(_O)" -#: app/menubar.c:347 -msgid "Use _Backing Store" -msgstr "¥Ð¥Ã¥­¥ó¥°¡¦¥¹¥È¥¢»ÈÍÑ(_B)" +#: app/menubar.c:374 +msgid "_Tracker" +msgstr "¥È¥é¥Ã¥«¡¼(_T)" -#: app/menubar.c:352 +#: app/menubar.c:378 msgid "_Keyboard Configuration..." msgstr "¥­¡¼¥Ü¡¼¥ÉÀßÄê(_K)..." -#: app/menubar.c:354 +#: app/menubar.c:380 msgid "_Audio Configuration..." msgstr "¥ª¡¼¥Ç¥£¥ªÀßÄê(_A)..." -#: app/menubar.c:356 +#: app/menubar.c:382 msgid "_GUI Configuration..." msgstr "GUIÀßÄê(_G)..." -#: app/menubar.c:361 +#: app/menubar.c:387 msgid "_Save Settings now" msgstr "ÀßÄê¤òº£Êݸ(_S)" -#: app/menubar.c:363 +#: app/menubar.c:389 msgid "Save Settings on _Exit" msgstr "½ªÎ»»þ¤ËÀßÄê¤òÊݸ(_E)" -#: app/menubar.c:370 +#: app/menubar.c:396 msgid "_About..." msgstr "¾ðÊó(_A)..." -#: app/menubar.c:375 +#: app/menubar.c:401 msgid "Show _Tips..." msgstr "µ»¤Îɽ¼¨(_T)..." -#: app/menubar.c:377 +#: app/menubar.c:403 msgid "_XM Effects..." msgstr "_XM¸ú²Ì..." -#: app/menubar.c:384 +#: app/menubar.c:410 msgid "_File" msgstr "¥Õ¥¡¥¤¥ë(_F)" -#: app/menubar.c:385 +#: app/menubar.c:411 msgid "_Module" msgstr "¥â¥¸¥å¡¼¥ë(_M)" -#: app/menubar.c:386 +#: app/menubar.c:412 msgid "_Edit" msgstr "ÊÔ½¸(_E)" -#: app/menubar.c:388 +#: app/menubar.c:414 msgid "_Instrument" msgstr "³Ú´ï(_I)" -#: app/menubar.c:389 +#: app/menubar.c:415 msgid "_Settings" msgstr "ÀßÄê(_S)" -#: app/menubar.c:390 +#: app/menubar.c:416 msgid "_Help" msgstr "¥Ø¥ë¥×(_H)" -#: app/menubar.c:420 +#: app/menubar.c:446 msgid "/_File" msgstr "/¥Õ¥¡¥¤¥ë" -#: app/menubar.c:421 +#: app/menubar.c:447 msgid "/File/_Open..." msgstr "/¥Õ¥¡¥¤¥ë/³«¤¯(_O)..." -#: app/menubar.c:422 +#: app/menubar.c:448 msgid "/File/Save _as..." msgstr "/¥Õ¥¡¥¤¥ë/Êݸ(_a)..." -#: app/menubar.c:423 app/menubar.c:425 +#: app/menubar.c:449 app/menubar.c:451 msgid "/File/-" msgstr "/¥Õ¥¡¥¤¥ë/-" -#: app/menubar.c:424 +#: app/menubar.c:450 msgid "/File/Save Module as _WAV..." msgstr "/¥Õ¥¡¥¤¥ë/_WAV¤È¤·¤Æ¥â¥¸¥å¡¼¥ë¤òÊݸ..." -#: app/menubar.c:426 +#: app/menubar.c:452 msgid "/File/_Quit" msgstr "/¥Õ¥¡¥¤¥ë/½ªÎ»(_Q)" -#: app/menubar.c:427 +#: app/menubar.c:453 msgid "/_Module" msgstr "/¥â¥¸¥å¡¼¥ë" -#: app/menubar.c:428 +#: app/menubar.c:454 msgid "/Module/Clear _All" msgstr "/¥â¥¸¥å¡¼¥ë/Á´¤Æ¾Ãµî(_A)" -#: app/menubar.c:429 +#: app/menubar.c:455 msgid "/Module/Clear _Patterns Only" msgstr "/¥â¥¸¥å¡¼¥ë/¥Ñ¥¿¡¼¥ó¤Î¤ß¾Ãµî(_P)" -#: app/menubar.c:430 +#: app/menubar.c:456 msgid "/Module/_Optimize Module" msgstr "/¥â¥¸¥å¡¼¥ë/¥â¥¸¥å¡¼¥ëºÇŬ²½(_O)" -#: app/menubar.c:431 +#: app/menubar.c:457 msgid "/_Edit" msgstr "/ÊÔ½¸" -#: app/menubar.c:432 +#: app/menubar.c:458 msgid "/Edit/_Jazz Edit Mode" msgstr "/ÊÔ½¸/_JazzÊÔ½¸¥â¡¼¥É" -#: app/menubar.c:433 app/menubar.c:435 +#: app/menubar.c:459 app/menubar.c:461 msgid "/Edit/-" msgstr "/ÊÔ½¸/-" -#: app/menubar.c:434 +#: app/menubar.c:460 msgid "/Edit/_Transposition..." msgstr "/ÊÔ½¸/°ÜÄ´(_T)..." -#: app/menubar.c:436 +#: app/menubar.c:462 msgid "/Edit/_Pattern" msgstr "/ÊÔ½¸/¥Ñ¥¿¡¼¥ó" -#: app/menubar.c:437 +#: app/menubar.c:463 msgid "/Edit/Pattern/C_ut" msgstr "/ÊÔ½¸/¥Ñ¥¿¡¼¥ó/ÀÚ¼è(_u)" -#: app/menubar.c:438 +#: app/menubar.c:464 msgid "/Edit/Pattern/_Copy" msgstr "/ÊÔ½¸/¥Ñ¥¿¡¼¥ó/¥³¥Ô¡¼(_C)" -#: app/menubar.c:439 +#: app/menubar.c:465 msgid "/Edit/Pattern/_Paste" msgstr "/ÊÔ½¸/¥Ñ¥¿¡¼¥ó/ŽÉÕ(_P)" -#: app/menubar.c:440 +#: app/menubar.c:466 msgid "/Edit/_Track" msgstr "/ÊÔ½¸/¥È¥é¥Ã¥¯" -#: app/menubar.c:441 +#: app/menubar.c:467 msgid "/Edit/Track/C_ut" msgstr "/ÊÔ½¸/¥È¥é¥Ã¥¯/ÀÚ¼è(_u)" -#: app/menubar.c:442 +#: app/menubar.c:468 msgid "/Edit/Track/_Copy" msgstr "/ÊÔ½¸/¥È¥é¥Ã¥¯/¥³¥Ô¡¼(_C)" -#: app/menubar.c:443 +#: app/menubar.c:469 msgid "/Edit/Track/_Paste" msgstr "/ÊÔ½¸/¥È¥é¥Ã¥¯/ŽÉÕ(_P)" -#: app/menubar.c:444 +#: app/menubar.c:470 msgid "/Edit/Track/_Insert" msgstr "/ÊÔ½¸/¥È¥é¥Ã¥¯/ÁÞÆþ(_I)" -#: app/menubar.c:445 +#: app/menubar.c:471 msgid "/Edit/Track/_Delete" msgstr "/ÊÔ½¸/¥È¥é¥Ã¥¯/ºï½ü(_D)" -#: app/menubar.c:446 +#: app/menubar.c:472 msgid "/Edit/_Selection" msgstr "/ÊÔ½¸/ÁªÂò" -#: app/menubar.c:447 +#: app/menubar.c:473 msgid "/Edit/Selection/_Mark" msgstr "/ÊÔ½¸/ÁªÂò/¥Þ¡¼¥¯(_M)" -#: app/menubar.c:448 +#: app/menubar.c:474 msgid "/Edit/Selection/C_ut" msgstr "/ÊÔ½¸/ÁªÂò/ÀÚ¼è(_u)" -#: app/menubar.c:449 +#: app/menubar.c:475 msgid "/Edit/Selection/_Copy" msgstr "/ÊÔ½¸/ÁªÂò/¥³¥Ô¡¼(_C)" -#: app/menubar.c:450 +#: app/menubar.c:476 msgid "/Edit/Selection/_Paste" msgstr "/ÊÔ½¸/ÁªÂò/ŽÉÕ(_P)" -#: app/menubar.c:451 +#: app/menubar.c:477 msgid "/_Pattern" msgstr "/¥Ñ¥¿¡¼¥ó" -#: app/menubar.c:452 +#: app/menubar.c:478 msgid "/Pattern/_Find Unused Pattern" msgstr "/¥Ñ¥¿¡¼¥ó/̤»ÈÍѥѥ¿¡¼¥ó¸¡º÷(_F)" -#: app/menubar.c:453 +#: app/menubar.c:479 msgid "/Pattern/_Copy Current to Unused Pattern" msgstr "/¥Ñ¥¿¡¼¥ó/̤»ÈÍѥѥ¿¡¼¥ó¤Ë¥«¥ì¥ó¥È¤ò¥³¥Ô¡¼(_C)" -#: app/menubar.c:454 +#: app/menubar.c:480 msgid "/Pattern/C_lear Unused Patterns" msgstr "/¥Ñ¥¿¡¼¥ó/̤»ÈÍѥѥ¿¡¼¥ó¾Ãµî(_l)" -#: app/menubar.c:455 +#: app/menubar.c:481 msgid "/Pattern/_Pack Patterns" msgstr "/¥Ñ¥¿¡¼¥ó/¥Ñ¥¿¡¼¥ó¡¦¥Ñ¥Ã¥¯(_P)" -#: app/menubar.c:456 +#: app/menubar.c:482 msgid "/_Instrument" msgstr "/³Ú´ï" -#: app/menubar.c:457 +#: app/menubar.c:483 msgid "/Instrument/_Load XI..." msgstr "/³Ú´ï/XI¥í¡¼¥É(_L)..." -#: app/menubar.c:458 +#: app/menubar.c:484 msgid "/Instrument/_Save XI..." msgstr "/³Ú´ï/XIÊݸ(_S)..." -#: app/menubar.c:459 app/menubar.c:461 +#: app/menubar.c:485 app/menubar.c:487 msgid "/Instrument/-" msgstr "/³Ú´ï/-" -#: app/menubar.c:460 +#: app/menubar.c:486 msgid "/Instrument/_Clear Current" msgstr "/³Ú´ï/¥«¥ì¥ó¥È¾Ãµî(_C)" -#: app/menubar.c:462 +#: app/menubar.c:488 msgid "/Instrument/_Delete Unused Instruments" msgstr "/³Ú´ï/̤»ÈÍѳڴïºï½ü(_D)" -#: app/menubar.c:463 +#: app/menubar.c:489 msgid "/_Settings" msgstr "/ÀßÄê" -#: app/menubar.c:464 +#: app/menubar.c:490 msgid "/Settings/Display _Oscilloscopes" msgstr "/ÀßÄê/¥ª¥·¥í¥¹¥³¡¼¥×ɽ¼¨(_O)" -#: app/menubar.c:465 -msgid "/Settings/Use _Backing Store" -msgstr "/ÀßÄê/¥Ð¥Ã¥­¥ó¥°¡¦¥¹¥È¥¢»ÈÍÑ(_B)" +#: app/menubar.c:491 +msgid "/Settings/_Tracker" +msgstr "/ÀßÄê/¥È¥é¥Ã¥«¡¼(_T)" + +#: app/menubar.c:492 +msgid "/Settings/Tracker/Use _Backing Store" +msgstr "/ÀßÄê/¥È¥é¥Ã¥«¡¼/_Backing Store»ÈÍÑ" + +#: app/menubar.c:493 +msgid "/Settings/Tracker/_Previous font" +msgstr "/ÀßÄê/¥È¥é¥Ã¥«¡¼/Á°¤Î¥Õ¥©¥ó¥È(_P)" + +#: app/menubar.c:494 +msgid "/Settings/Tracker/_Next font" +msgstr "/ÀßÄê/¥È¥é¥Ã¥«¡¼/¼¡¤Î¥Õ¥©¥ó¥È(_N)" -#: app/menubar.c:466 app/menubar.c:470 +#: app/menubar.c:495 app/menubar.c:499 msgid "/Settings/-" msgstr "/ÀßÄê/-" -#: app/menubar.c:467 +#: app/menubar.c:496 msgid "/Settings/_Keyboard Configuration..." msgstr "/ÀßÄê/¥­¡¼¥Ü¡¼¥ÉÀßÄê(_K)..." -#: app/menubar.c:468 +#: app/menubar.c:497 msgid "/Settings/_Audio Configuration..." msgstr "/ÀßÄê/¥ª¡¼¥Ç¥£¥ªÀßÄê(_A)..." -#: app/menubar.c:469 +#: app/menubar.c:498 msgid "/Settings/_GUI Configuration..." msgstr "/ÀßÄê/GUIÀßÄê(_G)..." -#: app/menubar.c:471 +#: app/menubar.c:500 msgid "/Settings/_Save Settings now" msgstr "/ÀßÄê/ÀßÄê¤òº£Êݸ(_S)" -#: app/menubar.c:472 +#: app/menubar.c:501 msgid "/Settings/Save Settings on _Exit" msgstr "/ÀßÄê/½ªÎ»»þ¤ËÀßÄê¤òÊݸ(_E)" -#: app/menubar.c:473 +#: app/menubar.c:502 msgid "/_Help" msgstr "/¥Ø¥ë¥×" -#: app/menubar.c:474 +#: app/menubar.c:503 msgid "/Help/_About..." msgstr "/¥Ø¥ë¥×/¾ðÊó(_A)..." -#: app/menubar.c:475 +#: app/menubar.c:504 msgid "/Help/-" msgstr "/¥Ø¥ë¥×/-" -#: app/menubar.c:476 +#: app/menubar.c:505 msgid "/Help/Show _Tips..." msgstr "/¥Ø¥ë¥×/µ»¤Îɽ¼¨(_T)..." -#: app/menubar.c:477 +#: app/menubar.c:506 msgid "/Help/_XM Effects..." msgstr "/¥Ø¥ë¥×/_XM¸ú²Ì..." @@ -1027,7 +1123,7 @@ #: app/playlist.c:293 msgid "Current pos" -msgstr "¥«¥ì¥ó¥È°ÌÃÖ" +msgstr "¸½ºß°ÌÃÖ" #: app/playlist.c:295 msgid "Restart pos" @@ -1067,17 +1163,17 @@ #: app/sample-editor.c:238 msgid "Panning" -msgstr "¥Ñ¥ó" +msgstr "" #: app/sample-editor.c:239 msgid "Finetune" -msgstr "ÈùÄ´À°" +msgstr "" #: app/sample-editor.c:259 msgid "Selection:" msgstr "ÁªÂò:" -#: app/sample-editor.c:263 +#: app/sample-editor.c:263 app/track-editor.c:168 app/track-editor.c:178 msgid "None" msgstr "̵" @@ -1091,7 +1187,7 @@ #: app/sample-editor.c:306 msgid "RelNote" -msgstr "Relnote" +msgstr "" #: app/sample-editor.c:317 msgid "Load Sample..." @@ -1119,7 +1215,7 @@ #: app/sample-editor.c:361 msgid "Volume Ramp" -msgstr "Volume Ramp" +msgstr "" #: app/sample-editor.c:371 msgid "Zoom to selection" @@ -1165,19 +1261,19 @@ msgid "(no selection)" msgstr "(̵ÁªÂò)" -#: app/sample-editor.c:1000 +#: app/sample-editor.c:999 msgid "" msgstr "<º£Å½ÉÕ¤±¤µ¤ì¤Þ¤·¤¿>" -#: app/sample-editor.c:1076 +#: app/sample-editor.c:1075 msgid "Read error." msgstr "ÆÉ¤ß¹þ¤ß¥¨¥é¡¼¡£" -#: app/sample-editor.c:1181 +#: app/sample-editor.c:1183 msgid "Load stereo sample" msgstr "¥¹¥Æ¥ì¥ª¡¦¥µ¥ó¥×¥ë¡¦¥í¡¼¥É" -#: app/sample-editor.c:1189 +#: app/sample-editor.c:1191 msgid "" "You have selected a stereo sample!\n" "(SoundTracker can only handle mono samples!)\n" @@ -1189,79 +1285,79 @@ "\n" "¥í¡¼¥É¤¹¤ë¤¿¤á¤Î¥Á¥ã¥ó¥Í¥ë¤òÁª¤ó¤Ç¤¯¤À¤µ¤¤:" -#: app/sample-editor.c:1200 +#: app/sample-editor.c:1202 msgid "Left" msgstr "º¸" -#: app/sample-editor.c:1206 +#: app/sample-editor.c:1208 msgid "Mix" msgstr "¥ß¥Ã¥¯¥¹" -#: app/sample-editor.c:1212 +#: app/sample-editor.c:1214 msgid "Right" msgstr "±¦" -#: app/sample-editor.c:1251 +#: app/sample-editor.c:1253 msgid "Can't read sample" msgstr "¥µ¥ó¥×¥ë¤¬ÆÉ¤ß¹þ¤á¤Þ¤»¤ó" -#: app/sample-editor.c:1257 +#: app/sample-editor.c:1259 msgid "Sample is too long for current mixer module. Loading anyway." msgstr "" "¥µ¥ó¥×¥ë¤¬¸½ºß¤Î¥ß¥­¥µ¡¦¥â¥¸¥å¡¼¥ë¤Ë¤ÏĹ²á¤®¤Þ¤¹¡£\n" "¤È¤Ë¤«¤¯¥í¡¼¥É¤·¤Þ¤¹¡£" -#: app/sample-editor.c:1271 +#: app/sample-editor.c:1273 msgid "Can only handle 8 and 16 bit samples with up to 2 channels" msgstr "2¥Á¥ã¥ó¥Í¥ë¤Þ¤Ç¤Ç 8¡¢16¥Ó¥Ã¥È¡¦¥µ¥ó¥×¥ë¤Î¤ß½èÍý¤Ç¤­¤Þ¤¹" -#: app/sample-editor.c:1370 +#: app/sample-editor.c:1376 msgid "Nothing to save." msgstr "²¿¤âÊݸ¤·¤Ê¤¤¡£" -#: app/sample-editor.c:1397 +#: app/sample-editor.c:1403 msgid "OK" msgstr "λ²ò" -#: app/sample-editor.c:1405 +#: app/sample-editor.c:1411 msgid "Start sampling" msgstr "¥µ¥ó¥×¥ê¥ó¥°³«»Ï" -#: app/sample-editor.c:1440 app/sample-editor.c:1443 +#: app/sample-editor.c:1446 app/sample-editor.c:1449 msgid "Sampling Window" msgstr "¥µ¥ó¥×¥ê¥ó¥°¡¦¥¦¥£¥ó¥É¥¦" -#: app/sample-editor.c:1543 +#: app/sample-editor.c:1549 msgid "" msgstr "<º£¥µ¥ó¥×¥ê¥ó¥°¤·¤Þ¤·¤¿>" -#: app/sample-editor.c:1573 +#: app/sample-editor.c:1579 msgid "Recorded sample is too long for current mixer module. Using it anyway." msgstr "" "Ï¿²»¤·¤¿¥µ¥ó¥×¥ë¤¬¸½ºß¤Î¥ß¥­¥µ¡¦¥â¥¸¥å¡¼¥ë¤Ë¤ÏĹ²á¤®¤Þ¤¹¡£\n" "¤È¤Ë¤«¤¯¤½¤ì¤ò»È¤¤¤Þ¤¹¡£" -#: app/sample-editor.c:1605 +#: app/sample-editor.c:1611 msgid "Normalize" msgstr "µ¬³Ê²½" -#: app/sample-editor.c:1606 +#: app/sample-editor.c:1612 msgid "Execute" msgstr "¼Â¹Ô" -#: app/sample-editor.c:1616 app/sample-editor.c:1619 +#: app/sample-editor.c:1622 app/sample-editor.c:1625 msgid "Volume Ramping" -msgstr "Volume Ramping" +msgstr "" -#: app/sample-editor.c:1636 +#: app/sample-editor.c:1642 msgid "Perform linear volume fade on Selection" msgstr "ÁªÂò»þ¤Ë²»Î̤òÀþ·¿¤Ë¥Õ¥§¡¼¥É¤¹¤ë" -#: app/sample-editor.c:1648 +#: app/sample-editor.c:1654 msgid "Left [%]:" msgstr "º¸ [%]:" -#: app/sample-editor.c:1653 +#: app/sample-editor.c:1659 msgid "Right [%]:" msgstr "±¦ [%]:" @@ -1328,14 +1424,263 @@ "³Ú´ïÊÔ½¸¥Ú¡¼¥¸¤Ç¡¢¥µ¥ó¥×¥ë¤ò¥¢¥¯¥Æ¥£¥Ö¤Ë¤·¤Æ¤«¤é¥­¡¼¥Ü¡¼¥É¤ò¥¯¥ê¥Ã¥¯\n" "¤¹¤ë¤È¸Ä¡¹¤Î¥­¡¼¤Ë³Ú´ï¤Î¥µ¥ó¥×¥ë¤ò³äÅö¤Æ¤é¤ì¤ë¤è¡£" +#: app/track-editor.c:83 +msgid "Arpeggio" +msgstr "¥¢¥ë¥Ú¥¸¥ª" + +#. 0 +#: app/track-editor.c:84 +msgid "Porta up" +msgstr "" + +#. 1 +#: app/track-editor.c:85 +msgid "Porta down" +msgstr "" + +#. 2 +#: app/track-editor.c:86 app/track-editor.c:150 +msgid "Tone porta" +msgstr "" + +#. 3 +#: app/track-editor.c:87 app/track-editor.c:146 +msgid "Vibrato" +msgstr "¥Ó¥Ö¥é¡¼¥È" + +#. 4 +#: app/track-editor.c:88 +msgid "Tone porta + Volume slide" +msgstr "" + +#. 5 +#: app/track-editor.c:89 +msgid "Vibrato + Volume slide" +msgstr "" + +#. 6 +#: app/track-editor.c:90 +msgid "Tremolo" +msgstr "¥È¥ì¥â¥í" + +#. 7 +#: app/track-editor.c:91 app/track-editor.c:147 +msgid "Set panning" +msgstr "" + +#. 8 +#: app/track-editor.c:92 app/track-editor.c:94 +msgid "Position jump" +msgstr "" + +#. 9 +#: app/track-editor.c:93 app/track-editor.c:95 app/track-editor.c:171 +msgid "Set volume" +msgstr "²»ÎÌÀßÄê" + +#. C +#: app/track-editor.c:96 +msgid "Pattern break" +msgstr "" + +#. D +#. E +#: app/track-editor.c:98 +msgid "Set tempo/bpm" +msgstr "¥Æ¥ó¥Ý/bpmÀßÄê" + +#. F +#: app/track-editor.c:99 +msgid "Set global volume" +msgstr "Á´ÂΥܥê¥å¡¼¥àÀßÄê" + +#. G +#: app/track-editor.c:100 +msgid "Global volume slide" +msgstr "Á´ÂΥܥê¥å¡¼¥à¡¦¥¹¥é¥¤¥É" + +#. H +#. I +#. J +#: app/track-editor.c:103 +msgid "Key off" +msgstr "" + +#. K +#: app/track-editor.c:104 +msgid "Set envelop position" +msgstr "¥¨¥ó¥Ù¥í¡¼¥×°ÌÃÖÀßÄê" + +#. L +#. M +#. N +#. O #: app/track-editor.c:108 +msgid "Panning slide" +msgstr "" + +#. P +#: app/track-editor.c:109 +msgid "LP filter resonance" +msgstr "" + +#. Q +#: app/track-editor.c:110 +msgid "Multi retrig note" +msgstr "" + +#. R +#. S +#: app/track-editor.c:112 +msgid "Tremor" +msgstr "" + +#. T +#. U +#. V +#. W +#. X +#. Y +#: app/track-editor.c:118 +msgid "LP filter cutoff" +msgstr "" + +#. 0 +#: app/track-editor.c:123 +msgid "Fine porta up" +msgstr "" + +#. 1 +#: app/track-editor.c:124 +msgid "Fine porta down" +msgstr "" + +#. 2 +#: app/track-editor.c:125 +msgid "Set gliss control" +msgstr "¥°¥ê¥Ã¥µ¥ó¥ÉÁàºîÀßÄê" + +#. 3 +#: app/track-editor.c:126 +msgid "Set vibrato control" +msgstr "¥Ó¥Ö¥é¡¼¥ÈÁàºîÀßÄê" + +#. 4 +#: app/track-editor.c:127 +msgid "Set finetune" +msgstr "" + +#. 5 +#: app/track-editor.c:128 +msgid "Set loop begin/loop" +msgstr "¥ë¡¼¥×³«»ÏÀßÄê/¥ë¡¼¥×" + +#. 6 +#: app/track-editor.c:129 +msgid "Set tremolo control" +msgstr "¥È¥ì¥â¥íÁàºîÀßÄê" + +#. 7 +#. 8 +#: app/track-editor.c:131 +msgid "Retrig note" +msgstr "" + +#. 9 +#: app/track-editor.c:132 app/track-editor.c:144 +msgid "Fine volume slide up" +msgstr "" + +#. A +#: app/track-editor.c:133 app/track-editor.c:143 +msgid "Fine volume slide down" +msgstr "" + +#. B +#: app/track-editor.c:134 +msgid "Note cut" +msgstr "" + +#. C +#: app/track-editor.c:135 +msgid "Note delay" +msgstr "" + +#. D +#: app/track-editor.c:136 +msgid "Pattern delay" +msgstr "" + +#: app/track-editor.c:141 +msgid "Volume slide down" +msgstr "" + +#: app/track-editor.c:142 +msgid "Volume slide up" +msgstr "" + +#: app/track-editor.c:145 +msgid "Set vibrato speed" +msgstr "¥Ó¥Ö¥é¡¼¥È®ÅÙÀßÄê" + +#: app/track-editor.c:148 +msgid "Panning slide left" +msgstr "" + +#: app/track-editor.c:149 +msgid "Panning slide right" +msgstr "" + +#: app/track-editor.c:154 +msgid "sine" +msgstr "Àµ¸¹ÇÈ" + +#. 0 +#: app/track-editor.c:155 +msgid "ramp down" +msgstr "" + +#. 1 +#: app/track-editor.c:156 +msgid "square" +msgstr "¶ë·ÁÇÈ" + +#: app/track-editor.c:331 msgid "Jazz Edit:" msgstr "JazzÊÔ½¸:" -#: app/track-editor.c:147 +#: app/track-editor.c:373 msgid "Tracker" msgstr "¥È¥é¥Ã¥«¡¼" +#: app/tracker-settings.c:233 +msgid "Font list" +msgstr "¥Õ¥©¥ó¥È°ìÍ÷" + +#: app/tracker-settings.c:257 +msgid "Add font" +msgstr "¥Õ¥©¥ó¥ÈÄɲÃ" + +#: app/tracker-settings.c:263 +msgid "Delete font" +msgstr "¥Õ¥©¥ó¥Èºï½ü" + +#: app/tracker-settings.c:269 +msgid "Apply font" +msgstr "¥Õ¥©¥ó¥ÈŬÍÑ" + +#: app/tracker-settings.c:284 +msgid "Up" +msgstr "¾å" + +#: app/tracker-settings.c:287 +msgid "Down" +msgstr "²¼" + +#: app/tracker-settings.c:290 +msgid "Select font..." +msgstr "¥Õ¥©¥ó¥ÈÁªÂò..." + #: app/transposition.c:166 msgid "Whole Song" msgstr "¶ÊÁ´ÂÎ" @@ -1412,44 +1757,44 @@ msgid "Instrument 2:" msgstr "³Ú´ï 2:" -#: app/xm.c:170 +#: app/xm.c:171 #, c-format msgid "Pattern length out of range: %d.\n" msgstr "¥Ñ¥¿¡¼¥óŤ¬ÈϰϤò±Û¤¨¤Þ¤·¤¿: %d.\n" -#: app/xm.c:455 app/xm.c:526 +#: app/xm.c:456 app/xm.c:527 #, c-format msgid "Invalid vibtype %d, using Sine.\n" msgstr "ÉÔÀµ¤Ê¥Ð¥¤¥Ö¥ì¡¼¥·¥ç¥ó·¿%d¡¢Àµ¸¹ÇȤò»ÈÍѤ·¤Þ¤¹¡£\n" -#: app/xm.c:486 +#: app/xm.c:487 msgid "File is no XI instrument." msgstr "¥Õ¥¡¥¤¥ë¤¬XI³Ú´ï¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó¡£" -#: app/xm.c:496 +#: app/xm.c:497 #, c-format msgid "Unknown XI version 0x%x\n" msgstr "̤ÃΤÎXI¥Ð¡¼¥¸¥ç¥ó0x%x¤Ç¤¹\n" -#: app/xm.c:787 app/xm.c:901 +#: app/xm.c:790 app/xm.c:908 msgid "Error while loading patterns." msgstr "¥Ñ¥¿¡¼¥ó¤Î¥í¡¼¥ÉÃæ¤Ë¥¨¥é¡¼¡£" -#: app/xm.c:851 +#: app/xm.c:858 msgid "Can't open file" msgstr "¥Õ¥¡¥¤¥ë¤¬³«¤±¤Þ¤»¤ó" -#: app/xm.c:865 +#: app/xm.c:872 msgid "XM header length != 276. Maybe a pre-0.0.12 SoundTracker module? :-)\n" msgstr "" "XM¥Ø¥Ã¥ÀŤ¬276¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó¡£\n" "¶²¤é¤¯pre-0.0.12 SoundTracker¥â¥¸¥å¡¼¥ë¤Ç¤Ï? :-)\n" -#: app/xm.c:907 +#: app/xm.c:914 msgid "Error while loading instruments." msgstr "³Ú´ï¤Î¥í¡¼¥ÉÃæ¤Ë¥¨¥é¡¼¡£" -#: app/xm.c:918 +#: app/xm.c:925 #, c-format msgid "" "Module contains sample(s) that are too long for the current mixer.\n" @@ -1458,7 +1803,7 @@ "¥â¥¸¥å¡¼¥ë¤¬¸½ºß¤Î¥ß¥­¥µ¡¦¥â¥¸¥å¡¼¥ë¤Ë¤ÏĹ²á¤®¤ë¥µ¥ó¥×¥ë¤ò´Þ¤ó¤Ç¤¤¤Þ¤¹¡£\n" "¥µ¥ó¥×¥ë¤ÎºÇÂçŤÏ%d¤Ç¤¹¡£" -#: app/xm.c:1234 +#: app/xm.c:1247 msgid "No FastTracker XM and no supported MOD format!" msgstr "" "FastTracker XM¥Õ¥©¡¼¥Þ¥Ã¥È¤Ç¤â¥µ¥Ý¡¼¥È¤µ¤ì¤¿MOD¥Õ¥©¡¼¥Þ¥Ã¥È¤Ç¤â¤¢¤ê¤Þ¤»¤ó!" diff -urN soundtracker-0.5.1/po/soundtracker.pot soundtracker-0.5.2/po/soundtracker.pot --- soundtracker-0.5.1/po/soundtracker.pot Sat Mar 25 11:24:56 2000 +++ soundtracker-0.5.2/po/soundtracker.pot Mon Mar 27 12:44:34 2000 @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"POT-Creation-Date: 2000-03-25 11:24+0100\n" +"POT-Creation-Date: 2000-03-27 12:44+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -164,31 +164,31 @@ "%s" msgstr "" -#: app/envelope-box.c:740 +#: app/envelope-box.c:863 msgid "Length" msgstr "" -#: app/envelope-box.c:741 +#: app/envelope-box.c:864 msgid "Current" msgstr "" -#: app/envelope-box.c:742 +#: app/envelope-box.c:865 msgid "Offset" msgstr "" -#: app/envelope-box.c:743 +#: app/envelope-box.c:866 msgid "Value" msgstr "" -#: app/envelope-box.c:749 app/playlist.c:301 +#: app/envelope-box.c:872 app/playlist.c:301 msgid "Insert" msgstr "" -#: app/envelope-box.c:755 app/playlist.c:307 +#: app/envelope-box.c:878 app/playlist.c:307 msgid "Delete" msgstr "" -#: app/envelope-box.c:843 +#: app/envelope-box.c:967 msgid "" "Graphical\n" "Envelope\n" @@ -197,23 +197,23 @@ "GNOME Version" msgstr "" -#: app/envelope-box.c:858 +#: app/envelope-box.c:982 msgid "Sustain" msgstr "" -#: app/envelope-box.c:866 +#: app/envelope-box.c:990 msgid "Point" msgstr "" -#: app/envelope-box.c:868 +#: app/envelope-box.c:992 msgid "Loop" msgstr "" -#: app/envelope-box.c:876 app/sample-editor.c:225 +#: app/envelope-box.c:1000 app/sample-editor.c:225 msgid "Start" msgstr "" -#: app/envelope-box.c:877 app/sample-editor.c:226 +#: app/envelope-box.c:1001 app/sample-editor.c:226 msgid "End" msgstr "" @@ -369,20 +369,20 @@ msgid "Instrument saved." msgstr "" -#: app/gui-subs.c:459 +#: app/gui-subs.c:463 msgid "Question" msgstr "" -#: app/gui-subs.c:476 app/keys.c:702 app/sample-editor.c:1227 +#: app/gui-subs.c:480 app/keys.c:702 app/sample-editor.c:1227 #: app/sample-editor.c:1418 msgid "Cancel" msgstr "" -#: app/gui-subs.c:494 +#: app/gui-subs.c:498 msgid "Warning" msgstr "" -#: app/gui-subs.c:520 +#: app/gui-subs.c:524 msgid "Error!" msgstr "" @@ -400,59 +400,59 @@ msgid "Are you sure you want to overwrite the file?" msgstr "" -#: app/gui.c:1167 +#: app/gui.c:1176 msgid "Load XM..." msgstr "" -#: app/gui.c:1169 +#: app/gui.c:1178 msgid "Save XM..." msgstr "" -#: app/gui.c:1172 +#: app/gui.c:1181 msgid "Render module as WAV..." msgstr "" -#: app/gui.c:1224 +#: app/gui.c:1233 msgid "Play Song" msgstr "" -#: app/gui.c:1230 +#: app/gui.c:1239 msgid "Play Pattern" msgstr "" -#: app/gui.c:1236 +#: app/gui.c:1245 msgid "Stop" msgstr "" -#: app/gui.c:1255 +#: app/gui.c:1264 msgid "Number of Channels:" msgstr "" -#: app/gui.c:1271 app/playlist.c:294 +#: app/gui.c:1280 app/playlist.c:294 msgid "Pattern" msgstr "" -#: app/gui.c:1287 +#: app/gui.c:1296 msgid "PatLength" msgstr "" -#: app/gui.c:1379 +#: app/gui.c:1388 msgid "Octave" msgstr "" -#: app/gui.c:1387 +#: app/gui.c:1396 msgid "Jump" msgstr "" -#: app/gui.c:1395 +#: app/gui.c:1404 msgid "Instr" msgstr "" -#: app/gui.c:1410 +#: app/gui.c:1419 msgid "Sample" msgstr "" -#: app/gui.c:1448 +#: app/gui.c:1482 msgid "%M:%S" msgstr "" diff -urN soundtracker-0.5.1/soundtracker.spec soundtracker-0.5.2/soundtracker.spec --- soundtracker-0.5.1/soundtracker.spec Sat Mar 25 11:30:26 2000 +++ soundtracker-0.5.2/soundtracker.spec Mon Mar 27 12:43:29 2000 @@ -1,6 +1,6 @@ %define name soundtracker -%define version 0.5.1 -%define release 13 +%define version 0.5.2 +%define release 14 %define prefix /usr Summary: Sound modules editor/player