diff -urN soundtracker-0.3.10/AUTHORS soundtracker-0.5.0/AUTHORS --- soundtracker-0.3.10/AUTHORS Fri Jan 21 16:39:50 2000 +++ soundtracker-0.5.0/AUTHORS Mon Mar 13 13:49:07 2000 @@ -53,8 +53,13 @@ (the SoundTracker logo) Conrad Parker ("Reverse" function in sample editor; bug fixes) -Tomasz Maka +Tomasz Maka ("Save region" function, insert / delete row stuff) +Nicolas Leveille + (track editor IT-style stuff) +Jason Nunn + (gz zip bz2 archive handler) + Translations ============= diff -urN soundtracker-0.3.10/ChangeLog soundtracker-0.5.0/ChangeLog --- soundtracker-0.3.10/ChangeLog Wed Jan 26 18:29:31 2000 +++ soundtracker-0.5.0/ChangeLog Mon Mar 13 14:02:00 2000 @@ -1,3 +1,152 @@ +2000-03-13 Michael Krause + + * Released v0.5.0 + + * app/audio.c (mixer_mix): Stereo to mono conversion works now. + + * app/xm.h: Added "treat_as_8bit" variable so that 8bit sample + handling can still be faked to the user by the GUI. + + * app/mixer.h: Removed "type" field from st_mixer_sample_info. All + samples are stored in 16bit format internally now. Removes a lot + of duplicate code in sample-editor.c and in the mixers. + +2000-03-12 Michael Krause + + * app/mixers/integer32.c: Adjusted for 16bit scope buffers. + + * app/audio.c: Using 16bit scope buffers now. Makes the mixer + routines faster. + + * app/mixers/kb-x86.c, app/mixers/kb-x86-asm.S: Added scopes + handling. + + * app/xm.c: Load XM's with odd number of channels as well + (generate empty channel in that case). + + * app/mixers/kb-x86.c (kb_x86_updatesample): Can handle updates of + loop limits while playing. + + * app/audio.c (driver_startnote): Don't call mixer if sample is + empty. + + * app/audioconfig.c, app/audio.c, app/main.c: You can choose a + mixer module now. + +2000-03-10 Michael Krause + + * app/mixers/kb-x86.c (kb_x86_mix_sub): Added pingpong loop + handling. Been listening to some of my favourite modules for quite + some time now and I haven't discovered any more mixing bugs. And + it sounds just great :-) + + * app/mixers/kb-x86-asm.S: Added backwards mixing function. + +2000-03-09 Michael Krause + + * app/cheat-sheet.c: Added new effects. + + * app/mixers/kb-x86-asm.S (kbasm_mix): Enabled IT filter + code. Sounds crappy. No wonder, this is a one-tap IIR filter. But + IT just sounds like that. + + * app/audio.c (driver_set_ch_filter_*), app/mixer.h: Added player + interface for filter commands. + + * app/xm-player.c (xm_player_playnote_fasttracker, xmpPlayTick): + Don't set procins = 0 when procnot==97 + (xmpPlayTick): Added filter commands. + (xmpPlayTick): Some Mxx fixes. (all these changes taken from + latest OpenCP CVS). + + * app/mixers/kb-x86.c: Looping code and no-loop code unified. Now + bullet-proof with regards to extremely short loop lengths. Added + declicking logic for sample ends. Still no ping-pong loop support. + +2000-03-08 Michael Krause + + * app/mixers/kb-x86.c: Rewrote complete loop handling code in C + and corrected it so as to deal with unmodified samples (the + interpolation code would read three invalid sample values after + the loop end otherwise). Actually, this required loop prediction + logic to be written similar to integer32.c. This thing sounds + great :-) + +2000-03-06 Jason Nunn + + * app/xm.c: Soundtracker can now load compressed zip lzh gz bz2 + modules. + +2000-03-05 Michael Krause + + * app/mixers/kb-x86.c, app/mixers/kb-x86-asm.S: First try at + incorporating Tammo Hinrich's brandnew FPU mixer code into + SoundTracker. I have ported two versions, one with linear + interpolation and one with cubic interpolation (both have code for + the IT filters). Support for Ping-Pong loops, 8 bit samples and + oscilloscopes is missing, though. + +2000-03-03 Michael Krause + + * app/scope-group.c (scope_group_timeout): Add some hackery to + deal with too short latencies and the scopes dropping out. + + * app/gui.c: The Win95 Menu key now plays all channels of the + current row only. Nice ProTracker feature. + + * app/audio.c (audio_ctlpipe_play_pattern): Support "only1row" + argument. Use edit-mode driver for the single row play feature. + + * app/xm-player.c: Hacked support for playing only one row of the + current pattern and then stopping. + + * app/gui-settings.c (gui_settings_dialog): Renamed + advance_cursor_in_fx_columns to "Advance cursor horizontally in + effect columns". + + * app/gui.c, app/track-editor.c, app/gui-settings.[ch]: Added + asynchronous IT-style editing where you can still edit patterns + while playing them and the patterns don't scroll. Use "Escape" + after starting playing the song or pattern to enable editing + mode. "Space" still stops the song. + + * po: Updated ru.po. + +2000-02-19 Michael Krause + + * app/mixers/integer32.c (integer32_setfreq): If freq is set too + low, c->speed can become 0. Force it to be 1 in this case. + + * app/keys.c (keys_dialog): Initializing capturing variables. + + * app/audioconfig.c, app/gui-settings.c, app/transposition.c: + Added Close button. + + * app/mixers/integer32.c: Removed ugly reverb effect. + + * app/keys.c: Added standard OK / Cancel / Apply buttons. + +2000-02-13 Michael Krause + + * app/sample-editor.c (sample_editor_update): Reordered some + initialization functions to avoid some triggered assert's. + (sample_editor_page_create): Cleaned up selection widget mess. + +2000-02-11 Michael Krause + + * po: Updated ja.po. + +2000-02-09 Michael Krause + + * app/drivers/alsa2-input.c, app/drivers/alsa2-output.c: + s/_plugin_/_channel_/ (as requested by Kai Vehmanen). + +2000-02-07 Nicolas Leveille + + * app/track-editor.c: fixed handling of the advance_in_fx_column. + + * doc/hacking.texi: some fixes to make it a well-formed texinfo file. + 2000-01-26 Michael Krause * Released v0.3.10 diff -urN soundtracker-0.3.10/FAQ soundtracker-0.5.0/FAQ --- soundtracker-0.3.10/FAQ Fri Sep 3 15:36:21 1999 +++ soundtracker-0.5.0/FAQ Mon Mar 13 13:57:32 2000 @@ -10,6 +10,15 @@ ------------------------------------------------------------------------ +QQQQ: SoundTracker complains about not being able to open /dev/dsp. + +a: You are probably running GNOME and ESD is keeping /dev/dsp open. +You could either kill esd, disable GNOME audio extensions, or use the +ESD driver supplied with SoundTracker, though that one gives you quite +a delay. + +------------------------------------------------------------------------ + QQQQ: SoundTracker crashes as soon as I use the menu bar. a: You have a too old gtk+. Read the INSTALL file. @@ -47,15 +56,6 @@ moment I have other priorities anyway. Adding MIDI support to the program will require a extensions of the file format; in other words, this is not an easy project. - ------------------------------------------------------------------------- - -QQQQ: Does your mixer use interpolation / MMX optimizations / whatever? - -a: No, the mixer is probably the worst a coder can come up with. It -doesn't sound too bad, though, but it is a bit slow if you have a -"poor" machine. I don't have much experience with coding audio mixers, -but I will definitely work on this again before v1.0.0. ------------------------------------------------------------------------ diff -urN soundtracker-0.3.10/INSTALL soundtracker-0.5.0/INSTALL --- soundtracker-0.3.10/INSTALL Fri Dec 24 16:42:20 1999 +++ soundtracker-0.5.0/INSTALL Mon Mar 13 13:50:27 2000 @@ -18,6 +18,12 @@ - under Linux, glibc 2.1.x is recommended (available from ftp://ftp.gnu.org/gnu/glibc/) +- optional: compression utilities zip, lha, zcat (gunzip) and +bunzip2. all of them accept for bunzip2 have been around for a decade +now. as for bunzip2, you might like to check on it's version. should +be around 0.9.0b. Nb/ standard unix bundles (redhat etc) will come +with all this utilities. + Installing GNOME is strongly recommended. Some features are only available when you compile with GNOME. You only need the gnome-libs distribution, it's really not hard to compile yourself. RedHat 6.0 diff -urN soundtracker-0.3.10/NEWS soundtracker-0.5.0/NEWS --- soundtracker-0.3.10/NEWS Wed Jan 26 18:30:23 2000 +++ soundtracker-0.5.0/NEWS Mon Mar 13 14:02:17 2000 @@ -2,6 +2,17 @@ (This file lists only major user-visible changes; the ChangeLog file contains more details) +What is new in soundtracker-0.5.0 (13-Mar-2000): + +* High-quality cubically interpolating floating-point mixer, based on + work by Tammo Hinrichs; only available on i386 machines +* Per-channel IT-style lowpass filters +* Asynchronous pattern editing (like in ImpulseTracker) +* Loads modules from zip, lha, gz and bzip2 archives +* Win95 menu key plays all channels of the current row +* Various bug fixes, and possibly some new ones due to the + new mixer module. So watch out :-) + What is new in soundtracker-0.3.10 (26-Jan-2000): * New "Insert" and "Backspace" key bindings in track editor diff -urN soundtracker-0.3.10/README soundtracker-0.5.0/README --- soundtracker-0.3.10/README Wed Jan 26 18:28:16 2000 +++ soundtracker-0.5.0/README Mon Mar 13 13:57:33 2000 @@ -4,7 +4,7 @@ http://www.soundtracker.org/ -------------------------------------------------------------- - v0.3.10 --- THIS IS A DEVELOPMENT VERSION! + v0.5.0 --- THIS IS A DEVELOPMENT VERSION! Written and (C) 1998-2000 by Michael Krause [ raw style / lego ] @@ -59,6 +59,7 @@ Right Ctrl Play Song Right Alt Play Pattern +Right WinMenu Key Just play current pattern row Right Shift Record (Play Pattern & Edit On) -- not yet! Space Stop Playing; edit mode on/off Shift - Space Toggle "jazz edit" mode diff -urN soundtracker-0.3.10/TODO soundtracker-0.5.0/TODO --- soundtracker-0.3.10/TODO Wed Jan 26 18:22:32 2000 +++ soundtracker-0.5.0/TODO Mon Mar 13 13:56:53 2000 @@ -1,10 +1,18 @@ things to do and known bugs (in no particular order) ------------------------------------------------------- -FILE TAB: problem reported by xavier with strange characters in the -file name entry widget. +> 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. +> It's more keystrokes but less flipping through groups of samples. + +> you could add a bass drum to "7", snare to "8", closed hat to "9", ride to +> "4", timpany G to "5", etc.. all at the correct note for that sample. +> Then you just switch to edit mode and knock out a drum beat with single +> keypresses! + +load 15 sample mods -GUI: bpm and tempo spins behave a little bit strange sometimes. @@ -23,6 +31,23 @@ ====== GUI ========= +in tokdar.xm in sample editor und dann die samples bis zur fЭnf von hand weiterschalten (Ctrl-left) + +KDE link file from Paul Buhr + +> Please add mouse bindings for copying parts of patterns... I'm still +> using FastTracker 2 because it's the only tracker with good mouse +> support. Some parts of FastTracker really suck (like the instrument +> list), so I'd like to start using another tracker... Soundtracker would +> be perfect if it just had proper mouse support. + +> I think it would be nice, if you had an option to load only the samples +> from a module, not the whole module, just like in my old OctaMed. + +> The second idea is an option, not to save the whole module, but only the +> arrangement without the samples, which is also a feauture of good ol' +> OctaMed. + bug: wenn man vorspult, werden die patterns im tracker schon geДndert, bevor der song sich Дndert. @@ -36,6 +61,7 @@ an instrument list or something similarly useful in case you don't want the scopes there. the scopes could be put into their own window or to the pre-0.1.1 position then. + SAMPLE LIST: like in good old MED TRACKER WIDGET: should work with arbitrary note types, effects, and so @@ -146,21 +172,7 @@ file-operations: after saving, the directory must be rescanned! unfortunately, there's no gtk+ call for this :( -> - most important: the player and the pattern editor aren't tightly -> linked: the player continues to play while you can edit any pattern you -> want. this is very useful in my opinion. -> - IT doesn't automatically scroll when you enter an effect number (hmm -> confusing ;) -> --- .. ... -> ^ if I put an effect here, IT scrolls to the next line -> --- .. ... -> ^ if I put a number, IT scrolls to the right -> -> --- .. ... -> ^ if I put a number, IT scrolls to the next line -> -> > -> - it has different shortcuts for selections: +> - IT has different shortcuts for selections: > alt-b (begin) alt-e (end) > alt-l (whole column) alt-l twice (whole pattern) > alt-k in the volume column slides the volume in the selection @@ -174,6 +186,8 @@ ====== PLAYER / LOADER ======== +support old 15 sample modules + LOADER: support loading from archives (gnome-libs-2 VFS in the future?) SAMPLE IMPORT/EXPORT: IFF and RAW formats. @@ -196,27 +210,63 @@ mod saver -toni-mixer: ------------ +@@ -691,7 +693,7 @@ + ch.chVibRate=(procdat>>4)<<2; + break; + case xmpCmdPortaVol: case xmpCmdVibVol: case xmpCmdVolSlide: +- if (procdat || ismod) ++ if (procdat) + ch.chVolSlideVal=procdat; + if (ch.chVolSlideVal&0xf0) + { + +@@ -887,13 +909,13 @@ + ch.chFinalPan=ch.chPan=procdat*0x11; + break; + case xmpCmdFVolSlideU: +- if (procdat || ismod ) ++ if (procdat) + ch.chFineVolSlideUVal=procdat; + ch.fx=xfxRowVolSlideUp; + ch.chFinalVol=ch.chVol=volrange(ch.chVol+ch.chFineVolSlideUVal); + break; + case xmpCmdFVolSlideD: +- if (procdat || ismod ) ++ if (procdat) + ch.chFineVolSlideDVal=procdat; + ch.fx=xfxRowVolSlideDown; + ch.chFinalVol=ch.chVol=volrange(ch.chVol-ch.chFineVolSlideDVal); -o Die Samples knacken irgendwie, wenn sie umschalten oder -stoppen. (aber auch in meinem Mixer) +fЭr jedes neue instrument einen neuen kanal aufmachen und den anderen +ausfaden lassen. -o Was soll das mit den linear frequencies? -o Sollte das Mono-Downmixing im Mixer passieren oder hinterher in -audio.c? Im Mixer ist natЭrlich besser, weil der Puffer nur einmal -angefasst wird. -o The code to handle unlimited length samples is clever. +====== MIXER ====== -o Limitation to 16bit samples only is to be discussed. Can conversion -to 32bit or float formats be avoided? +mix channels with low volume first, in order to reduce arithmetic error -o My volume and shifting code is quite stupid. +combine C parts of old and new mixers -o The initialization (loop handling) and exit (mixbuffer downgrading) -code should be shared. +bei dem thema in sta-gene knackt's aber ganz ordentlich... + +use volume ramping to reduce clicking on wild envelopes! + +global filter + +headphone-balancing... das echt zu hart sonst + +muъ declicking das volume-ramping weiterfЭhren? muъ stattdessen nicht +der exponentielle abfall kommen? + +kb-x86-asm.S: use "unfiltered" versions of the routines as well in +case the filter is inactive. + +kb-x86-asm.S should use macros instead of copy'n'paste to generate the +various mixer routines.. + +st_mixer_info->data should be a gint16*! rewrite all void* +arithmetic.. remove current_word_length @@ -247,6 +297,10 @@ MAILING LIST: put an archive on the home page. code some fancy php3+mysql database with search function. + +idea why realtime scheduling doesn't work: mutexes in player thread +are spinloops, so they take up 100% cpu time when waiting and the main +thread can't release the mutexes. ====== FUTURE ======= diff -urN soundtracker-0.3.10/app/Makefile.am soundtracker-0.5.0/app/Makefile.am --- soundtracker-0.3.10/app/Makefile.am Mon Dec 20 18:22:18 1999 +++ soundtracker-0.5.0/app/Makefile.am Sat Feb 19 13:59:17 2000 @@ -8,7 +8,6 @@ cheat-sheet.c cheat-sheet.h \ clavier.c clavier.h \ driver.h driver-in.h driver-out.h \ - effectsconfig.c effectsconfig.h \ endian-conv.h \ envelope-box.c envelope-box.h \ errors.c errors.h \ diff -urN soundtracker-0.3.10/app/Makefile.in soundtracker-0.5.0/app/Makefile.in --- soundtracker-0.3.10/app/Makefile.in Wed Jan 26 18:53:31 2000 +++ soundtracker-0.5.0/app/Makefile.in Mon Mar 13 14:06:44 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 effectsconfig.c effectsconfig.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 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 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 transposition.c transposition.h xm.c xm.h xm-player.c xm-player.h soundtracker_LDADD = drivers/libdrivers.a mixers/libmixers.a @@ -120,12 +120,11 @@ LDFLAGS = @LDFLAGS@ LIBS = @LIBS@ soundtracker_OBJECTS = audio.o audioconfig.o cheat-sheet.o clavier.o \ -effectsconfig.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 transposition.o \ -xm.o xm-player.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 transposition.o xm.o xm-player.o soundtracker_DEPENDENCIES = drivers/libdrivers.a mixers/libmixers.a soundtracker_LDFLAGS = CFLAGS = @CFLAGS@ @@ -339,7 +338,7 @@ sample-editor.h driver-in.h track-editor.h scope-group.h \ sample-display.h module-info.h preferences.h menubar.h \ tips-dialog.h gui-settings.h file-operations.h playlist.h -gui-settings.o: gui-settings.c ../config.h i18n.h gui-settings.h \ +gui-settings.o: gui-settings.c ../config.h i18n.h gui.h gui-settings.h \ gui-subs.h preferences.h scope-group.h sample-display.h \ track-editor.h xm.h mixer.h tracker.h extspinbutton.h gui-subs.o: gui-subs.c ../config.h i18n.h gui.h gui-subs.h \ @@ -357,8 +356,8 @@ 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 audioconfig.h effectsconfig.h gui-settings.h \ - tips-dialog.h transposition.h cheat-sheet.h file-operations.h \ + tracker.h audioconfig.h gui-settings.h tips-dialog.h \ + transposition.h cheat-sheet.h file-operations.h \ instrument-editor.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 \ @@ -390,8 +389,9 @@ transposition.o: transposition.c i18n.h ../config.h transposition.h \ main.h xm.h mixer.h gui-subs.h gui.h st-subs.h track-editor.h \ tracker.h -xm.o: xm.c i18n.h ../config.h xm.h mixer.h endian-conv.h st-subs.h \ - recode.h errors.h audio.h driver-out.h driver.h time-buffer.h +xm.o: xm.c i18n.h ../config.h gui-settings.h xm.h mixer.h endian-conv.h \ + st-subs.h recode.h errors.h audio.h driver-out.h driver.h \ + time-buffer.h xm-player.o: xm-player.c ../config.h i18n.h xm-player.h xm.h mixer.h \ main.h audio.h driver-out.h driver.h time-buffer.h diff -urN soundtracker-0.3.10/app/audio.c soundtracker-0.5.0/app/audio.c --- soundtracker-0.3.10/app/audio.c Sun Nov 14 15:35:42 1999 +++ soundtracker-0.5.0/app/audio.c Mon Mar 13 13:44:30 2000 @@ -2,7 +2,7 @@ /* * The Real SoundTracker - Audio handling thread * - * Copyright (C) 1998-1999 Michael Krause + * 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 @@ -81,6 +81,9 @@ static int mixfmt_req, mixfmt, mixfmt_conv; static int mixfreq_req; +static int audio_numchannels; +static float audio_ampfactor = 1.0; + static double pitchbend = +0.0, pitchbend_req; static double audio_next_tick_time_unbent, audio_next_tick_time_bent, audio_current_playback_time_bent; static double audio_mixer_current_time; @@ -108,7 +111,7 @@ /* Oscilloscope buffers */ -gint8 *scopebufs[32]; +gint16 *scopebufs[32]; gint32 scopebuf_length; scopebuf_endpoint scopebuf_start, scopebuf_end; int scopebuf_freq; @@ -211,7 +214,8 @@ static void audio_ctlpipe_play_pattern (int pattern, - int patpos) + int patpos, + int only1row) { audio_backpipe_id a; @@ -220,14 +224,26 @@ g_assert(xm != NULL); g_assert(!playing); - if(playback_driver->common.open(playback_driver_object)) { - current_driver_object = playback_driver_object; - current_driver = playback_driver; - audio_prepare_for_playing(); - xmplayer_init_play_pattern(pattern, patpos); - a = AUDIO_BACKPIPE_PLAYING_PATTERN_STARTED; + if(only1row) { + if(editing_driver->common.open(editing_driver_object)) { + current_driver_object = editing_driver_object; + current_driver = editing_driver; + audio_prepare_for_playing(); + xmplayer_init_play_pattern(pattern, patpos, only1row); + a = AUDIO_BACKPIPE_PLAYING_NOTE_STARTED; + } else { + a = AUDIO_BACKPIPE_DRIVER_OPEN_FAILED; + } } else { - a = AUDIO_BACKPIPE_DRIVER_OPEN_FAILED; + if(playback_driver->common.open(playback_driver_object)) { + current_driver_object = playback_driver_object; + current_driver = playback_driver; + audio_prepare_for_playing(); + xmplayer_init_play_pattern(pattern, patpos, only1row); + a = AUDIO_BACKPIPE_PLAYING_PATTERN_STARTED; + } else { + a = AUDIO_BACKPIPE_DRIVER_OPEN_FAILED; + } } write(backpipe, &a, sizeof(a)); @@ -342,6 +358,7 @@ { g_assert(mixer != NULL); + audio_ampfactor = af; mixer->setampfactor(af); } @@ -420,8 +437,8 @@ audio_ctlpipe_play_song(a[0], a[1]); break; case AUDIO_CTLPIPE_PLAY_PATTERN: - readpipe(ctlpipe, a, 2 * sizeof(a[0])); - audio_ctlpipe_play_pattern(a[0], a[1]); + readpipe(ctlpipe, a, 3 * sizeof(a[0])); + audio_ctlpipe_play_pattern(a[0], a[1], a[2]); break; case AUDIO_CTLPIPE_PLAY_NOTE: readpipe(ctlpipe, a, 3 * sizeof(a[0])); @@ -466,6 +483,16 @@ read(ctlpipe, &af, sizeof(af)); pitchbend_req = af; break; + case AUDIO_CTLPIPE_SET_MIXER: + read(ctlpipe, &b, sizeof(b)); + mixer = b; + if(playing) { + mixer->reset(); + mixfmt_req = -666; + mixer->setnumch(audio_numchannels); + } + mixer->setampfactor(audio_ampfactor); + break; default: fprintf(stderr, "\n\n*** audio_thread: unknown ctlpipe id %d\n\n\n", c); pthread_exit(NULL); @@ -527,6 +554,14 @@ return FALSE; } +void +audio_set_mixer (st_mixer *newmixer) +{ + audio_ctlpipe_id i = AUDIO_CTLPIPE_SET_MIXER; + write(audio_ctlpipe, &i, sizeof(i)); + write(audio_ctlpipe, &newmixer, sizeof(newmixer)); +} + static void mixer_mix_format (STMixerFormat m, int s) { @@ -632,7 +667,7 @@ scopebuf_length = gui_settings.scopes_buffer_size / 32; for(i = 0; i < 32; i++) { g_free(scopebufs[i]); - scopebufs[i] = g_new(gint8, scopebuf_length); + scopebufs[i] = g_new(gint16, scopebuf_length); if(!scopebufs[i]) return; } @@ -726,7 +761,7 @@ b *= 2; c = 16; } - if(mixfmt & MIXFMT_STEREO) { + if((mixfmt & MIXFMT_STEREO) || (mixfmt_conv & MIXFMT_CONV_TO_MONO)) { b *= 2; d = 2; } @@ -811,6 +846,7 @@ void driver_setnumch (int numchannels) { + audio_numchannels = numchannels; mixer->setnumch(numchannels); } @@ -818,7 +854,9 @@ driver_startnote (int channel, st_mixer_sample_info *si) { - mixer->startnote(channel, si); + if(si->length != 0) { + mixer->startnote(channel, si); + } } void @@ -857,6 +895,24 @@ g_assert(panning >= -1.0 && panning <= +1.0); mixer->setpanning(channel, panning); +} + +void +driver_set_ch_filter_freq (int channel, + float freq) +{ + if(mixer->setchcutoff) { + mixer->setchcutoff(channel, freq); + } +} + +void +driver_set_ch_filter_reso (int channel, + float freq) +{ + if(mixer->setchreso) { + mixer->setchreso(channel, freq); + } } gpointer diff -urN soundtracker-0.3.10/app/audio.h soundtracker-0.5.0/app/audio.h --- soundtracker-0.3.10/app/audio.h Sat Nov 13 14:22:03 1999 +++ soundtracker-0.5.0/app/audio.h Sun Mar 12 21:19:48 2000 @@ -2,7 +2,7 @@ /* * The Real SoundTracker - Audio handling thread (header) * - * Copyright (C) 1998 Michael Krause + * 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 @@ -37,7 +37,7 @@ AUDIO_CTLPIPE_INIT_PLAYER=2000, /* void */ AUDIO_CTLPIPE_RENDER_SONG_TO_FILE, /* int len, string (len+1 bytes) */ AUDIO_CTLPIPE_PLAY_SONG, /* int songpos, int patpos */ - AUDIO_CTLPIPE_PLAY_PATTERN, /* int pattern, int patpos */ + AUDIO_CTLPIPE_PLAY_PATTERN, /* int pattern, int patpos, int only_one_row */ AUDIO_CTLPIPE_PLAY_NOTE, /* int channel, int note, int instrument */ AUDIO_CTLPIPE_PLAY_NOTE_FULL, /* int channel, int note, STSample *sample, int offset */ AUDIO_CTLPIPE_PLAY_NOTE_KEYOFF, /* int channel */ @@ -46,6 +46,7 @@ AUDIO_CTLPIPE_SET_PATTERN, /* int pattern */ AUDIO_CTLPIPE_SET_AMPLIFICATION, /* float */ AUDIO_CTLPIPE_SET_PITCHBEND, /* float */ + AUDIO_CTLPIPE_SET_MIXER, /* st_mixer* */ } audio_ctlpipe_id; typedef enum audio_backpipe_id { @@ -73,7 +74,7 @@ modulo scopebuf_length, until you reach scopebuf_end.offset. */ extern gboolean scopebuf_ready; -extern gint8 *scopebufs[32]; +extern gint16 *scopebufs[32]; extern gint32 scopebuf_length; typedef struct scopebuf_endpoint { guint32 offset; // always < scopebuf_length @@ -120,6 +121,8 @@ gboolean audio_init (int ctlpipe, int backpipe); +void audio_set_mixer (st_mixer *mixer); + void readpipe (int fd, void *p, int count); /* --- Functions called by the player */ @@ -136,5 +139,9 @@ float volume); void driver_setpanning (int channel, float panning); +void driver_set_ch_filter_freq (int channel, + float freq); +void driver_set_ch_filter_reso (int channel, + float freq); #endif /* _ST_AUDIO_H */ diff -urN soundtracker-0.3.10/app/audioconfig.c soundtracker-0.5.0/app/audioconfig.c --- soundtracker-0.3.10/app/audioconfig.c Fri Dec 24 10:45:14 1999 +++ soundtracker-0.5.0/app/audioconfig.c Sun Mar 12 20:22:53 2000 @@ -2,7 +2,7 @@ /* * The Real SoundTracker - Audio configuration dialog * - * Copyright (C) 1999 Michael Krause + * Copyright (C) 1999-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 @@ -35,13 +35,17 @@ #include "preferences.h" #include "sample-editor.h" #include "gui.h" +#include "mixer.h" GList *drivers[2] = { NULL, NULL }; +GList *mixers = NULL; static GtkWidget *configwindow = NULL; -static GtkWidget *cw_clist, *cw_hbox; +static GtkWidget *cw_clist, *cw_hbox, *audioconfig_mixer_clist; static int cw_currentobject = -1; static GtkWidget *driverwidget = NULL; +static st_mixer *audioconfig_current_mixer = NULL; +static gboolean audioconfig_disable_mixer_selection = FALSE; typedef struct audio_object { const char *title; @@ -168,15 +172,56 @@ cw_currentobject = -1; } +static void +audioconfig_mixer_selected (GtkCList *list, + gint row, + gint column) +{ + st_mixer *new_mixer = g_list_nth_data(mixers, row); + + if(!audioconfig_disable_mixer_selection && new_mixer != audioconfig_current_mixer) { + audio_set_mixer(new_mixer); + audioconfig_current_mixer = new_mixer; + } +} + +static void +audioconfig_initialize_mixer_list (void) +{ + GList *l; + gchar *insertbuf[2] = { NULL }; + int i, active = -1; + + audioconfig_disable_mixer_selection = TRUE; + gtk_clist_freeze(GTK_CLIST(audioconfig_mixer_clist)); + gtk_clist_clear(GTK_CLIST(audioconfig_mixer_clist)); + for(i = 0, l = mixers; l; i++, l = l->next) { + st_mixer *mixer = l->data; + if(mixer == audioconfig_current_mixer) { + active = i; + } + insertbuf[0] = (gchar*)mixer->id; + insertbuf[1] = (gchar*)mixer->description; + gtk_clist_append(GTK_CLIST(audioconfig_mixer_clist), insertbuf); + } + gtk_clist_thaw(GTK_CLIST(audioconfig_mixer_clist)); + audioconfig_disable_mixer_selection = FALSE; + + gtk_clist_select_row(GTK_CLIST(audioconfig_mixer_clist), active, 0); +} + void audioconfig_dialog (void) { - GtkWidget *mainbox, *thing, *box1; + GtkWidget *mainbox, *thing, *box1, *hbox, *frame, *box2; OptionMenuItem menu1[NUM_AUDIO_OBJECTS]; static gchar *listtitles[1]; + static gchar *listtitles2[2]; int i; listtitles[0] = gettext("Driver Module"); + listtitles2[0] = gettext("Mixer Module"); + listtitles2[1] = gettext("Description"); if(configwindow != NULL) { gdk_window_raise(configwindow->window); @@ -201,22 +246,31 @@ #endif gtk_widget_show(mainbox); + frame = gtk_frame_new(NULL); + gtk_frame_set_label(GTK_FRAME(frame), _("Drivers")); + gtk_box_pack_start(GTK_BOX(mainbox), frame, FALSE, TRUE, 0); + gtk_widget_show(frame); + + box2 = gtk_vbox_new(FALSE, 2); + gtk_widget_show(box2); + gtk_container_add (GTK_CONTAINER(frame), box2); + gtk_container_border_width(GTK_CONTAINER(box2), 4); - // Key Group Selector + // Driver type selector for(i = 0; i < NUM_AUDIO_OBJECTS; i++) { menu1[i].name = gettext(audio_objects[i].title); menu1[i].func = audioconfig_object_changed; } - thing = build_option_menu(menu1, NUM_AUDIO_OBJECTS, 0); + thing = gui_build_option_menu(menu1, NUM_AUDIO_OBJECTS, 0); gtk_widget_show(thing); - gtk_box_pack_start(GTK_BOX(mainbox), thing, FALSE, FALSE, 0); + gtk_box_pack_start(GTK_BOX(box2), thing, FALSE, FALSE, 0); cw_hbox = box1 = gtk_hbox_new(FALSE, 4); gtk_widget_show(box1); - gtk_box_pack_start(GTK_BOX(mainbox), box1, TRUE, TRUE, 0); + gtk_box_pack_start(GTK_BOX(box2), box1, TRUE, TRUE, 0); - // List at the left side of the window - thing = get_clist_in_scrolled_window(1, listtitles, box1); + // Driver selection list + thing = gui_clist_in_scrolled_window(1, listtitles, box1); gtk_clist_set_selection_mode(GTK_CLIST(thing), GTK_SELECTION_BROWSE); gtk_clist_column_titles_passive(GTK_CLIST(thing)); gtk_clist_set_column_justification(GTK_CLIST(thing), 0, GTK_JUSTIFY_LEFT); @@ -227,6 +281,50 @@ audioconfig_object_changed(NULL, (void*)0); + + // Mixer selection + frame = gtk_frame_new(NULL); + gtk_frame_set_label(GTK_FRAME(frame), _("Mixers")); + gtk_box_pack_start(GTK_BOX(mainbox), frame, TRUE, TRUE, 0); + gtk_widget_show(frame); + + box2 = gtk_vbox_new(FALSE, 2); + gtk_widget_show(box2); + gtk_container_add (GTK_CONTAINER(frame), box2); + gtk_container_border_width(GTK_CONTAINER(box2), 4); + + thing = gui_clist_in_scrolled_window(2, listtitles2, box2); + gtk_clist_set_selection_mode(GTK_CLIST(thing), GTK_SELECTION_BROWSE); + gtk_clist_column_titles_passive(GTK_CLIST(thing)); + gtk_clist_set_column_justification(GTK_CLIST(thing), 0, GTK_JUSTIFY_LEFT); + gtk_signal_connect_after(GTK_OBJECT(thing), "select_row", + GTK_SIGNAL_FUNC(audioconfig_mixer_selected), NULL); + audioconfig_mixer_clist = thing; + audioconfig_initialize_mixer_list(); + + /* The button area */ + thing = gtk_hseparator_new(); + gtk_widget_show(thing); + gtk_box_pack_start(GTK_BOX(mainbox), thing, FALSE, TRUE, 0); + + hbox = gtk_hbutton_box_new (); + gtk_button_box_set_spacing (GTK_BUTTON_BOX (hbox), 4); + gtk_button_box_set_layout (GTK_BUTTON_BOX (hbox), GTK_BUTTONBOX_END); + gtk_box_pack_start (GTK_BOX (mainbox), hbox, + FALSE, FALSE, 0); + gtk_widget_show (hbox); + +#ifdef USE_GNOME + thing = gnome_stock_button (GNOME_STOCK_BUTTON_CLOSE); +#else + thing = gtk_button_new_with_label (_ ("Close")); +#endif + gtk_signal_connect (GTK_OBJECT (thing), "clicked", + GTK_SIGNAL_FUNC (audioconfig_close_requested), NULL); + gtk_box_pack_start (GTK_BOX (hbox), thing, FALSE, FALSE, 0); + gtk_widget_show (thing); + + gtk_widget_show (configwindow); } @@ -252,6 +350,7 @@ } } } + fclose(f); } for(i = 0; i < NUM_AUDIO_OBJECTS; i++) { @@ -281,6 +380,35 @@ } void +audioconfig_load_mixer_config (void) +{ + char buf[256]; + FILE *f; + GList *l; + + sprintf(buf, "%s/mixer", prefs_get_prefsdir()); + + f = fopen(buf, "rb"); + if(f) { + if(prefs_get_string(f, "mixer", buf)) { + for(l = mixers; l; l = l->next) { + st_mixer *m = l->data; + if(!strcmp(m->id, buf)) { + mixer = m; + audioconfig_current_mixer = m; + } + } + } + fclose(f); + } + + if(!audioconfig_current_mixer) { + mixer = mixers->data; + audioconfig_current_mixer = mixers->data; + } +} + +void audioconfig_save_config (void) { char buf[256]; @@ -314,6 +442,13 @@ fclose(f); } } + } + + sprintf(buf, "%s/mixer", prefs_get_prefsdir()); + f = fopen(buf, "wb"); + if(f) { + prefs_put_string(f, "mixer", audioconfig_current_mixer->id); + fclose(f); } return; diff -urN soundtracker-0.3.10/app/audioconfig.h soundtracker-0.5.0/app/audioconfig.h --- soundtracker-0.3.10/app/audioconfig.h Wed Jul 21 12:25:57 1999 +++ soundtracker-0.5.0/app/audioconfig.h Sun Mar 12 19:57:29 2000 @@ -2,7 +2,7 @@ /* * The Real SoundTracker - Audio configuration dialog (header) * - * Copyright (C) 1999 Michael Krause + * Copyright (C) 1999-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 @@ -27,10 +27,12 @@ void audioconfig_dialog (void); void audioconfig_load_config (void); +void audioconfig_load_mixer_config (void); void audioconfig_save_config (void); // Currently initialized in main.c extern GList *drivers[2]; +extern GList *mixers; #define DRIVER_OUTPUT 0 #define DRIVER_INPUT 1 diff -urN soundtracker-0.3.10/app/cheat-sheet.c soundtracker-0.5.0/app/cheat-sheet.c --- soundtracker-0.3.10/app/cheat-sheet.c Sat Sep 4 19:42:56 1999 +++ soundtracker-0.5.0/app/cheat-sheet.c Thu Mar 9 21:04:10 2000 @@ -2,7 +2,7 @@ /* * The Real SoundTracker - XM effects cheat sheet * - * Copyright (C) 1999 Michael Krause + * Copyright (C) 1999-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 @@ -55,19 +55,19 @@ " E4 Set vibrato control command should be used.\n" " E5 Set finetune\n" " E6 Set loop begin/loop\n" -" E7 Set tremolo control\n" +" E7 Set tremolo control ===================================\n" " E9 Retrig note\n" -" EA (*) Fine volume slide up\n" -" EB (*) Fine volume slide down\n" -" EC Note cut\n" -" ED Note delay\n" -" EE Pattern delay\n" +" EA (*) Fine volume slide up Non-Standard XM effects - only\n" +" EB (*) Fine volume slide down available in SoundTracker and\n" +" EC Note cut OpenCP - don't use if you want to\n" +" ED Note delay stay compatible with FastTracker.\n" +" EE Pattern delay -----------------------------------\n" " F Set tempo/BPM\n" -" G Set global volume\n" -" H (*) Global volume slide\n" +" G Set global volume Zxx Set LP filter cutoff frequency\n" +" H (*) Global volume slide Qxx Set LP filter resonance\n" " K Key off\n" -" L Set envelope position\n" -" P (*) Panning slide\n" +" L Set envelope position To switch off the filter, you must\n" +" P (*) Panning slide usw Q00 _and_ Zff!.\n" " R (*) Multi retrig note\n" " T Tremor\n" " X1 (*) Extra fine porta up\n" diff -urN soundtracker-0.3.10/app/cheat-sheet.h soundtracker-0.5.0/app/cheat-sheet.h --- soundtracker-0.3.10/app/cheat-sheet.h Sat Sep 4 19:06:33 1999 +++ soundtracker-0.5.0/app/cheat-sheet.h Sat Feb 19 11:58:35 2000 @@ -2,7 +2,7 @@ /* * The Real SoundTracker - XM effects cheat sheet (header) * - * Copyright (C) 1999 Michael Krause + * Copyright (C) 1999-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 diff -urN soundtracker-0.3.10/app/clavier.c soundtracker-0.5.0/app/clavier.c --- soundtracker-0.3.10/app/clavier.c Sat Jan 22 14:41:05 2000 +++ soundtracker-0.5.0/app/clavier.c Sat Feb 19 11:58:34 2000 @@ -1,6 +1,6 @@ /* clavier.c - GTK+ "Clavier" Widget -- based on clavier-0.1.3 * Copyright (C) 1998 Simon KЕgedal - * Copyright (C) 1999 Michael Krause + * Copyright (C) 1999-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 diff -urN soundtracker-0.3.10/app/clavier.h soundtracker-0.5.0/app/clavier.h --- soundtracker-0.3.10/app/clavier.h Sat Aug 21 19:11:31 1999 +++ soundtracker-0.5.0/app/clavier.h Sat Feb 19 11:58:34 2000 @@ -1,6 +1,6 @@ /* clavier.h - GTK+ "Clavier" Widget * Copyright (C) 1998 Simon KЕgedal - * Copyright (C) 1999 Michael Krause + * Copyright (C) 1999-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 diff -urN soundtracker-0.3.10/app/driver-in.h soundtracker-0.5.0/app/driver-in.h --- soundtracker-0.3.10/app/driver-in.h Wed Jul 21 11:07:56 1999 +++ soundtracker-0.5.0/app/driver-in.h Sat Feb 19 11:58:34 2000 @@ -2,7 +2,7 @@ /* * The Real SoundTracker - Input (sampling) driver module definitions * - * Copyright (C) 1999 Michael Krause + * Copyright (C) 1999-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 diff -urN soundtracker-0.3.10/app/driver-out.h soundtracker-0.5.0/app/driver-out.h --- soundtracker-0.3.10/app/driver-out.h Wed Jul 21 11:07:56 1999 +++ soundtracker-0.5.0/app/driver-out.h Sat Feb 19 11:58:34 2000 @@ -2,7 +2,7 @@ /* * The Real SoundTracker - Output driver module definitions * - * Copyright (C) 1998-1999 Michael Krause + * 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 diff -urN soundtracker-0.3.10/app/driver.h soundtracker-0.5.0/app/driver.h --- soundtracker-0.3.10/app/driver.h Wed Jul 21 12:18:37 1999 +++ soundtracker-0.5.0/app/driver.h Sat Feb 19 11:58:33 2000 @@ -2,7 +2,7 @@ /* * The Real SoundTracker - Common driver module definitions * - * Copyright (C) 1999 Michael Krause + * Copyright (C) 1999-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 diff -urN soundtracker-0.3.10/app/drivers/Makefile.in soundtracker-0.5.0/app/drivers/Makefile.in --- soundtracker-0.3.10/app/drivers/Makefile.in Wed Jan 26 18:53:32 2000 +++ soundtracker-0.5.0/app/drivers/Makefile.in Mon Mar 13 14:06:46 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.3.10/app/drivers/alsa-input.c soundtracker-0.5.0/app/drivers/alsa-input.c --- soundtracker-0.3.10/app/drivers/alsa-input.c Wed Jan 12 20:29:15 2000 +++ soundtracker-0.5.0/app/drivers/alsa-input.c Sat Feb 19 11:58:34 2000 @@ -3,7 +3,7 @@ * The Real SoundTracker - ALSA (input) driver * - requires ALSA 0.4.0 or newer * - * Copyright (C) 1999 Kai Vehmanen + * Copyright (C) 1999-2000 Kai Vehmanen * * 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 diff -urN soundtracker-0.3.10/app/drivers/alsa-output.c soundtracker-0.5.0/app/drivers/alsa-output.c --- soundtracker-0.3.10/app/drivers/alsa-output.c Wed Jan 12 20:29:21 2000 +++ soundtracker-0.5.0/app/drivers/alsa-output.c Sat Feb 19 11:58:34 2000 @@ -2,7 +2,7 @@ * The Real SoundTracker - ALSA (output) driver * - requires ALSA 0.4.0 or newer * - * Copyright (C) 1999 Kai Vehmanen + * Copyright (C) 1999-2000 Kai Vehmanen * * 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 diff -urN soundtracker-0.3.10/app/drivers/alsa2-input.c soundtracker-0.5.0/app/drivers/alsa2-input.c --- soundtracker-0.3.10/app/drivers/alsa2-input.c Wed Jan 12 20:30:03 2000 +++ soundtracker-0.5.0/app/drivers/alsa2-input.c Sat Feb 19 11:58:34 2000 @@ -437,7 +437,7 @@ goto out; } - if (snd_pcm_plugin_prepare(d->soundfd, SND_PCM_CHANNEL_CAPTURE) < 0) { + if (snd_pcm_channel_prepare(d->soundfd, SND_PCM_CHANNEL_CAPTURE) < 0) { error_error(_("Unable to prepare ALSA channel.\n")); goto out; } diff -urN soundtracker-0.3.10/app/drivers/alsa2-output.c soundtracker-0.5.0/app/drivers/alsa2-output.c --- soundtracker-0.3.10/app/drivers/alsa2-output.c Wed Jan 12 20:30:03 2000 +++ soundtracker-0.5.0/app/drivers/alsa2-output.c Sat Feb 19 11:58:34 2000 @@ -2,7 +2,7 @@ * The Real SoundTracker - ALSA (output) driver, pcm2 * - requires ALSA 0.5.0 or newer * - * Copyright (C) 1999 Kai Vehmanen + * Copyright (C) 1999-2000 Kai Vehmanen * * 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 @@ -441,7 +441,7 @@ goto out; } - if (snd_pcm_plugin_prepare(d->soundfd, SND_PCM_CHANNEL_PLAYBACK) < 0) { + if (snd_pcm_channel_prepare(d->soundfd, SND_PCM_CHANNEL_PLAYBACK) < 0) { error_error(_("Unable to prepare ALSA channel.\n")); goto out; } diff -urN soundtracker-0.3.10/app/drivers/esd-output.c soundtracker-0.5.0/app/drivers/esd-output.c --- soundtracker-0.3.10/app/drivers/esd-output.c Tue Jan 18 17:47:51 2000 +++ soundtracker-0.5.0/app/drivers/esd-output.c Sat Feb 19 11:58:34 2000 @@ -2,7 +2,7 @@ /* * The Real SoundTracker - ESD (output) driver. * - * Copyright (C) 1999 Michael Krause + * Copyright (C) 1999-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 diff -urN soundtracker-0.3.10/app/drivers/file-output.c soundtracker-0.5.0/app/drivers/file-output.c --- soundtracker-0.3.10/app/drivers/file-output.c Sat Nov 20 16:03:16 1999 +++ soundtracker-0.5.0/app/drivers/file-output.c Sat Feb 19 11:58:34 2000 @@ -2,7 +2,7 @@ /* * The Real SoundTracker - File (output) driver. * - * Copyright (C) 1999 Michael Krause + * Copyright (C) 1999-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 diff -urN soundtracker-0.3.10/app/drivers/oss-input.c soundtracker-0.5.0/app/drivers/oss-input.c --- soundtracker-0.3.10/app/drivers/oss-input.c Fri Aug 13 13:44:18 1999 +++ soundtracker-0.5.0/app/drivers/oss-input.c Sat Feb 19 11:58:34 2000 @@ -2,7 +2,7 @@ /* * The Real SoundTracker - OSS (input) driver. * - * Copyright (C) 1998-1999 Michael Krause + * 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 diff -urN soundtracker-0.3.10/app/drivers/oss-output.c soundtracker-0.5.0/app/drivers/oss-output.c --- soundtracker-0.3.10/app/drivers/oss-output.c Fri Oct 8 13:51:47 1999 +++ soundtracker-0.5.0/app/drivers/oss-output.c Fri Mar 3 19:20:19 2000 @@ -2,7 +2,7 @@ /* * The Real SoundTracker - OSS (output) driver. * - * Copyright (C) 1998-1999 Michael Krause + * 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 diff -urN soundtracker-0.3.10/app/effectsconfig.c soundtracker-0.5.0/app/effectsconfig.c --- soundtracker-0.3.10/app/effectsconfig.c Sat Sep 4 12:00:08 1999 +++ soundtracker-0.5.0/app/effectsconfig.c Thu Jan 1 01:00:00 1970 @@ -1,190 +0,0 @@ -/* - * The Real SoundTracker - Effects configuration dialog - * (by gc) - * Copyright (C) 1999 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 - -#include -#ifdef USE_GNOME -#include -#endif - -#include "i18n.h" -#include "gui-subs.h" -#include "mixer.h" -#include "effectsconfig.h" - -// The mixer being used - we edit effects through functions here. -extern st_mixer *mixer; - -// The main window. -static GtkWidget *configwindow = NULL; -// Window is split into two halves.. effect selector at top, -// Effect dialog at bottom. -static GtkWidget *cw_vbox; - -// The separate effects dialogs -static GtkWidget *reverb_dialog; - -// Effects dialog is generated from an array of this struct -typedef struct effects_object { - const char *title; - const char *shorttitle; - int type; - GtkWidget **main_dialog_wid; -} effects_object; - - -// All effects objects declared here -static effects_object effects_objects[] = { - { N_("Master Reverb"), - "reverb", - EFFECT_REVERB, - &reverb_dialog - } -}; -#define NUM_EFFECTS_OBJECTS (sizeof(effects_objects) / sizeof(effects_objects[0])) - -/* - * Stuff for the reverb dialog - */ -static GtkWidget *effects_reverb_adj_wid; - -static void effectsconfig_reverb_changed(GtkAdjustment *adj) -{ - mixer->setreverb((int) adj->value); - return; -} - -static void effectsconfig_draw_reverb(void) -{ - GtkAdjustment *effects_reverb_adj; - - // Make the main reverb container - reverb_dialog = gtk_hbox_new(FALSE, 2); - - // Make the adjuster - effects_reverb_adj = GTK_ADJUSTMENT(gtk_adjustment_new(mixer->getreverb(), - 0, 16, 1, 1, 1)); - effects_reverb_adj_wid = gtk_hscale_new(effects_reverb_adj); - - // Connect the adjustment function - gtk_signal_connect(GTK_OBJECT(effects_reverb_adj), "value_changed", - GTK_SIGNAL_FUNC(effectsconfig_reverb_changed), NULL); - // Stick it all together - gtk_box_pack_start(GTK_BOX(reverb_dialog), effects_reverb_adj_wid, - TRUE, TRUE, 0); - gtk_widget_show(effects_reverb_adj_wid); - gtk_box_pack_start(GTK_BOX(cw_vbox), reverb_dialog, TRUE, TRUE, 0); -} - -/* - * Effects dialog control functions - */ -static GtkWidget *current_dialog = NULL; - -static void show_dialog_part(GtkWidget *dialog) -{ - gtk_widget_show(dialog); - current_dialog = dialog; -} - -static void hide_dialog_part_current(void) -{ - if (current_dialog) { - gtk_widget_hide(current_dialog); - } -} - -/* - * Main window control functions - */ -static void -effectsconfig_close_requested (void) -{ - if (current_dialog) { - gtk_widget_hide(current_dialog); - } - - gtk_widget_destroy(configwindow); - configwindow = NULL; -} - -static void -effectsconfig_object_changed (void *a, - void *b) -{ - unsigned n = (int) b; - - hide_dialog_part_current(); - show_dialog_part(*effects_objects[n].main_dialog_wid); - - return; -} - -void -effectsconfig_dialog(void) -{ - GtkWidget *mainbox, *thing; - OptionMenuItem menu1[NUM_EFFECTS_OBJECTS]; - int i; - - if(configwindow != NULL) { - gdk_window_raise(configwindow->window); - return; - } -#ifdef USE_GNOME - configwindow = gnome_app_new("SoundTracker", _("Playback Effects Configuration")); -#else - configwindow = gtk_window_new(GTK_WINDOW_TOPLEVEL); - gtk_window_set_title(GTK_WINDOW(configwindow), _("Playback Effects Configuration")); -#endif - gtk_signal_connect (GTK_OBJECT (configwindow), "delete_event", - GTK_SIGNAL_FUNC (effectsconfig_close_requested), NULL); - - mainbox = gtk_vbox_new(FALSE, 2); - gtk_container_border_width(GTK_CONTAINER(mainbox), 4); -#ifdef USE_GNOME - gnome_app_set_contents(GNOME_APP(configwindow), mainbox); -#else - gtk_container_add(GTK_CONTAINER(configwindow), mainbox); -#endif - gtk_widget_show(mainbox); - - // Key Group Selector - for (i = 0; i < NUM_EFFECTS_OBJECTS; i++) { - menu1[i].name = gettext(effects_objects[i].title); - menu1[i].func = effectsconfig_object_changed; - } - thing = build_option_menu(menu1, NUM_EFFECTS_OBJECTS, 0); - gtk_widget_show(thing); - gtk_box_pack_start(GTK_BOX(mainbox), thing, FALSE, FALSE, 0); - - cw_vbox = gtk_vbox_new(FALSE, 2); - gtk_box_pack_start(GTK_BOX(mainbox), cw_vbox, TRUE, TRUE, 0); - gtk_widget_show(cw_vbox); - - // Get effect dialogs ready : - effectsconfig_draw_reverb(); - - current_dialog = NULL; - effectsconfig_object_changed(NULL, (void*)0); - - gtk_widget_show(configwindow); -} diff -urN soundtracker-0.3.10/app/effectsconfig.h soundtracker-0.5.0/app/effectsconfig.h --- soundtracker-0.3.10/app/effectsconfig.h Fri Sep 3 15:30:23 1999 +++ soundtracker-0.5.0/app/effectsconfig.h Thu Jan 1 01:00:00 1970 @@ -1,31 +0,0 @@ -/* - * The Real SoundTracker - Effects configuration dialog (header) - * (by gc) - * Copyright (C) 1999 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 _ST_EFFECTSCONFIG_H -#define _ST_EFFECTSCONFIG_H - -#include - -void effectsconfig_dialog (void); - -#define EFFECT_REVERB 0 - -#endif /* _ST_EFFECTSCONFIG.H */ - diff -urN soundtracker-0.3.10/app/endian-conv.h soundtracker-0.5.0/app/endian-conv.h --- soundtracker-0.3.10/app/endian-conv.h Mon Nov 23 16:05:52 1998 +++ soundtracker-0.5.0/app/endian-conv.h Sat Feb 19 11:58:34 2000 @@ -2,7 +2,7 @@ /* * The Real SoundTracker - Endianness conversion * - * Copyright (C) 1998 Michael Krause + * 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 diff -urN soundtracker-0.3.10/app/envelope-box.c soundtracker-0.5.0/app/envelope-box.c --- soundtracker-0.3.10/app/envelope-box.c Sat Sep 4 18:29:47 1999 +++ soundtracker-0.5.0/app/envelope-box.c Sat Feb 19 11:58:33 2000 @@ -2,7 +2,7 @@ /* * The Real SoundTracker - GTK+ envelope editor box * - * Copyright (C) 1998-1999 Michael Krause + * 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 diff -urN soundtracker-0.3.10/app/envelope-box.h soundtracker-0.5.0/app/envelope-box.h --- soundtracker-0.3.10/app/envelope-box.h Mon Aug 9 13:19:30 1999 +++ soundtracker-0.5.0/app/envelope-box.h Sat Feb 19 11:58:33 2000 @@ -2,7 +2,7 @@ /* * The Real SoundTracker - GTK+ envelope editor box (header) * - * Copyright (C) 1998 Michael Krause + * 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 diff -urN soundtracker-0.3.10/app/errors.c soundtracker-0.5.0/app/errors.c --- soundtracker-0.3.10/app/errors.c Sun Jun 6 18:36:35 1999 +++ soundtracker-0.5.0/app/errors.c Sat Feb 19 11:58:34 2000 @@ -2,7 +2,7 @@ /* * The Real SoundTracker - error handling functions * - * Copyright (C) 1999 Michael Krause + * Copyright (C) 1999-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 diff -urN soundtracker-0.3.10/app/errors.h soundtracker-0.5.0/app/errors.h --- soundtracker-0.3.10/app/errors.h Sun Jun 6 18:36:35 1999 +++ soundtracker-0.5.0/app/errors.h Sat Feb 19 11:58:34 2000 @@ -2,7 +2,7 @@ /* * The Real SoundTracker - error handling functions (header) * - * Copyright (C) 1999 Michael Krause + * Copyright (C) 1999-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 diff -urN soundtracker-0.3.10/app/extspinbutton.c soundtracker-0.5.0/app/extspinbutton.c --- soundtracker-0.3.10/app/extspinbutton.c Fri Aug 13 13:44:18 1999 +++ soundtracker-0.5.0/app/extspinbutton.c Sat Feb 19 11:58:34 2000 @@ -2,7 +2,7 @@ /* * The Real SoundTracker - GTK+ Spinbutton extensions * - * Copyright (C) 1999 Michael Krause + * Copyright (C) 1999-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 diff -urN soundtracker-0.3.10/app/extspinbutton.h soundtracker-0.5.0/app/extspinbutton.h --- soundtracker-0.3.10/app/extspinbutton.h Sat May 1 11:55:02 1999 +++ soundtracker-0.5.0/app/extspinbutton.h Sat Feb 19 11:58:34 2000 @@ -2,7 +2,7 @@ /* * The Real SoundTracker - GTK+ Spinbutton extensions (header) * - * Copyright (C) 1999 Michael Krause + * Copyright (C) 1999-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 diff -urN soundtracker-0.3.10/app/file-operations.c soundtracker-0.5.0/app/file-operations.c --- soundtracker-0.3.10/app/file-operations.c Fri Jan 21 16:47:13 2000 +++ soundtracker-0.5.0/app/file-operations.c Mon Mar 13 13:56:00 2000 @@ -21,6 +21,8 @@ #include +#include + #include "i18n.h" #include #include "file-operations.h" @@ -78,12 +80,15 @@ GdkEventButton *bevent, gpointer user_data) { - gchar *temp = NULL; + gchar *k = NULL; + static gchar t[256]; - gtk_clist_get_text (GTK_CLIST (widget), row, 0, &temp); + gtk_clist_get_text (GTK_CLIST (widget), row, 0, &k); + strncpy(t, k, 255); + t[255] = 0; gtk_file_selection_set_filename (GTK_FILE_SELECTION(user_data), - temp); + t); } static void diff -urN soundtracker-0.3.10/app/file-operations.h soundtracker-0.5.0/app/file-operations.h --- soundtracker-0.3.10/app/file-operations.h Fri Jan 21 16:35:02 2000 +++ soundtracker-0.5.0/app/file-operations.h Sat Feb 19 11:58:35 2000 @@ -2,7 +2,7 @@ /* * The Real SoundTracker - file operations page (header) * - * Copyright (C) 1999 Michael Krause + * Copyright (C) 1999-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 diff -urN soundtracker-0.3.10/app/gui-settings.c soundtracker-0.5.0/app/gui-settings.c --- soundtracker-0.3.10/app/gui-settings.c Fri Dec 24 16:05:08 1999 +++ soundtracker-0.5.0/app/gui-settings.c Mon Mar 13 13:47:01 2000 @@ -2,7 +2,7 @@ /* * The Real SoundTracker - GUI configuration dialog * - * Copyright (C) 1999 Michael Krause + * Copyright (C) 1999-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 @@ -27,6 +27,7 @@ #endif #include "i18n.h" +#include "gui.h" #include "gui-settings.h" #include "gui-subs.h" #include "preferences.h" @@ -37,7 +38,8 @@ gui_prefs gui_settings = { 1, 0, - 1, + 0, + 0, 1, 0, @@ -60,6 +62,12 @@ "~/", "~/", "~/", + + "rm", + "unzip", + "lha", + "zcat", + "bunzip2" }; static GtkWidget *configwindow = NULL; @@ -121,6 +129,13 @@ } static void +gui_settings_asyncedit_toggled (GtkWidget *widget) +{ + gui_play_stop(); + gui_settings.asynchronous_editing = GTK_TOGGLE_BUTTON(widget)->active; +} + +static void gui_settings_use_aa_canvas_toggled (GtkWidget *widget) { gui_settings.gui_use_aa_canvas = GTK_TOGGLE_BUTTON(widget)->active; @@ -161,7 +176,7 @@ void gui_settings_dialog (void) { - GtkWidget *mainbox, *thing, *box1; + GtkWidget *mainbox, *thing, *box1, *hbox; GtkTooltips *tooltips; if(configwindow != NULL) { @@ -177,6 +192,7 @@ #endif gtk_signal_connect (GTK_OBJECT (configwindow), "delete_event", GTK_SIGNAL_FUNC (gui_settings_close_requested), NULL); + gtk_window_set_policy(GTK_WINDOW(configwindow), FALSE, FALSE, FALSE); mainbox = gtk_vbox_new(FALSE, 2); gtk_container_border_width(GTK_CONTAINER(mainbox), 4); @@ -212,13 +228,20 @@ gtk_signal_connect(GTK_OBJECT(thing), "toggled", GTK_SIGNAL_FUNC(gui_settings_upcase_toggled), NULL); - thing = gtk_check_button_new_with_label(_("Advance Cursor in FX Columns")); + thing = gtk_check_button_new_with_label(_("Advance cursor horizontally in effect columns")); gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(thing), gui_settings.advance_cursor_in_fx_columns); gtk_box_pack_start(GTK_BOX(mainbox), thing, FALSE, TRUE, 0); gtk_widget_show(thing); gtk_signal_connect(GTK_OBJECT(thing), "toggled", GTK_SIGNAL_FUNC(gui_settings_advance_cursor_toggled), NULL); + thing = gtk_check_button_new_with_label(_("Asynchronous Editing")); + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(thing), gui_settings.asynchronous_editing); + gtk_box_pack_start(GTK_BOX(mainbox), thing, FALSE, TRUE, 0); + gtk_widget_show(thing); + gtk_signal_connect(GTK_OBJECT(thing), "toggled", + GTK_SIGNAL_FUNC(gui_settings_asyncedit_toggled), NULL); + thing = gtk_check_button_new_with_label(_("Use anti-aliased envelope editor")); gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(thing), gui_settings.gui_use_aa_canvas); gtk_box_pack_start(GTK_BOX(mainbox), thing, FALSE, TRUE, 0); @@ -278,6 +301,29 @@ gtk_signal_connect(GTK_OBJECT(thing), "toggled", GTK_SIGNAL_FUNC(gui_settings_non_empty_patterns_toggled), NULL); + /* The button area */ + thing = gtk_hseparator_new(); + gtk_widget_show(thing); + gtk_box_pack_start(GTK_BOX(mainbox), thing, FALSE, TRUE, 0); + + hbox = gtk_hbutton_box_new (); + gtk_button_box_set_spacing (GTK_BUTTON_BOX (hbox), 4); + gtk_button_box_set_layout (GTK_BUTTON_BOX (hbox), GTK_BUTTONBOX_END); + gtk_box_pack_start (GTK_BOX (mainbox), hbox, + FALSE, FALSE, 0); + gtk_widget_show (hbox); + +#ifdef USE_GNOME + thing = gnome_stock_button (GNOME_STOCK_BUTTON_CLOSE); +#else + thing = gtk_button_new_with_label (_ ("Close")); +#endif + gtk_signal_connect (GTK_OBJECT (thing), "clicked", + GTK_SIGNAL_FUNC (gui_settings_close_requested), NULL); + gtk_box_pack_start (GTK_BOX (hbox), thing, FALSE, FALSE, 0); + gtk_widget_show (thing); + + gtk_widget_show (configwindow); } @@ -294,6 +340,7 @@ prefs_get_int(f, "gui-use-hexadecimal-numbers", &gui_settings.tracker_hexmode); prefs_get_int(f, "gui-use-upper-case", &gui_settings.tracker_upcase); prefs_get_int(f, "gui-advance-cursor-in-fx-columns", &gui_settings.advance_cursor_in_fx_columns); + prefs_get_int(f, "gui-asynchronous-editing", &gui_settings.asynchronous_editing); prefs_get_int(f, "gui-display-scopes", &gui_settings.gui_display_scopes); prefs_get_int(f, "gui-use-backing-store", &gui_settings.gui_use_backing_store); prefs_get_int(f, "gui-use-aa-canvas", &gui_settings.gui_use_aa_canvas); @@ -318,6 +365,13 @@ prefs_get_string(f, "savesmpl-path", gui_settings.savesmpl_path); prefs_get_string(f, "loadinstr-path", gui_settings.loadinstr_path); prefs_get_string(f, "saveinstr-path", gui_settings.saveinstr_path); + + prefs_get_string(f, "rm-path", gui_settings.rm_path); + prefs_get_string(f, "unzip-path", gui_settings.unzip_path); + prefs_get_string(f, "lha-path", gui_settings.lha_path); + prefs_get_string(f, "gz-path", gui_settings.gz_path); + prefs_get_string(f, "bz2-path", gui_settings.bz2_path); + fclose(f); } } @@ -338,6 +392,7 @@ prefs_put_int(f, "gui-use-hexadecimal-numbers", gui_settings.tracker_hexmode); prefs_put_int(f, "gui-use-upper-case", gui_settings.tracker_upcase); prefs_put_int(f, "gui-advance-cursor-in-fx-columns", gui_settings.advance_cursor_in_fx_columns); + prefs_put_int(f, "gui-asynchronous-editing", gui_settings.asynchronous_editing); prefs_put_int(f, "gui-display-scopes", gui_settings.gui_display_scopes); prefs_put_int(f, "gui-use-backing-store", gui_settings.gui_use_backing_store); prefs_put_int(f, "gui-use-aa-canvas", gui_settings.gui_use_aa_canvas); @@ -371,6 +426,12 @@ prefs_put_string(f, "savesmpl-path", gui_settings.savesmpl_path); prefs_put_string(f, "loadinstr-path", gui_settings.loadinstr_path); prefs_put_string(f, "saveinstr-path", gui_settings.saveinstr_path); + + prefs_put_string(f, "rm-path", gui_settings.rm_path); + prefs_put_string(f, "unzip-path", gui_settings.unzip_path); + prefs_put_string(f, "lha-path", gui_settings.lha_path); + prefs_put_string(f, "gz-path", gui_settings.gz_path); + prefs_put_string(f, "bz2-path", gui_settings.bz2_path); fclose(f); } diff -urN soundtracker-0.3.10/app/gui-settings.h soundtracker-0.5.0/app/gui-settings.h --- soundtracker-0.3.10/app/gui-settings.h Fri Dec 24 16:05:08 1999 +++ soundtracker-0.5.0/app/gui-settings.h Mon Mar 13 13:47:01 2000 @@ -2,7 +2,7 @@ /* * The Real SoundTracker - GUI configuration dialog (header) * - * Copyright (C) 1999 Michael Krause + * Copyright (C) 1999-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 @@ -28,6 +28,7 @@ gboolean tracker_hexmode; gboolean tracker_upcase; gboolean advance_cursor_in_fx_columns; + gboolean asynchronous_editing; gboolean gui_display_scopes; gboolean gui_use_backing_store; @@ -50,6 +51,12 @@ gchar savesmpl_path[128]; gchar loadinstr_path[128]; gchar saveinstr_path[128]; + + gchar rm_path[128]; + gchar unzip_path[128]; + gchar lha_path[128]; + gchar gz_path[128]; + gchar bz2_path[128]; } gui_prefs; extern gui_prefs gui_settings; @@ -59,5 +66,7 @@ void gui_settings_load_config (void); void gui_settings_save_config (void); void gui_settings_save_config_always (void); + +#define ASYNCEDIT (gui_settings.asynchronous_editing) #endif /* _ST_GUI_SETTINGS_H */ diff -urN soundtracker-0.3.10/app/gui-subs.c soundtracker-0.5.0/app/gui-subs.c --- soundtracker-0.3.10/app/gui-subs.c Sun Dec 26 19:36:36 1999 +++ soundtracker-0.5.0/app/gui-subs.c Sat Feb 19 11:58:34 2000 @@ -2,7 +2,7 @@ /* * The Real SoundTracker - GUI support routines * - * Copyright (C) 1998-1999 Michael Krause + * 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 @@ -300,7 +300,7 @@ // Stolen from testgtk.c and modified GtkWidget * -build_option_menu (OptionMenuItem items[], +gui_build_option_menu (OptionMenuItem items[], gint num_items, gint history) { @@ -335,7 +335,7 @@ // Create CList in scrolled window, show and add to box GtkWidget * -get_clist_in_scrolled_window (int n, +gui_clist_in_scrolled_window (int n, gchar **tp, GtkWidget *hbox) { diff -urN soundtracker-0.3.10/app/gui-subs.h soundtracker-0.5.0/app/gui-subs.h --- soundtracker-0.3.10/app/gui-subs.h Mon Dec 20 17:59:24 1999 +++ soundtracker-0.5.0/app/gui-subs.h Sat Feb 19 11:58:56 2000 @@ -2,7 +2,7 @@ /* * The Real SoundTracker - GUI support routines (header) * - * Copyright (C) 1998-1999 Michael Krause + * 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 @@ -31,8 +31,10 @@ int find_current_toggle (GtkWidget **widgets, int count); + void add_empty_hbox (GtkWidget *tobox); void add_empty_vbox (GtkWidget *tobox); + void make_radio_group (const char **labels, GtkWidget *tobox, GtkWidget **saveptr, @@ -55,6 +57,7 @@ GtkWidget **saveptr, void (*sigfunc) (void), gpointer data); + void gui_put_labelled_spin_button (GtkWidget *destbox, const char *title, int min, @@ -85,48 +88,43 @@ GtkWidget *slider, *spin; } gui_subs_slider; -GtkWidget * -gui_subs_create_slider (gui_subs_slider *s); +GtkWidget * gui_subs_create_slider (gui_subs_slider *s); -void -gui_subs_set_slider_value (gui_subs_slider *s, - int v); +void gui_subs_set_slider_value (gui_subs_slider *s, + int v); -int -gui_subs_get_slider_value (gui_subs_slider *s); +int gui_subs_get_slider_value (gui_subs_slider *s); typedef struct OptionMenuItem { const gchar *name; GtkSignalFunc func; } OptionMenuItem; -GtkWidget * -build_option_menu (OptionMenuItem items[], - gint num_items, - gint history); - -GtkWidget * -get_clist_in_scrolled_window (int n, - gchar **tp, - GtkWidget *hbox); - -GtkWidget * gui_button (GtkWidget * win, - char *stock, - char *labeltext, - void *callback, - gpointer userdata, - GtkWidget *box); +GtkWidget * gui_build_option_menu (OptionMenuItem items[], + gint num_items, + gint history); + +GtkWidget * gui_clist_in_scrolled_window (int n, + gchar **tp, + GtkWidget *hbox); + +GtkWidget * gui_button (GtkWidget * win, + char *stock, + char *labeltext, + void *callback, + gpointer userdata, + GtkWidget *box); #ifndef USE_GNOME #define GNOME_APP(x) x -void gnome_app_ok_cancel_modal (GtkWidget *window, - const gchar *text, - void (*callback)(gint, gpointer), - gpointer data); -void gnome_warning_dialog (gchar *text); -void gnome_error_dialog (gchar *text); +void gnome_app_ok_cancel_modal (GtkWidget *window, + const gchar *text, + void (*callback)(gint, gpointer), + gpointer data); +void gnome_warning_dialog (gchar *text); +void gnome_error_dialog (gchar *text); #endif diff -urN soundtracker-0.3.10/app/gui.c soundtracker-0.5.0/app/gui.c --- soundtracker-0.3.10/app/gui.c Sat Jan 22 15:14:18 2000 +++ soundtracker-0.5.0/app/gui.c Mon Mar 13 13:47:01 2000 @@ -2,7 +2,7 @@ /* * The Real SoundTracker - main user interface handling * - * Copyright (C) 1998-1999 Michael Krause + * 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 @@ -117,6 +117,7 @@ static void wait_for_player(void); static void play_song(void); static void play_pattern(void); +static void play_current_pattern_row(void); /* gui initialization / helpers */ static void text_entry_selected(void); @@ -129,13 +130,15 @@ static void programlist_initialize(void); static void -gui_mixer_play_pattern (int p, - int pp) +gui_mixer_play_pattern (int pattern, + int row, + int stop_after_row) { audio_ctlpipe_id i = AUDIO_CTLPIPE_PLAY_PATTERN; write(audio_ctlpipe, &i, sizeof(i)); - write(audio_ctlpipe, &p, sizeof(p)); - write(audio_ctlpipe, &pp, sizeof(pp)); + write(audio_ctlpipe, &pattern, sizeof(pattern)); + write(audio_ctlpipe, &row, sizeof(row)); + write(audio_ctlpipe, &stop_after_row, sizeof(stop_after_row)); } static void @@ -367,6 +370,9 @@ play_song(); handled = TRUE; break; + case GDK_Menu: + play_current_pattern_row(); + break; case ' ': if(ctrl || alt || shift) break; @@ -449,7 +455,9 @@ gui_mixer_set_songpos(newpos); // See comment in audio.c::audio_mix() for why we do this set_songpos_count++; - gui_set_current_pattern(playlist_get_nth_pattern(p, newpos)); + if(!ASYNCEDIT) { + gui_set_current_pattern(playlist_get_nth_pattern(p, newpos)); + } } } @@ -602,10 +610,15 @@ // This will not be executed if the user has manually changed the song position songpos = nsongpos; playlist_set_position(playlist, songpos); - gui_set_current_pattern(xm->pattern_order_table[songpos]); + if(!ASYNCEDIT) { + gui_set_current_pattern(xm->pattern_order_table[songpos]); + } } - if(gui_playing_mode != PLAYING_NOTE) { - tracker_set_patpos(tracker, npatpos); + + if(!ASYNCEDIT) { + if(gui_playing_mode != PLAYING_NOTE) { + tracker_set_patpos(tracker, npatpos); + } } if(notebook_current_page == 0) { @@ -663,7 +676,9 @@ case AUDIO_BACKPIPE_PLAYING_PATTERN_STARTED: startstop_count--; gui_playing_mode = (a == AUDIO_BACKPIPE_PLAYING_STARTED) ? PLAYING_SONG : PLAYING_PATTERN; - gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(editing_toggle), FALSE); + if(!ASYNCEDIT) { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(editing_toggle), FALSE); + } gui_enable(0); scope_group_start_updating(scopegroup); tracker_start_updating(); @@ -705,6 +720,7 @@ default: fprintf(stderr, "\n\n*** read_mixer_pipe: unexpected backpipe id %d\n\n\n", a); + g_assert_not_reached(); break; } @@ -744,10 +760,18 @@ play_pattern (void) { gui_play_stop(); - gui_mixer_play_pattern(gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(spin_editpat)), 0); + gui_mixer_play_pattern(gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(spin_editpat)), 0, 0); wait_for_player(); } +static void +play_current_pattern_row (void) +{ + gui_play_stop(); + gui_mixer_play_pattern(gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(spin_editpat)), tracker->patpos, 1); + startstop_count++; +} + void gui_play_stop (void) { @@ -812,7 +836,7 @@ gui_load_xm (const char *filename) { gui_free_xm(); - xm = XM_Load(filename); + xm = File_Load(filename); if(!xm) { gui_new_xm(); @@ -860,8 +884,10 @@ static void gui_enable (int enable) { - gtk_widget_set_sensitive(vscrollbar, enable); - gtk_widget_set_sensitive(spin_patlen, enable); + if(!ASYNCEDIT) { + gtk_widget_set_sensitive(vscrollbar, enable); + gtk_widget_set_sensitive(spin_patlen, enable); + } playlist_enable(playlist, enable); } @@ -877,7 +903,7 @@ tracker_set_pattern(tracker, &xm->patterns[p]); gtk_spin_button_set_value(GTK_SPIN_BUTTON(spin_editpat), p); gui_update_pattern_data(); - if(!GUI_ENABLED) + if(!GUI_ENABLED && !ASYNCEDIT) gui_mixer_set_pattern(p); xm_set_modified(m); } @@ -948,7 +974,7 @@ int gui_get_current_jump_value (void) { - if(!GUI_ENABLED) + if(!GUI_ENABLED && !ASYNCEDIT) return 0; else return gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(spin_jump)); diff -urN soundtracker-0.3.10/app/gui.h soundtracker-0.5.0/app/gui.h --- soundtracker-0.3.10/app/gui.h Sun Dec 26 12:25:56 1999 +++ soundtracker-0.5.0/app/gui.h Sat Feb 19 11:58:33 2000 @@ -2,7 +2,7 @@ /* * The Real SoundTracker - main user interface handling (header) * - * Copyright (C) 1998-1999 Michael Krause + * 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 diff -urN soundtracker-0.3.10/app/instrument-editor.c soundtracker-0.5.0/app/instrument-editor.c --- soundtracker-0.3.10/app/instrument-editor.c Sat Jan 8 12:36:57 2000 +++ soundtracker-0.5.0/app/instrument-editor.c Sat Feb 19 11:58:33 2000 @@ -2,7 +2,7 @@ /* * The Real SoundTracker - instrument editor * - * Copyright (C) 1998-1999 Michael Krause + * 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 diff -urN soundtracker-0.3.10/app/instrument-editor.h soundtracker-0.5.0/app/instrument-editor.h --- soundtracker-0.3.10/app/instrument-editor.h Sun Dec 19 16:27:19 1999 +++ soundtracker-0.5.0/app/instrument-editor.h Sat Feb 19 11:58:33 2000 @@ -2,7 +2,7 @@ /* * The Real SoundTracker - instrument editor (header) * - * Copyright (C) 1998 Michael Krause + * 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 diff -urN soundtracker-0.3.10/app/keys.c soundtracker-0.5.0/app/keys.c --- soundtracker-0.3.10/app/keys.c Sat Jan 8 12:36:56 2000 +++ soundtracker-0.5.0/app/keys.c Sat Feb 19 16:31:27 2000 @@ -6,7 +6,7 @@ * it's the solution I've come up with after nearly three years of * experimentation... * - * Copyright (C) 1997-1999 Michael Krause + * Copyright (C) 1997-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 @@ -129,6 +129,7 @@ const char *title; const char *explanation; keys_key *keys; + keys_key *keys_edit; } keys_group; static keys_group groups[] = { @@ -169,6 +170,79 @@ static int capturing = 0, capturing_all; +static gint +keys_keys_array_length (keys_key *keys) +{ + int i = 0; + + while((keys++)->title) + i++; + + return i; +} + +static keys_key * +keys_duplicate_keys_array (keys_key *keys) +{ + int l = keys_keys_array_length(keys); + keys_key *copy; + + copy = g_new(keys_key, l + 1); + memcpy(copy, keys, l * sizeof(keys_key)); + copy[l].title = NULL; + + return copy; +} + +static void +keys_initialize_editing (void) +{ + int i; + + for(i = 0; i < NUM_KEY_GROUPS; i++) { + groups[i].keys_edit = keys_duplicate_keys_array(groups[i].keys); + g_assert(groups[i].keys_edit != NULL); + } +} + +static void +keys_finish_editing (void) +{ + int i; + + for(i = 0; i < NUM_KEY_GROUPS; i++) { + g_free(groups[i].keys_edit); + groups[i].keys_edit = NULL; + } +} + +static void +keys_apply (void) +{ + int i; + + for(i = 0; i < NUM_KEY_GROUPS; i++) { + g_assert(groups[i].keys_edit != NULL); + g_assert(groups[i].keys != NULL); + memcpy(groups[i].keys, groups[i].keys_edit, keys_keys_array_length(groups[i].keys) * sizeof(keys_key)); + } +} + +static void +keys_cancel (void) +{ + gtk_widget_destroy(configwindow); + configwindow = NULL; + keys_finish_editing(); +} + +static void +keys_ok (void) +{ + keys_apply(); + keys_cancel(); +} + static gboolean keys_encode_assignment (gchar *string, int modifiers, @@ -252,7 +326,7 @@ gtk_clist_clear(GTK_CLIST(cw_clist)); gtk_clist_freeze(GTK_CLIST(cw_clist)); - for(kpt = groups[n].keys; kpt->title; kpt++) { + for(kpt = groups[n].keys_edit; kpt->title; kpt++) { insertbuf[0] = (gchar*)gettext(kpt->title); keys_encode_assignment(string, kpt->modifiers, kpt->xkeysym); gtk_clist_append(GTK_CLIST(cw_clist), insertbuf); @@ -277,7 +351,7 @@ cw_currentkey = -1; // Set explanation - gtk_label_set_text(GTK_LABEL(cw_explabel2), gettext(groups[cw_currentgroup].keys[row].explanation)); + gtk_label_set_text(GTK_LABEL(cw_explabel2), gettext(groups[cw_currentgroup].keys_edit[row].explanation)); // Set combo box list if(cw_combostrings != (0)) { @@ -286,14 +360,14 @@ } // Set modifier toggles - mod = groups[cw_currentgroup].keys[row].modifiers; + mod = groups[cw_currentgroup].keys_edit[row].modifiers; for(i = 0; i <= 2; i++) { gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(cw_modtoggles[i]), mod & (1 << i)); } // Set combo box entry code = NONE_TEXT; - h = groups[cw_currentgroup].keys[row].xkeysym; + h = groups[cw_currentgroup].keys_edit[row].xkeysym; for(i = 0; h != 0 && i < xkeymaplen; i++) { if(xkeymap[i].xkeysym == h) { code = xkeymap[i].xname; @@ -314,7 +388,7 @@ if(cw_currentgroup == -1 || cw_currentkey == -1) return; - groups[cw_currentgroup].keys[cw_currentkey].modifiers = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(cw_modtoggles[0])) + groups[cw_currentgroup].keys_edit[cw_currentkey].modifiers = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(cw_modtoggles[0])) + 2 * gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(cw_modtoggles[1])) + 4 * gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(cw_modtoggles[2])); @@ -326,10 +400,10 @@ } } - groups[cw_currentgroup].keys[cw_currentkey].xkeysym = keysym; + groups[cw_currentgroup].keys_edit[cw_currentkey].xkeysym = keysym; keys_encode_assignment(string, - groups[cw_currentgroup].keys[cw_currentkey].modifiers, + groups[cw_currentgroup].keys_edit[cw_currentkey].modifiers, keysym); gtk_clist_set_text(GTK_CLIST(cw_clist), cw_currentkey, 1, string); } @@ -375,14 +449,14 @@ /* If this doesn't succeed, the keymap contains logical errors */ g_assert(keys_encode_assignment(string, mod, keysym)); - groups[cw_currentgroup].keys[cw_currentkey].xkeysym = keysym; - groups[cw_currentgroup].keys[cw_currentkey].modifiers = mod; + groups[cw_currentgroup].keys_edit[cw_currentkey].xkeysym = keysym; + groups[cw_currentgroup].keys_edit[cw_currentkey].modifiers = mod; gtk_clist_set_text(GTK_CLIST(cw_clist), cw_currentkey, 1, string); if(capturing_all) { int nextkey = cw_currentkey + 1; - if(groups[cw_currentgroup].keys[nextkey].title) { + if(groups[cw_currentgroup].keys_edit[nextkey].title) { gtk_clist_select_row(GTK_CLIST(cw_clist), nextkey, 0); gtk_clist_moveto(GTK_CLIST(cw_clist), nextkey, 0, 0.5, 0.0); } else { @@ -420,17 +494,10 @@ keys_lb_switch(0); } -static void -keys_close_requested (void) -{ - gtk_widget_destroy(configwindow); - configwindow = NULL; -} - void keys_dialog (void) { - GtkWidget *mainbox, *box1, *box2, *box3, *box4, *thing, *frame; + GtkWidget *mainbox, *box1, *box2, *box3, *box4, *thing, *frame, *hbox; OptionMenuItem menu1[NUM_KEY_GROUPS]; int i; gchar *listtitles[2] = { @@ -450,7 +517,7 @@ gtk_window_set_title(GTK_WINDOW(configwindow), _("Keyboard Configuration")); #endif gtk_signal_connect (GTK_OBJECT (configwindow), "delete_event", - GTK_SIGNAL_FUNC (keys_close_requested), NULL); + GTK_SIGNAL_FUNC (keys_cancel), NULL); mainbox = gtk_vbox_new(FALSE, 2); gtk_container_border_width(GTK_CONTAINER(mainbox), 4); @@ -461,12 +528,16 @@ #endif gtk_widget_show(mainbox); + keys_initialize_editing(); + capturing = 0; + capturing_all = 0; + // Key Group Selector for(i = 0; i < NUM_KEY_GROUPS; i++) { menu1[i].name = gettext(groups[i].title); menu1[i].func = keys_key_group_changed; } - thing = build_option_menu(menu1, NUM_KEY_GROUPS, 0); + thing = gui_build_option_menu(menu1, NUM_KEY_GROUPS, 0); gtk_widget_show(thing); gtk_box_pack_start(GTK_BOX(mainbox), thing, FALSE, FALSE, 0); @@ -476,7 +547,7 @@ gtk_box_pack_start(GTK_BOX(mainbox), box1, TRUE, TRUE, 0); // List at the left side of the window - thing = get_clist_in_scrolled_window(2, listtitles, box1); + thing = gui_clist_in_scrolled_window(2, listtitles, box1); gtk_clist_set_selection_mode(GTK_CLIST(thing), GTK_SELECTION_BROWSE); gtk_clist_column_titles_passive(GTK_CLIST(thing)); gtk_clist_set_column_justification(GTK_CLIST(thing), 0, GTK_JUSTIFY_LEFT); @@ -590,6 +661,50 @@ GTK_SIGNAL_FUNC(keys_keyevent), NULL); gtk_signal_connect(GTK_OBJECT(configwindow), "button_press_event", GTK_SIGNAL_FUNC(keys_buttonevent), NULL); + + + /* The button area */ + thing = gtk_hseparator_new(); + gtk_widget_show(thing); + gtk_box_pack_start(GTK_BOX(mainbox), thing, FALSE, TRUE, 0); + + hbox = gtk_hbutton_box_new (); + gtk_button_box_set_spacing (GTK_BUTTON_BOX (hbox), 4); + gtk_button_box_set_layout (GTK_BUTTON_BOX (hbox), GTK_BUTTONBOX_END); +// gtk_button_box_set_child_ipadding (GTK_BUTTON_BOX(hbox), 30, 0); + gtk_box_pack_start (GTK_BOX (mainbox), hbox, + FALSE, FALSE, 0); + gtk_widget_show (hbox); + +#ifdef USE_GNOME + thing = gnome_stock_button (GNOME_STOCK_BUTTON_OK); +#else + thing = gtk_button_new_with_label (_ ("Ok")); +#endif + gtk_signal_connect (GTK_OBJECT (thing), "clicked", + GTK_SIGNAL_FUNC (keys_ok), NULL); + gtk_box_pack_start (GTK_BOX (hbox), thing, FALSE, FALSE, 0); + gtk_widget_show (thing); + +#ifdef USE_GNOME + thing = gnome_stock_button (GNOME_STOCK_BUTTON_APPLY); +#else + thing = gtk_button_new_with_label (_ ("Apply")); +#endif + gtk_signal_connect (GTK_OBJECT (thing), "clicked", + GTK_SIGNAL_FUNC (keys_apply), NULL); + gtk_box_pack_start (GTK_BOX (hbox), thing, FALSE, FALSE, 0); + gtk_widget_show (thing); + +#ifdef USE_GNOME + thing = gnome_stock_button (GNOME_STOCK_BUTTON_CANCEL); +#else + thing = gtk_button_new_with_label (_ ("Cancel")); +#endif + gtk_signal_connect (GTK_OBJECT (thing), "clicked", + GTK_SIGNAL_FUNC (keys_cancel), NULL); + gtk_box_pack_start (GTK_BOX (hbox), thing, FALSE, FALSE, 0); + gtk_widget_show (thing); gtk_widget_show (configwindow); } diff -urN soundtracker-0.3.10/app/keys.h soundtracker-0.5.0/app/keys.h --- soundtracker-0.3.10/app/keys.h Fri Aug 13 20:21:36 1999 +++ soundtracker-0.5.0/app/keys.h Sat Feb 19 11:58:33 2000 @@ -2,7 +2,7 @@ /* * The Real SoundTracker - X keyboard handling (header) * - * Copyright (C) 1997-1999 Michael Krause + * Copyright (C) 1997-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 diff -urN soundtracker-0.3.10/app/main.c soundtracker-0.5.0/app/main.c --- soundtracker-0.3.10/app/main.c Wed Jan 12 20:29:27 2000 +++ soundtracker-0.5.0/app/main.c Sun Mar 12 20:11:50 2000 @@ -2,7 +2,7 @@ /* * The Real SoundTracker - main program * - * Copyright (C) 1998-1999 Michael Krause + * 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 @@ -63,8 +63,12 @@ #if 0 driver_out_test, #endif +#if defined(__i386__) + mixer_kb_x86, +#endif mixer_integer32; + g_thread_init(NULL); if(pipe(pipea) || pipe(pipeb)) { @@ -91,8 +95,13 @@ audio_ctlpipe = pipea[1]; audio_backpipe = pipeb[0]; - /* Mixer modules can't be changed through the GUI at the moment */ - mixer = &mixer_integer32; +#if defined(__i386__) + mixers = g_list_append(mixers, + &mixer_kb_x86); +#endif + + mixers = g_list_append(mixers, + &mixer_integer32); #if 0 drivers[DRIVER_OUTPUT] = g_list_append(drivers[DRIVER_OUTPUT], @@ -129,17 +138,19 @@ /* drivers[DRIVER_OUTPUT] = g_list_append(drivers[DRIVER_OUTPUT], &driver_out_file); - This driver is not being added to the list because it's rather special + This driver is not being added to the list because it's rather special in that it takes a filename argument each time it's called.. need to think about better integration perhaps. */ #endif g_assert(g_list_length(drivers[DRIVER_OUTPUT]) >= 1 - && g_list_length(drivers[DRIVER_INPUT]) >= 1); + && g_list_length(drivers[DRIVER_INPUT]) >= 1 + && g_list_length(mixers) >= 1); gui_settings_load_config(); tips_dialog_load_settings(); + audioconfig_load_mixer_config(); // in case gui_init already loads a module if(gui_init(argc, argv)) { audioconfig_load_config(); diff -urN soundtracker-0.3.10/app/main.h soundtracker-0.5.0/app/main.h --- soundtracker-0.3.10/app/main.h Wed Sep 23 14:16:23 1998 +++ soundtracker-0.5.0/app/main.h Sat Feb 19 11:58:33 2000 @@ -2,7 +2,7 @@ /* * The Real SoundTracker - main program (header) * - * Copyright (C) 1998 Michael Krause + * 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 diff -urN soundtracker-0.3.10/app/menubar.c soundtracker-0.5.0/app/menubar.c --- soundtracker-0.3.10/app/menubar.c Tue Jan 18 17:32:34 2000 +++ soundtracker-0.5.0/app/menubar.c Sat Feb 19 14:01:43 2000 @@ -2,7 +2,7 @@ /* * The Real SoundTracker - GUI (menu bar) * - * Copyright (C) 1999 Michael Krause + * Copyright (C) 1999-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 @@ -35,7 +35,6 @@ #include "scope-group.h" #include "track-editor.h" #include "audioconfig.h" -#include "effectsconfig.h" #include "gui-settings.h" #include "tips-dialog.h" #include "transposition.h" @@ -71,7 +70,7 @@ const gchar *authors[] = {"Michael Krause ", NULL}; GtkWidget *about = gnome_about_new("SoundTracker", VERSION, - "Copyright (C) 1998-1999 Michael Krause", + "Copyright (C) 1998-2000 Michael Krause", authors, "Includes OpenCP player from Niklas Beisert and Tammo Hinrichs.", NULL); @@ -86,7 +85,7 @@ gtk_window_position (GTK_WINDOW(about), GTK_WIN_POS_CENTER); gtk_window_set_title(GTK_WINDOW(about), "About SoundTracker"); - label = gtk_label_new("SoundTracker " VERSION "\n\nCopyright (C) 1998-1999 Michael Krause\n" + label = gtk_label_new("SoundTracker " VERSION "\n\nCopyright (C) 1998-2000 Michael Krause\n" "\n\nIncludes OpenCP player from Niklas Beisert and Tammo Hinrichs."); gtk_container_border_width(GTK_CONTAINER(GTK_DIALOG(about)->vbox), 10); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(about)->vbox), label, TRUE, TRUE, 10); @@ -354,8 +353,6 @@ GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_MENU_PREF, 0, 0, NULL }, { GNOME_APP_UI_ITEM, N_("_Audio Configuration..."), NULL, audioconfig_dialog, NULL, NULL, GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_MENU_PREF, 0, 0, NULL }, - { GNOME_APP_UI_ITEM, N_("_Playback Effects..."), NULL, effectsconfig_dialog, NULL, NULL, - GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_MENU_PREF, 0, 0, NULL }, { GNOME_APP_UI_ITEM, N_("_GUI Configuration..."), NULL, gui_settings_dialog, NULL, NULL, GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_MENU_PREF, 0, 0, NULL }, @@ -408,7 +405,7 @@ { gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(settings_menu[0].widget), gui_settings.gui_display_scopes); gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(settings_menu[1].widget), gui_settings.gui_use_backing_store); - gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(settings_menu[9].widget), gui_settings.save_settings_on_exit); + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(settings_menu[8].widget), gui_settings.save_settings_on_exit); } void @@ -469,7 +466,6 @@ { N_("/Settings/-"), NULL, NULL, 0, "" }, { N_("/Settings/_Keyboard Configuration..."), NULL, keys_dialog, 0 }, { N_("/Settings/_Audio Configuration..."), NULL, audioconfig_dialog, 0 }, - { N_("/Settings/_Playback Effects..."), NULL, effectsconfig_dialog, 0 }, { N_("/Settings/_GUI Configuration..."), NULL, gui_settings_dialog, 0 }, { N_("/Settings/-"), NULL, NULL, 0, "" }, { N_("/Settings/_Save Settings now"), NULL, menubar_save_settings_now, 0 }, diff -urN soundtracker-0.3.10/app/menubar.h soundtracker-0.5.0/app/menubar.h --- soundtracker-0.3.10/app/menubar.h Sun Aug 22 21:05:58 1999 +++ soundtracker-0.5.0/app/menubar.h Sat Feb 19 11:58:34 2000 @@ -2,7 +2,7 @@ /* * The Real SoundTracker - GUI (menu bar) (header) * - * Copyright (C) 1999 Michael Krause + * Copyright (C) 1999-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 diff -urN soundtracker-0.3.10/app/mixer.h soundtracker-0.5.0/app/mixer.h --- soundtracker-0.3.10/app/mixer.h Sun Sep 26 17:54:49 1999 +++ soundtracker-0.5.0/app/mixer.h Mon Mar 13 12:47:18 2000 @@ -2,7 +2,7 @@ /* * The Real SoundTracker - Mixer module definitions * - * Copyright (C) 1998-1999 Michael Krause + * 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 @@ -25,8 +25,7 @@ #include typedef struct st_mixer_sample_info { - guint8 type; /* see ST_MIXER_SAMPLE_TYPE_ defines below */ - guint8 looptype; /* see ST_MIXER_SAMPLE_LOOPTYPE_ defines below */ + guint32 looptype; /* see ST_MIXER_SAMPLE_LOOPTYPE_ defines below */ guint32 length; /* length in samples, not in bytes */ guint32 loopstart; /* offset in samples, not in bytes */ guint32 loopend; /* offset to first sample not being played */ @@ -34,14 +33,10 @@ GMutex *lock; } st_mixer_sample_info; -/* values for st_mixer_sample_info.type */ -#define ST_MIXER_SAMPLE_TYPE_8 8 -#define ST_MIXER_SAMPLE_TYPE_16 16 - static inline int mixer_sample_word_length (st_mixer_sample_info *s) { - return s->type / 8; + return 2; } /* values for st_mixer_sample_info.looptype */ @@ -76,11 +71,6 @@ /* set final amplification factor (0.0 = mute ... 1.0 = normal ... +inf = REAL LOUD! :D)*/ void (*setampfactor) (float amplification); - /* set reverb value */ - void (*setreverb) (int r); - /* get reverb value */ - int (*getreverb) (void); - /* returns true if last mix() call had to clip the signal */ gboolean (*getclipflag) (void); @@ -105,8 +95,14 @@ /* set sample panning (-1.0 ... +1.0) */ void (*setpanning) (int channel, float panning); + /* set channel filter cutoff frequency (-1.0 for off, or 0.0 ... +1.0) */ + void (*setchcutoff) (int channel, float freq); + + /* set channel filter resonance (0.0 ... +1.0) */ + void (*setchreso) (int channel, float reso); + /* do the mix, return pointer to end of dest */ - void* (*mix) (void *dest, guint32 count, gint8 *scopebufs[], int scopebuf_offset); + void* (*mix) (void *dest, guint32 count, gint16 *scopebufs[], int scopebuf_offset); /* get status information */ void (*dumpstatus) (st_mixer_channel_status array[]); diff -urN soundtracker-0.3.10/app/mixers/Makefile.am soundtracker-0.5.0/app/mixers/Makefile.am --- soundtracker-0.3.10/app/mixers/Makefile.am Sun Sep 26 18:05:46 1999 +++ soundtracker-0.5.0/app/mixers/Makefile.am Sun Mar 5 18:01:54 2000 @@ -2,6 +2,7 @@ noinst_LIBRARIES = libmixers.a libmixers_a_SOURCES = \ - integer32.c integer32-asm.S integer32-asm.h + integer32.c integer32-asm.S integer32-asm.h \ + kb-x86.c kb-x86-asm.S kb-x86-asm.h INCLUDES = -I.. diff -urN soundtracker-0.3.10/app/mixers/Makefile.in soundtracker-0.5.0/app/mixers/Makefile.in --- soundtracker-0.3.10/app/mixers/Makefile.in Wed Jan 26 18:53:33 2000 +++ soundtracker-0.5.0/app/mixers/Makefile.in Mon Mar 13 14:06:49 2000 @@ -97,7 +97,7 @@ noinst_LIBRARIES = libmixers.a -libmixers_a_SOURCES = integer32.c integer32-asm.S integer32-asm.h +libmixers_a_SOURCES = integer32.c integer32-asm.S integer32-asm.h kb-x86.c kb-x86-asm.S kb-x86-asm.h INCLUDES = -I.. @@ -112,7 +112,7 @@ LDFLAGS = @LDFLAGS@ LIBS = @LIBS@ libmixers_a_LIBADD = -libmixers_a_OBJECTS = integer32.o integer32-asm.o +libmixers_a_OBJECTS = integer32.o integer32-asm.o kb-x86.o kb-x86-asm.o AR = ar CFLAGS = @CFLAGS@ COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) @@ -217,6 +217,7 @@ fi; \ done integer32.o: integer32.c ../../config.h ../mixer.h integer32-asm.h +kb-x86.o: kb-x86.c ../../config.h ../mixer.h kb-x86-asm.h info-am: info: info-am diff -urN soundtracker-0.3.10/app/mixers/integer32-asm.S soundtracker-0.5.0/app/mixers/integer32-asm.S --- soundtracker-0.3.10/app/mixers/integer32-asm.S Sun Sep 26 18:10:02 1999 +++ soundtracker-0.5.0/app/mixers/integer32-asm.S Sun Mar 12 21:28:53 2000 @@ -70,10 +70,10 @@ sarl $6,%edx addl $8,%ecx # (increment mixed data pointer) - movb %dh,(%edi) # Store scope data + movw %dx,(%edi) # Store scope data addl 12(%ebp),%eax # (increment sample position pointer) - inc %edi # (increment scope data pointer) + lea 2(%edi),%edi # (increment scope data pointer) decl %esp # loop jnz .0 @@ -116,8 +116,8 @@ addl %edx,(%ecx) sarl $6,%edx - movb %dh,(%edi) # Store scope data - inc %edi # (increment scope data pointer) + movw %dx,(%edi) # Store scope data + lea 2(%edi),%edi # (increment scope data pointer) addl $4,%ecx addl 12(%ebp),%eax # (increment sample position pointer) diff -urN soundtracker-0.3.10/app/mixers/integer32-asm.h soundtracker-0.5.0/app/mixers/integer32-asm.h --- soundtracker-0.3.10/app/mixers/integer32-asm.h Sun Sep 26 17:18:14 1999 +++ soundtracker-0.5.0/app/mixers/integer32-asm.h Sun Mar 12 21:18:06 2000 @@ -2,7 +2,7 @@ /* * The Real SoundTracker - Assembly routines for the mixer (header) * - * Copyright (C) 1999 Michael Krause + * Copyright (C) 1999-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 @@ -28,7 +28,7 @@ gint32 increment, // 12 gint16 *data, // 16 gint32 *mixed, // 20 - gint8 *scopedata, // 24 + gint16 *scopedata, // 24 guint32 volume, // 28 guint32 leftvol, // 32 guint32 rightvol, // 36 @@ -38,7 +38,7 @@ gint32 increment, // 12 gint16 *data, // 16 gint32 *mixed, // 20 - gint8 *scopedata, // 24 + gint16 *scopedata, // 24 guint32 volume, // 28 guint32 count); // 32 diff -urN soundtracker-0.3.10/app/mixers/integer32.c soundtracker-0.5.0/app/mixers/integer32.c --- soundtracker-0.3.10/app/mixers/integer32.c Wed Oct 6 13:18:32 1999 +++ soundtracker-0.5.0/app/mixers/integer32.c Mon Mar 13 12:40:49 2000 @@ -3,7 +3,7 @@ * The Real SoundTracker - Basic 32bit integers mixer. Probably the * worst which you can come up with. * - * Copyright (C) 1998-1999 Michael Krause + * 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 @@ -34,20 +34,11 @@ static int mixbufsize = 0, clipflag; static int stereo; -/* Reverb control variables */ -#define REVERBERATION 110000L -static int RVc[8]; -static int Ridx[8]; -static gint32 *RVbufL[8]; -static gint32 *RVbufR[8]; -static guint32 md_reverb=0; - typedef struct integer32_channel { st_mixer_sample_info *sample; void *data; /* copy of sample->data */ guint32 length; /* length of sample (converted) */ - int type; /* 16 or 8 bits */ int running; /* this channel is active */ guint32 current; /* current playback position in sample (converted) */ @@ -144,60 +135,17 @@ static void integer32_reset (void) { - int i; - memset(channels, 0, sizeof(channels)); - - RVc[0] = (5000L * 44100) / REVERBERATION; - RVc[1] = (5078L * 44100) / REVERBERATION; - RVc[2] = (5313L * 44100) / REVERBERATION; - RVc[3] = (5703L * 44100) / REVERBERATION; - RVc[4] = (6250L * 44100) / REVERBERATION; - RVc[5] = (6953L * 44100) / REVERBERATION; - RVc[6] = (7813L * 44100) / REVERBERATION; - RVc[7] = (8828L * 44100) / REVERBERATION; - - for(i = 0; i <= 7; i++) { - Ridx[i] = 0; - } - - for(i = 0; i <= 7; i++) { - if(!RVbufL[i]) - if(!(RVbufL[i] = (gint32*) calloc((RVc[i]+1),sizeof(gint32)))) - exit(0); - memset(RVbufL[i], 0, (RVc[i]+1)*sizeof(gint32)); - } - - for(i = 0; i <= 7; i++) { - if(!RVbufR[i]) - if(!(RVbufR[i] = (gint32*) calloc((RVc[i]+1),sizeof(gint32)))) - exit(0); - memset(RVbufR[i], 0, (RVc[i]+1)*sizeof(gint32)); - } -} - -static void -integer32_setreverb (int r) -{ - md_reverb = r; - return; -} - -static int -integer32_getreverb (void) -{ - return md_reverb; } static void integer32_startnote (int channel, - st_mixer_sample_info *s) + st_mixer_sample_info *s) { integer32_channel *c = &channels[channel]; c->sample = s; c->data = s->data; - c->type = s->type; c->length = MIN(s->length, MAX_SAMPLE_LENGTH) << ACCURACY; c->running = 1; c->speed = 1; @@ -218,7 +166,7 @@ static void integer32_setsmplpos (int channel, - guint32 offset) + guint32 offset) { integer32_channel *c = &channels[channel]; @@ -232,7 +180,7 @@ static void integer32_setfreq (int channel, - float frequency) + float frequency) { integer32_channel *c = &channels[channel]; @@ -241,11 +189,14 @@ } c->speed = frequency * (1 << ACCURACY) / mixfreq; + if(c->speed == 0) { + c->speed = 1; + } } static void integer32_setvolume (int channel, - float volume) + float volume) { integer32_channel *c = &channels[channel]; @@ -254,7 +205,7 @@ static void integer32_setpanning (int channel, - float panning) + float panning) { integer32_channel *c = &channels[channel]; @@ -263,22 +214,20 @@ static void * integer32_mix (void *dest, - guint32 count, - gint8 *scopebufs[], - int scopebuf_offset) + guint32 count, + gint16 *scopebufs[], + int scopebuf_offset) { int todo; int i, j, t, *m, v; integer32_channel *c; - int done, s; - int val; + int done; int offs2end, oflcnt, looplen; gint16 *sndbuf; - gint8 *scopedata = NULL; + gint16 *scopedata = NULL; int vl = 0; int vr = 0; - gint32 speedup; - gint32 ReverbPct; + gint16 *data; if((stereo + 1) * count > mixbufsize) { g_free(mixbuf); @@ -298,7 +247,7 @@ if(!c->running) { if(scopebufs) - memset(scopedata, 0, count); + memset(scopedata, 0, 2 * count); continue; } @@ -341,7 +290,6 @@ } } g_assert(offs2end >= 0); - g_assert(c->speed != 0); done = offs2end / c->speed + 1; } else /* if(c->loopflags == LOOP_NO) */ { done = (c->length - c->current) / c->speed; @@ -365,111 +313,76 @@ } /* This one does the actual mixing */ - /* One of the few occasions where templates would be really useful :) */ - if(c->type == ST_MIXER_SAMPLE_TYPE_16) { - gint16 *data = c->data; - if(scopebufs) { - if(stereo) { -#if defined(__i386__) - j = mixerasm_stereo_16_scopes(c->current, c->speed * c->direction, - data, m, scopedata, - v, vl, vr, - done); - - m += 2 * done; - scopedata += done; -#else - for(j = c->current, s = c->speed * c->direction; done; done--, j += s) { - val = v * data[j >> ACCURACY]; - *m++ += vl * val >> 6; - *m++ += vr * val >> 6; - *scopedata++ = val >> 8 >> 6; - } -#endif - } else { + data = c->data; + if(scopebufs) { + if(stereo) { #if defined(__i386__) - j = mixerasm_mono_16_scopes(c->current, c->speed * c->direction, - data, m, scopedata, - v, - done); - - m += done; - scopedata += done; + j = mixerasm_stereo_16_scopes(c->current, c->speed * c->direction, + data, m, scopedata, + v, vl, vr, + done); + + m += 2 * done; + scopedata += done; #else - for(j = c->current, s = c->speed * c->direction; done; done--, j += s) { - val = v * data[j >> ACCURACY]; - *m++ += val; - *scopedata++ = val >> 8 >> 6; - } -#endif + for(j = c->current, s = c->speed * c->direction; done; done--, j += s) { + val = v * data[j >> ACCURACY]; + *m++ += vl * val >> 6; + *m++ += vr * val >> 6; + *scopedata++ = val >> 6; } - } else { - if(stereo) { - vl *= v; - vr *= v; -#if defined(__i386__) - j = mixerasm_stereo_16(c->current, c->speed * c->direction, - data, m, - vl, vr, - done); - - m += 2 * done; - scopedata += done; -#else - for(j = c->current, s = c->speed * c->direction; done; done--, j += s) { - val = data[j >> ACCURACY]; - *m++ += vl * val >> 6; - *m++ += vr * val >> 6; - } #endif - } else { + } else { #if defined(__i386__) - j = mixerasm_mono_16(c->current, c->speed * c->direction, - data, m, - v, - done); + j = mixerasm_mono_16_scopes(c->current, c->speed * c->direction, + data, m, scopedata, + v, + done); - m += done; - scopedata += done; + m += done; + scopedata += done; #else - for(j = c->current, s = c->speed * c->direction; done; done--, j += s) { - val = v * data[j >> ACCURACY]; - *m++ += val; - } -#endif + for(j = c->current, s = c->speed * c->direction; done; done--, j += s) { + val = v * data[j >> ACCURACY]; + *m++ += val; + *scopedata++ = val >> 6; } +#endif } } else { - /* I've not done assembly routines for 8 bit mixing, sorry */ - gint8 *data = c->data; - if(scopebufs) { - if(stereo) { - for(j = c->current, s = c->speed * c->direction; done; done--, j += s) { - val = v * (data[j >> ACCURACY] << 8); - *m++ += vl * val >> 6; - *m++ += vr * val >> 6; - *scopedata++ = val >> 8 >> 6; - } - } else { - for(j = c->current, s = c->speed * c->direction; done; done--, j += s) { - val = v * (data[j >> ACCURACY] << 8); - *m++ += val; - *scopedata++ = val >> 8 >> 6; - } + if(stereo) { + vl *= v; + vr *= v; +#if defined(__i386__) + j = mixerasm_stereo_16(c->current, c->speed * c->direction, + data, m, + vl, vr, + done); + + m += 2 * done; + scopedata += done; +#else + for(j = c->current, s = c->speed * c->direction; done; done--, j += s) { + val = data[j >> ACCURACY]; + *m++ += vl * val >> 6; + *m++ += vr * val >> 6; } +#endif } else { - if(stereo) { - for(j = c->current, s = c->speed * c->direction; done; done--, j += s) { - val = v * (data[j >> ACCURACY] << 8); - *m++ += vl * val >> 6; - *m++ += vr * val >> 6; - } - } else { - for(j = c->current, s = c->speed * c->direction; done; done--, j += s) { - val = v * (data[j >> ACCURACY] << 8); - *m++ += val; - } +#if defined(__i386__) + j = mixerasm_mono_16(c->current, c->speed * c->direction, + data, m, + v, + done); + + m += done; + scopedata += done; +#else + for(j = c->current, s = c->speed * c->direction; done; done--, j += s) { + val = v * data[j >> ACCURACY]; + *m++ += val; } +#endif } } @@ -479,55 +392,6 @@ g_mutex_unlock(c->sample->lock); } -/* - Reverb code incorporated from libmikmod by Giles Constant. - This is absolutely not the right place for this, and we must think - about a general plug-in interface with per-channel effects some time. - */ - -#define COMPUTE_LECHO(n) RVbufL[n-1] [Ridx[n-1] ]=speedup+((ReverbPct*RVbufL[n-1] [Ridx[n-1] ])>>7) -#define COMPUTE_RECHO(n) RVbufR[n-1] [Ridx[n-1] ]=speedup+((ReverbPct*RVbufR[n-1] [Ridx[n-1] ])>>7) -#define INCR_LOOP(n) Ridx[n-1] ++; if (Ridx[n-1] >= RVc[n-1] ) Ridx[n-1] = 0; - - if(md_reverb != 0) { - ReverbPct=92+(md_reverb<<1); - - if (stereo) { - for(todo=0; todo < (count*2); todo+=2) { - - /* Compute the left channel echo buffers */ - speedup = mixbuf[todo]>>3; - COMPUTE_LECHO(1); COMPUTE_LECHO(2); COMPUTE_LECHO(3); COMPUTE_LECHO(4); - COMPUTE_LECHO(5); COMPUTE_LECHO(6); COMPUTE_LECHO(7); COMPUTE_LECHO(8); - - speedup = mixbuf[todo+1]>>3; - COMPUTE_RECHO(1); COMPUTE_RECHO(2); COMPUTE_RECHO(3); COMPUTE_RECHO(4); - COMPUTE_RECHO(5); COMPUTE_RECHO(6); COMPUTE_RECHO(7); COMPUTE_RECHO(8); - - INCR_LOOP(1); INCR_LOOP(2); INCR_LOOP(3); INCR_LOOP(4); - INCR_LOOP(5); INCR_LOOP(6); INCR_LOOP(7); INCR_LOOP(8); - - mixbuf[todo] += RVbufL[0][Ridx[0]]-RVbufL[1][Ridx[1]]+RVbufL[2][Ridx[2]]-RVbufL[3][Ridx[3]]+ - RVbufL[4][Ridx[4]]-RVbufL[5][Ridx[5]]+RVbufL[6][Ridx[6]]-RVbufL[7][Ridx[7]]; - mixbuf[todo+1] += RVbufR[0][Ridx[0]]-RVbufR[1][Ridx[1]]+RVbufR[2][Ridx[2]]-RVbufR[3][Ridx[3]]+ - RVbufR[4][Ridx[4]]-RVbufR[5][Ridx[5]]+RVbufR[6][Ridx[6]]-RVbufR[7][Ridx[7]]; - } - } else { // mono - for(todo=0; todo < (count); todo++) { - /* Compute the left channel echo buffers */ - speedup = mixbuf[todo]>>3; - COMPUTE_LECHO(1); COMPUTE_LECHO(2); COMPUTE_LECHO(3); COMPUTE_LECHO(4); - COMPUTE_LECHO(5); COMPUTE_LECHO(6); COMPUTE_LECHO(7); COMPUTE_LECHO(8); - - INCR_LOOP(1); INCR_LOOP(2); INCR_LOOP(3); INCR_LOOP(4); - INCR_LOOP(5); INCR_LOOP(6); INCR_LOOP(7); INCR_LOOP(8); - - mixbuf[todo] += RVbufL[0][Ridx[0]]-RVbufL[1][Ridx[1]]+RVbufL[2][Ridx[2]]-RVbufL[3][Ridx[3]]+ - RVbufL[4][Ridx[4]]-RVbufL[5][Ridx[5]]+RVbufL[6][Ridx[6]]-RVbufL[7][Ridx[7]]; - } - } - } - /* modules with many channels get additional amplification here */ t = (4 * log(num_channels) / log(4)) * 64 * 8; @@ -566,7 +430,7 @@ st_mixer mixer_integer32 = { "integer32", - "Basic 32bit integers mixer", + "Basic 32bit integers mixer, no interpolation", integer32_setnumch, integer32_updatesample, @@ -574,8 +438,6 @@ integer32_setstereo, integer32_setmixfreq, integer32_setampfactor, - integer32_setreverb, - integer32_getreverb, integer32_getclipflag, integer32_reset, integer32_startnote, @@ -584,6 +446,8 @@ integer32_setfreq, integer32_setvolume, integer32_setpanning, + NULL, + NULL, integer32_mix, integer32_dumpstatus, diff -urN soundtracker-0.3.10/app/mixers/kb-x86-asm.S soundtracker-0.5.0/app/mixers/kb-x86-asm.S --- soundtracker-0.3.10/app/mixers/kb-x86-asm.S Thu Jan 1 01:00:00 1970 +++ soundtracker-0.5.0/app/mixers/kb-x86-asm.S Sun Mar 12 22:20:00 2000 @@ -0,0 +1,765 @@ + +/* + * The Real SoundTracker - Cubically interpolating mixing routines + * with IT style filter support + * + * Copyright (C) 1999-2000 Tammo Hinrichs + * Copyright (C) 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. + * + */ + +#if defined(__i386__) + +.data + .align 4 + +_fadeleft: .long 0 +_faderight: .long 0 +_volrl: .long 0 +_volrr: .long 0 +_voll: .long 0 +_volr: .long 0 +magic1: .long 0 +ebpstore: .long 0 +store2: .long 0 +scopebuf: .long 0 + +ffreq: .float 0.0 +freso: .float 0.0 +fl1: .float 0.0 +fb1: .float 0.0 + +.section .rodata + .align 4 +minampl: .float 0.0001 +cremoveconst: .float 0.992 +clampmax: .float 32767.0 +clampmin: .float -32767.0 +minuseins: .float -1.0 + +.text + +.globl kbasm_prepare_mixer +kbasm_prepare_mixer: + pushl %ebp + movl %esp,%ebp + + pushl %eax + + xor %eax,%eax + movl %eax,_fadeleft + movl %eax,_faderight + movl %eax,_volrl + movl %eax,_volrr + + popl %eax + + leave + ret + +.globl kbasm_pre_mixing +kbasm_pre_mixing: + pushl %ebp + movl %esp, %ebp + + pushl %eax + pushl %ebx + pushl %ecx + pushl %edx + pushl %esi + pushl %edi + + finit + + // range check for declick values + xor %ebx,%ebx + movl _fadeleft,%eax + andl $0x7fffffff,%eax + cmpl minampl,%eax + ja .nocutfl + movl %ebx,_fadeleft +.nocutfl: + movl _faderight,%eax + andl $0x7fffffff,%eax + cmpl minampl,%eax + ja .nocutfr + movl %ebx,_faderight +.nocutfr: + + // clear and declick buffer + movl kb_x86_tempbuf,%edi + movl kb_x86_nsamples,%ecx + call clearbufs + + popl %edi + popl %esi + popl %edx + popl %ecx + popl %ebx + popl %eax + + leave + ret + +// clears and declicks tempbuffer (stereo) +clearbufs: + // edi : 32 bit float buffer + // ecx : # of samples + + flds cremoveconst // (fc) + flds _faderight // (fr) (fc) + flds _fadeleft // (fl) (fr) (fc) + +.clloop: + fsts (%edi) + fmul %st(2),%st // (fl') (fr) (fc) + fxch %st(1) // (fr) (fl') (fc) + fsts 4(%edi) + fmul %st(2),%st // (fr') (fl') (fc) + fxch %st(1) // (fl') (fr') (fc) + lea 8(%edi),%edi + decl %ecx + jnz .clloop + + fstps _fadeleft // (fr') (fc) + fstps _faderight // (fc) + ret + +.globl kbasm_post_mixing +kbasm_post_mixing: + pushl %ebp + movl %esp, %ebp + + pushl %ebx + pushl %ecx + pushl %edx + pushl %esi + pushl %edi + + finit + + movl kb_x86_outbuf,%edi + movl kb_x86_tempbuf,%esi + movl kb_x86_nsamples,%ecx + addl %ecx,%ecx // stereo + + call clipstereo + + popl %edi + popl %esi + popl %edx + popl %ecx + popl %ebx + + leave + ret + +clipstereo: // convert/clip samples, 16bit signed + flds kb_x86_amplification + flds clampmin // (min) (amp) + flds clampmax // (max) (min) (amp) + movw $32767,%bx + movw $-32767,%dx + movl %ebp,ebpstore + xorl %ebp,%ebp + +.lp: + flds (%esi) // (ls) (max) (min) (amp) + fmul %st(3) + fcom %st(1) + fnstsw %ax + sahf + ja .max + fcom %st(2) + fstsw %ax + sahf + jb .min + fistp (%edi) // (max) (min) (amp) +.next: + addl $4,%esi + addl $2,%edi + decl %ecx + jnz .lp + jmp .ende + +.max: + fstp %st // (max) (min) (amp) + movw %bx,(%edi) + incl %ebp + jmp .next +.min: + fstp %st // (max) (min) (amp) + movw %dx,(%edi) + incl %ebp + jmp .next + +.ende: + movl %ebp,%eax + movl ebpstore,%ebp + fstp %st // (min) (amp) + fstp %st // (amp) + fstp %st // - + ret + +.globl kbasm_mix +kbasm_mix: + pushl %ebp + movl %esp, %ebp + + pushl %eax + pushl %ebx + pushl %ecx + pushl %edx + pushl %esi + pushl %edi + + finit + + movl %ebp,ebpstore + movl 8(%ebp),%ebp + + // Put data into appropriate places for the real mixer subroutine + movl (%ebp),%eax + movl 4(%ebp),%ebx + movl %eax,_voll + movl %ebx,_volr + movl 8(%ebp),%eax + movl 12(%ebp),%ebx + movl %eax,_volrl + movl %ebx,_volrr + + movl 44(%ebp),%eax + movl %eax,ffreq + movl 48(%ebp),%eax + movl %eax,freso + movl 52(%ebp),%eax + movl %eax,fl1 + movl 56(%ebp),%eax + movl %eax,fb1 + movl 60(%ebp),%ecx + movl %ecx,scopebuf + movl 24(%ebp),%ebx // freqi + movl 28(%ebp),%esi // freqf + movl 16(%ebp),%eax // pointer to sample data + movl 20(%ebp),%edx // sample position (fractional part) + movl 32(%ebp),%edi // destination float buffer + + cmpl $0,%ecx + jnz .fwscopes + movl 36(%ebp),%ecx // number of samples to mix + call kbasm_mix_stereo_cubic_filtered_i2f_noscopes + jmp .fwcont +.fwscopes: + movl 36(%ebp),%ecx // number of samples to mix + call kbasm_mix_stereo_cubic_filtered_i2f +.fwcont: + + // Update changed values + movl ebpstore,%ebp + movl 8(%ebp),%ebp + + movl %eax,16(%ebp) // pointer to sample data + movl %edx,20(%ebp) // sample position (fractional part) + movl %edi,32(%ebp) // destination float buffer + movl fl1,%eax + movl %eax,52(%ebp) + movl fb1,%eax + movl %eax,56(%ebp) + + movl _voll,%eax + movl _volr,%ebx + movl %eax,(%ebp) + movl %ebx,4(%ebp) + + movl ebpstore,%ebp + + popl %edi + popl %esi + popl %edx + popl %ecx + popl %ebx + popl %eax + + leave + ret + +.globl kbasm_mix_backward +kbasm_mix_backward: + pushl %ebp + movl %esp, %ebp + + pushl %eax + pushl %ebx + pushl %ecx + pushl %edx + pushl %esi + pushl %edi + + finit + + movl %ebp,ebpstore + movl 8(%ebp),%ebp + + // Put data into appropriate places for the real mixer subroutine + movl (%ebp),%eax + movl 4(%ebp),%ebx + movl %eax,_voll + movl %ebx,_volr + movl 8(%ebp),%eax + movl 12(%ebp),%ebx + movl %eax,_volrl + movl %ebx,_volrr + + movl 44(%ebp),%eax + movl %eax,ffreq + movl 48(%ebp),%eax + movl %eax,freso + movl 52(%ebp),%eax + movl %eax,fl1 + movl 56(%ebp),%eax + movl %eax,fb1 + movl 60(%ebp),%ecx + movl %ecx,scopebuf + movl 24(%ebp),%ebx // freqi + movl 28(%ebp),%esi // freqf + movl 16(%ebp),%eax // pointer to sample data + movl 20(%ebp),%edx // sample position (fractional part) + movl 32(%ebp),%edi // destination float buffer + + cmpl $0,%ecx + jnz .bwscopes + movl 36(%ebp),%ecx // number of samples to mix + call kbasm_mix_stereo_cubic_filtered_i2f_backward_noscopes + jmp .bwcont +.bwscopes: + movl 36(%ebp),%ecx // number of samples to mix + call kbasm_mix_stereo_cubic_filtered_i2f_backward +.bwcont: + + // Update changed values + movl ebpstore,%ebp + movl 8(%ebp),%ebp + + movl %eax,16(%ebp) // pointer to sample data + movl %edx,20(%ebp) // sample position (fractional part) + movl %edi,32(%ebp) // destination float buffer + movl fl1,%eax + movl %eax,52(%ebp) + movl fb1,%eax + movl %eax,56(%ebp) + + movl _voll,%eax + movl _volr,%ebx + movl %eax,(%ebp) + movl %ebx,4(%ebp) + + movl ebpstore,%ebp + + popl %edi + popl %esi + popl %edx + popl %ecx + popl %ebx + popl %eax + + leave + ret + +kbasm_mix_stereo_cubic_filtered_i2f: // mixing, stereo w/ cubic interpolation, FILTERED + flds _voll // (vl) + flds _volr // (vr) (vl) + movl %eax,%ebp + shrl $1,%ebp + movl %edx,%eax + shrl $24,%eax + movl %esp,store2 + movl scopebuf,%esp + + .p2align 4,,7 +.I2Fnext: // (vr) (vl) + fild (,%ebp,2) // (w0) (vl) + fmuls kb_x86_ct0(,%eax,4) // (w0') (vl) + fild 2(,%ebp,2) // (w1) (w0') (vl) + fmuls kb_x86_ct1(,%eax,4) // (w1') (w0') (vl) + fild 4(,%ebp,2) // (w2) (w1') (w0') (vl) + fmuls kb_x86_ct2(,%eax,4) // (w2') (w1') (w0') (vl) + fild 6(,%ebp,2) // (w3) (w2') (w1') (w0') (vl) + fmuls kb_x86_ct3(,%eax,4) // (w3') (w2') (w1') (w0') (vl) + fxch %st(2) // (w1') (w2') (w3') (w0') (vr) (vl) + faddp %st,%st(3) // (w2') (w3') (w0+w1) (vr) (vl) + addl %esi,%edx + lea 8(%edi),%edi + faddp %st,%st(2) // (w2+w3) (w0+w1) (vr) (vl) + adcl %ebx,%ebp + movl %edx,%eax + faddp %st,%st(1) // (val) (vr) (vl) + + // IT Filter Code + // b=reso*b+freq*(in-l); + // l+=freq*b; + fsubs fl1 // (in-l) .. + fmuls ffreq // (f*(in-l)) .. + flds fb1 // (b) (f*(in-l)) .. + fmuls freso // (r*b) (f*(in-l)) .. + faddp %st,%st(1) // (b') .. + fsts fb1 + fmuls ffreq // (f*b') .. + fadds fl1 // (l') .. + fsts fl1 // (val) (vr) (vl) + + shrl $24,%eax + + // Scopes + fld %st(0) // (val) (val) (vr) (vl) + fmul %st(2),%st // (val*vr) (val) (vr) (vl) + fld %st(1) // (val) (val*vr) (val) (vr) (vl) + fmul %st(4),%st // (val*vl) (val*vr) (val) (vr) (vl) + faddp %st(1),%st // (val*vl + val*vr) (val) (vr) (vl) + fistp (%esp) // (val) (vr) (vl) + lea 2(%esp),%esp + + fld %st(1) // (vr) (val) (vr) (vl) + fld %st(3) // (vl) (vr) (val) (vr) (vl) + fmul %st(2),%st // (left) (vr) (val) (vr) (vl) + fxch %st(4) // (vl) (vr) (val) (vr) (left) + fadds _volrl // (vl') (vr) (val) (vr) (left) + fxch %st(2) // (val) (vr) (vl') (vr) (left) + fmulp %st(1) // (right) (vl') (vr) (left) + fxch %st(2) // (vr) (vl') (right) (left) + fadds _volrr // (vr') (vl') (right) (left) + fxch %st(3) // (left) (vl') (right) (vr') + fadds -8(%edi) // (lfinal) (vl') (vr') + fxch %st(2) // (right) (vl') (lfinal) (vr') + fadds -4(%edi) // (rfinal) (vl') (lfinal) (vr') + fstps -4(%edi) // (vl') (lfinal) (vr') + fxch %st(1) // (lfinal) (vl) (vr) + fstps -8(%edi) // (vl) (vr) + fxch %st(1) // (vr) (vl) + decl %ecx + jnz .I2Fnext + + fstps _volr // (vl) + fstps _voll // - + shll $1,%ebp + movl %ebp,%eax + movl store2,%esp + ret + +kbasm_mix_stereo_cubic_filtered_i2f_noscopes: // mixing, stereo w/ cubic interpolation, FILTERED + flds _voll // (vl) + flds _volr // (vr) (vl) + movl %eax,%ebp + shrl $1,%ebp + movl %edx,%eax + shrl $24,%eax + + .p2align 4,,7 +.I2FnextN: // (vr) (vl) + fild (,%ebp,2) // (w0) (vl) + fmuls kb_x86_ct0(,%eax,4) // (w0') (vl) + fild 2(,%ebp,2) // (w1) (w0') (vl) + fmuls kb_x86_ct1(,%eax,4) // (w1') (w0') (vl) + fild 4(,%ebp,2) // (w2) (w1') (w0') (vl) + fmuls kb_x86_ct2(,%eax,4) // (w2') (w1') (w0') (vl) + fild 6(,%ebp,2) // (w3) (w2') (w1') (w0') (vl) + fmuls kb_x86_ct3(,%eax,4) // (w3') (w2') (w1') (w0') (vl) + fxch %st(2) // (w1') (w2') (w3') (w0') (vr) (vl) + faddp %st,%st(3) // (w2') (w3') (w0+w1) (vr) (vl) + addl %esi,%edx + lea 8(%edi),%edi + faddp %st,%st(2) // (w2+w3) (w0+w1) (vr) (vl) + adcl %ebx,%ebp + movl %edx,%eax + faddp %st,%st(1) // (val) (vr) (vl) + + // IT Filter Code + // b=reso*b+freq*(in-l); + // l+=freq*b; + fsubs fl1 // (in-l) .. + fmuls ffreq // (f*(in-l)) .. + flds fb1 // (b) (f*(in-l)) .. + fmuls freso // (r*b) (f*(in-l)) .. + faddp %st,%st(1) // (b') .. + fsts fb1 + fmuls ffreq // (f*b') .. + fadds fl1 // (l') .. + fsts fl1 // (val) (vr) (vl) + + shrl $24,%eax + + fld %st(1) // (vr) (val) (vr) (vl) + fld %st(3) // (vl) (vr) (val) (vr) (vl) + fmul %st(2),%st // (left) (vr) (val) (vr) (vl) + fxch %st(4) // (vl) (vr) (val) (vr) (left) + fadds _volrl // (vl') (vr) (val) (vr) (left) + fxch %st(2) // (val) (vr) (vl') (vr) (left) + fmulp %st(1) // (right) (vl') (vr) (left) + fxch %st(2) // (vr) (vl') (right) (left) + fadds _volrr // (vr') (vl') (right) (left) + fxch %st(3) // (left) (vl') (right) (vr') + fadds -8(%edi) // (lfinal) (vl') (vr') + fxch %st(2) // (right) (vl') (lfinal) (vr') + fadds -4(%edi) // (rfinal) (vl') (lfinal) (vr') + fstps -4(%edi) // (vl') (lfinal) (vr') + fxch %st(1) // (lfinal) (vl) (vr) + fstps -8(%edi) // (vl) (vr) + fxch %st(1) // (vr) (vl) + decl %ecx + jnz .I2FnextN + + fstps _volr // (vl) + fstps _voll // - + shll $1,%ebp + movl %ebp,%eax + ret + +kbasm_mix_stereo_cubic_filtered_i2f_backward: // mixing, stereo w/ cubic interpolation, FILTERED + flds _voll // (vl) + flds _volr // (vr) (vl) + movl %eax,%ebp + shrl $1,%ebp + movl %edx,%eax + negl %eax + shrl $24,%eax + movl %esp,store2 + movl scopebuf,%esp + + .p2align 4,,7 +.I2FBnext: // (vr) (vl) + fild (,%ebp,2) // (w0) (vl) + fmuls kb_x86_ct0(,%eax,4) // (w0') (vl) + fild -2(,%ebp,2) // (w1) (w0') (vl) + fmuls kb_x86_ct1(,%eax,4) // (w1') (w0') (vl) + fild -4(,%ebp,2) // (w2) (w1') (w0') (vl) + fmuls kb_x86_ct2(,%eax,4) // (w2') (w1') (w0') (vl) + fild -6(,%ebp,2) // (w3) (w2') (w1') (w0') (vl) + fmuls kb_x86_ct3(,%eax,4) // (w3') (w2') (w1') (w0') (vl) + fxch %st(2) // (w1') (w2') (w3') (w0') (vr) (vl) + faddp %st,%st(3) // (w2') (w3') (w0+w1) (vr) (vl) + addl %esi,%edx + lea 8(%edi),%edi + faddp %st,%st(2) // (w2+w3) (w0+w1) (vr) (vl) + adcl %ebx,%ebp + movl %edx,%eax + faddp %st,%st(1) // (val) (vr) (vl) + + // IT Filter Code + // b=reso*b+freq*(in-l); + // l+=freq*b; + fsubs fl1 // (in-l) .. + fmuls ffreq // (f*(in-l)) .. + flds fb1 // (b) (f*(in-l)) .. + fmuls freso // (r*b) (f*(in-l)) .. + negl %eax + faddp %st,%st(1) // (b') .. + fsts fb1 + fmuls ffreq // (f*b') .. + fadds fl1 // (l') .. + fsts fl1 // (val) (vr) (vl) + + shrl $24,%eax + + // Scopes + fld %st(0) // (val) (val) (vr) (vl) + fmul %st(2),%st // (val*vr) (val) (vr) (vl) + fld %st(1) // (val) (val*vr) (val) (vr) (vl) + fmul %st(4),%st // (val*vl) (val*vr) (val) (vr) (vl) + faddp %st(1),%st // (val*vl + val*vr) (val) (vr) (vl) + fistp (%esp) // (val) (vr) (vl) + lea 2(%esp),%esp + + fld %st(1) // (vr) (val) (vr) (vl) + fld %st(3) // (vl) (vr) (val) (vr) (vl) + fmul %st(2),%st // (left) (vr) (val) (vr) (vl) + fxch %st(4) // (vl) (vr) (val) (vr) (left) + fadds _volrl // (vl') (vr) (val) (vr) (left) + fxch %st(2) // (val) (vr) (vl') (vr) (left) + fmulp %st(1) // (right) (vl') (vr) (left) + fxch %st(2) // (vr) (vl') (right) (left) + fadds _volrr // (vr') (vl') (right) (left) + fxch %st(3) // (left) (vl') (right) (vr') + fadds -8(%edi) // (lfinal) (vl') (vr') + fxch %st(2) // (right) (vl') (lfinal) (vr') + fadds -4(%edi) // (rfinal) (vl') (lfinal) (vr') + fstps -4(%edi) // (vl') (lfinal) (vr') + fxch %st(1) // (lfinal) (vl) (vr) + fstps -8(%edi) // (vl) (vr) + fxch %st(1) // (vr) (vl) + decl %ecx + jnz .I2FBnext + + fstps _volr // (vl) + fstps _voll // - + shll $1,%ebp + movl %ebp,%eax + movl store2,%esp + ret + +kbasm_mix_stereo_cubic_filtered_i2f_backward_noscopes: // mixing, stereo w/ cubic interpolation, FILTERED + flds _voll // (vl) + flds _volr // (vr) (vl) + movl %eax,%ebp + shrl $1,%ebp + movl %edx,%eax + negl %eax + shrl $24,%eax + + .p2align 4,,7 +.I2FBnextN: // (vr) (vl) + fild (,%ebp,2) // (w0) (vl) + fmuls kb_x86_ct0(,%eax,4) // (w0') (vl) + fild -2(,%ebp,2) // (w1) (w0') (vl) + fmuls kb_x86_ct1(,%eax,4) // (w1') (w0') (vl) + fild -4(,%ebp,2) // (w2) (w1') (w0') (vl) + fmuls kb_x86_ct2(,%eax,4) // (w2') (w1') (w0') (vl) + fild -6(,%ebp,2) // (w3) (w2') (w1') (w0') (vl) + fmuls kb_x86_ct3(,%eax,4) // (w3') (w2') (w1') (w0') (vl) + fxch %st(2) // (w1') (w2') (w3') (w0') (vr) (vl) + faddp %st,%st(3) // (w2') (w3') (w0+w1) (vr) (vl) + addl %esi,%edx + lea 8(%edi),%edi + faddp %st,%st(2) // (w2+w3) (w0+w1) (vr) (vl) + adcl %ebx,%ebp + movl %edx,%eax + faddp %st,%st(1) // (val) (vr) (vl) + + // IT Filter Code + // b=reso*b+freq*(in-l); + // l+=freq*b; + fsubs fl1 // (in-l) .. + fmuls ffreq // (f*(in-l)) .. + flds fb1 // (b) (f*(in-l)) .. + fmuls freso // (r*b) (f*(in-l)) .. + negl %eax + faddp %st,%st(1) // (b') .. + fsts fb1 + fmuls ffreq // (f*b') .. + fadds fl1 // (l') .. + fsts fl1 // (val) (vr) (vl) + + shrl $24,%eax + + fld %st(1) // (vr) (val) (vr) (vl) + fld %st(3) // (vl) (vr) (val) (vr) (vl) + fmul %st(2),%st // (left) (vr) (val) (vr) (vl) + fxch %st(4) // (vl) (vr) (val) (vr) (left) + fadds _volrl // (vl') (vr) (val) (vr) (left) + fxch %st(2) // (val) (vr) (vl') (vr) (left) + fmulp %st(1) // (right) (vl') (vr) (left) + fxch %st(2) // (vr) (vl') (right) (left) + fadds _volrr // (vr') (vl') (right) (left) + fxch %st(3) // (left) (vl') (right) (vr') + fadds -8(%edi) // (lfinal) (vl') (vr') + fxch %st(2) // (right) (vl') (lfinal) (vr') + fadds -4(%edi) // (rfinal) (vl') (lfinal) (vr') + fstps -4(%edi) // (vl') (lfinal) (vr') + fxch %st(1) // (lfinal) (vl) (vr) + fstps -8(%edi) // (vl) (vr) + fxch %st(1) // (vr) (vl) + decl %ecx + jnz .I2FBnextN + + fstps _volr // (vl) + fstps _voll // - + shll $1,%ebp + movl %ebp,%eax + ret + +.globl kbasm_declick_postproc +kbasm_declick_postproc: + pushl %ebp + movl %esp, %ebp + + pushl %eax + pushl %ebx + pushl %ecx + pushl %edx + pushl %esi + pushl %edi + + finit + + movl 8(%ebp),%esi + + // Get necessary data + movl (%esi),%eax + movl 4(%esi),%ebx + movl %eax,_voll + movl %ebx,_volr + movl 8(%esi),%eax + movl 12(%esi),%ebx + movl %eax,_volrl + movl %ebx,_volrr + movl 32(%esi),%edi // destination float buffer + movl 36(%esi),%ecx // number of samples to mix + + // FPU Stack: + flds (%esi) // (vl) + flds 4(%esi) // (vr) (vl) + flds 40(%esi) // (val) (vr) (vl) + lea 8(%edi),%edi + fxch %st(2) // (vr) (vl) (val) + +.fillSIF: // sample ends -> fill rest of buffer with last sample value + fld %st(1) // (vl) (vr) (vl) (val) + fmul %st(3),%st // (left) (vr) (vl) (val) + fxch %st(1) // (vr) (left) (vl) (val) + fld %st // (vr) (vr) (left) (vl) (val) + fmul %st(4),%st // (right) (vr) (left) (vl) (val) + fxch %st(2) // (left) (vr) (right) (vl) (val) + fadds -8(%edi) // (left) (vr) (right) (vl) (val) + fstps -8(%edi) // (vr) (right) (vl) (val) + fxch %st(1) // (right) (vr) (vl) (val) + fadds -4(%edi) // (right) (vr) (vl) (val) + fstps -4(%edi) // (vr) (vl) (val) + fadds _volrr // (vr') (vl) (val) + fxch %st(1) // (vl) (vr') (val) + lea 8(%edi),%edi + decl %ecx + fadds _volrl // (vl') (vr') (val) + fxch %st(1) // (vr') (vl') (val) + jnz .fillSIF + + // update click-removal fade values + fld %st(2) // (val) (vr) (vl) (val) + fld %st // (val) (val) (vr) (vl) (val) + fmul %st(3),%st // (left) (val) (vr) (vl) (val) + fxch %st(1) // (val) (left) (vr) (vl) (val) + fmul %st(2),%st // (rite) (left) (vr) (vl) (val) + fxch %st(1) // (left) (rite) (vr) (vl) (val) + fadds _fadeleft // (fl') (rite) (vr) (vl) (val) + fxch %st(1) // (rite) (fl') (vr) (vl) (val) + fadds _faderight // (fr') (fl') (vr) (vl) (val) + fxch %st(1) // (fl') (fr') (vr) (vl) (val) + fstps _fadeleft // (fr') (vr) (vl) (val) + fstps _faderight // (vr) (vl) (val) + + fstps 4(%esi) + fstps (%esi) + movl %edi,32(%esi) + + popl %edi + popl %esi + popl %edx + popl %ecx + popl %ebx + popl %eax + + leave + ret + +#endif /* defined(__i386__) */ diff -urN soundtracker-0.3.10/app/mixers/kb-x86-asm.h soundtracker-0.5.0/app/mixers/kb-x86-asm.h --- soundtracker-0.3.10/app/mixers/kb-x86-asm.h Thu Jan 1 01:00:00 1970 +++ soundtracker-0.5.0/app/mixers/kb-x86-asm.h Sun Mar 12 21:17:04 2000 @@ -0,0 +1,72 @@ + +/* + * The Real SoundTracker - Cubically interpolating mixing routines + * with IT style filter support + * + * Copyright (C) 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 _ST_MIXERASM_H +#define _ST_MIXERASM_H + +#include + +void kbasm_prepare_mixer (void); +void kbasm_pre_mixing (void); +gboolean kbasm_post_mixing (void); // returns "clipped" flag +void kbasm_mix_channel (void *channel_data); // 8 + +typedef struct kb_x86_mixer_data { + float volleft; // left volume (1.0=normal) 0 + float volright; // right volume (1.0=normal) 4 + float volrampl; // left volramp (dvol/sample) 8 + float volrampr; // right volramp (dvol/sample) 12 + gint16 *positioni; // pointer to sample data 16 + guint32 positionf; // fractional part of pointer 20 + guint32 freqi; // integer part of delta 24 + guint32 freqf; // fractional part of delta 28 + float *mixbuffer; // pointer to destination buffer 32 + guint32 numsamples; // number of samples to render 36 + float lastl; // declick value 40 + float ffreq; // filter frequency (0<=x<=1) 44 + float freso; // filter resonance (0<=x<1) 48 + float fl1; // filter lp buffer 52 + float fb1; // filter bp buffer 56 + gint16 *scopebuf; // 60 +} kb_x86_mixer_data; + +void kbasm_mix (kb_x86_mixer_data *data); // 8 +void kbasm_mix_backward (kb_x86_mixer_data *data); // 8 + +void kbasm_declick_postproc (kb_x86_mixer_data *data); // 8 + +extern gint32 _nsamples; +extern gint32 _nvoices; +extern gint32 _isstereo; + +extern guint32 *kb_x86_tempbuf; +extern gint16 *kb_x86_outbuf; +extern guint32 kb_x86_nsamples; + +extern float kb_x86_amplification; + +extern float kb_x86_ct0[256]; +extern float kb_x86_ct1[256]; +extern float kb_x86_ct2[256]; +extern float kb_x86_ct3[256]; + +#endif /* _ST_MIXERASM_H */ diff -urN soundtracker-0.3.10/app/mixers/kb-x86.c soundtracker-0.5.0/app/mixers/kb-x86.c --- soundtracker-0.3.10/app/mixers/kb-x86.c Thu Jan 1 01:00:00 1970 +++ soundtracker-0.5.0/app/mixers/kb-x86.c Mon Mar 13 13:38:43 2000 @@ -0,0 +1,759 @@ + +/* + * The Real SoundTracker - Cubically interpolating mixing routines + * with IT style filter support + * + * Copyright (C) 2000 Michael Krause + * Copyright (C) 1999-2000 Tammo Hinrichs + * + * 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(__i386__) + +#include +#include +#include +#include + +#include "mixer.h" +#include "kb-x86-asm.h" + +static int num_channels, mixfreq; +static int clipflag; + +static int kb_x86_tempbufsize = 0; +static gint16 *kb_x86_scopebuf = NULL; + +guint32 *kb_x86_tempbuf = NULL; +gint16 *kb_x86_outbuf; +guint32 kb_x86_nsamples; + +float kb_x86_amplification = 0.25; + +float kb_x86_ct0[256]; +float kb_x86_ct1[256]; +float kb_x86_ct2[256]; +float kb_x86_ct3[256]; + +typedef struct kb_x86_channel { + st_mixer_sample_info *sample; + + void *data; + int looptype; + guint32 length; + guint32 flags; // see below + float volume; // 0.0 ... 1.0 + float panning; // 0.0 ... 1.0 + int direction; // +1 for forward, -1 for backward + + float volleft; // float: left volume (1.0=normal) + float volright; // float: rite volume (1.0=normal) + float rampleft; // float: left volramp (dvol/sample) [yet unused] + float rampright; // float: rite volramp (dvol/sample) [yet unused] + + guint32 positionw; // current sample position (whole part of 32.32) + guint32 positionf; // current sample position (fractional part of 32.32) + guint32 freqw; // frequency (whole part of 32.32) + guint32 freqf; // frequency (fractional part of 32.32) + + float lastl, lastr; // aux variables for "last mixed sample" calculation + + float ffreq; // filter frequency (0<=x<=1) + float freso; // filter resonance (0<=x<1) + float fl1; // filter lp buffer + float fb1; // filter bp buffer +} kb_x86_channel; + +#define KB_X86_FLAG_LOOP_UNIDIRECTIONAL 1 +#define KB_X86_FLAG_LOOP_BIDIRECTIONAL 2 +#define KB_X86_FLAG_SAMPLE_RUNNING 4 +#define KB_X86_FLAG_STOP_SAMPLE 8 + +// The asm code can theoretically handle 256 voices +static kb_x86_channel channels[32]; + +#define KB_X86_SAMPLE_PADDING 3 // number of samples the mixer needs after the one pointed to by smpposw + +static void +kb_x86_setnumch (int n) +{ + g_assert(n >= 1 && n <= 32); + + num_channels = n; +} + +static void +kb_x86_updatesample (st_mixer_sample_info *si) +{ + int i; + kb_x86_channel *c; + + for(i = 0; i < 32; i++) { + c = &channels[i]; + + if(c->sample != si || !(c->flags & KB_X86_FLAG_SAMPLE_RUNNING)) { + continue; + } + + if(c->data != si->data + || c->length != si->length + || c->looptype != si->looptype) { + c->flags &= ~KB_X86_FLAG_SAMPLE_RUNNING; + continue; + } + + /* No relevant data has changed. Don't stop the sample, but update + our local loop data instead. */ + c->looptype = si->looptype; + if(c->looptype != ST_MIXER_SAMPLE_LOOPTYPE_NONE) { + if(c->positionw < si->loopstart) { + c->positionw = si->loopstart; + c->positionf = 0x7fffffff; + } else if(c->positionw >= si->loopend) { + c->positionw = si->loopend - 1; + c->positionf = 0x7fffffff; + } + } + } +} + +static gboolean +kb_x86_setmixformat (int format) +{ + if(format != 16) + return FALSE; + + return TRUE; +} + +static gboolean +kb_x86_setstereo (int on) +{ + if(!on) + return FALSE; + + return TRUE; +} + +static void +kb_x86_setmixfreq (guint16 frequency) +{ + mixfreq = frequency; +} + +static void +kb_x86_setampfactor (float amplification) +{ + kb_x86_amplification = 0.25 * amplification; +} + +static gboolean +kb_x86_getclipflag (void) +{ + return clipflag; +} + +static void +kb_x86_reset (void) +{ + int i; + + memset(channels, 0, sizeof(channels)); + kbasm_prepare_mixer(); + clipflag = 0; + + for(i = 0; i < 256; i++) { + float x1 = i / 256.0; + float x2 = x1*x1; + float x3 = x1*x1*x1; + kb_x86_ct0[i] = -0.5*x3 + x2 - 0.5*x1; + kb_x86_ct1[i] = 1.5*x3 - 2.5 * x2+1; + kb_x86_ct2[i] = -1.5*x3 + 2*x2 + 0.5*x1; + kb_x86_ct3[i] = 0.5*x3 - 0.5*x2; + } +} + +static void +kb_x86_startnote (int channel, + st_mixer_sample_info *s) +{ + kb_x86_channel *c = &channels[channel]; + + c->flags = 0; + + c->sample = s; + + // The following three for update_sample() + c->data = s->data; + c->length = s->length; + c->looptype = s->looptype; + + c->positionw = 0; + c->positionf = 0; + if(s->looptype == ST_MIXER_SAMPLE_LOOPTYPE_AMIGA) { + c->flags |= KB_X86_FLAG_LOOP_UNIDIRECTIONAL; + } else if(s->looptype == ST_MIXER_SAMPLE_LOOPTYPE_PINGPONG) { + c->flags |= KB_X86_FLAG_LOOP_BIDIRECTIONAL; + } + c->direction = 1; + c->rampleft = 0.0; + c->rampleft = 0.0; + c->lastl = 0.0; + c->lastr = 0.0; + c->freso = 0.0; + c->ffreq = 1.0; + c->fl1 = 0.0; + c->fb1 = 0.0; + c->flags |= KB_X86_FLAG_SAMPLE_RUNNING; +} + +static void +kb_x86_stopnote (int channel) +{ + kb_x86_channel *c = &channels[channel]; + +#if 0 + c->flags |= KB_X86_FLAG_STOP_SAMPLE; +#else + c->flags = 0; +#endif +} + +static void +kb_x86_setsmplpos (int channel, + guint32 offset) +{ + kb_x86_channel *c = &channels[channel]; + + if(c->sample && c->flags != 0) { + if(offset < c->sample->length) { + c->positionw = offset; + c->positionf = 0; + c->direction = 1; + } else { + c->flags = 0; + } + } +} + +static void +kb_x86_setfreq (int channel, + float frequency) +{ + kb_x86_channel *c = &channels[channel]; + + frequency /= mixfreq; + + c->freqw = (guint32)floor(frequency); + c->freqf = (guint32)((frequency - c->freqw) * pow(2,32)); +} + +static void +kb_x86_redo_vol_fields (kb_x86_channel *c) +{ + c->volleft = c->volume * (1.0 - c->panning); + c->volright = c->volume * c->panning; + g_assert(c->volleft >= 0.0 && c->volleft <= 1.0); + g_assert(c->volright >= 0.0 && c->volright <= 1.0); +} + +static void +kb_x86_setvolume (int channel, + float volume) +{ + kb_x86_channel *c = &channels[channel]; + + c->volume = volume; + kb_x86_redo_vol_fields(c); +} + +static void +kb_x86_setpanning (int channel, + float panning) +{ + kb_x86_channel *c = &channels[channel]; + + c->panning = 0.5 * (panning + 1.0); + kb_x86_redo_vol_fields(c); +} + +static void +kb_x86_setchcutoff (int channel, + float freq) +{ + kb_x86_channel *c = &channels[channel]; + + if(freq < 0.0) { + c->ffreq = 1.0; + c->freso = 0.0; + } else { + g_assert(0.0 <= freq); + g_assert(freq <= 1.0); + c->ffreq = freq; + c->freso = 0.0; + } +} + +static void +kb_x86_setchreso (int channel, + float reso) +{ + kb_x86_channel *c = &channels[channel]; + + g_assert(0.0 <= reso); + g_assert(reso <= 1.0); + c->freso = reso; +} + +static inline void +kb_x86_mix_handle_last_mixed_pre (kb_x86_channel *ch, + kb_x86_mixer_data *md) +{ + ch->lastl = md->mixbuffer[2 * md->numsamples - 2]; + ch->lastr = md->mixbuffer[2 * md->numsamples - 1]; +} + +static inline void +kb_x86_mix_handle_last_mixed_post (kb_x86_channel *ch, + kb_x86_mixer_data *md) +{ + if(md->volleft >= md->volright) { + if(md->volleft != 0.0) { + ch->lastl = ch->lastr = (md->mixbuffer[-2] - ch->lastl) / md->volleft; + } else { + ch->lastl = ch->lastr = 0.0; + } + } else { + if(md->volright != 0.0) { + ch->lastl = ch->lastr = (md->mixbuffer[-1] - ch->lastr) / md->volright; + } else { + ch->lastl = ch->lastr = 0.0; + } + } +} + +#if defined(DEBUG_BUFFER) +static void +kb_x86_debug_dump_buffer (gint16 *buffer, + int count) +{ + int i; + + printf("{ "); + for(i = 0; i < count; i++) { + if(i > 0) { + printf(", "); + } + printf("%d", buffer[i]); + } + printf(" }\n"); +} +#endif + +static guint32 +kb_x86_mix_sub (kb_x86_channel *ch, + gboolean loopit, + gboolean gonnapingpong, + guint32 num_samples_left) +{ + kb_x86_mixer_data md; + + /* This routine has not yet been optimized. It contains a lot of + ugly 64 bit arithmetic that could probably be rewritten to use + 32 bits only and thus be faster. It still contains a lot of + assertions that make it even slower. But the running time of + this routine is only relevant for short loops where it is + called very often. */ + + const gint32 ende = loopit ? ch->sample->loopend : ch->sample->length; + const gint64 ende64 = (guint64)ende << 32; + const gint64 lstart64 = ((guint64)ch->sample->loopstart) << 32; + const gint32 pos = ch->positionw; + const gint64 freq64 = (((guint64)ch->freqw) << 32) + (guint64)ch->freqf; + const gint64 pos64 = ((guint64)(ch->positionw) << 32) + (guint64)ch->positionf; + + int num_samples; + + /* Initalize the data array for the assembly subroutines. */ + md.volleft = ch->volleft; + md.volright = ch->volright; + md.volrampl = 0; + md.volrampr = 0; + md.positionf = ch->positionf; + if(ch->direction == 1) { + md.freqi = ch->freqw; + md.freqf = ch->freqf; + } else { + gint64 freq64_ = -(gint64)freq64; + md.freqi = freq64_ >> 32; + md.freqf = freq64_ & 0xffffffff; + } + md.mixbuffer = (float*)kb_x86_tempbuf; + md.scopebuf = kb_x86_scopebuf; + md.freso = ch->freso; + md.ffreq = ch->ffreq; + md.fl1 = ch->fl1; + md.fb1 = ch->fb1; + + if((ch->direction == 1 && pos >= ende - KB_X86_SAMPLE_PADDING) + || (ch->direction == -1 && pos < (gint32)(ch->sample->loopstart + KB_X86_SAMPLE_PADDING))) { + /* This is the dangerous case. We are near one of the ends of + a loop or sample (we might even have crossed it + already!). We have to take care of handling the looping and + perhaps we also have to prepare a mirror copy of the sample + values located around the loop incontinuity so that the + assembly routines don't use illegal values when + interpolating. */ + gint16 buffer[KB_X86_SAMPLE_PADDING + 1]; + unsigned int i; + gint32 j; + gint16 *bufferpt; + + /* First check if we're completely out of bounds, that means + for example: not just slightly before the end of the loop, + but way behind it. */ + if(gonnapingpong) { + /* The pingpong loop case. Care is taken to take into + account extremely short loops with extremly high + frequencies. */ + gboolean touched = FALSE; + gint64 pos64_ = ((guint64)(ch->positionw) << 32) + (guint64)ch->positionf; + gint64 lend64 = (((guint64)ch->sample->loopend) << 32) - 1; + + while(1) { + if(ch->direction == 1 && pos64_ >= lend64) { + ch->direction = -1; + pos64_ -= lend64; + pos64_ *= -1; + pos64_ += lend64; + touched = TRUE; + } else if(ch->direction == -1 && pos64 < lstart64) { + ch->direction = +1; + pos64_ -= lstart64; + pos64_ *= -1; + pos64_ += lstart64; + touched = TRUE; + } else { + break; + } + } + + if(touched) { + /* We've been really out of bounds. Start all over. */ + ch->positionw = pos64_ >> 32; + ch->positionf = (guint32)(pos64_ & 0xffffffff); + return 0; + } + } else if(loopit) { + /* The unidirectional ("Amiga") loop case. */ + gboolean touched = FALSE; + guint32 looplen = ch->sample->loopend - ch->sample->loopstart; + + while(ch->positionw >= ch->sample->loopend) { + ch->positionw -= looplen; + touched = TRUE; + } + + if(touched) { + /* We've been out of bounds. Start all over. */ + return 0; + } + } else { + if(ch->positionw >= ende) { + /* A sample without loop has just ended. */ + md.numsamples = num_samples_left; + md.lastl = ch->lastl; + kbasm_declick_postproc(&md); + ch->flags = 0; + return num_samples_left; + } + } + + /* The following code is concerned with doing the fake sample + stuff for correct handling of the loop incontinuities. */ + if(loopit || gonnapingpong) { + g_assert(pos >= ch->sample->loopstart); + g_assert(pos < ch->sample->loopend); + } + + if(gonnapingpong) { + int dir, bufferfilldir; + + dir = bufferfilldir = ch->direction; + bufferpt = buffer; + if(ch->direction == -1) { + bufferpt += (sizeof(buffer) / sizeof(buffer[0])) - 1; + } + for(i = 0, j = pos; i < sizeof(buffer) / sizeof(buffer[0]); i++) { + *bufferpt = ((gint16*)ch->sample->data)[j]; + if(dir == +1) { + if(++j >= ch->sample->loopend) { + dir = -1; + j--; + } + } else { + if(--j < (gint32)ch->sample->loopstart) { + j++; + dir = +1; + } + } + bufferpt += bufferfilldir; + } + } else { + for(i = 0, j = pos; i < sizeof(buffer) / sizeof(buffer[0]); i++) { + buffer[i] = ((gint16*)ch->sample->data)[j]; + if(++j >= ende) { + if(loopit) { + j -= (ch->sample->loopend - ch->sample->loopstart); + } else { + j--; + } + } + } + } + +#if defined(DEBUG_BUFFER) + kb_x86_debug_dump_buffer(buffer, sizeof(buffer) / sizeof(buffer[0])); +#endif + num_samples = 1; + md.numsamples = 1; + if(ch->direction == 1) { + md.positioni = buffer; + kb_x86_mix_handle_last_mixed_pre(ch, &md); + kbasm_mix(&md); + ch->positionw = md.positioni - buffer + pos; + } else { + md.positioni = buffer + ((sizeof(buffer) / sizeof(buffer[0])) - 1); + kb_x86_mix_handle_last_mixed_pre(ch, &md); + kbasm_mix_backward(&md); + ch->positionw = md.positioni - (buffer + ((sizeof(buffer) / sizeof(buffer[0])) - 1)) + pos; + } + kb_x86_mix_handle_last_mixed_post(ch, &md); + + ch->positionf = md.positionf; + ch->volleft = md.volleft; + ch->volright = md.volright; + ch->fl1 = md.fl1; + ch->fb1 = md.fb1; + + return num_samples; + } else { + /* That we've reached this point means that the current sample + position is in an area of the sample that's not near the + start nor the end, which in turn means that we don't have + to create auxiliary arrays to prevent the mixer routine + from accessing invalid data beyond the end of the sample. + + Now calculate how far we can go on like this until we hit a + dangerous area. */ + if(ch->direction == 1) { + const guint64 wieweit64 = pos64 + freq64 * num_samples_left; + const guint32 wieweit = wieweit64 >> 32; + + if(wieweit >= ende - KB_X86_SAMPLE_PADDING) { + /* oh, sorry - we need to truncate mixing length this + time. calculate exactly how many samples we can + still render in one run until we hit a dangerous + area. */ + num_samples = (ende64 - ((guint64)KB_X86_SAMPLE_PADDING << 32) - pos64 + (freq64 - 1)) / freq64; + g_assert(num_samples > 0); + g_assert(pos64 + freq64 * num_samples >= ende64 - ((guint64)KB_X86_SAMPLE_PADDING << 32)); + g_assert(pos64 + freq64 * (num_samples - 1) < ende64 - ((guint64)KB_X86_SAMPLE_PADDING << 32)); + num_samples = MIN(num_samples_left, num_samples); + } else { + /* no problem, we can render the full buffer without + problems in one run. */ + num_samples = num_samples_left; + } + + md.positioni = (gint16*)ch->sample->data + pos; + md.numsamples = num_samples; + kb_x86_mix_handle_last_mixed_pre(ch, &md); + kbasm_mix(&md); + kb_x86_mix_handle_last_mixed_post(ch, &md); + } else { + /* The same stuff, only for backwards direction */ + const gint64 wieweit64 = pos64 - freq64 * num_samples_left; + const gint32 wieweit = wieweit64 >> 32; + + if(wieweit < (gint32)(ch->sample->loopstart + KB_X86_SAMPLE_PADDING)) { + num_samples = 1 + (pos64 - (((guint64)KB_X86_SAMPLE_PADDING + ch->sample->loopstart) << 32)) / freq64; + g_assert(num_samples > 0); + g_assert(pos64 - freq64 * (gint64)(num_samples) < ((gint64)(ch->sample->loopstart + KB_X86_SAMPLE_PADDING) << 32)); + g_assert(pos64 - freq64 * (gint64)(num_samples - 1) >= ((gint64)(ch->sample->loopstart + KB_X86_SAMPLE_PADDING) << 32)); + num_samples = MIN(num_samples_left, num_samples); + } else { + num_samples = num_samples_left; + } + + md.positioni = (gint16*)ch->sample->data + pos; + md.numsamples = num_samples; + kb_x86_mix_handle_last_mixed_pre(ch, &md); + kbasm_mix_backward(&md); + kb_x86_mix_handle_last_mixed_post(ch, &md); + } + + ch->positionw = md.positioni - (gint16*)ch->sample->data; + ch->positionf = md.positionf; + ch->volleft = md.volleft; + ch->volright = md.volright; + ch->fl1 = md.fl1; + ch->fb1 = md.fb1; + + return num_samples; + } +} + +static void * +kb_x86_mix (void *dest, + guint32 count, + gint16 *scopebufs[], + int scopebuf_offset) +{ + int chnr; + + if(count > kb_x86_tempbufsize) { + free(kb_x86_tempbuf); + kb_x86_tempbufsize = count; + kb_x86_tempbuf = malloc(8 * kb_x86_tempbufsize); + } + + kb_x86_nsamples = count; + kbasm_pre_mixing(); + + for(chnr = 0; chnr < num_channels; chnr++) { + kb_x86_channel *ch = channels + chnr; + guint32 *tempbuf = kb_x86_tempbuf; + int num_samples_left = count; + gint16 *scopedata = NULL; + + if(scopebufs) { + scopedata = scopebufs[chnr] + scopebuf_offset; + } + + if(!(ch->flags & KB_X86_FLAG_SAMPLE_RUNNING)) { + if(scopedata) { + memset(scopedata, 0, 2 * num_samples_left); + } + continue; + } + + kb_x86_scopebuf = scopedata; + + g_assert(ch->sample->lock); + g_mutex_lock(ch->sample->lock); + + while(num_samples_left && (ch->flags & KB_X86_FLAG_SAMPLE_RUNNING)) { + int num_samples = 0; + + /* Check how much of the sample we can fill in one run */ +#if 0 + if(ch->flags & KB_X86_FLAG_STOP_SAMPLE) { + /* Stop sample, declick. */ + kb_x86_mixer_data md; + printf("stopping... & declicking\n"); + md.volleft = ch->volleft; + md.volright = ch->volright; + md.volrampl = 0; + md.volrampr = 0; + md.mixbuffer = (float*)kb_x86_tempbuf; + md.numsamples = num_samples_left; + md.lastl = ch->lastl; + kbasm_declick_postproc(&md); + ch->flags = 0; + break; + } +#endif + if(ch->flags & KB_X86_FLAG_LOOP_UNIDIRECTIONAL) { + num_samples = kb_x86_mix_sub(ch, TRUE, FALSE, num_samples_left); + } else if(ch->flags & KB_X86_FLAG_LOOP_BIDIRECTIONAL) { + num_samples = kb_x86_mix_sub(ch, TRUE, TRUE, num_samples_left); + } else /* no loop */ { + num_samples = kb_x86_mix_sub(ch, FALSE, FALSE, num_samples_left); + } + + num_samples_left -= num_samples; + kb_x86_tempbuf += (num_samples * 2); + if(kb_x86_scopebuf) { + kb_x86_scopebuf += num_samples; + } + } + + g_mutex_unlock(ch->sample->lock); + + kb_x86_tempbuf = tempbuf; + } + + kb_x86_outbuf = dest; + kb_x86_nsamples = count; + clipflag = kbasm_post_mixing(); + + return dest + count * 2 * 2; +} + +void +kb_x86_dumpstatus (st_mixer_channel_status array[]) +{ + int i; + gint32 pos; + + for(i = 0; i < 32; i++) { + if(channels[i].flags & KB_X86_FLAG_SAMPLE_RUNNING) { + array[i].current_sample = channels[i].sample; + pos = channels[i].positionw; + if(pos < 0) { + pos = 0; + } else if(pos >= channels[i].sample->length) { + pos = channels[i].sample->length - 1; + } + array[i].current_position = pos; + } else { + array[i].current_sample = NULL; + } + } +} + +st_mixer mixer_kb_x86 = { + "kb_x86", + "HQ FPU mixer with cubic interpolation and IT filters", + + kb_x86_setnumch, + kb_x86_updatesample, + kb_x86_setmixformat, + kb_x86_setstereo, + kb_x86_setmixfreq, + kb_x86_setampfactor, + kb_x86_getclipflag, + kb_x86_reset, + kb_x86_startnote, + kb_x86_stopnote, + kb_x86_setsmplpos, + kb_x86_setfreq, + kb_x86_setvolume, + kb_x86_setpanning, + kb_x86_setchcutoff, + kb_x86_setchreso, + kb_x86_mix, + kb_x86_dumpstatus, + + 0x7fffffff, + + NULL +}; + +#endif /* defined(__i386__) */ diff -urN soundtracker-0.3.10/app/module-info.c soundtracker-0.5.0/app/module-info.c --- soundtracker-0.3.10/app/module-info.c Sun Dec 19 11:57:32 1999 +++ soundtracker-0.5.0/app/module-info.c Sat Feb 19 11:58:33 2000 @@ -2,7 +2,7 @@ /* * The Real SoundTracker - module info page * - * Copyright (C) 1998 Michael Krause + * 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 @@ -125,7 +125,7 @@ gtk_notebook_append_page(nb, hbox, gtk_label_new(_("Module Info"))); gtk_widget_show(hbox); - ilist = get_clist_in_scrolled_window(3, ititles, hbox); + ilist = gui_clist_in_scrolled_window(3, ititles, hbox); gtk_clist_set_selection_mode(GTK_CLIST(ilist), GTK_SELECTION_BROWSE); gtk_clist_column_titles_passive(GTK_CLIST(ilist)); gtk_clist_set_column_justification(GTK_CLIST(ilist), 0, GTK_JUSTIFY_CENTER); @@ -144,7 +144,7 @@ gtk_box_pack_start(GTK_BOX(hbox), vbox, TRUE, TRUE, 0); gtk_widget_show(vbox); - slist = get_clist_in_scrolled_window(2, stitles, vbox); + slist = gui_clist_in_scrolled_window(2, stitles, vbox); gtk_clist_set_selection_mode(GTK_CLIST(slist), GTK_SELECTION_BROWSE); gtk_clist_column_titles_passive(GTK_CLIST(slist)); gtk_clist_set_column_justification(GTK_CLIST(slist), 0, GTK_JUSTIFY_CENTER); diff -urN soundtracker-0.3.10/app/module-info.h soundtracker-0.5.0/app/module-info.h --- soundtracker-0.3.10/app/module-info.h Sun Aug 22 18:17:46 1999 +++ soundtracker-0.5.0/app/module-info.h Sat Feb 19 11:58:33 2000 @@ -2,7 +2,7 @@ /* * The Real SoundTracker - module info page (header) * - * Copyright (C) 1998 Michael Krause + * 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 diff -urN soundtracker-0.3.10/app/playlist.c soundtracker-0.5.0/app/playlist.c --- soundtracker-0.3.10/app/playlist.c Sat Jan 22 14:41:05 2000 +++ soundtracker-0.5.0/app/playlist.c Sat Feb 19 11:58:35 2000 @@ -2,7 +2,7 @@ /* * The Real SoundTracker - gtk+ Playlist widget (header) * - * Copyright (C) 1999 Michael Krause + * Copyright (C) 1999-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 diff -urN soundtracker-0.3.10/app/playlist.h soundtracker-0.5.0/app/playlist.h --- soundtracker-0.3.10/app/playlist.h Fri Dec 24 15:51:17 1999 +++ soundtracker-0.5.0/app/playlist.h Sat Feb 19 11:58:35 2000 @@ -2,7 +2,7 @@ /* * The Real SoundTracker - gtk+ Playlist widget (header) * - * Copyright (C) 1999 Michael Krause + * Copyright (C) 1999-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 diff -urN soundtracker-0.3.10/app/preferences.c soundtracker-0.5.0/app/preferences.c --- soundtracker-0.3.10/app/preferences.c Sat Sep 4 11:51:36 1999 +++ soundtracker-0.5.0/app/preferences.c Sat Feb 19 11:58:34 2000 @@ -2,7 +2,7 @@ /* * The Real SoundTracker - Preferences handling * - * Copyright (C) 1998-1999 Michael Krause + * 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 diff -urN soundtracker-0.3.10/app/preferences.h soundtracker-0.5.0/app/preferences.h --- soundtracker-0.3.10/app/preferences.h Sat Aug 7 11:20:43 1999 +++ soundtracker-0.5.0/app/preferences.h Sat Feb 19 11:58:34 2000 @@ -2,7 +2,7 @@ /* * The Real SoundTracker - Preferences handling (header) * - * Copyright (C) 1998-1999 Michael Krause + * 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 diff -urN soundtracker-0.3.10/app/recode.c soundtracker-0.5.0/app/recode.c --- soundtracker-0.3.10/app/recode.c Sun Nov 1 16:51:52 1998 +++ soundtracker-0.5.0/app/recode.c Sat Feb 19 11:58:33 2000 @@ -2,7 +2,7 @@ /* * The Real SoundTracker - DOS Charset recoder * - * Copyright (C) 1998 Michael Krause + * Copyright (C) 1998-2000 Michael Krause * * The tables have been taken from recode-3.4.1/ibmpc.c: * Copyright (C) 1990, 1993, 1994 Free Software Foundation, Inc. diff -urN soundtracker-0.3.10/app/recode.h soundtracker-0.5.0/app/recode.h --- soundtracker-0.3.10/app/recode.h Sun Nov 1 16:51:16 1998 +++ soundtracker-0.5.0/app/recode.h Sat Feb 19 11:58:33 2000 @@ -2,7 +2,7 @@ /* * The Real SoundTracker - DOS Charset recoder (header) * - * Copyright (C) 1998 Michael Krause + * Copyright (C) 1998-2000 Michael Krause * * The tables have been taken from recode-3.4.1/ibmpc.c: * Copyright (C) 1990, 1993, 1994 Free Software Foundation, Inc. diff -urN soundtracker-0.3.10/app/sample-display.c soundtracker-0.5.0/app/sample-display.c --- soundtracker-0.3.10/app/sample-display.c Sat Jan 22 14:36:19 2000 +++ soundtracker-0.5.0/app/sample-display.c Sat Feb 19 11:58:33 2000 @@ -2,7 +2,7 @@ /* * The Real SoundTracker - GTK+ sample display widget * - * Copyright (C) 1998-1999 Michael Krause + * 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 diff -urN soundtracker-0.3.10/app/sample-display.h soundtracker-0.5.0/app/sample-display.h --- soundtracker-0.3.10/app/sample-display.h Sun Aug 29 17:44:55 1999 +++ soundtracker-0.5.0/app/sample-display.h Sat Feb 19 11:58:33 2000 @@ -2,7 +2,7 @@ /* * The Real SoundTracker - GTK+ sample display widget (header) * - * Copyright (C) 1998-1999 Michael Krause + * 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 diff -urN soundtracker-0.3.10/app/sample-editor.c soundtracker-0.5.0/app/sample-editor.c --- soundtracker-0.3.10/app/sample-editor.c Fri Jan 21 17:22:48 2000 +++ soundtracker-0.5.0/app/sample-editor.c Mon Mar 13 13:24:44 2000 @@ -67,9 +67,14 @@ static SampleDisplay *sampledisplay; static GtkWidget *sample_editor_hscrollbar; static GtkWidget *loopradio[3], *resolution_radio[2]; -static GtkWidget *spin_loopstart, *spin_loopend, *spin_selstart, *spin_selend; -static GtkWidget *box_loop, *box_params, *box_sel, *box_sel2; -static GtkWidget *label_slength; +static GtkWidget *spin_loopstart, *spin_loopend; + +static struct SampleEditor { // simplifies future encapsulation of this into a Gtk+ widget + GtkWidget *label_selection; + GtkWidget *label_length; + GtkWidget *vertical_boxes[3]; +} sample_editor; +static struct SampleEditor * const se = &sample_editor; // = Volume ramping dialog @@ -118,7 +123,6 @@ static void *copybuffer = NULL; static int copybufferlen; -static int copybuffertype; static void sample_editor_ok_clicked(void); @@ -129,7 +133,6 @@ static void sample_editor_spin_finetune_changed(GtkSpinButton *spin); static void sample_editor_spin_relnote_changed(GtkSpinButton *spin); static void sample_editor_loop_changed(void); -static void sample_editor_spin_selection_changed(void); static void sample_editor_display_loop_changed(SampleDisplay *, int start, int end); static void sample_editor_display_selection_changed(SampleDisplay *, int start, int end); static void sample_editor_display_window_changed(SampleDisplay *, int start, int end); @@ -176,7 +179,7 @@ void sample_editor_page_create (GtkNotebook *nb) { - GtkWidget *box, *thing, *hbox, *vbox; + GtkWidget *box, *thing, *hbox, *vbox, *vbox2, *frame, *box2; static const char *looplabels[] = { N_("No loop"), N_("Amiga"), @@ -214,7 +217,7 @@ gtk_box_pack_start(GTK_BOX(box), hbox, FALSE, TRUE, 0); gtk_widget_show(hbox); - box_loop = vbox = gtk_vbox_new(FALSE, 2); + se->vertical_boxes[0] = vbox = gtk_vbox_new(FALSE, 2); gtk_widget_show(vbox); gtk_box_pack_start(GTK_BOX(hbox), vbox, FALSE, TRUE, 0); @@ -227,7 +230,7 @@ gtk_widget_show(thing); gtk_box_pack_start(GTK_BOX(hbox), thing, FALSE, TRUE, 0); - box_params = vbox = gtk_vbox_new(TRUE, 2); + se->vertical_boxes[1] = vbox = gtk_vbox_new(TRUE, 2); gtk_widget_show(vbox); gtk_box_pack_start(GTK_BOX(hbox), vbox, FALSE, TRUE, 0); @@ -240,35 +243,67 @@ gtk_widget_show(thing); gtk_box_pack_start(GTK_BOX(hbox), thing, FALSE, TRUE, 0); - box_sel = vbox = gtk_vbox_new(TRUE, 2); + se->vertical_boxes[2] = vbox = gtk_vbox_new(FALSE, 2); gtk_widget_show(vbox); gtk_box_pack_start(GTK_BOX(hbox), vbox, FALSE, TRUE, 0); - gui_put_labelled_spin_button(vbox, _("SelStart"), 0, 0, &spin_selstart, sample_editor_spin_selection_changed, NULL); - gui_put_labelled_spin_button(vbox, _("SelEnd"), 0, 0, &spin_selend, sample_editor_spin_selection_changed, NULL); - gtk_widget_set_sensitive(spin_selstart, 0); - gtk_widget_set_sensitive(spin_selend, 0); - - box_sel2 = gtk_hbox_new(TRUE, 4); - gtk_widget_show(box_sel2); - gtk_box_pack_start(GTK_BOX(vbox), box_sel2, FALSE, TRUE, 0); + /* Sample selection */ + vbox2 = gtk_vbox_new(TRUE, 2); + gtk_widget_show(vbox2); + gtk_box_pack_start(GTK_BOX(vbox), vbox2, FALSE, TRUE, 0); + + box2 = gtk_hbox_new(FALSE, 4); + gtk_widget_show(box2); + gtk_box_pack_start(GTK_BOX(vbox2), box2, FALSE, TRUE, 0); - thing = gtk_button_new_with_label(_("Sel None")); + thing = gtk_label_new(_("Selection:")); + gtk_widget_show(thing); + gtk_box_pack_start(GTK_BOX(box2), thing, FALSE, TRUE, 0); + + thing = gtk_button_new_with_label(_("None")); gtk_signal_connect(GTK_OBJECT(thing), "clicked", GTK_SIGNAL_FUNC(sample_editor_select_none_clicked), NULL); - gtk_box_pack_start(GTK_BOX(box_sel2), thing, TRUE, TRUE, 0); + gtk_box_pack_start(GTK_BOX(box2), thing, TRUE, TRUE, 0); gtk_widget_show(thing); - thing = gtk_button_new_with_label(_("Sel All")); + thing = gtk_button_new_with_label(_("All")); gtk_signal_connect(GTK_OBJECT(thing), "clicked", GTK_SIGNAL_FUNC(sample_editor_select_all_clicked), NULL); - gtk_box_pack_start(GTK_BOX(box_sel2), thing, TRUE, TRUE, 0); + gtk_box_pack_start(GTK_BOX(box2), thing, TRUE, TRUE, 0); gtk_widget_show(thing); - gui_put_labelled_spin_button(vbox, _("RelNote"), -128, 127, &spin_relnote, sample_editor_spin_relnote_changed, NULL); - label_slength = thing = gtk_label_new(_("Length: 0")); + frame = gtk_frame_new (NULL); + gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN); + gtk_box_pack_start (GTK_BOX(vbox2), frame, FALSE, TRUE, 0); + gtk_widget_show (frame); + + se->label_selection = gtk_label_new (""); + gtk_misc_set_alignment (GTK_MISC (se->label_selection), 0.5, 0.5); + gtk_container_add (GTK_CONTAINER (frame), se->label_selection); + gtk_widget_show (se->label_selection); + + /* Sample length */ + box2 = gtk_hbox_new(FALSE, 4); + gtk_widget_show(box2); + gtk_box_pack_start(GTK_BOX(vbox2), box2, FALSE, TRUE, 0); + + thing = gtk_label_new(_("Length:")); gtk_widget_show(thing); - gtk_box_pack_start(GTK_BOX(vbox), thing, FALSE, TRUE, 0); + gtk_box_pack_start(GTK_BOX(box2), thing, FALSE, TRUE, 0); + + frame = gtk_frame_new (NULL); + gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN); + gtk_box_pack_start (GTK_BOX(box2), frame, TRUE, TRUE, 0); + gtk_widget_show (frame); + + se->label_length = gtk_label_new (""); + gtk_misc_set_alignment (GTK_MISC (se->label_length), 0.5, 0.5); + gtk_container_add (GTK_CONTAINER (frame), se->label_length); + gtk_widget_show (se->label_length); + + add_empty_vbox(vbox); + + gui_put_labelled_spin_button(vbox, _("RelNote"), -128, 127, &spin_relnote, sample_editor_spin_relnote_changed, NULL); thing = gtk_vseparator_new(); gtk_widget_show(thing); @@ -410,17 +445,6 @@ } static void -sample_editor_block_sel_spins (int block) -{ - void (*func) (GtkObject*, GtkSignalFunc, gpointer); - - func = block ? gtk_signal_handler_block_by_func : gtk_signal_handler_unblock_by_func; - - func(GTK_OBJECT(spin_selstart), sample_editor_spin_selection_changed, NULL); - func(GTK_OBJECT(spin_selend), sample_editor_spin_selection_changed, NULL); -} - -static void sample_editor_blocked_set_loop_spins (int start, int end) { @@ -431,13 +455,17 @@ } static void -sample_editor_blocked_set_sel_spins (int start, - int end) +sample_editor_set_selection_label (int start, + int end) { - sample_editor_block_sel_spins(1); - gtk_spin_button_set_value(GTK_SPIN_BUTTON(spin_selstart), start); - gtk_spin_button_set_value(GTK_SPIN_BUTTON(spin_selend), end); - sample_editor_block_sel_spins(0); + char buf[64]; + + if(start > -1) { + sprintf(buf, ("%d - %d"), start, end); + gtk_label_set(GTK_LABEL(se->label_selection), buf); + } else { + gtk_label_set(GTK_LABEL(se->label_selection), _("(no selection)")); + } } static void @@ -457,16 +485,18 @@ char buf[20]; int m = xm_get_modified(); + sample_display_set_data_16(sampledisplay, NULL, 0, FALSE); + if(!sts || !sts->sample.data) { - sample_display_set_data_16(sampledisplay, NULL, 0, FALSE); - gtk_widget_set_sensitive(box_loop, 0); - gtk_widget_set_sensitive(box_params, 0); - gtk_widget_set_sensitive(box_sel, 0); + gtk_widget_set_sensitive(se->vertical_boxes[0], FALSE); + gtk_widget_set_sensitive(se->vertical_boxes[1], FALSE); + gtk_widget_set_sensitive(se->vertical_boxes[2], FALSE); gtk_widget_set_sensitive(savebutton, 0); gtk_widget_set_sensitive(savebutton_rgn, 0); } - if(!sts) return; + if(!sts) + return; gtk_entry_set_text(GTK_ENTRY(gui_cursmpl_name), sts->name); @@ -475,44 +505,36 @@ gtk_spin_button_set_value(GTK_SPIN_BUTTON(spin_finetune), sts->finetune); gtk_spin_button_set_value(GTK_SPIN_BUTTON(spin_relnote), sts->relnote); - s = &sts->sample; - sprintf(buf, _("Length: %d"), s->length); - gtk_label_set(GTK_LABEL(label_slength), buf); + sprintf(buf, ("%d"), s->length); + gtk_label_set(GTK_LABEL(se->label_length), buf); sample_editor_block_loop_spins(1); gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(loopradio[s->looptype]), TRUE); gui_update_spin_adjustment(GTK_SPIN_BUTTON(spin_loopstart), 0, s->length - 1); gui_update_spin_adjustment(GTK_SPIN_BUTTON(spin_loopend), 1, s->length); sample_editor_block_loop_spins(0); - sample_editor_blocked_set_loop_spins(s->loopstart, s->loopend); - - sample_editor_block_sel_spins(1); - gui_update_spin_adjustment(GTK_SPIN_BUTTON(spin_selstart), -1, s->length - 1); - gui_update_spin_adjustment(GTK_SPIN_BUTTON(spin_selend), 1, s->length); - sample_editor_block_sel_spins(0); - sample_editor_blocked_set_sel_spins(-1, 0); + + sample_editor_set_selection_label(-1, 0); if(s->data) { - - if(s->type == ST_MIXER_SAMPLE_TYPE_16) sample_display_set_data_16(sampledisplay, s->data, s->length, FALSE); - else - sample_display_set_data_8(sampledisplay, s->data, s->length, FALSE); - - if(s->looptype != ST_MIXER_SAMPLE_LOOPTYPE_NONE) - sample_editor_blocked_set_display_loop(s->loopstart, s->loopend); - - gtk_widget_set_sensitive(box_loop, 1); - gtk_widget_set_sensitive(box_params, 1); - gtk_widget_set_sensitive(box_sel, 1); + + if(s->looptype != ST_MIXER_SAMPLE_LOOPTYPE_NONE) { + sample_editor_blocked_set_display_loop(s->loopstart, s->loopend); + } + + gtk_widget_set_sensitive(se->vertical_boxes[0], TRUE); + gtk_widget_set_sensitive(se->vertical_boxes[1], TRUE); + gtk_widget_set_sensitive(se->vertical_boxes[2], TRUE); + #ifndef NO_AUDIOFILE - gtk_widget_set_sensitive(savebutton, 1); - gtk_widget_set_sensitive(savebutton_rgn, 1); + gtk_widget_set_sensitive(savebutton, 1); + gtk_widget_set_sensitive(savebutton_rgn, 1); #endif - gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(resolution_radio[(s->type / 8) - 1]), TRUE); + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(resolution_radio[sts->treat_as_8bit ? 0 : 1]), TRUE); } xm_set_modified(m); @@ -631,12 +653,6 @@ } static void -sample_editor_spin_selection_changed (void) -{ - -} - -static void sample_editor_display_loop_changed (SampleDisplay *sample_display, int start, int end) @@ -682,7 +698,7 @@ g_return_if_fail(current_sample->sample.data != NULL); g_return_if_fail(start < end); - sample_editor_blocked_set_sel_spins(start, end); + sample_editor_set_selection_label(start, end); } static void @@ -734,38 +750,8 @@ } static void -sample_editor_convert_sample (void *src, - void *dst, - int srcformat, - int dstformat, - int count) -{ - gint16 *d16; - gint8 *d8; - - if(srcformat == dstformat) { - memcpy(dst, src, count * (srcformat / 8)); - } else { - if(dstformat == ST_MIXER_SAMPLE_TYPE_16) { - /* convert to 16 bit */ - d16 = dst; - d8 = src; - while(count--) - *d16++ = (*d8++ << 8); - } else { - /* convert to 8 bit */ - d8 = dst; - d16 = src; - while(count--) - *d8++ = (*d16++ >> 8); - } - } -} - -static void sample_editor_resolution_changed (void) { - void *newdata; STSample *sts = current_sample; st_mixer_sample_info *s; int n = find_current_toggle(resolution_radio, 2); @@ -774,30 +760,12 @@ return; s = &sts->sample; - if((s->type / 8) - 1 != n) { - sample_editor_lock_sample(); - - newdata = malloc(s->length * (n + 1)); - if(!newdata) - return; - - gui_play_stop(); - - sample_editor_convert_sample(s->data, - newdata, - s->type, - (n + 1) * 8, - s->length); - - free(s->data); - - s->data = newdata; - s->type = (n + 1) * 8; - - sample_editor_unlock_sample(); - sample_editor_set_sample(sts); + if(n == 0 && !sts->treat_as_8bit) { + st_sample_cutoff_lowest_8_bits(s->data, s->length); } + sts->treat_as_8bit = (n == 0); + xm_set_modified(1); } @@ -910,7 +878,6 @@ copybuffer = NULL; } copybufferlen = cutlen; - copybuffertype = oldsample->sample.type; copybuffer = malloc(copybufferlen * mult); if(!copybuffer) { error_error("Out of memory for copybuffer.\n"); @@ -1031,7 +998,6 @@ /* pasting into empty sample */ sample_editor_lock_sample(); sample_editor_init_sample(_("")); - current_sample->sample.type = copybuffertype; sample_editor_unlock_sample(); ss = 0; update_ie = 1; @@ -1053,11 +1019,13 @@ memcpy(newsample, oldsample->sample.data, ss * mult); - sample_editor_convert_sample(copybuffer, - newsample + ss * mult, - copybuffertype, - oldsample->sample.type, - copybufferlen); + st_convert_sample(copybuffer, + newsample + ss * mult, + 16, + 16, + copybufferlen); + st_sample_cutoff_lowest_8_bits(newsample + ss * mult, + copybufferlen); memcpy(newsample + (ss + copybufferlen) * mult, oldsample->sample.data + ss * mult, (oldsample->sample.length - ss) * mult); @@ -1074,21 +1042,6 @@ xm_set_modified(1); } -static void -sample_editor_modify_wav_sample (STSample *s) -{ - if(s->sample.type == ST_MIXER_SAMPLE_TYPE_16) { - byteswap_16_array(s->sample.data, s->sample.length); - } else { - gint8 *data = s->sample.data; - int length = s->sample.length; - while(length) { - *data = *data++ + 128; - length--; - } - } -} - #ifndef NO_AUDIOFILE static void @@ -1103,58 +1056,62 @@ wavload_sampleWidth, wavload_channelCount; */ - void *sbuf; + void *sbuf, *sbuf_loadto; int len; int i, count; - len = wavload_frameCount * (wavload_sampleWidth/8) * wavload_channelCount; + len = 2 * wavload_frameCount * wavload_channelCount; if(!(sbuf = malloc(len))) { error_error("Out of memory for sample data."); goto errnobuf; } - if(wavload_frameCount != afReadFrames(wavload_file, AF_DEFAULT_TRACK, sbuf, wavload_frameCount)) { + if(wavload_sampleWidth == 16) { + sbuf_loadto = sbuf; + } else { + sbuf_loadto = sbuf + len / 2; + } + + if(wavload_frameCount != afReadFrames(wavload_file, AF_DEFAULT_TRACK, sbuf_loadto, wavload_frameCount)) { error_error(_("Read error.")); goto errnodata; } + sample_editor_lock_sample(); + sample_editor_init_sample(wavload_samplename); + current_sample->sample.data = sbuf; + current_sample->treat_as_8bit = (wavload_sampleWidth == 8); + current_sample->sample.length = wavload_frameCount; + + if(wavload_sampleWidth == 8) { + st_sample_8bit_add_128(sbuf_loadto, len / 2); + st_convert_sample(sbuf_loadto, + sbuf, + 8, + 16, + len / 2); + } else { + byteswap_16_array(sbuf, len / 2); + } + if(mode != MODE_MONO) { + gint16 *a = sbuf, *b = sbuf; + count = wavload_frameCount; /* Code could probably be made shorter. But this is readable. */ switch(mode) { case MODE_STEREO_MIX: - if(wavload_sampleWidth == 16) { - gint16 *a = sbuf, *b = sbuf; - for(i = 0; i < count; i++, a+=2, b+=1) - *b = (a[0] + a[1]) / 2; - } else { - gint8 *a = sbuf, *b = sbuf; - for(i = 0; i < count; i++, a+=2, b+=1) - *b = (a[0] + a[1]) / 2; - } + for(i = 0; i < count; i++, a+=2, b+=1) + *b = (a[0] + a[1]) / 2; break; case MODE_STEREO_LEFT: - if(wavload_sampleWidth == 16) { - gint16 *a = sbuf, *b = sbuf; - for(i = 0; i < count; i++, a+=2, b+=1) - *b = a[0]; - } else { - gint8 *a = sbuf, *b = sbuf; - for(i = 0; i < count; i++, a+=2, b+=1) - *b = a[0]; - } + for(i = 0; i < count; i++, a+=2, b+=1) + *b = a[0]; break; case MODE_STEREO_RIGHT: - if(wavload_sampleWidth == 16) { - gint16 *a = sbuf, *b = sbuf; - for(i = 0; i < count; i++, a+=2, b+=1) - *b = a[1]; - } else { - gint8 *a = sbuf, *b = sbuf; - for(i = 0; i < count; i++, a+=2, b+=1) - *b = a[1]; - } + for(i = 0; i < count; i++, a+=2, b+=1) + *b = a[1]; break; default: g_assert_not_reached(); @@ -1162,15 +1119,6 @@ } } - sample_editor_lock_sample(); - sample_editor_init_sample(wavload_samplename); - current_sample->sample.data = sbuf; - current_sample->sample.type = wavload_sampleWidth; - current_sample->sample.length = wavload_frameCount; - - if(wavload_sampleWidth == 8) - sample_editor_modify_wav_sample(current_sample); - sample_editor_unlock_sample(); instrument_editor_update(); @@ -1345,8 +1293,8 @@ static void sample_editor_save_wav_main (const gchar *fn, - guint32 offset, - guint32 length) + guint32 offset, + guint32 length) { AFfilehandle outfile; AFfilesetup outfilesetup; @@ -1356,7 +1304,7 @@ outfilesetup = afNewFileSetup(); afInitFileFormat(outfilesetup, AF_FILE_WAVE); afInitChannels(outfilesetup, AF_DEFAULT_TRACK, 1); - afInitSampleFormat(outfilesetup, AF_DEFAULT_TRACK, AF_SAMPFMT_TWOSCOMP, current_sample->sample.type); + afInitSampleFormat(outfilesetup, AF_DEFAULT_TRACK, AF_SAMPFMT_TWOSCOMP, current_sample->treat_as_8bit ? 8 : 16); outfile = afOpenFile(fn, "w", outfilesetup); afFreeFileSetup(outfilesetup); @@ -1365,20 +1313,27 @@ return; } - sample_editor_lock_sample(); - - if(current_sample->sample.type == 8) - sample_editor_modify_wav_sample(current_sample); + if(current_sample->treat_as_8bit) { + void *buf = malloc(1 * length); + g_assert(buf); + st_convert_sample(current_sample->sample.data + offset * mixer_sample_word_length(¤t_sample->sample), + buf, + 16, + 8, + length); + st_sample_8bit_add_128(buf, + length); + afWriteFrames(outfile, AF_DEFAULT_TRACK, + buf, + length); + free(buf); + } else { + afWriteFrames(outfile, AF_DEFAULT_TRACK, + current_sample->sample.data + offset * mixer_sample_word_length(¤t_sample->sample), + length); + } - afWriteFrames(outfile, AF_DEFAULT_TRACK, - current_sample->sample.data + offset * mixer_sample_word_length(¤t_sample->sample), - length); afCloseFile(outfile); - - if(current_sample->sample.type == 8) - sample_editor_modify_wav_sample(current_sample); - - sample_editor_unlock_sample(); } static void @@ -1623,7 +1578,7 @@ current_sample->finetune = 0; current_sample->panning = 128; current_sample->relnote = 0; - current_sample->sample.type = 16; + current_sample->treat_as_8bit = FALSE; sample_editor_unlock_sample(); diff -urN soundtracker-0.3.10/app/sample-editor.h soundtracker-0.5.0/app/sample-editor.h --- soundtracker-0.3.10/app/sample-editor.h Sat Sep 4 11:19:28 1999 +++ soundtracker-0.5.0/app/sample-editor.h Sat Feb 19 11:58:34 2000 @@ -2,7 +2,7 @@ /* * The Real SoundTracker - sample editor (header) * - * Copyright (C) 1998 Michael Krause + * 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 diff -urN soundtracker-0.3.10/app/scope-group.c soundtracker-0.5.0/app/scope-group.c --- soundtracker-0.3.10/app/scope-group.c Sat Nov 13 14:56:39 1999 +++ soundtracker-0.5.0/app/scope-group.c Sun Mar 12 21:21:01 2000 @@ -2,7 +2,7 @@ /* * The Real SoundTracker - main window oscilloscope group * - * Copyright (C) 1998-1999 Michael Krause + * 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 @@ -88,7 +88,7 @@ { double time1, time2; int i, l; - static gint8 *buf = NULL; + static gint16 *buf = NULL; static int bufsize = 0; int o1, o2; ScopeGroup *s = data; @@ -99,16 +99,25 @@ time1 = current_driver->get_play_time(current_driver_object); time2 = time1 + (double)1 / s->update_freq; - if(time1 < scopebuf_start.time || time2 < scopebuf_start.time) { - // requesting too old samples -- scopebuf_length is too low + for(i = 0; i < 2; i++) { + if(time1 < scopebuf_start.time || time2 < scopebuf_start.time) { + // requesting too old samples -- scopebuf_length is too low // fprintf(stderr, "scope-group.c: requesting too old samples.\n"); - goto ende; + goto ende; + } + + if(time1 >= scopebuf_end.time || time2 >= scopebuf_end.time) { + /* requesting samples which haven't been even rendered yet. + can happen with short driver latencies. */ +// fprintf(stderr, "scope-group.c: requesting too new samples.\n"); + time1 -= (double)1 / s->update_freq; + time2 -= (double)1 / s->update_freq; + } else { + break; + } } - if(time1 >= scopebuf_end.time || time2 >= scopebuf_end.time) { - /* requesting samples which haven't been even rendered yet. - can't happen (theoretically :D). */ -// fprintf(stderr, "scope-group.c: requesting too new samples.\n"); + if(i == 2) { goto ende; } @@ -118,7 +127,7 @@ l = o2 - o1; if(bufsize < l) { free(buf); - buf = malloc(l); + buf = malloc(2 * l); bufsize = l; } @@ -129,11 +138,11 @@ for(i = 0; i < s->numchan; i++) { if(o2 > o1) { - sample_display_set_data_8(s->scopes[i], scopebufs[i] + o1, l, TRUE); + sample_display_set_data_16(s->scopes[i], scopebufs[i] + o1, l, TRUE); } else { - memcpy(buf, scopebufs[i] + o1, scopebuf_length - o1); - memcpy(buf + scopebuf_length - o1, scopebufs[i], o2); - sample_display_set_data_8(s->scopes[i], buf, l, TRUE); + memcpy(buf, scopebufs[i] + o1, 2 * (scopebuf_length - o1)); + memcpy(buf + scopebuf_length - o1, scopebufs[i], 2 * o2); + sample_display_set_data_16(s->scopes[i], buf, l, TRUE); } } diff -urN soundtracker-0.3.10/app/scope-group.h soundtracker-0.5.0/app/scope-group.h --- soundtracker-0.3.10/app/scope-group.h Sat Mar 20 16:46:58 1999 +++ soundtracker-0.5.0/app/scope-group.h Sat Feb 19 11:58:34 2000 @@ -2,7 +2,7 @@ /* * The Real SoundTracker - main window oscilloscope group (header) * - * Copyright (C) 1998-1999 Michael Krause + * 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 diff -urN soundtracker-0.3.10/app/st-subs.c soundtracker-0.5.0/app/st-subs.c --- soundtracker-0.3.10/app/st-subs.c Fri Oct 8 16:17:54 1999 +++ soundtracker-0.5.0/app/st-subs.c Mon Mar 13 13:18:07 2000 @@ -2,7 +2,7 @@ /* * The Real SoundTracker - General support routines * - * Copyright (C) 1998-1999 Michael Krause + * 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 @@ -507,5 +507,56 @@ xm->pattern_order_table[i] = p2; else if(xm->pattern_order_table[i] == p2) xm->pattern_order_table[i] = p1; + } +} + +void +st_convert_sample (void *src, + void *dst, + int srcformat, + int dstformat, + int count) +{ + gint16 *d16; + gint8 *d8; + + if(srcformat == dstformat) { + memcpy(dst, src, count * (srcformat / 8)); + } else { + if(dstformat == 16) { + /* convert to 16 bit */ + d16 = dst; + d8 = src; + while(count--) + *d16++ = (*d8++ << 8); + } else { + /* convert to 8 bit */ + d8 = dst; + d16 = src; + while(count--) + *d8++ = (*d16++ >> 8); + } + } +} + +void +st_sample_cutoff_lowest_8_bits (gint16 *data, + int count) +{ + while(count) { + gint16 d = *data; + d &= 0xff00; + *data++ = d; + count--; + } +} + +void +st_sample_8bit_add_128 (gint8 *data, + int count) +{ + while(count) { + *data = *data++ + 128; + count--; } } diff -urN soundtracker-0.3.10/app/st-subs.h soundtracker-0.5.0/app/st-subs.h --- soundtracker-0.3.10/app/st-subs.h Fri Oct 8 16:05:31 1999 +++ soundtracker-0.5.0/app/st-subs.h Mon Mar 13 13:18:07 2000 @@ -2,7 +2,7 @@ /* * The Real SoundTracker - General support routines (header) * - * Copyright (C) 1998-1999 Michael Krause + * 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 @@ -24,57 +24,57 @@ #include "xm.h" +/* --- Module functions --- */ void st_free_all_pattern_channels (XM *xm); int st_init_pattern_channels (XMPattern *p, int length, int num_channels); int st_instrument_num_save_samples (STInstrument *instr); int st_num_save_instruments (XM *xm); int st_num_save_patterns (XM *xm); +void st_clean_song (XM *); +void st_set_num_channels (XM *, int); +/* --- Pattern functions --- */ XMPattern* st_dup_pattern (XMPattern*); void st_free_pattern_channels (XMPattern *pat); void st_clear_pattern (XMPattern*); +int st_copy_pattern (XMPattern *dst, + XMPattern *src); void st_pattern_delete_track (XMPattern*, int); void st_pattern_insert_track (XMPattern*, int); +gboolean st_is_empty_pattern (XMPattern *p); +int st_find_first_unused_and_empty_pattern (XM *xm); +gboolean st_is_pattern_used_in_song (XM *xm, + int patnum); +void st_set_pattern_length (XMPattern *, int); +void st_exchange_patterns (XM *xm, + int p1, + int p2); +/* --- Track functions --- */ XMNote* st_dup_track (XMNote*, int length); XMNote* st_dup_track_wrap (XMNote*, int tracklength, int copystart, int copylength); void st_clear_track (XMNote*, int length); void st_clear_track_wrap (XMNote*, int tracklength, int clearstart, int clearlength); void st_paste_track_into_track_wrap (XMNote *from, XMNote *to, int tolength, int insertstart, int fromlength); +gboolean st_is_empty_track (XMNote *notes, + int length); +/* --- Instrument functions --- */ int st_instrument_num_samples (STInstrument *i); void st_clean_instrument (STInstrument *i, const char *name); -void st_clean_sample (STSample *s, const char *name); -void st_clean_song (XM*); - -void st_set_num_channels (XM *, int); -void st_set_pattern_length (XMPattern *, int); - -void st_sample_fix_loop (STSample *s); - gboolean st_instrument_used_in_song (XM *xm, int instr); -int -st_copy_pattern (XMPattern *dst, - XMPattern *src); - -int -st_find_first_unused_and_empty_pattern (XM *xm); - -gboolean -st_is_empty_pattern (XMPattern *p); - -gboolean -st_is_empty_track (XMNote *notes, - int length); - -gboolean -st_is_pattern_used_in_song (XM *xm, - int patnum); - -void -st_exchange_patterns (XM *xm, - int p1, - int p2); +/* --- Sample functions --- */ +void st_clean_sample (STSample *s, const char *name); +void st_sample_fix_loop (STSample *s); +void st_convert_sample (void *src, + void *dst, + int srcformat, + int dstformat, + int count); +void st_sample_cutoff_lowest_8_bits (gint16 *data, + int count); +void st_sample_8bit_add_128 (gint8 *data, + int count); #endif /* _ST_SUBS_H */ diff -urN soundtracker-0.3.10/app/time-buffer.c soundtracker-0.5.0/app/time-buffer.c --- soundtracker-0.3.10/app/time-buffer.c Thu Sep 9 19:00:23 1999 +++ soundtracker-0.5.0/app/time-buffer.c Sat Feb 19 11:58:34 2000 @@ -2,7 +2,7 @@ /* * The Real SoundTracker - time buffer * - * Copyright (C) 1999 Michael Krause + * Copyright (C) 1999-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 diff -urN soundtracker-0.3.10/app/time-buffer.h soundtracker-0.5.0/app/time-buffer.h --- soundtracker-0.3.10/app/time-buffer.h Fri Aug 6 12:33:53 1999 +++ soundtracker-0.5.0/app/time-buffer.h Sat Feb 19 11:58:34 2000 @@ -2,7 +2,7 @@ /* * The Real SoundTracker - time buffer (header) * - * Copyright (C) 1999 Michael Krause + * Copyright (C) 1999-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 diff -urN soundtracker-0.3.10/app/tips-dialog.c soundtracker-0.5.0/app/tips-dialog.c --- soundtracker-0.3.10/app/tips-dialog.c Sat Sep 4 17:31:22 1999 +++ soundtracker-0.5.0/app/tips-dialog.c Sat Feb 19 11:58:34 2000 @@ -2,8 +2,8 @@ /* * The Real SoundTracker - Tips dialog * - * Copyright (C) 1997-1999 by the GIMP authors - * Some adjustments for SoundTracker Copyright (C) 1999 by Michael Krause + * Copyright (C) 1997-2000 by the GIMP authors + * Some adjustments for SoundTracker Copyright (C) 1999-2000 by 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 diff -urN soundtracker-0.3.10/app/track-editor.c soundtracker-0.5.0/app/track-editor.c --- soundtracker-0.3.10/app/track-editor.c Fri Jan 21 16:58:30 2000 +++ soundtracker-0.5.0/app/track-editor.c Sat Mar 11 21:35:46 2000 @@ -2,7 +2,7 @@ /* * The Real SoundTracker - track editor * - * Copyright (C) 1998-1999 Michael Krause + * 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 @@ -162,7 +162,7 @@ static void vscrollbar_changed(GtkAdjustment *adj) { - if(gui_playing_mode != PLAYING_SONG && gui_playing_mode != PLAYING_PATTERN) { + if(ASYNCEDIT || (gui_playing_mode != PLAYING_SONG && gui_playing_mode != PLAYING_PATTERN)) { gtk_signal_handler_block_by_func(GTK_OBJECT(tracker), GTK_SIGNAL_FUNC(update_vscrollbar), NULL); tracker_set_patpos(TRACKER(tracker), adj->value); gtk_signal_handler_unblock_by_func(GTK_OBJECT(tracker), GTK_SIGNAL_FUNC(update_vscrollbar), NULL); @@ -314,19 +314,19 @@ switch (keyval) { case GDK_Up: - if(GUI_ENABLED && !ctrl && !shift && !alt) { + if((GUI_ENABLED || ASYNCEDIT) && !ctrl && !shift && !alt) { tracker_set_patpos(t, t->patpos > 0 ? t->patpos - 1 : t->curpattern->length - 1); handled = TRUE; } break; case GDK_Down: - if(GUI_ENABLED && !ctrl && !shift && !alt) { + if((GUI_ENABLED || ASYNCEDIT) && !ctrl && !shift && !alt) { tracker_set_patpos(t, t->patpos < t->curpattern->length - 1 ? t->patpos + 1 : 0); handled = TRUE; } break; case GDK_Page_Up: - if(!GUI_ENABLED) + if(!GUI_ENABLED && !ASYNCEDIT) break; if(t->patpos >= 16) tracker_set_patpos(t, t->patpos - 16); @@ -335,7 +335,7 @@ handled = TRUE; break; case GDK_Page_Down: - if(!GUI_ENABLED) + if(!GUI_ENABLED && !ASYNCEDIT) break; if(t->patpos < t->curpattern->length - 16) tracker_set_patpos(t, t->patpos + 16); @@ -345,31 +345,31 @@ break; case GDK_F9: case GDK_Home: - if(GUI_ENABLED) { + if(GUI_ENABLED || ASYNCEDIT) { tracker_set_patpos(t, 0); handled = TRUE; } break; case GDK_F10: - if(GUI_ENABLED) { + if(GUI_ENABLED || ASYNCEDIT) { tracker_set_patpos(t, t->curpattern->length/4); handled = TRUE; } break; case GDK_F11: - if(GUI_ENABLED) { + if(GUI_ENABLED || ASYNCEDIT) { tracker_set_patpos(t, t->curpattern->length/2); handled = TRUE; } break; case GDK_F12: - if(GUI_ENABLED) { + if(GUI_ENABLED || ASYNCEDIT) { tracker_set_patpos(t, 3*t->curpattern->length/4); handled = TRUE; } break; case GDK_End: - if(GUI_ENABLED) { + if(GUI_ENABLED || ASYNCEDIT) { tracker_set_patpos(t, t->curpattern->length - 1); handled = TRUE; } @@ -615,7 +615,6 @@ height += t->curpattern->length; } - printf("%d %d\n", width, height); block_buffer.alloc_length = block_buffer.length = height; for(i = 0; i < 32; i++) { @@ -692,7 +691,7 @@ } tracker_redraw_current_row(t); - if(gui_settings.advance_cursor_in_fx_columns) + if(!gui_settings.advance_cursor_in_fx_columns) tracker_step_cursor_row(t, 1); else tracker_step_cursor_item(t, 1); @@ -715,10 +714,20 @@ s |= n << exp; *modpt = s; tracker_redraw_current_row(t); - if(gui_settings.advance_cursor_in_fx_columns) + + if(!gui_settings.advance_cursor_in_fx_columns) { tracker_step_cursor_row(t, 1); - else - tracker_step_cursor_item(t, 1); + } else { + if(exp) { /* not at the end */ + tracker_step_cursor_item(t, 1); + } else { + tracker_step_cursor_row(t,1); + tracker_step_cursor_item(t, -1); + if(t->cursor_item == 6) /* -2 in case of fx col */ + tracker_step_cursor_item(t, -1); + } + } + xm->modified = 1; } @@ -744,7 +753,7 @@ } note->fxtype = n; tracker_redraw_current_row(t); - if(gui_settings.advance_cursor_in_fx_columns) + if(!gui_settings.advance_cursor_in_fx_columns) tracker_step_cursor_row(t, 1); else tracker_step_cursor_item(t, 1); diff -urN soundtracker-0.3.10/app/track-editor.h soundtracker-0.5.0/app/track-editor.h --- soundtracker-0.3.10/app/track-editor.h Tue Jan 18 18:29:01 2000 +++ soundtracker-0.5.0/app/track-editor.h Sat Feb 19 11:58:33 2000 @@ -2,7 +2,7 @@ /* * The Real SoundTracker - track editor (header) * - * Copyright (C) 1998-1999 Michael Krause + * 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 diff -urN soundtracker-0.3.10/app/tracker.c soundtracker-0.5.0/app/tracker.c --- soundtracker-0.3.10/app/tracker.c Wed Dec 22 12:16:48 1999 +++ soundtracker-0.5.0/app/tracker.c Sat Feb 19 11:58:34 2000 @@ -2,7 +2,7 @@ /* * The Real SoundTracker - GTK+ Tracker widget * - * Copyright (C) 1998-1999 Michael Krause + * 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 diff -urN soundtracker-0.3.10/app/tracker.h soundtracker-0.5.0/app/tracker.h --- soundtracker-0.3.10/app/tracker.h Sat Sep 25 12:35:05 1999 +++ soundtracker-0.5.0/app/tracker.h Sat Feb 19 11:58:34 2000 @@ -2,7 +2,7 @@ /* * The Real SoundTracker - GTK+ Tracker widget (header) * - * Copyright (C) 1998-1999 Michael Krause + * 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 diff -urN soundtracker-0.3.10/app/transposition.c soundtracker-0.5.0/app/transposition.c --- soundtracker-0.3.10/app/transposition.c Sat Oct 30 12:27:02 1999 +++ soundtracker-0.5.0/app/transposition.c Sun Feb 20 11:20:16 2000 @@ -2,7 +2,7 @@ /* * The Real SoundTracker - Transposition dialog * - * Copyright (C) 1999 Michael Krause + * Copyright (C) 1999-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 @@ -161,7 +161,7 @@ transposition_dialog (void) { int i; - GtkWidget *mainbox, *thing, *box1, *box2, *frame; + GtkWidget *mainbox, *thing, *box1, *box2, *frame, *hbox; const char *labels1[] = { _("Whole Song"), _("All Patterns"), @@ -200,6 +200,7 @@ GTK_SIGNAL_FUNC (transposition_close_requested), NULL); gtk_window_set_transient_for(GTK_WINDOW(transposition_window), GTK_WINDOW(mainwindow)); + gtk_window_set_policy(GTK_WINDOW(transposition_window), FALSE, FALSE, FALSE); mainbox = gtk_vbox_new(FALSE, 2); gtk_container_border_width(GTK_CONTAINER(mainbox), 4); @@ -297,6 +298,24 @@ gtk_signal_connect(GTK_OBJECT(thing), "clicked", GTK_SIGNAL_FUNC(transposition_change_instruments), (gpointer)i); } + + /* The button area */ + hbox = gtk_hbutton_box_new (); + gtk_button_box_set_spacing (GTK_BUTTON_BOX (hbox), 4); + gtk_button_box_set_layout (GTK_BUTTON_BOX (hbox), GTK_BUTTONBOX_END); + gtk_box_pack_start (GTK_BOX (mainbox), hbox, + FALSE, FALSE, 0); + gtk_widget_show (hbox); + +#ifdef USE_GNOME + thing = gnome_stock_button (GNOME_STOCK_BUTTON_CLOSE); +#else + thing = gtk_button_new_with_label (_ ("Close")); +#endif + gtk_signal_connect (GTK_OBJECT (thing), "clicked", + GTK_SIGNAL_FUNC (transposition_close_requested), NULL); + gtk_box_pack_start (GTK_BOX (hbox), thing, FALSE, FALSE, 0); + gtk_widget_show (thing); gtk_widget_show(transposition_window); } diff -urN soundtracker-0.3.10/app/transposition.h soundtracker-0.5.0/app/transposition.h --- soundtracker-0.3.10/app/transposition.h Sun Aug 22 12:31:39 1999 +++ soundtracker-0.5.0/app/transposition.h Sat Feb 19 11:58:34 2000 @@ -2,7 +2,7 @@ /* * The Real SoundTracker - Transposition dialog (header) * - * Copyright (C) 1999 Michael Krause + * Copyright (C) 1999-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 diff -urN soundtracker-0.3.10/app/xm-player.c soundtracker-0.5.0/app/xm-player.c --- soundtracker-0.3.10/app/xm-player.c Sun Nov 14 15:10:56 1999 +++ soundtracker-0.5.0/app/xm-player.c Sun Mar 12 20:37:45 2000 @@ -4,7 +4,7 @@ * * Copyright (C) 1994-1998 Niklas Beisert * Copyright (C) 1998 Tammo Hinrichs - * Copyright (C) 1998-1999 Michael Krause + * Copyright (C) 1998-2000 Michael Krause * * Based on the source code of "OpenCP", the DOS module player, * written by Niklas Beisert and now maintained by Tammo Hinrichs @@ -133,12 +133,13 @@ xmpCmdPanning=8,xmpCmdOffset=9,xmpCmdVolSlide=10,xmpCmdJump=11, xmpCmdVolume=12,xmpCmdBreak=13,xmpCmdSpeed=15,xmpCmdGVolume=16, xmpCmdGVolSlide=17,xmpCmdKeyOff=20,xmpCmdEnvPos=21,xmpCmdPanSlide=25, - xmpCmdMRetrigger=27,xmpCmdTremor=29,xmpCmdXPorta=33,xmpCmpSFilter=36, + xmpCmdSetFReso=26, xmpCmdMRetrigger=27,xmpCmdTremor=29,xmpCmdXPorta=33, + xmpCmdSetFCutoff=35, xmpCmdSFilter=36, xmpCmdFPortaU=37,xmpCmdFPortaD=38,xmpCmdGlissando=39,xmpCmdVibType=40, xmpCmdSFinetune=41,xmpCmdPatLoop=42,xmpCmdTremType=43,xmpCmdSPanning=44, xmpCmdRetrigger=45,xmpCmdFVolSlideU=46, xmpCmdFVolSlideD=47, - xmpCmdNoteCut=48,xmpCmdDelayNote=49,xmpCmdPatDelay=50, xmpCmdSync1=28, - xmpCmdSync2=32, xmpCmdSync3=51, + xmpCmdNoteCut=48,xmpCmdDelayNote=49,xmpCmdPatDelay=50, + xmpCmdSetFHFCutoff=31, xmpCmdSetFHFReso=32, xmpVCmdVol0x=1,xmpVCmdVol1x=2,xmpVCmdVol2x=3,xmpVCmdVol3x=4,xmpVCmdVol40=5, xmpVCmdVolSlideD=6,xmpVCmdVolSlideU=7,xmpVCmdFVolSlideD=8, xmpVCmdFVolSlideU=9,xmpVCmdVibRate=10,xmpVCmdVibDep=11,xmpVCmdPanning=12, @@ -155,6 +156,8 @@ gint32 chPitch; /* Pitch really means 'period' in nonlinear and module frequencies */ gint32 chFinalPitch; int curnote; + long chCutoff; + long chReso; guint8 chCurIns; guint8 chLastIns; @@ -225,7 +228,7 @@ static guint8 curtempo; static guint8 tick0; -static int currow; +static int currow, play_only_row; static XMPattern *curpattern; static int patlen; static int curord; @@ -558,7 +561,6 @@ if (procnot==97) { procnot=0; - procins=0; keyoff=1; } @@ -747,6 +749,13 @@ } else { driver_setpanning(chnr, (double)pan / 128); } + + if(ch->chCutoff == 0xff && ch->chReso == 0) { + driver_set_ch_filter_freq(chnr, -1.0); + } else { + driver_set_ch_filter_freq(chnr, 0.5 * pow(2,(float)(ch->chCutoff-255)/32.0)); + driver_set_ch_filter_reso(chnr, (float)ch->chReso / 255); + } } static gint32 @@ -803,7 +812,7 @@ player_will_loop = FALSE; } - if (!curtick&&patdelay) { + if(!curtick && patdelay) { if (jumptoord!=-1) { if (jumptoord!=curord) for (i=0; ichLastIns=ch->chCurIns; ch->chCurIns=procins; @@ -965,6 +978,19 @@ case xmpCmdPanning: ch->chFinalPan=ch->chPan=procdat; break; + case xmpCmdSetFCutoff: + ch->chCutoff=procdat; + break; + case xmpCmdSetFReso: + ch->chReso=procdat; + break; + case xmpCmdSetFHFCutoff: +// mcpSet(0,mcpMasterFHFCutoff,procdat); + break; + case xmpCmdSetFHFReso: +// mcpSet(0,mcpMasterFHFReso,procdat); + break; + case xmpCmdJump: if (!patdelay) { jumptoord=procdat; @@ -1038,8 +1064,6 @@ ch->chMRetrigAct=procdat>>4; } break; - case xmpCmdSync1: case xmpCmdSync2: case xmpCmdSync3: - break; case xmpCmdTremor: if (procdat) { ch->chTremorLen=(procdat&0xF)+(procdat>>4)+2; @@ -1314,10 +1338,8 @@ case xmpCmdMRetrigger: if (ch->chMRetrigPos++!=ch->chMRetrigLen) break; - ch->chMRetrigPos=1; + ch->chMRetrigPos=0; ch->nextpos=0; - ch->chVolEnvPos=0; - ch->chPanEnvPos=0; switch (ch->chMRetrigAct) { case 0: case 8: break; @@ -1348,8 +1370,6 @@ break; if (!(curtick%ch->chActionTick)) { ch->nextpos=0; - ch->chVolEnvPos=0; - ch->chPanEnvPos=0; } break; case xmpCmdNoteCut: @@ -1403,6 +1423,8 @@ static gboolean xmplayer_init_playing () { + int i; + memset(channels, 0, sizeof(channels)); driver_setnumch(xm->num_channels); @@ -1421,6 +1443,11 @@ curtick = curtempo-1; patdelay = 0; + for(i = 0; i < nchan; i++) { + channels[i].chCutoff = 0xff; + channels[i].chReso = 0; + } + return TRUE; } @@ -1430,6 +1457,7 @@ { jumptorow = patpos; currow = patpos; + play_only_row = -1; jumptoord = songpos; curord = songpos; player_will_loop = FALSE; @@ -1444,10 +1472,12 @@ gboolean xmplayer_init_play_pattern (int pattern, - int patpos) + int patpos, + int only1row) { jumptorow = patpos; currow = patpos; + play_only_row = only1row ? patpos : -1; jumptoord = 0; curord = 0; patlen = xm->patterns[pattern].length; @@ -1485,6 +1515,9 @@ PlayNote(channel); + channels[channel].chCutoff = 0xff; + channels[channel].chReso = 0; + channels[channel].nextpos = -1; channels[channel].nextstop = 0; xmplayer_final_channel_ops(channel); @@ -1550,6 +1583,8 @@ ch->chAVibSwpPos=0; ch->chVolEnvPos=0; ch->chPanEnvPos=0; + ch->chCutoff = 0xff; + ch->chReso = 0; ch->nextsamp = sample; ch->hacksample = 1; @@ -1573,6 +1608,7 @@ player_patpos = currow; xmpPlayTick(); + current_time += (double)125 / (curbpm * 50); return current_time; } diff -urN soundtracker-0.3.10/app/xm-player.h soundtracker-0.5.0/app/xm-player.h --- soundtracker-0.3.10/app/xm-player.h Sat Oct 30 19:35:26 1999 +++ soundtracker-0.5.0/app/xm-player.h Fri Mar 3 18:44:40 2000 @@ -2,7 +2,7 @@ /* * The Real SoundTracker - XM player (header) * - * Copyright (C) 1998 Michael Krause + * 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 @@ -31,7 +31,7 @@ void xmplayer_init_module (void); gboolean xmplayer_init_play_song (int songpos, int patpos); -gboolean xmplayer_init_play_pattern (int pattern, int patpos); +gboolean xmplayer_init_play_pattern (int pattern, int patpos, int only1row); gboolean xmplayer_play_note (int channel, int note, int instrument); gboolean xmplayer_play_note_full (int channel, int note, STSample *sample, int offset); void xmplayer_play_note_keyoff (int channel); diff -urN soundtracker-0.3.10/app/xm.c soundtracker-0.5.0/app/xm.c --- soundtracker-0.3.10/app/xm.c Wed Jan 19 19:28:35 2000 +++ soundtracker-0.5.0/app/xm.c Mon Mar 13 13:47:01 2000 @@ -2,7 +2,7 @@ /* * The Real SoundTracker - XM support routines * - * Copyright (C) 1998-1999 Michael Krause + * Copyright (C) 1998-2000 Michael Krause * * The XM loader is based on the "maube" 0.10.4 source code, Copyright * (C) 1997 by Conrad Parker (not much is left over, though :D) @@ -25,10 +25,17 @@ #include #include #include +#include +#include +#include +#include +#include #include + #include "i18n.h" +#include "gui-settings.h" #include "xm.h" #include "endian-conv.h" #include "st-subs.h" @@ -36,6 +43,8 @@ #include "errors.h" #include "audio.h" +#define LFSTAT_IS_MODULE 1 + static guint16 npertab[60]={ /* -> Tuning 0 */ 1712,1616,1524,1440,1356,1280,1208,1140,1076,1016, 960, 906, @@ -163,7 +172,7 @@ return 0; } - if(!st_init_pattern_channels(pat, len, num_channels)) + if(!st_init_pattern_channels(pat, len, (num_channels + 1) & 0xfe)) return 0; if(get_le_16(ph + 7) == 0) @@ -193,7 +202,7 @@ if(i < num_patterns) e = loadfunc(&ptr[i], num_channels, f); else - e = st_init_pattern_channels(&ptr[i], 64, num_channels); + e = st_init_pattern_channels(&ptr[i], 64, (num_channels + 1) & 0xfe); if(!e) return 0; @@ -270,11 +279,12 @@ s->sample.data = NULL; continue; } - s->sample.type = s->sample.looptype & 0x10 ? 16 : 8; + s->treat_as_8bit = !(s->sample.looptype & 0x10); s->sample.looptype &= 3; - if(s->sample.type == 16) { + if(!s->treat_as_8bit) { /* 16 bit sample */ + s->treat_as_8bit = FALSE; s->sample.length >>= 1; s->sample.loopstart >>= 1; s->sample.loopend >>= 1; @@ -288,13 +298,16 @@ *d16++ = p; } } else { - /* 8 bit sample */ - d8 = s->sample.data = malloc(s->sample.length); + s->treat_as_8bit = TRUE; + + d16 = s->sample.data = malloc(2 * s->sample.length); + d8 = (gint8*)d16; + d8 += s->sample.length; fread(d8, 1, s->sample.length, f); for(j = s->sample.length, p = 0; j; j--) { - p += *d8; - *d8++ = p; + p += *d8++; + *d16++ = p << 8; } } @@ -324,12 +337,12 @@ /* save sample header */ s = &samples[i]; memset(sh, 0, sizeof(sh)); - put_le_32(sh + 0, s->sample.length * (s->sample.type / 8)); - put_le_32(sh + 4, s->sample.loopstart * (s->sample.type / 8)); - put_le_32(sh + 8, (s->sample.loopend - s->sample.loopstart) * (s->sample.type / 8)); + put_le_32(sh + 0, s->sample.length * (s->treat_as_8bit ? 1 : 2)); + put_le_32(sh + 4, s->sample.loopstart * (s->treat_as_8bit ? 1 : 2)); + put_le_32(sh + 8, (s->sample.loopend - s->sample.loopstart) * (s->treat_as_8bit ? 1 : 2)); sh[12] = s->volume; sh[13] = s->finetune; - sh[14] = s->sample.looptype | (s->sample.type == 16 ? 0x10 : 0); + sh[14] = s->sample.looptype | (s->treat_as_8bit ? 0x00 : 0x10); sh[15] = s->panning; sh[16] = s->relnote; sh[17] = 0; @@ -341,7 +354,7 @@ for(i = 0; i < num_samples; i++) { s = &samples[i]; - if(s->sample.type == 16) { + if(!s->treat_as_8bit) { gint16 *packbuf, *d16, *ss; gint16 p, d; @@ -358,17 +371,18 @@ fwrite(packbuf, 1, s->sample.length * 2, f); free(packbuf); } else { - gint8 *packbuf, *d8, *ss; + gint16 *d16; + gint8 *packbuf, *ss; gint8 p, d; packbuf = malloc(s->sample.length); - d8 = s->sample.data; + d16 = s->sample.data; ss = packbuf; for(k = s->sample.length, p = 0, d = 0; k; k--) { - d = *d8 - p; + d = (*d16 >> 8) - p; *ss++ = d; - p = *d8++; + p = (*d16++ >> 8); } fwrite(packbuf, 1, s->sample.length, f); @@ -701,7 +715,7 @@ } static XM * -xm_load_mod (FILE *f) +xm_load_mod (FILE *f,int *status) { XM *xm; guint8 sh[31][8]; @@ -729,7 +743,8 @@ fread(xm->pattern_order_table, 1, 128, f); fread(mh, 1, 4, f); - + + *status = LFSTAT_IS_MODULE; if ((!memcmp("M.K.", mh, 4)) || (!memcmp("M&K!", mh, 4)) || (!memcmp("M!K!", mh, 4))) @@ -754,7 +769,8 @@ } else { - error_error(_("No FastTracker XM and no supported MOD format!")); + *status &= ~LFSTAT_IS_MODULE; /* see notes in File_Load() about + this status*/ goto ende; } @@ -782,7 +798,7 @@ s->volume = sh[i][3]; s->sample.loopstart = get_be_16(sh[i] + 4) << 1; s->sample.loopend = s->sample.loopstart + (get_be_16(sh[i] + 6) << 1); - s->sample.type = 8; + s->treat_as_8bit = TRUE; s->panning = 128; if(get_be_16(sh[i] + 6) > 1) @@ -801,9 +817,14 @@ s->sample.loopend = 1; s->sample.looptype = 0; } - - s->sample.data = malloc(s->sample.length); - fread(s->sample.data, 1, s->sample.length, f); + + s->sample.data = malloc(2 * s->sample.length); + fread(s->sample.data + s->sample.length, 1, s->sample.length, f); + st_convert_sample(s->sample.data + s->sample.length, + s->sample.data, + 8, + 16, + s->sample.length); } } @@ -817,16 +838,17 @@ } XM * -XM_Load (const char *filename) +XM_Load (const char *filename,int *status) { XM *xm; FILE *f; guint8 xh[80]; int i, j, num_patterns, num_instruments; + *status = 0; f = fopen(filename, "r"); if(!f) { - error_error(_("Can't open file")); + error_error(_("Can't open file")); return NULL; } @@ -836,7 +858,7 @@ || strncmp(xh + 0, "Extended Module: ", 17) != 0 || xh[37] != 0x1a) { fseek(f, 0, SEEK_SET); - return xm_load_mod(f); + return xm_load_mod(f,status); } if(get_le_32(xh + 60) != 276) { @@ -848,6 +870,9 @@ goto fileerr; } + *status |= LFSTAT_IS_MODULE; /* see notes in File_Load() about + this status*/ + xm = calloc(1, sizeof(XM)); if(!xm) goto fileerr; @@ -898,6 +923,11 @@ } weiter: + if(xm->num_channels & 1) { + /* Yes, mods like this *do* exist. */ + xm->num_channels++; + } + return xm; ende: @@ -998,4 +1028,210 @@ free(xm); } +} + +/************************************************************************** +* Mezzinane compression Handler/Loader +* coded by Jason Nunn +* 7/3/2000 +* +* these routines handle modules that are compressed in the known formats- +* zip, gz, lha, bz2. +* +* for simple ones like gz and bz2, it just creates a temp file, and tells +* XM_Load() to load it before deleting the tmp file. +* +* For more complex formats like zip and lha, where they can store multiple +* files, it's an all-out affair- the compressed file is extracted, and +* each file is loaded by XM_Load(). The first file it comes across that +* can be successfully loaded is the one that's accepted as the mod file. +* After it has loaded a mod, it will remove the directory. +* +**************************************************************************/ +char *err_msg = "Bzzzz, error extracting song, aborting operation."; + +/* + * this is for zip style archives, where compression format stores + * multiple files + */ +XM * +File_Extract_Zip (char *extract_cmd,char *tmp_dir_path,int *status) +{ + XM *ret = NULL; + register int r; + DIR *dp; + char str[256]; + + /* + * extract archive, and store it in tmp directory + */ + r = system (extract_cmd); + if ((r == -1) || (r == 127)) { + sprintf (str,"%s (Err 0)",err_msg); + error_error (str); + return ret; + } + + /* + * open directory + */ + dp = opendir (tmp_dir_path); + if (dp == NULL) { + sprintf (str,"%s (Err 1)",err_msg); + error_error (str); + return ret; + } + + /* + * read each file name. for each file, try to load it. + * the first one that successfully loads- accept it. + */ + for (;;) { + struct dirent *ds; + struct stat sp; + + ds = readdir (dp); + if (ds == NULL) + break; + + /* + * if not a normal file, then ignore. if get a stat() error, + * then don't make a fuss. it's no big deal. + */ + sprintf (str,"%s/%s",tmp_dir_path,ds->d_name); + if (stat (str,&sp) == 0) + if (S_ISREG (sp.st_mode)) { + ret = XM_Load (str,status); + if (ret != NULL) + break; + + } + } + + closedir(dp); + + /* + * delete tmp directory + */ + sprintf (str,"%s -r %s",gui_settings.rm_path,tmp_dir_path); + r = system (str); + if ((r == -1) || (r == 127)) { + sprintf (str,"%s (Err 2)",err_msg); + error_error (str); + } + + return ret; +} + +/* + * this is for zcat and bunzip2 style archives, where compression format + * stores only one file + */ +XM * +File_Extract_GZip (char *extract_cmd,char *tmp_path,int *status) +{ + XM *ret = NULL; + register int r; + char str[256]; + + /* + * extract archive- run cmd + */ + r = system (extract_cmd); + if ((r == -1) || (r == 127)) { + sprintf (str,"%s (Err 3)",err_msg); + error_error (str); + return ret; + } + + ret = XM_Load (tmp_path,status); + unlink (tmp_path); /*delete tmp file*/ + + return ret; +} + +/* + * this tests a file extension. if it matches, return 1, if not return 0 + */ +int +f_extension_cmp (const char *filename,char *exten) +{ + register int a,b,fs,ks; + + fs = strlen (filename); + ks = strlen (exten); + if (fs < ks) + return 0; + + for (a = fs - ks,b = 0;a < fs;a++) { + if (exten[b++] == tolower (filename[a])) + continue; + + return 0; + } + + return 1; +} + +XM * +File_Load (const char *filename) +{ + char str[256],tmp_path[256]; + int status = 0; + XM *ret = NULL; + + tmpnam(tmp_path); + + /* + * test and load zip files. for unzip version 5.31 + */ + if (f_extension_cmp (filename,".zip")) { + sprintf (str,"%s %s -d %s >> /dev/null", + gui_settings.unzip_path,filename,tmp_path); + ret = File_Extract_Zip (str,tmp_path,&status); + } + + /* + * test and load lha files. for UNIX V1.00 + */ + else if (f_extension_cmp (filename,".lzh") || + f_extension_cmp (filename,".lha")) { + sprintf (str,"%s ew=%s %s >> /dev/null", + gui_settings.lha_path,tmp_path,filename); + ret = File_Extract_Zip (str,tmp_path,&status); + } + + /* + * for zcat 1.2.4 + */ + else if (f_extension_cmp (filename,".gz")) { + sprintf (str,"%s %s >> %s",gui_settings.gz_path,filename,tmp_path); + ret = File_Extract_GZip (str,tmp_path,&status); + } + + /* + * for bunzip2 Version 0.9.0b + */ + else if (f_extension_cmp (filename,".bz2")) { + sprintf (str,"%s -c %s >> %s",gui_settings.bz2_path,filename,tmp_path); + ret = File_Extract_GZip (str,tmp_path,&status); + } + + /* + * if not compressed, load as normal + */ + else + ret = XM_Load (filename,&status); + + /* + * mike: we have this here instead of in xm_load_mod(), because it + * can get called multiple times when a compressed file has many + * files of unknown types. So, we have to have it here to prevent + * lots of dialog boxes popping up with this message, even when a + * mod file is eventually found in a compressed archive. -- jsno + */ + if (!(status & LFSTAT_IS_MODULE)) + error_error (_("No FastTracker XM and no supported MOD format!")); + + return ret; } diff -urN soundtracker-0.3.10/app/xm.h soundtracker-0.5.0/app/xm.h --- soundtracker-0.3.10/app/xm.h Sat Nov 20 15:54:19 1999 +++ soundtracker-0.5.0/app/xm.h Mon Mar 13 13:47:01 2000 @@ -2,7 +2,7 @@ /* * The Real SoundTracker - XM support routines * - * Copyright (C) 1998-1999 Michael Krause + * Copyright (C) 1998-2000 Michael Krause * * This file is based on the "maube" 0.10.4 source code, Copyright (C) * 1997 by Conrad Parker. @@ -57,6 +57,8 @@ gint8 finetune; /* finetune (-128 ... 127) */ guint8 panning; /* panning (0 ... 255) */ gint8 relnote; + + gboolean treat_as_8bit; } STSample; /* -- Instrument definitions -- */ @@ -122,7 +124,8 @@ #define XM_FLAGS_AMIGA_FREQ 1 #define XM_FLAGS_IS_MOD 2 -XM* XM_Load (const char *filename); +XM* File_Load (const char *filename); +XM* XM_Load (const char *filename,int *status); int XM_Save (XM *xm, const char *filename); XM* XM_New (void); void XM_Free (XM*); diff -urN soundtracker-0.3.10/configure soundtracker-0.5.0/configure --- soundtracker-0.3.10/configure Wed Jan 26 18:32:32 2000 +++ soundtracker-0.5.0/configure Mon Mar 13 14:04:27 2000 @@ -722,7 +722,7 @@ PACKAGE=soundtracker -VERSION=0.3.10 +VERSION=0.5.0 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.3.10/configure.in soundtracker-0.5.0/configure.in --- soundtracker-0.3.10/configure.in Wed Jan 26 18:28:17 2000 +++ soundtracker-0.5.0/configure.in Mon Mar 13 13:57:34 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.3.10) +AM_INIT_AUTOMAKE(soundtracker, 0.5.0) AM_CONFIG_HEADER(config.h) dnl ----------------------------------------------------------------------- diff -urN soundtracker-0.3.10/doc/hacking.html soundtracker-0.5.0/doc/hacking.html --- soundtracker-0.3.10/doc/hacking.html Tue Jan 18 18:23:20 2000 +++ soundtracker-0.5.0/doc/hacking.html Mon Mar 13 14:05:04 2000 @@ -1,6 +1,6 @@ - + SoundTracker internals @@ -19,8 +19,7 @@
  • Output drivers
  • Input drivers -
  • Mixer API -
  • Contributing Code +
  • Contributing Code


    @@ -48,7 +47,7 @@ the same time, with one editing window. Some of the GUI code has already been modularized, since some of the editing facilities have been encapsulated in custom GTK+ widgets, for example sample-display.c, -clavier.c, envelope-box.c and tracker.c. Noteworthy exceptions and +clavier.c, envelope-box.c, playlist.c and tracker.c. Noteworthy exceptions and containers of generous amounts of global variables are gui.c, sample-editor.c, instrument-editor.c and xm-player.c. @@ -223,10 +222,6 @@

    Input drivers

    - - -

    Mixer API

    -

    I'm not sure that this API will stay in its current form. Most probably I'll just remove the public interface and integrate a mixer into the @@ -235,7 +230,7 @@ -

    Contributing Code

    +

    Contributing Code

    Please follow these rules if you want to donate code to the @@ -301,7 +296,7 @@


    -This document was generated on 18 January 2000 using +This document was generated on 13 March 2000 using texi2html 1.56k. diff -urN soundtracker-0.3.10/doc/hacking.texi soundtracker-0.5.0/doc/hacking.texi --- soundtracker-0.3.10/doc/hacking.texi Tue Jan 18 18:24:25 2000 +++ soundtracker-0.5.0/doc/hacking.texi Mon Mar 13 14:06:24 2000 @@ -14,8 +14,8 @@ * Contributing Code:: @end menu +@node General Architecture, Synchronization of Audio and GUI, , Top @chapter General Architecture -@node General Architecture, , Top, Top SoundTracker (short: ST) consists of two threads: the GUI (or main) thread, and the audio (or mixer / player) thread. The reason for not @@ -42,8 +42,8 @@ the global "tracker" and "xm" variables can be found virtually everywhere in the source code. +@node Synchronization of Audio and GUI, How the audio subsystem works, General Architecture, Top @chapter Synchronization of Audio and GUI -@node Synchronization of Audio and GUI, , Top, Top Since mixing buffer sizes can't be turned down as low as under primitive operating systems such as DOS, special care must been taken to take the @@ -63,8 +63,8 @@ be used here because scope data is continuous and is accessed from the GUI thread in more than one location. +@node How the audio subsystem works, Driver API, Synchronization of Audio and GUI, Top @chapter How the audio subsystem works -@node How the audio subsystem works, , Top, Top Module playing is initialized by the GUI thread sending a message AUDIO_CTLPIPE_PLAY_SONG, for example. The audio thread then opens the @@ -97,8 +97,8 @@ modularized mixer system could be installed lateron. You can find more about the Mixer API later in this document. +@node Driver API, Mixer API, How the audio subsystem works, Top @chapter Driver API -@node Driver API, , Top, Top The driver API is separated into two branches: output and input (sampling) drivers. Input drivers are usually simpler, because they @@ -160,20 +160,20 @@ @section Input drivers +@node Mixer API, Contributing Code, Driver API, Top @chapter Mixer API -@node Mixer API, , Top, Top -I'm not sure that this API will stay in its current form. Most probably -I'll just remove the public interface and integrate a mixer into the -program's core. +To be written. Two mixers are already available; shouldn't be hard to +understand how it works. Basically it's really independent of the rest +of the tracker. +@node Contributing Code, , Mixer API, Top @chapter Contributing Code -@node Contributing Code, , Top, Top Please follow these rules if you want to donate code to the SoundTracker project: -@itemize +@itemize @bullet @item Coding Style. I prefer 4-space tabulators, and an indentation style like this: diff -urN soundtracker-0.3.10/doc/hacking.txt soundtracker-0.5.0/doc/hacking.txt --- soundtracker-0.3.10/doc/hacking.txt Tue Jan 18 18:23:20 2000 +++ soundtracker-0.5.0/doc/hacking.txt Mon Mar 13 14:06:25 2000 @@ -19,9 +19,9 @@ at the same time, with one editing window. Some of the GUI code has already been modularized, since some of the editing facilities have been encapsulated in custom GTK+ widgets, for example sample-display.c, -clavier.c, envelope-box.c and tracker.c. Noteworthy exceptions and -containers of generous amounts of global variables are gui.c, -sample-editor.c, instrument-editor.c and xm-player.c. +clavier.c, envelope-box.c, playlist.c and tracker.c. Noteworthy +exceptions and containers of generous amounts of global variables are +gui.c, sample-editor.c, instrument-editor.c and xm-player.c. For ST to be made fully multi-module capable ("object-oriented"), large parts of the GUI will have to be changed. Unfortunately, @@ -153,9 +153,9 @@ Mixer API ********* - I'm not sure that this API will stay in its current form. Most -probably I'll just remove the public interface and integrate a mixer -into the program's core. + To be written. Two mixers are already available; shouldn't be hard to +understand how it works. Basically it's really independent of the rest +of the tracker. Contributing Code ***************** diff -urN soundtracker-0.3.10/po/POTFILES.in soundtracker-0.5.0/po/POTFILES.in --- soundtracker-0.3.10/po/POTFILES.in Sat Jan 15 16:48:34 2000 +++ soundtracker-0.5.0/po/POTFILES.in Sat Feb 19 16:27:06 2000 @@ -7,7 +7,6 @@ app/drivers/file-output.c app/drivers/oss-input.c app/drivers/oss-output.c -app/effectsconfig.c app/envelope-box.c app/errors.c app/extspinbutton.c diff -urN soundtracker-0.3.10/po/cat-id-tbl.c soundtracker-0.5.0/po/cat-id-tbl.c --- soundtracker-0.3.10/po/cat-id-tbl.c Fri Jan 21 17:22:59 2000 +++ soundtracker-0.5.0/po/cat-id-tbl.c Mon Mar 13 13:51:33 2000 @@ -12,380 +12,380 @@ {"Editing Output", 3}, {"Sampling", 4}, {"Driver Module", 5}, - {"Audio Configuration", 6}, - {"(%d bytes)", 7}, - {"Estimated audio delay: %f microseconds", 8}, - {"These changes won't take effect until you restart playing.", 9}, - {"Resolution:", 10}, - {"Channels:", 11}, - {"Frequency [Hz]:", 12}, - {"Buffer Size:", 13}, - {"ALSA card number:", 14}, - {"ALSA device number:", 15}, + {"Mixer Module", 6}, + {"Description", 7}, + {"Audio Configuration", 8}, + {"Drivers", 9}, + {"Mixers", 10}, + {"Close", 11}, + {"(%d bytes)", 12}, + {"Estimated audio delay: %f microseconds", 13}, + {"These changes won't take effect until you restart playing.", 14}, + {"Resolution:", 15}, + {"Channels:", 16}, + {"Frequency [Hz]:", 17}, + {"Buffer Size:", 18}, + {"ALSA card number:", 19}, + {"ALSA device number:", 20}, {"\ Couldn't open ALSA device for sound input (card:%d, device:%d):\n\ -%s", 16}, - {"Required sound output format not supported.\n", 17}, - {"Required sound output parameters not supported.\n", 18}, +%s", 21}, + {"Required sound output format not supported.\n", 22}, + {"Required sound output parameters not supported.\n", 23}, {"\ Couldn't open ALSA device for sound output (card:%d, device:%d):\n\ -%s", 19}, +%s", 24}, {"\ Note that the ESD output is unusable in\n\ interactive mode because of the latency added\n\ by ESD. Use the OSS or ALSA output plug-ins\n\ -for serious work.", 20}, +for serious work.", 25}, {"\ Couldn't connect to ESD for sound output:\n\ -%s", 21}, - {"no settings (yet), sorry!", 22}, - {"Can't open file for writing.", 23}, +%s", 26}, + {"no settings (yet), sorry!", 27}, + {"Can't open file for writing.", 28}, {"\ Couldn't open /dev/dsp for sampling:\n\ -%s", 24}, - {"(%d samples)", 25}, +%s", 29}, + {"(%d samples)", 30}, {"\ Couldn't open /dev/dsp for sound output:\n\ -%s", 26}, - {"Master Reverb", 27}, - {"Playback Effects Configuration", 28}, - {"Length", 29}, - {"Current", 30}, - {"Offset", 31}, - {"Value", 32}, - {"Insert", 33}, - {"Delete", 34}, +%s", 31}, + {"Length", 32}, + {"Current", 33}, + {"Offset", 34}, + {"Value", 35}, + {"Insert", 36}, + {"Delete", 37}, {"\ Graphical\n\ Envelope\n\ Editor\n\ only in\n\ -GNOME Version", 35}, - {"Sustain", 36}, - {"Point", 37}, - {"Loop", 38}, - {"Start", 39}, - {"End", 40}, - {"Load Module", 41}, - {"Save Module", 42}, - {"Render WAV", 43}, - {"Load Sample", 44}, - {"Save Sample", 45}, - {"Load Instrument", 46}, - {"Save Instrument", 47}, - {"File", 48}, - {"Operation not supported.", 49}, - {"Scopes Frequency", 50}, - {"Tracker Frequency", 51}, - {"GUI Configuration", 52}, - {"Use Hexadecimal Numbers", 53}, - {"Use upper case letters for hex numbers", 54}, - {"Advance Cursor in FX Columns", 55}, - {"Use anti-aliased envelope editor", 56}, - {"You need to restart SoundTracker for this change to come into effect.", 57}, - {"Scopes buffer size [MB]", 58}, - {"Highlight rows:", 59}, - {"`Save XM' saves all non-empty patterns", 60}, - {"Question", 61}, - {"Cancel", 62}, - {"Warning", 63}, - {"Error!", 64}, - {"Tempo", 65}, +GNOME Version", 38}, + {"Sustain", 39}, + {"Point", 40}, + {"Loop", 41}, + {"Start", 42}, + {"End", 43}, + {"Load Module", 44}, + {"Save Module", 45}, + {"Render WAV", 46}, + {"Load Sample", 47}, + {"Save Sample", 48}, + {"Load Instrument", 49}, + {"Save Instrument", 50}, + {"File", 51}, + {"Operation not supported.", 52}, + {"Scopes Frequency", 53}, + {"Tracker Frequency", 54}, + {"GUI Configuration", 55}, + {"Use Hexadecimal Numbers", 56}, + {"Use upper case letters for hex numbers", 57}, + {"Advance cursor horizontally in effect columns", 58}, + {"Asynchronous Editing", 59}, + {"Use anti-aliased envelope editor", 60}, + {"You need to restart SoundTracker for this change to come into effect.", 61}, + {"Scopes buffer size [MB]", 62}, + {"Highlight rows:", 63}, + {"`Save XM' saves all non-empty patterns", 64}, + {"Question", 65}, + {"Cancel", 66}, + {"Warning", 67}, + {"Error!", 68}, + {"Tempo", 69}, {"\ Are you sure you want to free the current project?\n\ -All changes will be lost!", 66}, - {"Are you sure you want to overwrite the file?", 67}, - {"Load XM...", 68}, - {"Save XM...", 69}, - {"Render module as WAV...", 70}, - {"Play Song", 71}, - {"Play Pattern", 72}, - {"Stop", 73}, - {"Number of Channels:", 74}, - {"Pattern", 75}, - {"PatLength", 76}, - {"Octave", 77}, - {"Jump", 78}, - {"Instr", 79}, - {"Sample", 80}, - {"VolFade", 81}, - {"VibSpeed", 82}, - {"VibDepth", 83}, - {"VibSweep", 84}, - {"Can't open file.", 85}, - {"Sine", 86}, - {"Square", 87}, - {"Saw Down", 88}, - {"Saw Up", 89}, - {"Instrument Editor", 90}, - {"Volume envelope", 91}, - {"Panning envelope", 92}, - {"Load Instrument...", 93}, - {"Save Instrument...", 94}, - {"Load XI", 95}, - {"Save XI", 96}, - {"Vibrato Type:", 97}, - {"Note:", 98}, - {"Initialize", 99}, - {"The key that inserts the special keyoff note for FastTracker modules.", 100}, - {"Upper Octave Keys...", 101}, +All changes will be lost!", 70}, + {"Are you sure you want to overwrite the file?", 71}, + {"Load XM...", 72}, + {"Save XM...", 73}, + {"Render module as WAV...", 74}, + {"Play Song", 75}, + {"Play Pattern", 76}, + {"Stop", 77}, + {"Number of Channels:", 78}, + {"Pattern", 79}, + {"PatLength", 80}, + {"Octave", 81}, + {"Jump", 82}, + {"Instr", 83}, + {"Sample", 84}, + {"VolFade", 85}, + {"VibSpeed", 86}, + {"VibDepth", 87}, + {"VibSweep", 88}, + {"Can't open file.", 89}, + {"Sine", 90}, + {"Square", 91}, + {"Saw Down", 92}, + {"Saw Up", 93}, + {"Instrument Editor", 94}, + {"Volume envelope", 95}, + {"Panning envelope", 96}, + {"Load Instrument...", 97}, + {"Save Instrument...", 98}, + {"Load XI", 99}, + {"Save XI", 100}, + {"Vibrato Type:", 101}, + {"Note:", 102}, + {"Initialize", 103}, + {"The key that inserts the special keyoff note for FastTracker modules.", 104}, + {"Upper Octave Keys...", 105}, {"\ These are the keys on the upper half of the keyboard. The c key is normally \ the key to the right of the TAB key. The rest of the keys should be ordered \ -in a piano keyboard fashion, including the number keys row above.", 102}, - {"Lower Octave Keys...", 103}, +in a piano keyboard fashion, including the number keys row above.", 106}, + {"Lower Octave Keys...", 107}, {"\ These are the keys on the lower half of the keyboard. The c key is normally \ the first character key to the right of the left Shift key. The rest of the \ -keys should be ordered in a piano keyboard fashion, including the row above.", 104}, - {"Other Keys...", 105}, - {"Various other keys", 106}, - {"Function", 107}, - {"Assignment", 108}, - {"Keyboard Configuration", 109}, - {"Key Group Explanation", 110}, - {"Key Explanation", 111}, - {"Modifiers:", 112}, - {"Learn selected key", 113}, - {"Learn all keys", 114}, +keys should be ordered in a piano keyboard fashion, including the row above.", 108}, + {"Other Keys...", 109}, + {"Various other keys", 110}, + {"Function", 111}, + {"Assignment", 112}, + {"Keyboard Configuration", 113}, + {"Key Group Explanation", 114}, + {"Key Explanation", 115}, + {"Modifiers:", 116}, + {"Learn selected key", 117}, + {"Learn all keys", 118}, {"\ Please press the desired key combination!\n\ -Click into left list to cancel", 115}, +Click into left list to cancel", 119}, + {"Ok", 120}, + {"Apply", 121}, {"\ The keyboard configuration file is defective.\n\ -Please use the Keyboard Configuration dialog.", 116}, +Please use the Keyboard Configuration dialog.", 122}, {"\ Automatic key configuration unsuccessful.\n\ Please use the Keyboard Configuration dialog\n\ -in the Settings menu.", 117}, - {"Ok", 118}, +in the Settings menu.", 123}, {"\ Are you sure you want to do this?\n\ -All changes will be lost!", 119}, +All changes will be lost!", 124}, {"\ Are you sure you want to quit?\n\ -All changes will be lost!", 120}, - {"_Open...", 121}, - {"Save _as...", 122}, - {"Save Module as _WAV...", 123}, - {"_Quit", 124}, - {"Clear _All", 125}, - {"Clear _Patterns Only", 126}, - {"_Optimize Module", 127}, - {"C_ut", 128}, - {"_Copy", 129}, - {"_Paste", 130}, - {"_Insert", 131}, - {"_Delete", 132}, - {"_Mark", 133}, - {"_Jazz Edit Mode", 134}, - {"Transp_osition...", 135}, - {"_Pattern", 136}, - {"_Track", 137}, - {"_Selection", 138}, - {"_Find Unused Pattern", 139}, - {"_Copy Current to Unused Pattern", 140}, - {"C_lear Unused Patterns", 141}, - {"_Pack Patterns", 142}, - {"_Load XI...", 143}, - {"_Save XI...", 144}, - {"_Clear Current", 145}, - {"_Delete Unused Instruments", 146}, - {"Display _Oscilloscopes", 147}, - {"Use _Backing Store", 148}, - {"_Keyboard Configuration...", 149}, - {"_Audio Configuration...", 150}, - {"_Playback Effects...", 151}, - {"_GUI Configuration...", 152}, - {"_Save Settings now", 153}, - {"Save Settings on _Exit", 154}, - {"_About...", 155}, - {"Show _Tips...", 156}, - {"_XM Effects...", 157}, - {"_File", 158}, - {"_Module", 159}, - {"_Edit", 160}, - {"_Instrument", 161}, - {"_Settings", 162}, - {"_Help", 163}, - {"/_File", 164}, - {"/File/_Open...", 165}, - {"/File/Save _as...", 166}, - {"/File/-", 167}, - {"/File/Save Module as _WAV...", 168}, - {"/File/_Quit", 169}, - {"/_Module", 170}, - {"/Module/Clear _All", 171}, - {"/Module/Clear _Patterns Only", 172}, - {"/Module/_Optimize Module", 173}, - {"/_Edit", 174}, - {"/Edit/_Jazz Edit Mode", 175}, - {"/Edit/-", 176}, - {"/Edit/_Transposition...", 177}, - {"/Edit/_Pattern", 178}, - {"/Edit/Pattern/C_ut", 179}, - {"/Edit/Pattern/_Copy", 180}, - {"/Edit/Pattern/_Paste", 181}, - {"/Edit/_Track", 182}, - {"/Edit/Track/C_ut", 183}, - {"/Edit/Track/_Copy", 184}, - {"/Edit/Track/_Paste", 185}, - {"/Edit/Track/_Insert", 186}, - {"/Edit/Track/_Delete", 187}, - {"/Edit/_Selection", 188}, - {"/Edit/Selection/_Mark", 189}, - {"/Edit/Selection/C_ut", 190}, - {"/Edit/Selection/_Copy", 191}, - {"/Edit/Selection/_Paste", 192}, - {"/_Pattern", 193}, - {"/Pattern/_Find Unused Pattern", 194}, - {"/Pattern/_Copy Current to Unused Pattern", 195}, - {"/Pattern/C_lear Unused Patterns", 196}, - {"/Pattern/_Pack Patterns", 197}, - {"/_Instrument", 198}, - {"/Instrument/_Load XI...", 199}, - {"/Instrument/_Save XI...", 200}, - {"/Instrument/-", 201}, - {"/Instrument/_Clear Current", 202}, - {"/Instrument/_Delete Unused Instruments", 203}, - {"/_Settings", 204}, - {"/Settings/Display _Oscilloscopes", 205}, - {"/Settings/Use _Backing Store", 206}, - {"/Settings/-", 207}, - {"/Settings/_Keyboard Configuration...", 208}, - {"/Settings/_Audio Configuration...", 209}, - {"/Settings/_Playback Effects...", 210}, - {"/Settings/_GUI Configuration...", 211}, - {"/Settings/_Save Settings now", 212}, - {"/Settings/Save Settings on _Exit", 213}, - {"/_Help", 214}, - {"/Help/_About...", 215}, - {"/Help/-", 216}, - {"/Help/Show _Tips...", 217}, - {"/Help/_XM Effects...", 218}, - {"Instrument Name", 219}, - {"#smpl", 220}, - {"Sample Name", 221}, - {"Linear", 222}, - {"Amiga", 223}, - {"Module Info", 224}, - {"Songname:", 225}, - {"Frequencies:", 226}, - {"ProTracker Mode", 227}, - {"Song length", 228}, - {"Current pos", 229}, - {"Restart pos", 230}, +All changes will be lost!", 125}, + {"_Open...", 126}, + {"Save _as...", 127}, + {"Save Module as _WAV...", 128}, + {"_Quit", 129}, + {"Clear _All", 130}, + {"Clear _Patterns Only", 131}, + {"_Optimize Module", 132}, + {"C_ut", 133}, + {"_Copy", 134}, + {"_Paste", 135}, + {"_Insert", 136}, + {"_Delete", 137}, + {"_Mark", 138}, + {"_Jazz Edit Mode", 139}, + {"Transp_osition...", 140}, + {"_Pattern", 141}, + {"_Track", 142}, + {"_Selection", 143}, + {"_Find Unused Pattern", 144}, + {"_Copy Current to Unused Pattern", 145}, + {"C_lear Unused Patterns", 146}, + {"_Pack Patterns", 147}, + {"_Load XI...", 148}, + {"_Save XI...", 149}, + {"_Clear Current", 150}, + {"_Delete Unused Instruments", 151}, + {"Display _Oscilloscopes", 152}, + {"Use _Backing Store", 153}, + {"_Keyboard Configuration...", 154}, + {"_Audio Configuration...", 155}, + {"_GUI Configuration...", 156}, + {"_Save Settings now", 157}, + {"Save Settings on _Exit", 158}, + {"_About...", 159}, + {"Show _Tips...", 160}, + {"_XM Effects...", 161}, + {"_File", 162}, + {"_Module", 163}, + {"_Edit", 164}, + {"_Instrument", 165}, + {"_Settings", 166}, + {"_Help", 167}, + {"/_File", 168}, + {"/File/_Open...", 169}, + {"/File/Save _as...", 170}, + {"/File/-", 171}, + {"/File/Save Module as _WAV...", 172}, + {"/File/_Quit", 173}, + {"/_Module", 174}, + {"/Module/Clear _All", 175}, + {"/Module/Clear _Patterns Only", 176}, + {"/Module/_Optimize Module", 177}, + {"/_Edit", 178}, + {"/Edit/_Jazz Edit Mode", 179}, + {"/Edit/-", 180}, + {"/Edit/_Transposition...", 181}, + {"/Edit/_Pattern", 182}, + {"/Edit/Pattern/C_ut", 183}, + {"/Edit/Pattern/_Copy", 184}, + {"/Edit/Pattern/_Paste", 185}, + {"/Edit/_Track", 186}, + {"/Edit/Track/C_ut", 187}, + {"/Edit/Track/_Copy", 188}, + {"/Edit/Track/_Paste", 189}, + {"/Edit/Track/_Insert", 190}, + {"/Edit/Track/_Delete", 191}, + {"/Edit/_Selection", 192}, + {"/Edit/Selection/_Mark", 193}, + {"/Edit/Selection/C_ut", 194}, + {"/Edit/Selection/_Copy", 195}, + {"/Edit/Selection/_Paste", 196}, + {"/_Pattern", 197}, + {"/Pattern/_Find Unused Pattern", 198}, + {"/Pattern/_Copy Current to Unused Pattern", 199}, + {"/Pattern/C_lear Unused Patterns", 200}, + {"/Pattern/_Pack Patterns", 201}, + {"/_Instrument", 202}, + {"/Instrument/_Load XI...", 203}, + {"/Instrument/_Save XI...", 204}, + {"/Instrument/-", 205}, + {"/Instrument/_Clear Current", 206}, + {"/Instrument/_Delete Unused Instruments", 207}, + {"/_Settings", 208}, + {"/Settings/Display _Oscilloscopes", 209}, + {"/Settings/Use _Backing Store", 210}, + {"/Settings/-", 211}, + {"/Settings/_Keyboard Configuration...", 212}, + {"/Settings/_Audio Configuration...", 213}, + {"/Settings/_GUI Configuration...", 214}, + {"/Settings/_Save Settings now", 215}, + {"/Settings/Save Settings on _Exit", 216}, + {"/_Help", 217}, + {"/Help/_About...", 218}, + {"/Help/-", 219}, + {"/Help/Show _Tips...", 220}, + {"/Help/_XM Effects...", 221}, + {"Instrument Name", 222}, + {"#smpl", 223}, + {"Sample Name", 224}, + {"Linear", 225}, + {"Amiga", 226}, + {"Module Info", 227}, + {"Songname:", 228}, + {"Frequencies:", 229}, + {"ProTracker Mode", 230}, + {"Song length", 231}, + {"Current pos", 232}, + {"Restart pos", 233}, {"\ A directory called '.soundtracker' has been created in your\n\ -home directory to store configuration files.\n", 231}, - {"No loop", 232}, - {"PingPong", 233}, - {"8 bits", 234}, - {"16 bits", 235}, - {"Sample Editor", 236}, - {"Volume", 237}, - {"Panning", 238}, - {"Finetune", 239}, - {"SelStart", 240}, - {"SelEnd", 241}, - {"Sel None", 242}, - {"Sel All", 243}, - {"RelNote", 244}, - {"Length: 0", 245}, - {"Load Sample...", 246}, - {"Save WAV...", 247}, - {"Save region as WAV...", 248}, - {"Save WAV", 249}, - {"Save Region", 250}, - {"Monitor", 251}, - {"Volume Ramp", 252}, - {"Zoom to selection", 253}, - {"Show all", 254}, - {"Zoom in (+50%)", 255}, - {"Zoom out (-50%)", 256}, - {"Reverse", 257}, - {"Cut", 258}, - {"Remove", 259}, - {"Copy", 260}, - {"Paste", 261}, - {"Clear Sample", 262}, - {"Length: %d", 263}, - {"", 264}, - {"Read error.", 265}, - {"Load stereo sample", 266}, +home directory to store configuration files.\n", 234}, + {"No loop", 235}, + {"PingPong", 236}, + {"8 bits", 237}, + {"16 bits", 238}, + {"Sample Editor", 239}, + {"Volume", 240}, + {"Panning", 241}, + {"Finetune", 242}, + {"Selection:", 243}, + {"None", 244}, + {"All", 245}, + {"Length:", 246}, + {"RelNote", 247}, + {"Load Sample...", 248}, + {"Save WAV...", 249}, + {"Save region as WAV...", 250}, + {"Save WAV", 251}, + {"Save Region", 252}, + {"Monitor", 253}, + {"Volume Ramp", 254}, + {"Zoom to selection", 255}, + {"Show all", 256}, + {"Zoom in (+50%)", 257}, + {"Zoom out (-50%)", 258}, + {"Reverse", 259}, + {"Cut", 260}, + {"Remove", 261}, + {"Copy", 262}, + {"Paste", 263}, + {"Clear Sample", 264}, + {"(no selection)", 265}, + {"", 266}, + {"Read error.", 267}, + {"Load stereo sample", 268}, {"\ You have selected a stereo sample!\n\ (SoundTracker can only handle mono samples!)\n\ \n\ -Please choose which channel to load:", 267}, - {"Left", 268}, - {"Mix", 269}, - {"Right", 270}, - {"Can't read sample", 271}, - {"Sample is too long for current mixer module. Loading anyway.", 272}, - {"Can only handle 8 and 16 bit samples with up to 2 channels", 273}, - {"Nothing to save.", 274}, - {"OK", 275}, - {"Start sampling", 276}, - {"Sampling Window", 277}, - {"", 278}, - {"Recorded sample is too long for current mixer module. Using it anyway.", 279}, - {"Normalize", 280}, - {"Execute", 281}, - {"Close", 282}, - {"Volume Ramping", 283}, - {"Perform linear volume fade on Selection", 284}, - {"Left [%]:", 285}, - {"Right [%]:", 286}, - {"SoundTracker Tip of the day", 287}, - {"Previous Tip", 288}, - {"Next Tip", 289}, - {"Show tip next time", 290}, +Please choose which channel to load:", 269}, + {"Left", 270}, + {"Mix", 271}, + {"Right", 272}, + {"Can't read sample", 273}, + {"Sample is too long for current mixer module. Loading anyway.", 274}, + {"Can only handle 8 and 16 bit samples with up to 2 channels", 275}, + {"Nothing to save.", 276}, + {"OK", 277}, + {"Start sampling", 278}, + {"Sampling Window", 279}, + {"", 280}, + {"Recorded sample is too long for current mixer module. Using it anyway.", 281}, + {"Normalize", 282}, + {"Execute", 283}, + {"Volume Ramping", 284}, + {"Perform linear volume fade on Selection", 285}, + {"Left [%]:", 286}, + {"Right [%]:", 287}, + {"SoundTracker Tip of the day", 288}, + {"Previous Tip", 289}, + {"Next Tip", 290}, + {"Show tip next time", 291}, {"\ Welcome to SoundTracker!\n\ \n\ If you are new to this type of program, you will want to get hold of\n\ -some XM or MOD files first and play with them.", 291}, +some XM or MOD files first and play with them.", 292}, {"\ You can make SoundTracker's edit mode more responsive to keyboard\n\ input by decreasing the mixing buffer size of the \"Editing\" object in\n\ -the Audio Configuration.", 292}, +the Audio Configuration.", 293}, {"\ You can adjust the loop points in the sample editor by holding Shift\n\ -and using the left and right mousebuttons.\n", 293}, +and using the left and right mousebuttons.\n", 294}, {"\ If you want to know more about tracking, and how the various commands\n\ -work, have a look at http://www.united-trackers.org/", 294}, +work, have a look at http://www.united-trackers.org/", 295}, {"\ You can assign samples of an instrument to the individual keys by\n\ activating its sample and then clicking on the keyboard in the\n\ -instrument editor page.", 295}, - {"Jazz Edit:", 296}, - {"Tracker", 297}, - {"Whole Song", 298}, - {"All Patterns", 299}, - {"Current Pattern", 300}, - {"Current Track", 301}, - {"Current Instrument", 302}, - {"All Instruments", 303}, - {"Half note up", 304}, - {"Half note down", 305}, - {"Octave up", 306}, - {"Octave down", 307}, - {"Exchange 1 <-> 2", 308}, - {"Change 1 -> 2", 309}, - {"Transposition Tools", 310}, - {"Scope of the operation:", 311}, - {"Note Transposition", 312}, - {"Instrument Changing", 313}, - {"Instrument 1:", 314}, - {"Current instrument", 315}, - {"Instrument 2:", 316}, - {"Pattern length out of range: %d.\n", 317}, - {"Invalid vibtype %d, using Sine.\n", 318}, - {"File is no XI instrument.", 319}, - {"Unknown XI version 0x%x\n", 320}, - {"No FastTracker XM and no supported MOD format!", 321}, +instrument editor page.", 296}, + {"Jazz Edit:", 297}, + {"Tracker", 298}, + {"Whole Song", 299}, + {"All Patterns", 300}, + {"Current Pattern", 301}, + {"Current Track", 302}, + {"Current Instrument", 303}, + {"All Instruments", 304}, + {"Half note up", 305}, + {"Half note down", 306}, + {"Octave up", 307}, + {"Octave down", 308}, + {"Exchange 1 <-> 2", 309}, + {"Change 1 -> 2", 310}, + {"Transposition Tools", 311}, + {"Scope of the operation:", 312}, + {"Note Transposition", 313}, + {"Instrument Changing", 314}, + {"Instrument 1:", 315}, + {"Current instrument", 316}, + {"Instrument 2:", 317}, + {"Pattern length out of range: %d.\n", 318}, + {"Invalid vibtype %d, using Sine.\n", 319}, + {"File is no XI instrument.", 320}, + {"Unknown XI version 0x%x\n", 321}, {"Error while loading patterns.", 322}, {"Can't open file", 323}, {"XM header length != 276. Maybe a pre-0.0.12 SoundTracker module? :-)\n", 324}, @@ -393,6 +393,7 @@ {"\ Module contains sample(s) that are too long for the current mixer.\n\ Maximum sample length is %d.", 326}, + {"No FastTracker XM and no supported MOD format!", 327}, }; -int _msg_tbl_length = 326; +int _msg_tbl_length = 327; Binary files soundtracker-0.3.10/po/de.gmo and soundtracker-0.5.0/po/de.gmo differ diff -urN soundtracker-0.3.10/po/de.po soundtracker-0.5.0/po/de.po --- soundtracker-0.3.10/po/de.po Wed Jan 26 18:53:27 2000 +++ soundtracker-0.5.0/po/de.po Mon Mar 13 14:06:37 2000 @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: soundtracker-0.3.3\n" -"POT-Creation-Date: 2000-01-22 15:32+0100\n" +"POT-Creation-Date: 2000-03-13 13:56+0100\n" "PO-Revision-Date: 1999-09-21 23:00+02:00\n" "Last-Translator: Colin Marquardt \n" "Language-Team: German \n" @@ -13,26 +13,51 @@ "Content-Type: text/plain; charset=iso-8859-1\n" "Content-Transfer-Encoding: 8bit\n" -#: app/audioconfig.c:55 +#: app/audioconfig.c:59 msgid "Playback Output" msgstr "Playbackausgang" -#: app/audioconfig.c:61 +#: app/audioconfig.c:65 msgid "Editing Output" msgstr "Editierausgang" -#: app/audioconfig.c:67 +#: app/audioconfig.c:71 msgid "Sampling" msgstr "Samplen" -#: app/audioconfig.c:179 +#: app/audioconfig.c:222 msgid "Driver Module" msgstr "Treibermodul" -#: app/audioconfig.c:187 app/audioconfig.c:190 +#: app/audioconfig.c:223 +#, fuzzy +msgid "Mixer Module" +msgstr "Treibermodul" + +#: app/audioconfig.c:224 +#, fuzzy +msgid "Description" +msgstr "Frage" + +#: app/audioconfig.c:232 app/audioconfig.c:235 msgid "Audio Configuration" msgstr "Audio-Konfiguration" +#: app/audioconfig.c:250 +#, fuzzy +msgid "Drivers" +msgstr "Treibermodul" + +#: app/audioconfig.c:287 +#, fuzzy +msgid "Mixers" +msgstr "Modifizierer:" + +#: app/audioconfig.c:320 app/gui-settings.c:319 app/sample-editor.c:1607 +#: app/tips-dialog.c:165 app/transposition.c:313 +msgid "Close" +msgstr "Schlieъen" + #: app/drivers/alsa-input.c:125 app/drivers/alsa-output.c:134 #, c-format msgid "(%d bytes)" @@ -125,7 +150,7 @@ msgid "no settings (yet), sorry!" msgstr "Keine Einstellungen (zur Zeit), sorry!" -#: app/drivers/file-output.c:161 app/sample-editor.c:1364 +#: app/drivers/file-output.c:161 app/sample-editor.c:1312 msgid "Can't open file for writing." msgstr "Kann Datei nicht zum Schreiben Жffnen." @@ -152,14 +177,6 @@ "Konnte /dev/dsp nicht zur Soundausgabe Жffnen:\n" "%s" -#: app/effectsconfig.c:56 -msgid "Master Reverb" -msgstr "Master Reverb" - -#: app/effectsconfig.c:153 app/effectsconfig.c:156 -msgid "Playback Effects Configuration" -msgstr "Konfiguration der Playback-Effekte" - #: app/envelope-box.c:740 msgid "Length" msgstr "LДnge" @@ -210,98 +227,103 @@ msgid "Loop" msgstr "Loop" -#: app/envelope-box.c:876 app/sample-editor.c:222 +#: app/envelope-box.c:876 app/sample-editor.c:225 msgid "Start" msgstr "Anfang" -#: app/envelope-box.c:877 app/sample-editor.c:223 +#: app/envelope-box.c:877 app/sample-editor.c:226 msgid "End" msgstr "Ende" -#: app/file-operations.c:145 +#: app/file-operations.c:150 #, fuzzy msgid "Load Module" msgstr "_Modul" -#: app/file-operations.c:146 +#: app/file-operations.c:151 #, fuzzy msgid "Save Module" msgstr "Treibermodul" -#: app/file-operations.c:147 +#: app/file-operations.c:152 msgid "Render WAV" msgstr "" -#: app/file-operations.c:148 app/sample-editor.c:290 +#: app/file-operations.c:153 app/sample-editor.c:325 msgid "Load Sample" msgstr "Lade Sample" -#: app/file-operations.c:149 +#: app/file-operations.c:154 #, fuzzy msgid "Save Sample" msgstr "Lade Sample" -#: app/file-operations.c:150 +#: app/file-operations.c:155 #, fuzzy msgid "Load Instrument" msgstr "Lade Instrument..." -#: app/file-operations.c:151 +#: app/file-operations.c:156 #, fuzzy msgid "Save Instrument" msgstr "Speichere Instrument..." -#: app/file-operations.c:157 +#: app/file-operations.c:162 #, fuzzy msgid "File" msgstr "_Datei" -#: app/file-operations.c:208 +#: app/file-operations.c:213 msgid "Operation not supported." msgstr "" -#: app/gui-settings.c:78 +#: app/gui-settings.c:86 msgid "Scopes Frequency" msgstr "Scope-Frequenz" -#: app/gui-settings.c:81 +#: app/gui-settings.c:89 msgid "Tracker Frequency" msgstr "Tracker-Frequenz" -#: app/gui-settings.c:173 app/gui-settings.c:176 +#: app/gui-settings.c:188 app/gui-settings.c:191 msgid "GUI Configuration" msgstr "GUI-Konfiguration" -#: app/gui-settings.c:201 +#: app/gui-settings.c:217 msgid "Use Hexadecimal Numbers" msgstr "Verwende hexadezimale Zahlen" -#: app/gui-settings.c:208 +#: app/gui-settings.c:224 msgid "Use upper case letters for hex numbers" msgstr "" -#: app/gui-settings.c:215 -msgid "Advance Cursor in FX Columns" +#: app/gui-settings.c:231 +#, fuzzy +msgid "Advance cursor horizontally in effect columns" msgstr "Lasse Cursor in FX-Spalten mitlaufen" -#: app/gui-settings.c:222 +#: app/gui-settings.c:238 +msgid "Asynchronous Editing" +msgstr "" + +#: app/gui-settings.c:245 msgid "Use anti-aliased envelope editor" msgstr "Verwende Antialiasing im HЭllkurven-Editor" -#: app/gui-settings.c:228 +#: app/gui-settings.c:251 msgid "You need to restart SoundTracker for this change to come into effect." msgstr "" "Sie mЭssen SoundTracker neustarten, damit diese дnderungen wirksam werden." -#: app/gui-settings.c:237 +#: app/gui-settings.c:260 msgid "Scopes buffer size [MB]" msgstr "PuffergrЖъe der Scopes [MB]" -#: app/gui-settings.c:256 +#: app/gui-settings.c:279 msgid "Highlight rows:" msgstr "" -#: app/gui-settings.c:274 +#: app/gui-settings.c:297 msgid "`Save XM' saves all non-empty patterns" msgstr "`Speichere XM' speichert alle nicht-leeren Pattern" @@ -309,7 +331,8 @@ msgid "Question" msgstr "Frage" -#: app/gui-subs.c:447 app/sample-editor.c:1277 app/sample-editor.c:1457 +#: app/gui-subs.c:447 app/keys.c:702 app/sample-editor.c:1225 +#: app/sample-editor.c:1412 msgid "Cancel" msgstr "Abbrechen" @@ -325,7 +348,7 @@ msgid "Tempo" msgstr "Tempo" -#: app/gui.c:214 +#: app/gui.c:217 msgid "" "Are you sure you want to free the current project?\n" "All changes will be lost!" @@ -333,59 +356,59 @@ "Sind Sie sicher, daъ Sie das aktuelle Projekt schlieъen wollen?\n" "Alle дnderungen gehen verloren!" -#: app/gui.c:228 app/gui.c:242 +#: app/gui.c:231 app/gui.c:245 msgid "Are you sure you want to overwrite the file?" msgstr "Sind sie sicher, daъ Sie die Datei Эberschreiben wollen?" -#: app/gui.c:1119 +#: app/gui.c:1145 msgid "Load XM..." msgstr "Lade XM..." -#: app/gui.c:1121 +#: app/gui.c:1147 msgid "Save XM..." msgstr "Speichere XM..." -#: app/gui.c:1124 +#: app/gui.c:1150 msgid "Render module as WAV..." msgstr "" -#: app/gui.c:1176 +#: app/gui.c:1202 msgid "Play Song" msgstr "Spiele Song" -#: app/gui.c:1182 +#: app/gui.c:1208 msgid "Play Pattern" msgstr "Spiele Pattern" -#: app/gui.c:1188 +#: app/gui.c:1214 msgid "Stop" msgstr "Stop" -#: app/gui.c:1207 +#: app/gui.c:1233 msgid "Number of Channels:" msgstr "Anzahl der KanДle:" -#: app/gui.c:1223 app/playlist.c:294 +#: app/gui.c:1249 app/playlist.c:294 msgid "Pattern" msgstr "Pattern" -#: app/gui.c:1239 +#: app/gui.c:1265 msgid "PatLength" msgstr "PatLДnge" -#: app/gui.c:1331 +#: app/gui.c:1357 msgid "Octave" msgstr "Oktave" -#: app/gui.c:1339 +#: app/gui.c:1365 msgid "Jump" msgstr "Springe" -#: app/gui.c:1347 +#: app/gui.c:1373 msgid "Instr" msgstr "Instr" -#: app/gui.c:1362 +#: app/gui.c:1388 msgid "Sample" msgstr "Sample" @@ -472,12 +495,12 @@ msgstr "" "Die Taste, die die spezielle keyoff-Note fЭr FastTracker-Module einfЭgt." -#: app/keys.c:135 +#: app/keys.c:136 #, fuzzy msgid "Upper Octave Keys..." msgstr "Tasten fЭr obere Oktave..." -#: app/keys.c:136 +#: app/keys.c:137 msgid "" "These are the keys on the upper half of the keyboard. The c key is normally " "the key to the right of the TAB key. The rest of the keys should be ordered " @@ -487,12 +510,12 @@ "normalerweise rechts neben der TAB-Taste. Die restlichen Tasten sind in der " "Art einer Klaviertastatur angeordnet, inklusive der Zifferntasten darЭber." -#: app/keys.c:142 +#: app/keys.c:143 #, fuzzy msgid "Lower Octave Keys..." msgstr "Taste fЭr untere Oktave..." -#: app/keys.c:143 +#: app/keys.c:144 msgid "" "These are the keys on the lower half of the keyboard. The c key is normally " "the first character key to the right of the left Shift key. The rest of the " @@ -503,48 +526,48 @@ "restlichen Tasten sind in der Art einer Klaviertastatur angeordnet, " "inklusive der Tastenreihe darЭber." -#: app/keys.c:149 +#: app/keys.c:150 #, fuzzy msgid "Other Keys..." msgstr "Andere Tasten..." -#: app/keys.c:150 +#: app/keys.c:151 msgid "Various other keys" msgstr "Verschiedene andere Tasten" -#: app/keys.c:437 +#: app/keys.c:504 msgid "Function" msgstr "Funktion" -#: app/keys.c:438 +#: app/keys.c:505 msgid "Assignment" msgstr "Zuordnung" -#: app/keys.c:447 app/keys.c:450 +#: app/keys.c:514 app/keys.c:517 msgid "Keyboard Configuration" msgstr "Tastatur-Konfiguration" -#: app/keys.c:495 +#: app/keys.c:566 msgid "Key Group Explanation" msgstr "Tastengruppen-ErklДrung" -#: app/keys.c:512 +#: app/keys.c:583 msgid "Key Explanation" msgstr "TastenerklДrung" -#: app/keys.c:543 +#: app/keys.c:614 msgid "Modifiers:" msgstr "Modifizierer:" -#: app/keys.c:569 +#: app/keys.c:640 msgid "Learn selected key" msgstr "Lerne gewДhlte Taste" -#: app/keys.c:575 +#: app/keys.c:646 msgid "Learn all keys" msgstr "Lerne alle Tasten" -#: app/keys.c:581 +#: app/keys.c:652 msgid "" "Please press the desired key combination!\n" "Click into left list to cancel" @@ -552,7 +575,15 @@ "Bitte drЭcken Sie die gewЭnschte Tastenkombination!\n" "Klicken Sie in die linke Liste, um abzubrechen" -#: app/keys.c:645 +#: app/keys.c:682 app/menubar.c:94 +msgid "Ok" +msgstr "OK" + +#: app/keys.c:692 +msgid "Apply" +msgstr "" + +#: app/keys.c:760 msgid "" "The keyboard configuration file is defective.\n" "Please use the Keyboard Configuration dialog." @@ -560,7 +591,7 @@ "Die Datei fЭr die Tastaturkonfiguration ist fehlerhaft.\n" "Bitte verwenden Sie den Dialog fЭr die Tastatur-Konfiguration." -#: app/keys.c:895 +#: app/keys.c:1010 msgid "" "Automatic key configuration unsuccessful.\n" "Please use the Keyboard Configuration dialog\n" @@ -570,11 +601,7 @@ "Bitte verwenden Sie den Dialog fЭr die Tastatur-Konfiguration\n" "im MenЭ Einstellungen." -#: app/menubar.c:95 -msgid "Ok" -msgstr "OK" - -#: app/menubar.c:131 +#: app/menubar.c:130 msgid "" "Are you sure you want to do this?\n" "All changes will be lost!" @@ -582,7 +609,7 @@ "Sind Sie sicher, daъ Sie das tun wollen?\n" "Alle дnderungen gehen verloren!" -#: app/menubar.c:153 +#: app/menubar.c:152 msgid "" "Are you sure you want to quit?\n" "All changes will be lost!" @@ -590,426 +617,416 @@ "Sind Sie sicher, daъ Sie das Programm beenden wollen?\n" "Alle дnderungen gehen verloren!" -#: app/menubar.c:224 +#: app/menubar.c:223 #, fuzzy msgid "_Open..." msgstr "ж_ffnen..." -#: app/menubar.c:226 +#: app/menubar.c:225 #, fuzzy msgid "Save _as..." msgstr "Speichern _unter..." -#: app/menubar.c:232 +#: app/menubar.c:231 #, fuzzy msgid "Save Module as _WAV..." msgstr "Speichere WAV..." -#: app/menubar.c:237 +#: app/menubar.c:236 msgid "_Quit" msgstr "_Beenden" -#: app/menubar.c:244 +#: app/menubar.c:243 msgid "Clear _All" msgstr "_Alles lЖschen" -#: app/menubar.c:246 +#: app/menubar.c:245 msgid "Clear _Patterns Only" msgstr "Nur _Pattern lЖschen" -#: app/menubar.c:248 +#: app/menubar.c:247 msgid "_Optimize Module" msgstr "Modul _optimieren" -#: app/menubar.c:255 app/menubar.c:266 app/menubar.c:284 +#: app/menubar.c:254 app/menubar.c:265 app/menubar.c:283 msgid "C_ut" msgstr "_Ausschneiden" -#: app/menubar.c:257 app/menubar.c:268 app/menubar.c:286 +#: app/menubar.c:256 app/menubar.c:267 app/menubar.c:285 msgid "_Copy" msgstr "_Kopieren" -#: app/menubar.c:259 app/menubar.c:270 app/menubar.c:288 +#: app/menubar.c:258 app/menubar.c:269 app/menubar.c:287 msgid "_Paste" msgstr "E_infЭgen" -#: app/menubar.c:272 +#: app/menubar.c:271 #, fuzzy msgid "_Insert" msgstr "EinfЭgen" -#: app/menubar.c:274 +#: app/menubar.c:273 #, fuzzy msgid "_Delete" msgstr "LЖschen" -#: app/menubar.c:282 +#: app/menubar.c:281 msgid "_Mark" msgstr "_Markieren" -#: app/menubar.c:295 +#: app/menubar.c:294 msgid "_Jazz Edit Mode" msgstr "_Jazz-Edit-Modus" -#: app/menubar.c:300 +#: app/menubar.c:299 #, fuzzy msgid "Transp_osition..." msgstr "_Transposition..." -#: app/menubar.c:305 app/menubar.c:390 +#: app/menubar.c:304 app/menubar.c:387 msgid "_Pattern" msgstr "_Pattern" -#: app/menubar.c:306 +#: app/menubar.c:305 msgid "_Track" msgstr "_Track" -#: app/menubar.c:307 +#: app/menubar.c:306 msgid "_Selection" msgstr "_Auswahl" -#: app/menubar.c:313 +#: app/menubar.c:312 msgid "_Find Unused Pattern" msgstr "_Finde unbenutztes Pattern" -#: app/menubar.c:315 +#: app/menubar.c:314 msgid "_Copy Current to Unused Pattern" msgstr "_Kopiere aktuelles zu unbenutztem Pattern" -#: app/menubar.c:317 +#: app/menubar.c:316 msgid "C_lear Unused Patterns" msgstr "_LЖsche unbenutzte Pattern" -#: app/menubar.c:319 +#: app/menubar.c:318 msgid "_Pack Patterns" msgstr "_Packe Pattern" -#: app/menubar.c:326 +#: app/menubar.c:325 #, fuzzy msgid "_Load XI..." msgstr "_Lade XI..." -#: app/menubar.c:328 +#: app/menubar.c:327 #, fuzzy msgid "_Save XI..." msgstr "Speichere XM..." -#: app/menubar.c:333 +#: app/menubar.c:332 #, fuzzy msgid "_Clear Current" msgstr "Aktuell" -#: app/menubar.c:338 +#: app/menubar.c:337 msgid "_Delete Unused Instruments" msgstr "LЖsche unbenutzte _Instrumente" -#: app/menubar.c:346 +#: app/menubar.c:345 msgid "Display _Oscilloscopes" msgstr "Zeige _Oszilloskope" -#: app/menubar.c:348 +#: app/menubar.c:347 msgid "Use _Backing Store" msgstr "Verwende _Backing Store" -#: app/menubar.c:353 +#: app/menubar.c:352 #, fuzzy msgid "_Keyboard Configuration..." msgstr "_Tastatur-Konfiguration..." -#: app/menubar.c:355 +#: app/menubar.c:354 #, fuzzy msgid "_Audio Configuration..." msgstr "_Audio-Konfiguration..." -#: app/menubar.c:357 -#, fuzzy -msgid "_Playback Effects..." -msgstr "_Playback-Effekte..." - -#: app/menubar.c:359 +#: app/menubar.c:356 #, fuzzy msgid "_GUI Configuration..." msgstr "_GUI-Konfiguration..." -#: app/menubar.c:364 +#: app/menubar.c:361 msgid "_Save Settings now" msgstr "_Speichere Einstellungen jetzt" -#: app/menubar.c:366 +#: app/menubar.c:363 msgid "Save Settings on _Exit" msgstr "Speichere Einstellungen beim _Verlassen" -#: app/menubar.c:373 +#: app/menubar.c:370 #, fuzzy msgid "_About..." msgstr "э_ber..." -#: app/menubar.c:378 +#: app/menubar.c:375 #, fuzzy msgid "Show _Tips..." msgstr "Zeige _Tips..." -#: app/menubar.c:380 +#: app/menubar.c:377 #, fuzzy msgid "_XM Effects..." msgstr "_XM-Effekte..." -#: app/menubar.c:387 +#: app/menubar.c:384 msgid "_File" msgstr "_Datei" -#: app/menubar.c:388 +#: app/menubar.c:385 msgid "_Module" msgstr "_Modul" -#: app/menubar.c:389 +#: app/menubar.c:386 msgid "_Edit" msgstr "_Bearbeiten" -#: app/menubar.c:391 +#: app/menubar.c:388 msgid "_Instrument" msgstr "_Instrument" -#: app/menubar.c:392 +#: app/menubar.c:389 msgid "_Settings" msgstr "_Einstellungen" -#: app/menubar.c:393 +#: app/menubar.c:390 msgid "_Help" msgstr "_Hilfe" -#: app/menubar.c:423 +#: app/menubar.c:420 msgid "/_File" msgstr "/_Datei" -#: app/menubar.c:424 +#: app/menubar.c:421 #, fuzzy msgid "/File/_Open..." msgstr "/Datei/ж_ffnen..." -#: app/menubar.c:425 +#: app/menubar.c:422 #, fuzzy msgid "/File/Save _as..." msgstr "/Datei/Speichern _unter..." -#: app/menubar.c:426 app/menubar.c:428 +#: app/menubar.c:423 app/menubar.c:425 msgid "/File/-" msgstr "/Datei/-" -#: app/menubar.c:427 +#: app/menubar.c:424 #, fuzzy msgid "/File/Save Module as _WAV..." msgstr "/Datei/Speichern _unter..." -#: app/menubar.c:429 +#: app/menubar.c:426 msgid "/File/_Quit" msgstr "/Datei/_Beenden" -#: app/menubar.c:430 +#: app/menubar.c:427 msgid "/_Module" msgstr "/_Modul" -#: app/menubar.c:431 +#: app/menubar.c:428 msgid "/Module/Clear _All" msgstr "/Modul/LЖsche _alle" -#: app/menubar.c:432 +#: app/menubar.c:429 msgid "/Module/Clear _Patterns Only" msgstr "/Modul/LЖsche nur _Pattern" -#: app/menubar.c:433 +#: app/menubar.c:430 msgid "/Module/_Optimize Module" msgstr "/Modul/_Optimiere Modul" -#: app/menubar.c:434 +#: app/menubar.c:431 msgid "/_Edit" msgstr "/_Bearbeiten" -#: app/menubar.c:435 +#: app/menubar.c:432 msgid "/Edit/_Jazz Edit Mode" msgstr "/Bearbeiten/_Jazz-Edit-Mode" -#: app/menubar.c:436 app/menubar.c:438 +#: app/menubar.c:433 app/menubar.c:435 msgid "/Edit/-" msgstr "/Bearbeiten/-" -#: app/menubar.c:437 +#: app/menubar.c:434 #, fuzzy msgid "/Edit/_Transposition..." msgstr "/Bearbeiten/_Transposition..." -#: app/menubar.c:439 +#: app/menubar.c:436 msgid "/Edit/_Pattern" msgstr "/Bearbeiten/_Pattern" -#: app/menubar.c:440 +#: app/menubar.c:437 msgid "/Edit/Pattern/C_ut" msgstr "/Bearbeiten/Pattern/_Ausschneiden" -#: app/menubar.c:441 +#: app/menubar.c:438 msgid "/Edit/Pattern/_Copy" msgstr "/Bearbeiten/Pattern/_Kopieren" -#: app/menubar.c:442 +#: app/menubar.c:439 msgid "/Edit/Pattern/_Paste" msgstr "/Bearbeiten/Pattern/E_infЭgen" -#: app/menubar.c:443 +#: app/menubar.c:440 msgid "/Edit/_Track" msgstr "/Bearbeiten/_Track" -#: app/menubar.c:444 +#: app/menubar.c:441 msgid "/Edit/Track/C_ut" msgstr "/Bearbeiten/Track/_Ausschneiden" -#: app/menubar.c:445 +#: app/menubar.c:442 msgid "/Edit/Track/_Copy" msgstr "/Bearbeiten/Track/_Kopieren" -#: app/menubar.c:446 +#: app/menubar.c:443 msgid "/Edit/Track/_Paste" msgstr "/Bearbeiten/Track/E_infЭgen" -#: app/menubar.c:447 +#: app/menubar.c:444 #, fuzzy msgid "/Edit/Track/_Insert" msgstr "/Bearbeiten/Track/E_infЭgen" -#: app/menubar.c:448 +#: app/menubar.c:445 #, fuzzy msgid "/Edit/Track/_Delete" msgstr "/Bearbeiten/Track/E_infЭgen" -#: app/menubar.c:449 +#: app/menubar.c:446 msgid "/Edit/_Selection" msgstr "/Bearbeiten/_Auswahl" -#: app/menubar.c:450 +#: app/menubar.c:447 msgid "/Edit/Selection/_Mark" msgstr "/Bearbeiten/Auswahl/_Markieren" -#: app/menubar.c:451 +#: app/menubar.c:448 msgid "/Edit/Selection/C_ut" msgstr "/Bearbeiten/Auswahl/_Ausschneiden" -#: app/menubar.c:452 +#: app/menubar.c:449 msgid "/Edit/Selection/_Copy" msgstr "/Bearbeiten/Auswahl/_Kopieren" -#: app/menubar.c:453 +#: app/menubar.c:450 msgid "/Edit/Selection/_Paste" msgstr "/Bearbeiten/Auswahl/E_infЭgen" -#: app/menubar.c:454 +#: app/menubar.c:451 msgid "/_Pattern" msgstr "/_Pattern" -#: app/menubar.c:455 +#: app/menubar.c:452 msgid "/Pattern/_Find Unused Pattern" msgstr "/Pattern/_Finde unbenutztes Pattern" -#: app/menubar.c:456 +#: app/menubar.c:453 msgid "/Pattern/_Copy Current to Unused Pattern" msgstr "/Pattern/_Kopiere aktuelles zu unbenutztem Pattern" -#: app/menubar.c:457 +#: app/menubar.c:454 msgid "/Pattern/C_lear Unused Patterns" msgstr "/Pattern/_LЖsche unbenutzte Pattern" -#: app/menubar.c:458 +#: app/menubar.c:455 msgid "/Pattern/_Pack Patterns" msgstr "/Pattern/_Packe Pattern" -#: app/menubar.c:459 +#: app/menubar.c:456 msgid "/_Instrument" msgstr "/_Instrument" -#: app/menubar.c:460 +#: app/menubar.c:457 #, fuzzy msgid "/Instrument/_Load XI..." msgstr "/Instrument/_Lade XI..." -#: app/menubar.c:461 +#: app/menubar.c:458 #, fuzzy msgid "/Instrument/_Save XI..." msgstr "/Instrument/_Lade XI..." -#: app/menubar.c:462 app/menubar.c:464 +#: app/menubar.c:459 app/menubar.c:461 msgid "/Instrument/-" msgstr "/Instrument/-" -#: app/menubar.c:463 +#: app/menubar.c:460 #, fuzzy msgid "/Instrument/_Clear Current" msgstr "/Instrument/_LЖsche unbenutzte Instrumente" -#: app/menubar.c:465 +#: app/menubar.c:462 msgid "/Instrument/_Delete Unused Instruments" msgstr "/Instrument/_LЖsche unbenutzte Instrumente" -#: app/menubar.c:466 +#: app/menubar.c:463 msgid "/_Settings" msgstr "/_Einstellungen" -#: app/menubar.c:467 +#: app/menubar.c:464 msgid "/Settings/Display _Oscilloscopes" msgstr "/Einstellungen/Zeige _Oszilloskope" -#: app/menubar.c:468 +#: app/menubar.c:465 msgid "/Settings/Use _Backing Store" msgstr "/Einstellungen/Verwende _Backing Store" -#: app/menubar.c:469 app/menubar.c:474 +#: app/menubar.c:466 app/menubar.c:470 msgid "/Settings/-" msgstr "/Einstellungen/-" -#: app/menubar.c:470 +#: app/menubar.c:467 #, fuzzy msgid "/Settings/_Keyboard Configuration..." msgstr "/Einstellungen/_Tastatur-Konfiguration..." -#: app/menubar.c:471 +#: app/menubar.c:468 #, fuzzy msgid "/Settings/_Audio Configuration..." msgstr "/Einstellungen/_Audio-Konfiguration..." -#: app/menubar.c:472 -#, fuzzy -msgid "/Settings/_Playback Effects..." -msgstr "/Einstellungen/_Playback-Effekte..." - -#: app/menubar.c:473 +#: app/menubar.c:469 #, fuzzy msgid "/Settings/_GUI Configuration..." msgstr "/Einstellungen/_GUI-Konfiguration..." -#: app/menubar.c:475 +#: app/menubar.c:471 msgid "/Settings/_Save Settings now" msgstr "/Einstellungen/_Speichere Einstellungen jetzt" -#: app/menubar.c:476 +#: app/menubar.c:472 msgid "/Settings/Save Settings on _Exit" msgstr "/Einstellungen/Speichere Einstellungen beim _Verlassen" -#: app/menubar.c:477 +#: app/menubar.c:473 msgid "/_Help" msgstr "/_Hilfe" -#: app/menubar.c:478 +#: app/menubar.c:474 #, fuzzy msgid "/Help/_About..." msgstr "/Hilfe/э_ber..." -#: app/menubar.c:479 +#: app/menubar.c:475 msgid "/Help/-" msgstr "/Hilfe/-" -#: app/menubar.c:480 +#: app/menubar.c:476 #, fuzzy msgid "/Help/Show _Tips..." msgstr "/Hilfe/Zeige _Tips..." -#: app/menubar.c:481 +#: app/menubar.c:477 #, fuzzy msgid "/Help/_XM Effects..." msgstr "/Hilfe/_XM-Effekte..." @@ -1030,7 +1047,7 @@ msgid "Linear" msgstr "Linear" -#: app/module-info.c:118 app/sample-editor.c:182 +#: app/module-info.c:118 app/sample-editor.c:185 msgid "Amiga" msgstr "Amiga" @@ -1070,155 +1087,153 @@ "Ein Verzeichnis namens '.soundtracker' wurde in Ihrem Home-Verzeichnis \n" "angelegt, um Konfigurationsdateien darin zu speichern.\n" -#: app/sample-editor.c:181 +#: app/sample-editor.c:184 msgid "No loop" msgstr "Keine Loop" -#: app/sample-editor.c:183 +#: app/sample-editor.c:186 msgid "PingPong" msgstr "PingPong" -#: app/sample-editor.c:187 +#: app/sample-editor.c:190 msgid "8 bits" msgstr "8 Bits" -#: app/sample-editor.c:188 +#: app/sample-editor.c:191 msgid "16 bits" msgstr "16 Bits" -#: app/sample-editor.c:194 +#: app/sample-editor.c:197 msgid "Sample Editor" msgstr "Sample-Editor" -#: app/sample-editor.c:234 +#: app/sample-editor.c:237 msgid "Volume" msgstr "LautstДrke" -#: app/sample-editor.c:235 +#: app/sample-editor.c:238 msgid "Panning" msgstr "Balance" -#: app/sample-editor.c:236 +#: app/sample-editor.c:239 msgid "Finetune" msgstr "Feineinstellung" -#: app/sample-editor.c:247 -msgid "SelStart" -msgstr "AuswAnf" - -#: app/sample-editor.c:248 -msgid "SelEnd" -msgstr "AuswEnde" +#: app/sample-editor.c:259 +#, fuzzy +msgid "Selection:" +msgstr "_Auswahl" -#: app/sample-editor.c:256 +#: app/sample-editor.c:263 #, fuzzy -msgid "Sel None" -msgstr "RelNote" +msgid "None" +msgstr "Note:" -#: app/sample-editor.c:262 -msgid "Sel All" +#: app/sample-editor.c:269 +msgid "All" msgstr "" -#: app/sample-editor.c:268 +#: app/sample-editor.c:290 +#, fuzzy +msgid "Length:" +msgstr "LДnge" + +#: app/sample-editor.c:306 msgid "RelNote" msgstr "RelNote" -#: app/sample-editor.c:269 -msgid "Length: 0" -msgstr "LДnge: 0" - -#: app/sample-editor.c:282 +#: app/sample-editor.c:317 #, fuzzy msgid "Load Sample..." msgstr "Lade Sample..." -#: app/sample-editor.c:284 +#: app/sample-editor.c:319 #, fuzzy msgid "Save WAV..." msgstr "Speichere WAV..." -#: app/sample-editor.c:286 +#: app/sample-editor.c:321 #, fuzzy msgid "Save region as WAV..." msgstr "Speichere WAV..." -#: app/sample-editor.c:299 +#: app/sample-editor.c:334 msgid "Save WAV" msgstr "Speichere WAV" -#: app/sample-editor.c:309 +#: app/sample-editor.c:344 msgid "Save Region" msgstr "" -#: app/sample-editor.c:320 +#: app/sample-editor.c:355 msgid "Monitor" msgstr "Monitor" -#: app/sample-editor.c:326 +#: app/sample-editor.c:361 msgid "Volume Ramp" msgstr "LautstДrke" -#: app/sample-editor.c:336 +#: app/sample-editor.c:371 msgid "Zoom to selection" msgstr "Zoom in Auswahl" -#: app/sample-editor.c:342 +#: app/sample-editor.c:377 msgid "Show all" msgstr "Zeige alles" -#: app/sample-editor.c:348 +#: app/sample-editor.c:383 msgid "Zoom in (+50%)" msgstr "Zoom in (+50%)" -#: app/sample-editor.c:354 +#: app/sample-editor.c:389 msgid "Zoom out (-50%)" msgstr "Zoom out (-50%)" -#: app/sample-editor.c:360 +#: app/sample-editor.c:395 #, fuzzy msgid "Reverse" msgstr "Entfernen" -#: app/sample-editor.c:370 +#: app/sample-editor.c:405 msgid "Cut" msgstr "Ausschneiden" -#: app/sample-editor.c:376 +#: app/sample-editor.c:411 msgid "Remove" msgstr "Entfernen" -#: app/sample-editor.c:382 +#: app/sample-editor.c:417 msgid "Copy" msgstr "Kopieren" -#: app/sample-editor.c:388 +#: app/sample-editor.c:423 msgid "Paste" msgstr "EinfЭgen" -#: app/sample-editor.c:394 +#: app/sample-editor.c:429 #, fuzzy msgid "Clear Sample" msgstr "Lade Sample" -#: app/sample-editor.c:481 -#, c-format -msgid "Length: %d" -msgstr "LДnge: %d" +#: app/sample-editor.c:467 +#, fuzzy +msgid "(no selection)" +msgstr "Zoom in Auswahl" -#: app/sample-editor.c:1033 +#: app/sample-editor.c:1000 msgid "" msgstr "" -#: app/sample-editor.c:1117 +#: app/sample-editor.c:1076 msgid "Read error." msgstr "Lesefehler." -#: app/sample-editor.c:1233 +#: app/sample-editor.c:1181 #, fuzzy msgid "Load stereo sample" msgstr "Lade Sample" -#: app/sample-editor.c:1241 +#: app/sample-editor.c:1189 msgid "" "You have selected a stereo sample!\n" "(SoundTracker can only handle mono samples!)\n" @@ -1226,84 +1241,80 @@ "Please choose which channel to load:" msgstr "" -#: app/sample-editor.c:1252 +#: app/sample-editor.c:1200 #, fuzzy msgid "Left" msgstr "Links [%]:" -#: app/sample-editor.c:1258 +#: app/sample-editor.c:1206 msgid "Mix" msgstr "" -#: app/sample-editor.c:1264 +#: app/sample-editor.c:1212 #, fuzzy msgid "Right" msgstr "Rechts [%]:" -#: app/sample-editor.c:1303 +#: app/sample-editor.c:1251 msgid "Can't read sample" msgstr "Kann Sample nicht lesen" -#: app/sample-editor.c:1309 +#: app/sample-editor.c:1257 msgid "Sample is too long for current mixer module. Loading anyway." msgstr "Sample ist zu lang fЭr aktuelles Mixer-Modul. Lade trotzdem." -#: app/sample-editor.c:1323 +#: app/sample-editor.c:1271 #, fuzzy msgid "Can only handle 8 and 16 bit samples with up to 2 channels" msgstr "Kann nur mono- 8 und 16 Bit Samples verarbeiten" -#: app/sample-editor.c:1415 +#: app/sample-editor.c:1370 msgid "Nothing to save." msgstr "" -#: app/sample-editor.c:1442 +#: app/sample-editor.c:1397 msgid "OK" msgstr "OK" -#: app/sample-editor.c:1450 +#: app/sample-editor.c:1405 msgid "Start sampling" msgstr "Starte Sampling" -#: app/sample-editor.c:1485 app/sample-editor.c:1488 +#: app/sample-editor.c:1440 app/sample-editor.c:1443 msgid "Sampling Window" msgstr "Sampling-Fenster" -#: app/sample-editor.c:1588 +#: app/sample-editor.c:1543 msgid "" msgstr "" -#: app/sample-editor.c:1618 +#: app/sample-editor.c:1573 msgid "Recorded sample is too long for current mixer module. Using it anyway." msgstr "" "Aufgezeichnetes Sample ist zu lang fЭr aktuelles Mixer-Modul. Verwende es " "trotzdem." -#: app/sample-editor.c:1650 +#: app/sample-editor.c:1605 msgid "Normalize" msgstr "Normalisieren" -#: app/sample-editor.c:1651 +#: app/sample-editor.c:1606 msgid "Execute" msgstr "AusfЭhren" -#: app/sample-editor.c:1652 app/tips-dialog.c:165 -msgid "Close" -msgstr "Schlieъen" - -#: app/sample-editor.c:1661 app/sample-editor.c:1664 +#: app/sample-editor.c:1616 app/sample-editor.c:1619 msgid "Volume Ramping" msgstr "LautstДrke-Anpassung" -#: app/sample-editor.c:1681 +#: app/sample-editor.c:1636 msgid "Perform linear volume fade on Selection" msgstr "Lineare LautstДrkenverringerung auf Markierung" -#: app/sample-editor.c:1693 +#: app/sample-editor.c:1648 msgid "Left [%]:" msgstr "Links [%]:" -#: app/sample-editor.c:1698 +#: app/sample-editor.c:1653 msgid "Right [%]:" msgstr "Rechts [%]:" @@ -1436,71 +1447,67 @@ msgid "Transposition Tools" msgstr "Transpositions-Werkzeuge" -#: app/transposition.c:217 +#: app/transposition.c:218 msgid "Scope of the operation:" msgstr "Bereich der Anwendung:" -#: app/transposition.c:224 +#: app/transposition.c:225 msgid "Note Transposition" msgstr "Noten-Transposition" -#: app/transposition.c:254 +#: app/transposition.c:255 msgid "Instrument Changing" msgstr "Instrumentenwechsel" -#: app/transposition.c:269 +#: app/transposition.c:270 msgid "Instrument 1:" msgstr "Instrument 1:" -#: app/transposition.c:271 app/transposition.c:281 +#: app/transposition.c:272 app/transposition.c:282 msgid "Current instrument" msgstr "Aktuelles Instrument" -#: app/transposition.c:279 +#: app/transposition.c:280 msgid "Instrument 2:" msgstr "Instrument 2:" -#: app/xm.c:161 +#: app/xm.c:170 #, c-format msgid "Pattern length out of range: %d.\n" msgstr "PatternlДnge auъerhalb des Bereiches: %d.\n" -#: app/xm.c:441 app/xm.c:512 +#: app/xm.c:455 app/xm.c:526 #, c-format msgid "Invalid vibtype %d, using Sine.\n" msgstr "UngЭltiger vibtype %d, verwende Sinus.\n" -#: app/xm.c:472 +#: app/xm.c:486 msgid "File is no XI instrument." msgstr "Datei ist kein XI-Instrument." -#: app/xm.c:482 +#: app/xm.c:496 #, c-format msgid "Unknown XI version 0x%x\n" msgstr "Unbekannte XI-Version 0x%x\n" -#: app/xm.c:757 -msgid "No FastTracker XM and no supported MOD format!" -msgstr "Kein FastTracker XM und kein unterstЭtztes MOD-Format!" - -#: app/xm.c:771 app/xm.c:876 +#: app/xm.c:787 app/xm.c:901 msgid "Error while loading patterns." msgstr "Fehler beim Laden der Pattern." -#: app/xm.c:829 +#: app/xm.c:851 msgid "Can't open file" msgstr "Kann Datei nicht Жffnen" -#: app/xm.c:843 +#: app/xm.c:865 msgid "XM header length != 276. Maybe a pre-0.0.12 SoundTracker module? :-)\n" msgstr "" "XM-Header-LДnge != 276. Vielleicht ein pre-0.0.12 SoundTracker-Modul? :-)\n" -#: app/xm.c:882 +#: app/xm.c:907 msgid "Error while loading instruments." msgstr "Fehler beim Laden der Instrumente." -#: app/xm.c:893 +#: app/xm.c:918 #, c-format msgid "" "Module contains sample(s) that are too long for the current mixer.\n" @@ -1508,6 +1515,40 @@ msgstr "" "Modul enthДlt Sample(s), die zu lang fЭr den aktuellen Mixer sind..\n" "Maximale Sample-LДnge ist %d." + +#: app/xm.c:1234 +msgid "No FastTracker XM and no supported MOD format!" +msgstr "Kein FastTracker XM und kein unterstЭtztes MOD-Format!" + +#~ msgid "Master Reverb" +#~ msgstr "Master Reverb" + +#~ msgid "Playback Effects Configuration" +#~ msgstr "Konfiguration der Playback-Effekte" + +#, fuzzy +#~ msgid "_Playback Effects..." +#~ msgstr "_Playback-Effekte..." + +#, fuzzy +#~ msgid "/Settings/_Playback Effects..." +#~ msgstr "/Einstellungen/_Playback-Effekte..." + +#~ msgid "SelStart" +#~ msgstr "AuswAnf" + +#~ msgid "SelEnd" +#~ msgstr "AuswEnde" + +#, fuzzy +#~ msgid "Sel None" +#~ msgstr "RelNote" + +#~ msgid "Length: 0" +#~ msgstr "LДnge: 0" + +#~ msgid "Length: %d" +#~ msgstr "LДnge: %d" #~ msgid "Filter" #~ msgstr "Filter" Binary files soundtracker-0.3.10/po/ja.gmo and soundtracker-0.5.0/po/ja.gmo differ diff -urN soundtracker-0.3.10/po/ja.po soundtracker-0.5.0/po/ja.po --- soundtracker-0.3.10/po/ja.po Tue Jan 18 16:59:06 2000 +++ soundtracker-0.5.0/po/ja.po Fri Feb 11 15:16:14 2000 @@ -1,4 +1,4 @@ -# ja.po(0.3.9-1) for SoundTracker +# ja.po(0.3.10-0) for SoundTracker # Copyright (C) 1998-2000 Michael Krause . # Translators: Atsushi Yamagata , 1999, 2000. # Yuuki NINOMIYA , 1999, 2000. @@ -6,13 +6,13 @@ #, fuzzy msgid "" msgstr "" -"Project-Id-Version: SoundTracker 0.3.9\n" -"POT-Creation-Date: 2000-01-08 12:24+0100\n" -"PO-Revision-Date: 2000-01-14 10:14+09:00\n" +"Project-Id-Version: SoundTracker 0.3.10\n" +"POT-Creation-Date: 2000-01-22 15:32+0100\n" +"PO-Revision-Date: 2000-01-28 10:06+09:00\n" "Last-Translator: Atsushi Yamagata \n" +"MIME-Version: 1.0\n" "Content-Type: text/plain; charset=EUC-JP\n" "Content-Transfer-Encoding: 8-bit\n" -"MIME-Version: 1.0\n" #: app/audioconfig.c:55 msgid "Playback Output" @@ -105,7 +105,7 @@ "╔╣╔╕╔С╔и╫пно╓кбп╓╥╓фALSA╔г╔п╔╓╔╧(╔╚║╪╔и:%d║╒╔г╔п╔╓╔╧:%d)╓╛Ё╚╓╠╓ч╓╩╓С╓г╓╥╓©:\n" "%s" -#: app/drivers/esd-output.c:94 +#: app/drivers/esd-output.c:96 msgid "" "Note that the ESD output is unusable in\n" "interactive mode because of the latency added\n" @@ -117,7 +117,7 @@ "╓ю╓╣╓╓║ё╫ебГ╓й╨Н╤х╓к╓оOSS╓ДALSA╫п\n" "но╔в╔И╔╟╔╓╔С╓Р╩х╓ц╓ф╓╞╓ю╓╣╓╓║ё" -#: app/drivers/esd-output.c:159 +#: app/drivers/esd-output.c:161 #, c-format msgid "" "Couldn't connect to ESD for sound output:\n" @@ -130,7 +130,7 @@ msgid "no settings (yet), sorry!" msgstr "╓╧╓ъ╓ч╓╩╓С║╒(╓ч╓ю)юъдЙ╓╣╓Л╓ф╓╓╓ч╓╩╓С!" -#: app/drivers/file-output.c:161 app/sample-editor.c:1337 +#: app/drivers/file-output.c:161 app/sample-editor.c:1364 msgid "Can't open file for writing." msgstr "╫Я╓╜╧Ч╓ъ╓н╓©╓А╓к╔у╔║╔╓╔К╓╛Ё╚╓╠╓ч╓╩╓С║ё" @@ -181,11 +181,11 @@ msgid "Value" msgstr "цм" -#: app/envelope-box.c:749 +#: app/envelope-box.c:749 app/playlist.c:301 msgid "Insert" msgstr "ачфЧ" -#: app/envelope-box.c:755 +#: app/envelope-box.c:755 app/playlist.c:307 msgid "Delete" msgstr "╨О╫Э" @@ -215,11 +215,11 @@ msgid "Loop" msgstr "╔К║╪╔в" -#: app/envelope-box.c:876 app/sample-editor.c:221 +#: app/envelope-box.c:876 app/sample-editor.c:222 msgid "Start" msgstr "Ё╚╩о" -#: app/envelope-box.c:877 app/sample-editor.c:222 +#: app/envelope-box.c:877 app/sample-editor.c:223 msgid "End" msgstr "╫╙н╩" @@ -235,7 +235,7 @@ msgid "Render WAV" msgstr "WAV╔Л╔С╔ю" -#: app/file-operations.c:148 app/sample-editor.c:287 +#: app/file-operations.c:148 app/sample-editor.c:290 msgid "Load Sample" msgstr "╔╣╔С╔в╔К║╕╔М║╪╔и" @@ -307,7 +307,7 @@ msgid "Question" msgstr "╪алД" -#: app/gui-subs.c:447 app/sample-editor.c:1243 app/sample-editor.c:1389 +#: app/gui-subs.c:447 app/sample-editor.c:1277 app/sample-editor.c:1457 msgid "Cancel" msgstr "╪Х╬ц" @@ -335,55 +335,55 @@ msgid "Are you sure you want to overwrite the file?" msgstr "╔у╔║╔╓╔К╓Р╬Е╫Я╓╜╓╥╓©╓╓╓н╓оЁн╓╚╓г╓╧╓╚?" -#: app/gui.c:1114 +#: app/gui.c:1119 msgid "Load XM..." msgstr "XM╔М║╪╔и..." -#: app/gui.c:1116 +#: app/gui.c:1121 msgid "Save XM..." msgstr "XMйщб╦..." -#: app/gui.c:1119 +#: app/gui.c:1124 msgid "Render module as WAV..." msgstr "WAV╓х╓╥╓ф╔Б╔╦╔Е║╪╔К╓Р╔Л╔С╔ю╔Й╔С╔╟╓╧╓К..." -#: app/gui.c:1171 +#: app/gui.c:1176 msgid "Play Song" msgstr "╤й╨фю╦" -#: app/gui.c:1177 +#: app/gui.c:1182 msgid "Play Pattern" msgstr "╔я╔©║╪╔С╨фю╦" -#: app/gui.c:1183 +#: app/gui.c:1188 msgid "Stop" msgstr "дД╩ъ" -#: app/gui.c:1202 +#: app/gui.c:1207 msgid "Number of Channels:" msgstr "╔а╔Ц╔С╔м╔К©Т:" -#: app/gui.c:1218 +#: app/gui.c:1223 app/playlist.c:294 msgid "Pattern" msgstr "╔я╔©║╪╔С" -#: app/gui.c:1234 +#: app/gui.c:1239 msgid "PatLength" msgstr "╔я╔©║╪╔Сд╧" -#: app/gui.c:1326 +#: app/gui.c:1331 msgid "Octave" msgstr "╔╙╔╞╔©║╪╔ж" -#: app/gui.c:1334 +#: app/gui.c:1339 msgid "Jump" msgstr "╔╦╔Ц╔С╔в" -#: app/gui.c:1342 +#: app/gui.c:1347 msgid "Instr" msgstr "Ёз╢О" -#: app/gui.c:1357 +#: app/gui.c:1362 msgid "Sample" msgstr "╔╣╔С╔в╔К" @@ -436,12 +436,12 @@ msgstr "╔я╔С║╕╔╗╔С╔ы╔М║╪╔в" #: app/instrument-editor.c:250 -msgid "Load Instrument.." -msgstr "Ёз╢О╔М║╪╔и.." +msgid "Load Instrument..." +msgstr "Ёз╢О╔М║╪╔и..." #: app/instrument-editor.c:252 -msgid "Save Instrument.." -msgstr "Ёз╢Ойщб╦.." +msgid "Save Instrument..." +msgstr "Ёз╢Ойщб╦..." #: app/instrument-editor.c:254 msgid "Load XI" @@ -468,8 +468,8 @@ msgstr "ачфЧ╓╣╓Л╓©╔╜║╪╓оFastTracker╔Б╔╦╔Е║╪╔К╓к╢ь╓╧╓Кфцйл╓й╔╜║╪╔╙╔у╡╩иД╓г╓╧║ё" #: app/keys.c:135 -msgid "Upper Octave Keys.." -msgstr "╔╙╔╞╔©║╪╔ж╬Е╓н╔╜║╪.." +msgid "Upper Octave Keys..." +msgstr "╔╙╔╞╔©║╪╔ж╬Е╓н╔╜║╪..." #: app/keys.c:136 msgid "" @@ -481,8 +481,8 @@ "╔╜║╪╓о║╒╬ЕиТ╓н©Т╩З╔╜║╪╓н╧т╓Р╢ч╓С╓г║╒╔т╔╒╔н╓н╦╟хв╓н╓Х╓╕╓кйб╓С╓г╓╓╓ч╓╧║ё" #: app/keys.c:142 -msgid "Lower Octave Keys.." -msgstr "╔╙╔╞╔©║╪╔ж╡╪╓н╔╜║╪.." +msgid "Lower Octave Keys..." +msgstr "╔╙╔╞╔©║╪╔ж╡╪╓н╔╜║╪..." #: app/keys.c:143 msgid "" @@ -494,8 +494,8 @@ "╓г╓╧║ё╩д╓Й╓н╔╜║╪╓о║╒╬ЕиТ╓н╧т╓Р╢ч╓С╓г║╒╔т╔╒╔н╓н╦╟хв╓н╓Х╓╕╓кйб╓С╓г╓╓╓ч╓╧║ё" #: app/keys.c:149 -msgid "Other Keys.." -msgstr "б╬╓н╔╜║╪.." +msgid "Other Keys..." +msgstr "б╬╓н╔╜║╪..." #: app/keys.c:150 msgid "Various other keys" @@ -559,11 +559,11 @@ "юъдЙ╔А╔к╔Е║╪╓н╔╜║╪╔э║╪╔июъдЙ╔ю╔╓╔╒╔М╔╟╓Р╩хмя\n" "╓╥╓ф╓╞╓ю╓╣╓╓║ё" -#: app/menubar.c:93 +#: app/menubar.c:95 msgid "Ok" msgstr "н╩╡Р" -#: app/menubar.c:129 +#: app/menubar.c:131 msgid "" "Are you sure you want to do this?\n" "All changes will be lost!" @@ -571,7 +571,7 @@ "╓Ё╓╕╓╥╓©╓╓╓н╓оЁн╓╚╓г╓╧╓╚?\n" "а╢╓ф╓нйя╧╧╓╛╪╨╓О╓Л╓ч╓╧!" -#: app/menubar.c:151 +#: app/menubar.c:153 msgid "" "Are you sure you want to quit?\n" "All changes will be lost!" @@ -579,410 +579,398 @@ "╫╙н╩╓╥╓©╓╓╓н╓оЁн╓╚╓г╓╧╓╚?\n" "а╢╓ф╓нйя╧╧╓╛╪╨╓О╓Л╓ч╓╧!" -#: app/menubar.c:222 +#: app/menubar.c:224 msgid "_Open..." msgstr "Ё╚╓╞(_O)..." -#: app/menubar.c:224 +#: app/menubar.c:226 msgid "Save _as..." msgstr "йщб╦(_a)..." -#: app/menubar.c:230 +#: app/menubar.c:232 msgid "Save Module as _WAV..." msgstr "_WAV╓х╓╥╓ф╔Б╔╦╔Е║╪╔К╓Рйщб╦..." -#: app/menubar.c:235 +#: app/menubar.c:237 msgid "_Quit" msgstr "╫╙н╩(_Q)" -#: app/menubar.c:242 +#: app/menubar.c:244 msgid "Clear _All" msgstr "а╢╓ф╬ц╣Н(_A)" -#: app/menubar.c:244 +#: app/menubar.c:246 msgid "Clear _Patterns Only" msgstr "╔я╔©║╪╔С╓н╓ъ╬ц╣Н(_P)" -#: app/menubar.c:246 +#: app/menubar.c:248 msgid "_Optimize Module" msgstr "╔Б╔╦╔Е║╪╔К╨ге╛╡╫(_O)" -#: app/menubar.c:253 app/menubar.c:264 app/menubar.c:282 +#: app/menubar.c:255 app/menubar.c:266 app/menubar.c:284 msgid "C_ut" msgstr "юз╪Х(_u)" -#: app/menubar.c:255 app/menubar.c:266 app/menubar.c:284 +#: app/menubar.c:257 app/menubar.c:268 app/menubar.c:286 msgid "_Copy" msgstr "╔Ё╔т║╪(_C)" -#: app/menubar.c:257 app/menubar.c:268 app/menubar.c:286 +#: app/menubar.c:259 app/menubar.c:270 app/menubar.c:288 msgid "_Paste" msgstr "е╫иу(_P)" -#: app/menubar.c:270 +#: app/menubar.c:272 msgid "_Insert" msgstr "ачфЧ(_I)" -#: app/menubar.c:272 +#: app/menubar.c:274 msgid "_Delete" msgstr "╨О╫Э(_D)" -#: app/menubar.c:280 +#: app/menubar.c:282 msgid "_Mark" msgstr "╔ч║╪╔╞(_M)" -#: app/menubar.c:293 +#: app/menubar.c:295 msgid "_Jazz Edit Mode" msgstr "_Jazzйт╫╦╔Б║╪╔и" -#: app/menubar.c:298 +#: app/menubar.c:300 msgid "Transp_osition..." msgstr "╟эд╢(_o)..." -#: app/menubar.c:303 app/menubar.c:388 +#: app/menubar.c:305 app/menubar.c:390 msgid "_Pattern" msgstr "╔я╔©║╪╔С(_P)" -#: app/menubar.c:304 +#: app/menubar.c:306 msgid "_Track" msgstr "╔х╔И╔ц╔╞(_T)" -#: app/menubar.c:305 +#: app/menubar.c:307 msgid "_Selection" msgstr "а╙бР(_S)" -#: app/menubar.c:311 +#: app/menubar.c:313 msgid "_Find Unused Pattern" msgstr "л╓╩хмя╔я╔©║╪╔С╦║╨В(_F)" -#: app/menubar.c:313 +#: app/menubar.c:315 msgid "_Copy Current to Unused Pattern" msgstr "л╓╩хмя╔я╔©║╪╔С╓к╔╚╔Л╔С╔х╓Р╔Ё╔т║╪(_C)" -#: app/menubar.c:315 +#: app/menubar.c:317 msgid "C_lear Unused Patterns" msgstr "л╓╩хмя╔я╔©║╪╔С╬ц╣Н(_l)" -#: app/menubar.c:317 +#: app/menubar.c:319 msgid "_Pack Patterns" msgstr "╔я╔©║╪╔С║╕╔я╔ц╔╞(_P)" -#: app/menubar.c:324 +#: app/menubar.c:326 msgid "_Load XI..." msgstr "XI╔М║╪╔и(_L)..." -#: app/menubar.c:326 +#: app/menubar.c:328 msgid "_Save XI..." msgstr "XIйщб╦(_S)..." -#: app/menubar.c:331 +#: app/menubar.c:333 msgid "_Clear Current" msgstr "╔╚╔Л╔С╔х╬ц╣Н(_C)" -#: app/menubar.c:336 +#: app/menubar.c:338 msgid "_Delete Unused Instruments" msgstr "л╓╩хмяЁз╢О╨О╫Э(_D)" -#: app/menubar.c:344 +#: app/menubar.c:346 msgid "Display _Oscilloscopes" msgstr "╔╙╔╥╔М╔╧╔Ё║╪╔ви╫╪╗(_O)" -#: app/menubar.c:346 +#: app/menubar.c:348 msgid "Use _Backing Store" msgstr "╔п╔ц╔╜╔С╔╟║╕╔╧╔х╔╒╩хмя(_B)" -#: app/menubar.c:351 +#: app/menubar.c:353 msgid "_Keyboard Configuration..." msgstr "╔╜║╪╔э║╪╔июъдЙ(_K)..." -#: app/menubar.c:353 +#: app/menubar.c:355 msgid "_Audio Configuration..." msgstr "╔╙║╪╔г╔ё╔╙юъдЙ(_A)..." -#: app/menubar.c:355 +#: app/menubar.c:357 msgid "_Playback Effects..." msgstr "╨фю╦╦З╡л(_P)..." -#: app/menubar.c:357 +#: app/menubar.c:359 msgid "_GUI Configuration..." msgstr "GUIюъдЙ(_G)..." -#: app/menubar.c:362 +#: app/menubar.c:364 msgid "_Save Settings now" msgstr "юъдЙ╓Р╨ёйщб╦(_S)" -#: app/menubar.c:364 +#: app/menubar.c:366 msgid "Save Settings on _Exit" msgstr "╫╙н╩╩Ч╓кюъдЙ╓Рйщб╦(_E)" -#: app/menubar.c:371 +#: app/menubar.c:373 msgid "_About..." msgstr "╬ПйС(_A)..." -#: app/menubar.c:376 +#: app/menubar.c:378 msgid "Show _Tips..." msgstr "╣╩╓ни╫╪╗(_T)..." -#: app/menubar.c:378 +#: app/menubar.c:380 msgid "_XM Effects..." msgstr "_XM╦З╡л..." -#: app/menubar.c:385 +#: app/menubar.c:387 msgid "_File" msgstr "╔у╔║╔╓╔К(_F)" -#: app/menubar.c:386 +#: app/menubar.c:388 msgid "_Module" msgstr "╔Б╔╦╔Е║╪╔К(_M)" -#: app/menubar.c:387 +#: app/menubar.c:389 msgid "_Edit" msgstr "йт╫╦(_E)" -#: app/menubar.c:389 +#: app/menubar.c:391 msgid "_Instrument" msgstr "Ёз╢О(_I)" -#: app/menubar.c:390 +#: app/menubar.c:392 msgid "_Settings" msgstr "юъдЙ(_S)" -#: app/menubar.c:391 +#: app/menubar.c:393 msgid "_Help" msgstr "╔ь╔К╔в(_H)" -#: app/menubar.c:421 +#: app/menubar.c:423 msgid "/_File" msgstr "/╔у╔║╔╓╔К" -#: app/menubar.c:422 +#: app/menubar.c:424 msgid "/File/_Open..." msgstr "/╔у╔║╔╓╔К/Ё╚╓╞(_O)..." -#: app/menubar.c:423 +#: app/menubar.c:425 msgid "/File/Save _as..." msgstr "/╔у╔║╔╓╔К/йщб╦(_a)..." -#: app/menubar.c:424 app/menubar.c:426 +#: app/menubar.c:426 app/menubar.c:428 msgid "/File/-" msgstr "/╔у╔║╔╓╔К/-" -#: app/menubar.c:425 +#: app/menubar.c:427 msgid "/File/Save Module as _WAV..." msgstr "/╔у╔║╔╓╔К/_WAV╓х╓╥╓ф╔Б╔╦╔Е║╪╔К╓Рйщб╦..." -#: app/menubar.c:427 +#: app/menubar.c:429 msgid "/File/_Quit" msgstr "/╔у╔║╔╓╔К/╫╙н╩(_Q)" -#: app/menubar.c:428 +#: app/menubar.c:430 msgid "/_Module" msgstr "/╔Б╔╦╔Е║╪╔К" -#: app/menubar.c:429 +#: app/menubar.c:431 msgid "/Module/Clear _All" msgstr "/╔Б╔╦╔Е║╪╔К/а╢╓ф╬ц╣Н(_A)" -#: app/menubar.c:430 +#: app/menubar.c:432 msgid "/Module/Clear _Patterns Only" msgstr "/╔Б╔╦╔Е║╪╔К/╔я╔©║╪╔С╓н╓ъ╬ц╣Н(_P)" -#: app/menubar.c:431 +#: app/menubar.c:433 msgid "/Module/_Optimize Module" msgstr "/╔Б╔╦╔Е║╪╔К/╔Б╔╦╔Е║╪╔К╨ге╛╡╫(_O)" -#: app/menubar.c:432 +#: app/menubar.c:434 msgid "/_Edit" msgstr "/йт╫╦" -#: app/menubar.c:433 +#: app/menubar.c:435 msgid "/Edit/_Jazz Edit Mode" msgstr "/йт╫╦/_Jazzйт╫╦╔Б║╪╔и" -#: app/menubar.c:434 app/menubar.c:436 +#: app/menubar.c:436 app/menubar.c:438 msgid "/Edit/-" msgstr "/йт╫╦/-" -#: app/menubar.c:435 +#: app/menubar.c:437 msgid "/Edit/_Transposition..." msgstr "/йт╫╦/╟эд╢(_T)..." -#: app/menubar.c:437 +#: app/menubar.c:439 msgid "/Edit/_Pattern" msgstr "/йт╫╦/╔я╔©║╪╔С" -#: app/menubar.c:438 +#: app/menubar.c:440 msgid "/Edit/Pattern/C_ut" msgstr "/йт╫╦/╔я╔©║╪╔С/юз╪Х(_u)" -#: app/menubar.c:439 +#: app/menubar.c:441 msgid "/Edit/Pattern/_Copy" msgstr "/йт╫╦/╔я╔©║╪╔С/╔Ё╔т║╪(_C)" -#: app/menubar.c:440 +#: app/menubar.c:442 msgid "/Edit/Pattern/_Paste" msgstr "/йт╫╦/╔я╔©║╪╔С/е╫иу(_P)" -#: app/menubar.c:441 +#: app/menubar.c:443 msgid "/Edit/_Track" msgstr "/йт╫╦/╔х╔И╔ц╔╞" -#: app/menubar.c:442 +#: app/menubar.c:444 msgid "/Edit/Track/C_ut" msgstr "/йт╫╦/╔х╔И╔ц╔╞/юз╪Х(_u)" -#: app/menubar.c:443 +#: app/menubar.c:445 msgid "/Edit/Track/_Copy" msgstr "/йт╫╦/╔х╔И╔ц╔╞/╔Ё╔т║╪(_C)" -#: app/menubar.c:444 +#: app/menubar.c:446 msgid "/Edit/Track/_Paste" msgstr "/йт╫╦/╔х╔И╔ц╔╞/е╫иу(_P)" -#: app/menubar.c:445 +#: app/menubar.c:447 msgid "/Edit/Track/_Insert" msgstr "/йт╫╦/╔х╔И╔ц╔╞/ачфЧ(_I)" -#: app/menubar.c:446 +#: app/menubar.c:448 msgid "/Edit/Track/_Delete" msgstr "/йт╫╦/╔х╔И╔ц╔╞/╨О╫Э(_D)" -#: app/menubar.c:447 +#: app/menubar.c:449 msgid "/Edit/_Selection" msgstr "/йт╫╦/а╙бР" -#: app/menubar.c:448 +#: app/menubar.c:450 msgid "/Edit/Selection/_Mark" msgstr "/йт╫╦/а╙бР/╔ч║╪╔╞(_M)" -#: app/menubar.c:449 +#: app/menubar.c:451 msgid "/Edit/Selection/C_ut" msgstr "/йт╫╦/а╙бР/юз╪Х(_u)" -#: app/menubar.c:450 +#: app/menubar.c:452 msgid "/Edit/Selection/_Copy" msgstr "/йт╫╦/а╙бР/╔Ё╔т║╪(_C)" -#: app/menubar.c:451 +#: app/menubar.c:453 msgid "/Edit/Selection/_Paste" msgstr "/йт╫╦/а╙бР/е╫иу(_P)" -#: app/menubar.c:452 +#: app/menubar.c:454 msgid "/_Pattern" msgstr "/╔я╔©║╪╔С" -#: app/menubar.c:453 +#: app/menubar.c:455 msgid "/Pattern/_Find Unused Pattern" msgstr "/╔я╔©║╪╔С/л╓╩хмя╔я╔©║╪╔С╦║╨В(_F)" -#: app/menubar.c:454 +#: app/menubar.c:456 msgid "/Pattern/_Copy Current to Unused Pattern" msgstr "/╔я╔©║╪╔С/л╓╩хмя╔я╔©║╪╔С╓к╔╚╔Л╔С╔х╓Р╔Ё╔т║╪(_C)" -#: app/menubar.c:455 +#: app/menubar.c:457 msgid "/Pattern/C_lear Unused Patterns" msgstr "/╔я╔©║╪╔С/л╓╩хмя╔я╔©║╪╔С╬ц╣Н(_l)" -#: app/menubar.c:456 +#: app/menubar.c:458 msgid "/Pattern/_Pack Patterns" msgstr "/╔я╔©║╪╔С/╔я╔©║╪╔С║╕╔я╔ц╔╞(_P)" -#: app/menubar.c:457 +#: app/menubar.c:459 msgid "/_Instrument" msgstr "/Ёз╢О" -#: app/menubar.c:458 +#: app/menubar.c:460 msgid "/Instrument/_Load XI..." msgstr "/Ёз╢О/XI╔М║╪╔и(_L)..." -#: app/menubar.c:459 +#: app/menubar.c:461 msgid "/Instrument/_Save XI..." msgstr "/Ёз╢О/XIйщб╦(_S)..." -#: app/menubar.c:460 app/menubar.c:462 +#: app/menubar.c:462 app/menubar.c:464 msgid "/Instrument/-" msgstr "/Ёз╢О/-" -#: app/menubar.c:461 +#: app/menubar.c:463 msgid "/Instrument/_Clear Current" msgstr "/Ёз╢О/╔╚╔Л╔С╔х╬ц╣Н(_C)" -#: app/menubar.c:463 +#: app/menubar.c:465 msgid "/Instrument/_Delete Unused Instruments" msgstr "/Ёз╢О/л╓╩хмяЁз╢О╨О╫Э(_D)" -#: app/menubar.c:464 +#: app/menubar.c:466 msgid "/_Settings" msgstr "/юъдЙ" -#: app/menubar.c:465 +#: app/menubar.c:467 msgid "/Settings/Display _Oscilloscopes" msgstr "/юъдЙ/╔╙╔╥╔М╔╧╔Ё║╪╔ви╫╪╗(_O)" -#: app/menubar.c:466 +#: app/menubar.c:468 msgid "/Settings/Use _Backing Store" msgstr "/юъдЙ/╔п╔ц╔╜╔С╔╟║╕╔╧╔х╔╒╩хмя(_B)" -#: app/menubar.c:467 app/menubar.c:472 +#: app/menubar.c:469 app/menubar.c:474 msgid "/Settings/-" msgstr "/юъдЙ/-" -#: app/menubar.c:468 +#: app/menubar.c:470 msgid "/Settings/_Keyboard Configuration..." msgstr "/юъдЙ/╔╜║╪╔э║╪╔июъдЙ(_K)..." -#: app/menubar.c:469 +#: app/menubar.c:471 msgid "/Settings/_Audio Configuration..." msgstr "/юъдЙ/╔╙║╪╔г╔ё╔╙юъдЙ(_A)..." -#: app/menubar.c:470 +#: app/menubar.c:472 msgid "/Settings/_Playback Effects..." msgstr "/юъдЙ/╨фю╦╦З╡л(_P)..." -#: app/menubar.c:471 +#: app/menubar.c:473 msgid "/Settings/_GUI Configuration..." msgstr "/юъдЙ/GUIюъдЙ(_G)..." -#: app/menubar.c:473 +#: app/menubar.c:475 msgid "/Settings/_Save Settings now" msgstr "/юъдЙ/юъдЙ╓Р╨ёйщб╦(_S)" -#: app/menubar.c:474 +#: app/menubar.c:476 msgid "/Settings/Save Settings on _Exit" msgstr "/юъдЙ/╫╙н╩╩Ч╓кюъдЙ╓Рйщб╦(_E)" -#: app/menubar.c:475 +#: app/menubar.c:477 msgid "/_Help" msgstr "/╔ь╔К╔в" -#: app/menubar.c:476 +#: app/menubar.c:478 msgid "/Help/_About..." msgstr "/╔ь╔К╔в/╬ПйС(_A)..." -#: app/menubar.c:477 +#: app/menubar.c:479 msgid "/Help/-" msgstr "/╔ь╔К╔в/-" -#: app/menubar.c:478 +#: app/menubar.c:480 msgid "/Help/Show _Tips..." msgstr "/╔ь╔К╔в/╣╩╓ни╫╪╗(_T)..." -#: app/menubar.c:479 +#: app/menubar.c:481 msgid "/Help/_XM Effects..." msgstr "/╔ь╔К╔в/_XM╦З╡л..." -#: app/menubar.c:494 -msgid "/Settings/Display Oscilloscopes" -msgstr "/юъдЙ/╔╙╔╥╔М╔╧╔Ё║╪╔ви╫╪╗(O)" - -#: app/menubar.c:495 -msgid "/Settings/Use Backing Store" -msgstr "/юъдЙ/╔п╔ц╔╜╔С╔╟║╕╔╧╔х╔╒╩хмя(B)" - -#: app/menubar.c:496 -msgid "/Settings/Save Settings on Exit" -msgstr "/юъдЙ/╫╙н╩╩Ч╓кюъдЙ╓Рйщб╦(E)" - #: app/module-info.c:116 msgid "Instrument Name" msgstr "Ёз╢Ол╬" @@ -999,7 +987,7 @@ msgid "Linear" msgstr "юЧ╥©" -#: app/module-info.c:118 app/sample-editor.c:181 +#: app/module-info.c:118 app/sample-editor.c:182 msgid "Amiga" msgstr "Amiga" @@ -1019,6 +1007,18 @@ msgid "ProTracker Mode" msgstr "ProTracker╔Б║╪╔и" +#: app/playlist.c:292 +msgid "Song length" +msgstr "╤йд╧" + +#: app/playlist.c:293 +msgid "Current pos" +msgstr "╔╚╔Л╔С╔х╟лцж" + +#: app/playlist.c:295 +msgid "Restart pos" +msgstr "╨фЁ╚╩о╟лцж" + #: app/preferences.c:58 msgid "" "A directory called '.soundtracker' has been created in your\n" @@ -1027,144 +1027,148 @@ "юъдЙ╔у╔║╔╓╔К╓Р╣╜╡╠╓╧╓К╓©╓А║╒╓╒╓й╓©╓н╔ш║╪╔Ю║╕╔г╔ё╔Л╔╞╔х╔Й╓к\n" "╔г╔ё╔Л╔╞╔х╔Й'.soundtracker'╓╛ю╦ю╝╓╣╓Л╓ч╓╧║ё\n" -#: app/sample-editor.c:180 +#: app/sample-editor.c:181 msgid "No loop" msgstr "╔К║╪╔вл╣╓╥" -#: app/sample-editor.c:182 +#: app/sample-editor.c:183 msgid "PingPong" msgstr "╔т╔С╔щ╔С" -#: app/sample-editor.c:186 +#: app/sample-editor.c:187 msgid "8 bits" msgstr "8╔с╔ц╔х" -#: app/sample-editor.c:187 +#: app/sample-editor.c:188 msgid "16 bits" msgstr "16╔с╔ц╔х" -#: app/sample-editor.c:193 +#: app/sample-editor.c:194 msgid "Sample Editor" msgstr "╔╣╔С╔в╔Кйт╫╦" -#: app/sample-editor.c:233 +#: app/sample-editor.c:234 msgid "Volume" msgstr "╡╩нл" -#: app/sample-editor.c:234 +#: app/sample-editor.c:235 msgid "Panning" msgstr "╔я╔С" -#: app/sample-editor.c:235 +#: app/sample-editor.c:236 msgid "Finetune" msgstr "хЫд╢ю╟" -#: app/sample-editor.c:246 +#: app/sample-editor.c:247 msgid "SelStart" msgstr "а╙бР╩оею" -#: app/sample-editor.c:247 +#: app/sample-editor.c:248 msgid "SelEnd" msgstr "а╙бР╫╙ею" -#: app/sample-editor.c:255 +#: app/sample-editor.c:256 msgid "Sel None" msgstr "л╣а╙бР" -#: app/sample-editor.c:261 +#: app/sample-editor.c:262 msgid "Sel All" msgstr "а╢а╙бР" -#: app/sample-editor.c:267 +#: app/sample-editor.c:268 msgid "RelNote" msgstr "Relnote" -#: app/sample-editor.c:268 +#: app/sample-editor.c:269 msgid "Length: 0" msgstr "д╧╓╣: 0" -#: app/sample-editor.c:281 -msgid "Load Sample.." -msgstr "╔╣╔С╔в╔К║╕╔М║╪╔и.." - -#: app/sample-editor.c:283 -msgid "Save WAV.." -msgstr "WAVйщб╦.." +#: app/sample-editor.c:282 +msgid "Load Sample..." +msgstr "╔╣╔С╔в╔К║╕╔М║╪╔и..." + +#: app/sample-editor.c:284 +msgid "Save WAV..." +msgstr "WAVйщб╦..." + +#: app/sample-editor.c:286 +msgid "Save region as WAV..." +msgstr "WAV╓х╓╥╓фхо╟ойщб╦..." -#: app/sample-editor.c:296 +#: app/sample-editor.c:299 msgid "Save WAV" msgstr "WAVйщб╦" -#: app/sample-editor.c:306 -msgid "Clear Sample" -msgstr "╔╣╔С╔в╔К╬ц╣Н" +#: app/sample-editor.c:309 +msgid "Save Region" +msgstr "хо╟ойщб╦" -#: app/sample-editor.c:312 +#: app/sample-editor.c:320 msgid "Monitor" msgstr "╔Б╔к╔©" -#: app/sample-editor.c:318 +#: app/sample-editor.c:326 msgid "Volume Ramp" msgstr "Volume Ramp" -#: app/sample-editor.c:328 +#: app/sample-editor.c:336 msgid "Zoom to selection" msgstr "а╙бРиТй╛ЁхбГ" -#: app/sample-editor.c:334 +#: app/sample-editor.c:342 msgid "Show all" msgstr "а╢╓фи╫╪╗" -#: app/sample-editor.c:340 +#: app/sample-editor.c:348 msgid "Zoom in (+50%)" msgstr "ЁхбГ(+50%)" -#: app/sample-editor.c:346 +#: app/sample-editor.c:354 msgid "Zoom out (-50%)" msgstr "╫л╬╝(-50%)" -#: app/sample-editor.c:352 +#: app/sample-editor.c:360 msgid "Reverse" msgstr "╔Й╔п║╪╔╧" -#: app/sample-editor.c:362 +#: app/sample-editor.c:370 msgid "Cut" msgstr "юз╪Х" -#: app/sample-editor.c:368 +#: app/sample-editor.c:376 msgid "Remove" msgstr "╟эф╟" -#: app/sample-editor.c:374 +#: app/sample-editor.c:382 msgid "Copy" msgstr "╔Ё╔т║╪" -#: app/sample-editor.c:380 +#: app/sample-editor.c:388 msgid "Paste" msgstr "е╫иу" -#: app/sample-editor.c:386 -msgid "Filter" -msgstr "╔у╔ё╔К╔©" +#: app/sample-editor.c:394 +msgid "Clear Sample" +msgstr "╔╣╔С╔в╔К╬ц╣Н" -#: app/sample-editor.c:473 +#: app/sample-editor.c:481 #, c-format msgid "Length: %d" msgstr "д╧╓╣: %d" -#: app/sample-editor.c:999 +#: app/sample-editor.c:1033 msgid "" msgstr "<╨ёе╫иу╓╠╓╣╓Л╓ч╓╥╓©>" -#: app/sample-editor.c:1083 +#: app/sample-editor.c:1117 msgid "Read error." msgstr "фи╓ъ╧Ч╓ъ╔╗╔И║╪║ё" -#: app/sample-editor.c:1199 +#: app/sample-editor.c:1233 msgid "Load stereo sample" msgstr "╔╧╔ф╔Л╔╙║╕╔╣╔С╔в╔К║╕╔М║╪╔и" -#: app/sample-editor.c:1207 +#: app/sample-editor.c:1241 msgid "" "You have selected a stereo sample!\n" "(SoundTracker can only handle mono samples!)\n" @@ -1176,79 +1180,83 @@ "\n" "╔М║╪╔и╓╧╓К╓©╓А╓н╔а╔Ц╔С╔м╔К╓Ра╙╓С╓г╓╞╓ю╓╣╓╓:" -#: app/sample-editor.c:1218 +#: app/sample-editor.c:1252 msgid "Left" msgstr "╨╦" -#: app/sample-editor.c:1224 +#: app/sample-editor.c:1258 msgid "Mix" msgstr "╔ъ╔ц╔╞╔╧" -#: app/sample-editor.c:1230 +#: app/sample-editor.c:1264 msgid "Right" msgstr "╠╕" -#: app/sample-editor.c:1269 +#: app/sample-editor.c:1303 msgid "Can't read sample" msgstr "╔╣╔С╔в╔К╓╛фи╓ъ╧Ч╓А╓ч╓╩╓С" -#: app/sample-editor.c:1275 +#: app/sample-editor.c:1309 msgid "Sample is too long for current mixer module. Loading anyway." msgstr "" "╔╣╔С╔в╔К╓╛╦╫╨ъ╓н╔ъ╔╜╔╣║╕╔Б╔╦╔Е║╪╔К╓к╓од╧╡А╓╝╓ч╓╧║ё\n" "╓х╓к╓╚╓╞╔М║╪╔и╓╥╓ч╓╧║ё" -#: app/sample-editor.c:1289 +#: app/sample-editor.c:1323 msgid "Can only handle 8 and 16 bit samples with up to 2 channels" msgstr "2╔а╔Ц╔С╔м╔К╓ч╓г╓г 8║╒16╔с╔ц╔х║╕╔╣╔С╔в╔К╓н╓ъ╫ХмЩ╓г╓╜╓ч╓╧" -#: app/sample-editor.c:1374 +#: app/sample-editor.c:1415 +msgid "Nothing to save." +msgstr "╡©╓Бйщб╦╓╥╓й╓╓║ё" + +#: app/sample-editor.c:1442 msgid "OK" msgstr "н╩╡Р" -#: app/sample-editor.c:1382 +#: app/sample-editor.c:1450 msgid "Start sampling" msgstr "╔╣╔С╔в╔Й╔С╔╟Ё╚╩о" -#: app/sample-editor.c:1417 app/sample-editor.c:1420 +#: app/sample-editor.c:1485 app/sample-editor.c:1488 msgid "Sampling Window" msgstr "╔╣╔С╔в╔Й╔С╔╟║╕╔╕╔ё╔С╔и╔╕" -#: app/sample-editor.c:1520 +#: app/sample-editor.c:1588 msgid "" msgstr "<╨ё╔╣╔С╔в╔Й╔С╔╟╓╥╓ч╓╥╓©>" -#: app/sample-editor.c:1550 +#: app/sample-editor.c:1618 msgid "Recorded sample is too long for current mixer module. Using it anyway." msgstr "" "о©╡╩╓╥╓©╔╣╔С╔в╔К╓╛╦╫╨ъ╓н╔ъ╔╜╔╣║╕╔Б╔╦╔Е║╪╔К╓к╓од╧╡А╓╝╓ч╓╧║ё\n" "╓х╓к╓╚╓╞╓╫╓Л╓Р╩х╓╓╓ч╓╧║ё" -#: app/sample-editor.c:1582 +#: app/sample-editor.c:1650 msgid "Normalize" msgstr "╣╛Ёй╡╫" -#: app/sample-editor.c:1583 +#: app/sample-editor.c:1651 msgid "Execute" msgstr "╪б╧т" -#: app/sample-editor.c:1584 app/tips-dialog.c:165 +#: app/sample-editor.c:1652 app/tips-dialog.c:165 msgid "Close" msgstr "йд╓╦╓К" -#: app/sample-editor.c:1593 app/sample-editor.c:1596 +#: app/sample-editor.c:1661 app/sample-editor.c:1664 msgid "Volume Ramping" msgstr "Volume Ramping" -#: app/sample-editor.c:1613 +#: app/sample-editor.c:1681 msgid "Perform linear volume fade on Selection" msgstr "а╙бР╩Ч╓к╡╩нл╓РюЧ╥©╓к╔у╔╖║╪╔и╓╧╓К" -#: app/sample-editor.c:1625 +#: app/sample-editor.c:1693 msgid "Left [%]:" msgstr "╨╦ [%]:" -#: app/sample-editor.c:1630 +#: app/sample-editor.c:1698 msgid "Right [%]:" msgstr "╠╕ [%]:" @@ -1315,11 +1323,11 @@ "Ёз╢Ойт╫╦╔з║╪╔╦╓г║╒╔╣╔С╔в╔К╓Р╔╒╔╞╔ф╔ё╔ж╓к╓╥╓ф╓╚╓И╔╜║╪╔э║╪╔и╓Р╔╞╔Й╔ц╔╞\n" "╓╧╓К╓х╦д║╧╓н╔╜║╪╓кЁз╢О╓н╔╣╔С╔в╔К╓РЁДеЖ╓ф╓И╓Л╓К╓Х║ё" -#: app/track-editor.c:82 +#: app/track-editor.c:108 msgid "Jazz Edit:" msgstr "Jazzйт╫╦:" -#: app/track-editor.c:126 +#: app/track-editor.c:147 msgid "Tracker" msgstr "╔х╔И╔ц╔╚║╪" @@ -1423,7 +1431,7 @@ msgstr "" "FastTracker XM╔у╔╘║╪╔ч╔ц╔х╓г╓Б╔╣╔щ║╪╔х╓╣╓Л╓©MOD╔у╔╘║╪╔ч╔ц╔х╓г╓Б╓╒╓Й╓ч╓╩╓С!" -#: app/xm.c:771 app/xm.c:871 +#: app/xm.c:771 app/xm.c:876 msgid "Error while loading patterns." msgstr "╔я╔©║╪╔С╓н╔М║╪╔ицФ╓к╔╗╔И║╪║ё" @@ -1437,11 +1445,11 @@ "XM╔ь╔ц╔юд╧╓╛276╓г╓о╓╒╓Й╓ч╓╩╓С║ё\n" "╤╡╓И╓╞pre-0.0.12 SoundTracker╔Б╔╦╔Е║╪╔К╓г╓о? :-)\n" -#: app/xm.c:877 +#: app/xm.c:882 msgid "Error while loading instruments." msgstr "Ёз╢О╓н╔М║╪╔ицФ╓к╔╗╔И║╪║ё" -#: app/xm.c:888 +#: app/xm.c:893 #, c-format msgid "" "Module contains sample(s) that are too long for the current mixer.\n" @@ -1449,4 +1457,3 @@ msgstr "" "╔Б╔╦╔Е║╪╔К╓╛╦╫╨ъ╓н╔ъ╔╜╔╣║╕╔Б╔╦╔Е║╪╔К╓к╓од╧╡А╓╝╓К╔╣╔С╔в╔К╓Р╢ч╓С╓г╓╓╓ч╓╧║ё\n" "╔╣╔С╔в╔К╓н╨гбГд╧╓о%d╓г╓╧║ё" - Binary files soundtracker-0.3.10/po/ru.gmo and soundtracker-0.5.0/po/ru.gmo differ diff -urN soundtracker-0.3.10/po/ru.po soundtracker-0.5.0/po/ru.po --- soundtracker-0.3.10/po/ru.po Wed Dec 22 12:32:19 1999 +++ soundtracker-0.5.0/po/ru.po Fri Mar 3 17:35:04 2000 @@ -1,12 +1,12 @@ # Русская локализация для Sound Tracker -# Copyright (C) 1999 Free Software Foundation, Inc. -# Michael Shigorin , 1999. +# Copyright (C) 1999, 2000 Free Software Foundation, Inc. +# Michael Shigorin , 1999, 2000. # msgid "" msgstr "" -"Project-Id-Version: soundtracker-0.3.6\n" -"POT-Creation-Date: 1999-10-08 20:25+0200\n" -"PO-Revision-Date: 1999-12-08 17:01+0200\n" +"Project-Id-Version: soundtracker-0.3.10\n" +"POT-Creation-Date: 2000-01-22 15:32+0100\n" +"PO-Revision-Date: 2000-02-21 11:12+0200\n" "Last-Translator: Michael Shigorin \n" "Language-Team: Russian \n" "MIME-Version: 1.0\n" @@ -25,55 +25,55 @@ msgid "Sampling" msgstr "Оцифровка" -#: app/audioconfig.c:178 +#: app/audioconfig.c:179 msgid "Driver Module" msgstr "Модуль драйвера" -#: app/audioconfig.c:186 app/audioconfig.c:189 +#: app/audioconfig.c:187 app/audioconfig.c:190 msgid "Audio Configuration" msgstr "Конфигурация аудио" -#: app/drivers/alsa-input.c:125 app/drivers/alsa-output.c:135 +#: app/drivers/alsa-input.c:125 app/drivers/alsa-output.c:134 #, c-format msgid "(%d bytes)" msgstr "(%d байт)" -#: app/drivers/alsa-input.c:128 app/drivers/alsa-output.c:138 +#: app/drivers/alsa-input.c:128 app/drivers/alsa-output.c:137 #: app/drivers/oss-output.c:139 #, c-format msgid "Estimated audio delay: %f microseconds" msgstr "Ожидаемая задержка звука: %f микросекунд" -#: app/drivers/alsa-input.c:193 app/drivers/alsa-output.c:200 +#: app/drivers/alsa-input.c:193 app/drivers/alsa-output.c:199 #: app/drivers/oss-output.c:188 msgid "These changes won't take effect until you restart playing." -msgstr "Эти изменения вступят в силу при следующем воспроизведении" +msgstr "Эти изменения вступят в силу при следующем воспроизведении." -#: app/drivers/alsa-input.c:205 app/drivers/alsa-output.c:212 +#: app/drivers/alsa-input.c:205 app/drivers/alsa-output.c:211 #: app/drivers/oss-output.c:200 msgid "Resolution:" msgstr "Разрешение:" -#: app/drivers/alsa-input.c:215 app/drivers/alsa-output.c:222 +#: app/drivers/alsa-input.c:215 app/drivers/alsa-output.c:221 #: app/drivers/oss-output.c:210 msgid "Channels:" msgstr "Каналы:" -#: app/drivers/alsa-input.c:225 app/drivers/alsa-output.c:232 +#: app/drivers/alsa-input.c:225 app/drivers/alsa-output.c:231 #: app/drivers/oss-output.c:220 msgid "Frequency [Hz]:" msgstr "Частота [Гц]:" -#: app/drivers/alsa-input.c:235 app/drivers/alsa-output.c:242 +#: app/drivers/alsa-input.c:235 app/drivers/alsa-output.c:241 #: app/drivers/oss-output.c:230 msgid "Buffer Size:" msgstr "Размер буфера:" -#: app/drivers/alsa-input.c:268 app/drivers/alsa-output.c:275 +#: app/drivers/alsa-input.c:268 app/drivers/alsa-output.c:274 msgid "ALSA card number:" msgstr "Номер карты (ALSA):" -#: app/drivers/alsa-input.c:283 app/drivers/alsa-output.c:290 +#: app/drivers/alsa-input.c:283 app/drivers/alsa-output.c:289 msgid "ALSA device number:" msgstr "Номер устройства (ALSA):" @@ -87,26 +87,26 @@ "(карта %d, устройство %d):\n" "%s" -#: app/drivers/alsa-input.c:426 app/drivers/alsa-output.c:427 +#: app/drivers/alsa-input.c:426 app/drivers/alsa-output.c:426 #: app/drivers/oss-input.c:221 app/drivers/oss-output.c:390 msgid "Required sound output format not supported.\n" -msgstr "Требуемый формат вывода звука не поддерживается.\n" +msgstr "Требуемый формат воспроизведения не поддерживается.\n" -#: app/drivers/alsa-input.c:439 app/drivers/alsa-output.c:442 +#: app/drivers/alsa-input.c:439 app/drivers/alsa-output.c:441 msgid "Required sound output parameters not supported.\n" -msgstr "Требуемые параметры вывода звука не поддерживаются.\n" +msgstr "Требуемые параметры воспроизведения не поддерживаются.\n" -#: app/drivers/alsa-output.c:378 +#: app/drivers/alsa-output.c:377 #, c-format msgid "" "Couldn't open ALSA device for sound output (card:%d, device:%d):\n" "%s" msgstr "" -"Невозможно открыть устройство ALSA для вывода звука\n" +"Невозможно открыть устройство ALSA для воспроизведения\n" "(карта %d, устройство %d):\n" "%s" -#: app/drivers/esd-output.c:94 +#: app/drivers/esd-output.c:96 msgid "" "Note that the ESD output is unusable in\n" "interactive mode because of the latency added\n" @@ -115,22 +115,23 @@ msgstr "" "Заметьте, что вывод через ESD малопригоден для\n" "интерактивного режима из-за задержек, вводимых\n" -"ESD. Для серьезной работы используйте OSS или ALSA." +"ESD. Для серьезной работы используйте модули\n" +"воспроизведения OSS или ALSA." -#: app/drivers/esd-output.c:159 +#: app/drivers/esd-output.c:161 #, c-format msgid "" "Couldn't connect to ESD for sound output:\n" "%s" msgstr "" -"Невозможно соединиться с ESD для вывода звука:\n" +"Подключение к ESD для вывода звука неудачно:\n" "%s" #: app/drivers/file-output.c:86 app/drivers/oss-input.c:90 msgid "no settings (yet), sorry!" msgstr "(пока) нет настроек, сорри!" -#: app/drivers/file-output.c:161 app/sample-editor.c:1120 +#: app/drivers/file-output.c:161 app/sample-editor.c:1364 msgid "Can't open file for writing." msgstr "Невозможно открыть файл для записи." @@ -139,7 +140,8 @@ msgid "" "Couldn't open /dev/dsp for sampling:\n" "%s" -msgstr "Невозможно открыть /dev/dsp для оцифровки:\n" +msgstr "" +"Невозможно открыть /dev/dsp для оцифровки:\n" "%s" #: app/drivers/oss-output.c:173 @@ -180,11 +182,11 @@ msgid "Value" msgstr "Значение" -#: app/envelope-box.c:749 app/gui.c:1115 +#: app/envelope-box.c:749 app/playlist.c:301 msgid "Insert" msgstr "Вставка" -#: app/envelope-box.c:755 app/gui.c:1122 +#: app/envelope-box.c:755 app/playlist.c:307 msgid "Delete" msgstr "Удаление" @@ -198,7 +200,7 @@ msgstr "" "Графический\n" "редактор\n" -"envelope\n" +"конверта\n" "только в\n" "GNOME-версии" @@ -214,147 +216,175 @@ msgid "Loop" msgstr "Цикл" -#: app/envelope-box.c:876 app/sample-editor.c:207 +#: app/envelope-box.c:876 app/sample-editor.c:222 msgid "Start" msgstr "Начало" -#: app/envelope-box.c:877 app/sample-editor.c:208 +#: app/envelope-box.c:877 app/sample-editor.c:223 msgid "End" msgstr "Конец" -#: app/gui-settings.c:75 +#: app/file-operations.c:145 +msgid "Load Module" +msgstr "Загрузить модуль" + +#: app/file-operations.c:146 +msgid "Save Module" +msgstr "Сохранить модуль" + +#: app/file-operations.c:147 +msgid "Render WAV" +msgstr "Записать WAV" + +#: app/file-operations.c:148 app/sample-editor.c:290 +msgid "Load Sample" +msgstr "Загрузить сэмпл" + +#: app/file-operations.c:149 +msgid "Save Sample" +msgstr "Сохранить сэмпл" + +#: app/file-operations.c:150 +msgid "Load Instrument" +msgstr "Загрузить инструмент" + +#: app/file-operations.c:151 +msgid "Save Instrument" +msgstr "Сохранить инструмент" + +#: app/file-operations.c:157 +msgid "File" +msgstr "Файл" + +#: app/file-operations.c:208 +msgid "Operation not supported." +msgstr "Операция не поддерживается." + +#: app/gui-settings.c:78 msgid "Scopes Frequency" msgstr "Частота осциллографа" -#: app/gui-settings.c:78 +#: app/gui-settings.c:81 msgid "Tracker Frequency" msgstr "Частота трекера" -#: app/gui-settings.c:161 app/gui-settings.c:164 +#: app/gui-settings.c:173 app/gui-settings.c:176 msgid "GUI Configuration" msgstr "Конфигурация GUI" -#: app/gui-settings.c:189 +#: app/gui-settings.c:201 msgid "Use Hexadecimal Numbers" msgstr "Использовать Hex-числа" -#: app/gui-settings.c:196 +#: app/gui-settings.c:208 +msgid "Use upper case letters for hex numbers" +msgstr "Использовать заглавные буквы для Hex-чисел" + +#: app/gui-settings.c:215 msgid "Advance Cursor in FX Columns" msgstr "Продвигать курсор в колонках FX" -#: app/gui-settings.c:203 +#: app/gui-settings.c:222 msgid "Use anti-aliased envelope editor" -msgstr "Антиалиасинг в envelope-редакторе" +msgstr "Антиалиасинг в редакторе конверта" -#: app/gui-settings.c:209 +#: app/gui-settings.c:228 msgid "You need to restart SoundTracker for this change to come into effect." msgstr "Перезапустите SoundTracker для учета этих изменений." -#: app/gui-settings.c:218 +#: app/gui-settings.c:237 msgid "Scopes buffer size [MB]" msgstr "Размер буфера осциллографов [Мб]" -#: app/gui-settings.c:237 +#: app/gui-settings.c:256 msgid "Highlight rows:" msgstr "Подсвечивать строки:" -#: app/gui-settings.c:255 +#: app/gui-settings.c:274 msgid "`Save XM' saves all non-empty patterns" msgstr "`Сохранить XM' сохраняет все непустые паттерны" -#: app/gui-subs.c:386 +#: app/gui-subs.c:430 msgid "Question" msgstr "Вопрос" -#: app/gui-subs.c:403 app/sample-editor.c:1172 +#: app/gui-subs.c:447 app/sample-editor.c:1277 app/sample-editor.c:1457 msgid "Cancel" msgstr "Отмена" -#: app/gui-subs.c:421 +#: app/gui-subs.c:465 msgid "Warning" msgstr "Предупреждение" -#: app/gui-subs.c:447 +#: app/gui-subs.c:491 msgid "Error!" msgstr "Ошибка!" -#: app/gui.c:82 +#: app/gui.c:83 msgid "Tempo" msgstr "Темп" -#: app/gui.c:220 +#: app/gui.c:214 msgid "" "Are you sure you want to free the current project?\n" "All changes will be lost!" msgstr "" -"Вы уверены, что хотите очистить текущий проект?\n" +"Вы уверены, что хотите освободить текущий проект?\n" "Все изменения будут потеряны!" -#: app/gui.c:234 app/gui.c:246 +#: app/gui.c:228 app/gui.c:242 msgid "Are you sure you want to overwrite the file?" msgstr "Вы уверены, что хотите перезаписать файл?" -#: app/gui.c:1106 -msgid "Song length" -msgstr "Длина песни" - -#: app/gui.c:1107 -msgid "Current pos" -msgstr "Позиция" - -#: app/gui.c:1108 app/gui.c:1266 -msgid "Pattern" -msgstr "Паттерн" - -#: app/gui.c:1109 -msgid "Restart pos" -msgstr "Рестарт с" - -#: app/gui.c:1177 +#: app/gui.c:1119 msgid "Load XM..." msgstr "Загрузить XM..." -#: app/gui.c:1179 +#: app/gui.c:1121 msgid "Save XM..." msgstr "Сохранить XM..." -#: app/gui.c:1181 +#: app/gui.c:1124 msgid "Render module as WAV..." msgstr "Записать модуль как WAV..." -#: app/gui.c:1219 +#: app/gui.c:1176 msgid "Play Song" msgstr "Играть песню" -#: app/gui.c:1225 +#: app/gui.c:1182 msgid "Play Pattern" msgstr "Играть паттерн" -#: app/gui.c:1231 +#: app/gui.c:1188 msgid "Stop" msgstr "Стоп" -#: app/gui.c:1250 +#: app/gui.c:1207 msgid "Number of Channels:" msgstr "Количество каналов:" -#: app/gui.c:1282 +#: app/gui.c:1223 app/playlist.c:294 +msgid "Pattern" +msgstr "Паттерн" + +#: app/gui.c:1239 msgid "PatLength" msgstr "Длина паттерна:" -#: app/gui.c:1374 +#: app/gui.c:1331 msgid "Octave" msgstr "Октава" -#: app/gui.c:1382 +#: app/gui.c:1339 msgid "Jump" msgstr "Прыжок" -#: app/gui.c:1390 +#: app/gui.c:1347 msgid "Instr" msgstr "Инструмент" -#: app/gui.c:1405 +#: app/gui.c:1362 msgid "Sample" msgstr "Сэмпл" @@ -374,67 +404,63 @@ msgid "VibSweep" msgstr "Размах" -#: app/instrument-editor.c:154 +#: app/instrument-editor.c:154 app/instrument-editor.c:175 msgid "Can't open file." msgstr "Невозможно открыть файл." -#: app/instrument-editor.c:174 -msgid "Saving Instruments not yet supported." -msgstr "Сохранение инструментов еще не поддерживается." - -#: app/instrument-editor.c:182 +#: app/instrument-editor.c:212 msgid "Sine" msgstr "Синусоида" -#: app/instrument-editor.c:182 +#: app/instrument-editor.c:212 msgid "Square" msgstr "Прямоугольник" -#: app/instrument-editor.c:182 +#: app/instrument-editor.c:212 msgid "Saw Down" msgstr "Пила (вниз)" -#: app/instrument-editor.c:182 +#: app/instrument-editor.c:212 msgid "Saw Up" msgstr "Пила (вверх)" -#: app/instrument-editor.c:186 +#: app/instrument-editor.c:216 msgid "Instrument Editor" msgstr "Редактор инструментов" -#: app/instrument-editor.c:195 +#: app/instrument-editor.c:225 msgid "Volume envelope" -msgstr "Envelope громкости" +msgstr "Конверт громкости" -#: app/instrument-editor.c:203 +#: app/instrument-editor.c:233 msgid "Panning envelope" -msgstr "Envelope панорамирования" +msgstr "Конверт панорамирования" -#: app/instrument-editor.c:220 -msgid "Load Instrument.." -msgstr "Загрузить инструмент" +#: app/instrument-editor.c:250 +msgid "Load Instrument..." +msgstr "Загрузить инструмент..." -#: app/instrument-editor.c:222 -msgid "Save Instrument.." -msgstr "Сохранить инструмент" +#: app/instrument-editor.c:252 +msgid "Save Instrument..." +msgstr "Сохранить инструмент..." -#: app/instrument-editor.c:224 +#: app/instrument-editor.c:254 msgid "Load XI" msgstr "Загрузить XI" -#: app/instrument-editor.c:230 +#: app/instrument-editor.c:260 msgid "Save XI" msgstr "Сохранить XI" -#: app/instrument-editor.c:250 +#: app/instrument-editor.c:279 msgid "Vibrato Type:" msgstr "Тип вибрато:" -#: app/instrument-editor.c:322 +#: app/instrument-editor.c:351 msgid "Note:" msgstr "Нота:" -#: app/instrument-editor.c:340 +#: app/instrument-editor.c:369 msgid "Initialize" msgstr "Инициализовать" @@ -443,8 +469,8 @@ msgstr "Клавиша, вставляющая keyoff-ноту в FastTracker-модули" #: app/keys.c:135 -msgid "Upper Octave Keys.." -msgstr "Клавиши верхней октавы" +msgid "Upper Octave Keys..." +msgstr "Клавиши верхней октавы..." #: app/keys.c:136 msgid "" @@ -453,12 +479,12 @@ "in a piano keyboard fashion, including the number keys row above." msgstr "" "Это клавиши верхней половины клавиатуры. Клавиша 'до' обычно справа от Tab. " -"Остальные клавиши расположены подобно клавиатуре пианино, включая клавиши " -"с цифрами в верхнем ряду." +"Остальные клавиши расположены подобно клавиатуре пианино, включая клавиши с " +"цифрами в верхнем ряду." #: app/keys.c:142 -msgid "Lower Octave Keys.." -msgstr "Клавиши нижней октавы" +msgid "Lower Octave Keys..." +msgstr "Клавиши нижней октавы..." #: app/keys.c:143 msgid "" @@ -466,51 +492,51 @@ "the first character key to the right of the left Shift key. The rest of the " "keys should be ordered in a piano keyboard fashion, including the row above." msgstr "" -"Это клавиши нижней половины клавиатуры. Клавиша 'до' обычно справа от Shift. " +"Это клавиши нижней половины клавиатуры. Клавиша 'до' обычно справа от LShift. " "Остальные клавиши расположены подобно клавиатуре пианино, включая клавиши " "среднего буквенного ряда." #: app/keys.c:149 -msgid "Other Keys.." -msgstr "Другие клавиши" +msgid "Other Keys..." +msgstr "Другие клавиши..." #: app/keys.c:150 msgid "Various other keys" msgstr "Разнообразные клавиши" -#: app/keys.c:433 +#: app/keys.c:437 msgid "Function" msgstr "Функция" -#: app/keys.c:434 +#: app/keys.c:438 msgid "Assignment" msgstr "Назначенная клавиша" -#: app/keys.c:443 app/keys.c:446 +#: app/keys.c:447 app/keys.c:450 msgid "Keyboard Configuration" msgstr "Конфигурация клавиатуры" -#: app/keys.c:491 +#: app/keys.c:495 msgid "Key Group Explanation" msgstr "Пояснение групп клавиатуры" -#: app/keys.c:508 +#: app/keys.c:512 msgid "Key Explanation" msgstr "Пояснение клавиш" -#: app/keys.c:539 +#: app/keys.c:543 msgid "Modifiers:" msgstr "Модификаторы:" -#: app/keys.c:565 +#: app/keys.c:569 msgid "Learn selected key" msgstr "Запомнить выбранную клавишу" -#: app/keys.c:571 +#: app/keys.c:575 msgid "Learn all keys" msgstr "Запомнить все клавиши" -#: app/keys.c:577 +#: app/keys.c:581 msgid "" "Please press the desired key combination!\n" "Click into left list to cancel" @@ -518,7 +544,7 @@ "Пожалуйста, нажмите желаемую комбинацию клавиш!\n" "Щелкните по списку слева для отмены" -#: app/keys.c:635 +#: app/keys.c:645 msgid "" "The keyboard configuration file is defective.\n" "Please use the Keyboard Configuration dialog." @@ -526,21 +552,21 @@ "Файл конфигурации клавиатуры поврежден.\n" "Пожалуйста, используйте Диалог конфигурации клавиатуры." -#: app/keys.c:845 +#: app/keys.c:895 msgid "" "Automatic key configuration unsuccessful.\n" "Please use the Keyboard Configuration dialog\n" "in the Settings menu." msgstr "" "Автоконфигурирование клавиш не удалось.\n" -"Пожалуйста, используйте Диалог конфигурации клавиатуры" -"в меню Настроек." +"Используйте Диалог конфигурации клавиатуры\n" +"в меню Настроек, пожалуйста." -#: app/menubar.c:98 +#: app/menubar.c:95 msgid "Ok" msgstr "ОК" -#: app/menubar.c:134 +#: app/menubar.c:131 msgid "" "Are you sure you want to do this?\n" "All changes will be lost!" @@ -548,409 +574,413 @@ "Вы уверены в том, что делаете?\n" "Все изменения будут утеряны!" -#: app/menubar.c:156 +#: app/menubar.c:153 msgid "" "Are you sure you want to quit?\n" "All changes will be lost!" msgstr "" -"Вы уверены, что хотите выйти?" +"Вы уверены, что хотите выйти?\n" "Все изменения будут утеряны!" -#: app/menubar.c:227 +#: app/menubar.c:224 msgid "_Open..." msgstr "_Открыть..." -#: app/menubar.c:229 +#: app/menubar.c:226 msgid "Save _as..." msgstr "_Сохранить как..." -#: app/menubar.c:234 +#: app/menubar.c:232 msgid "Save Module as _WAV..." msgstr "Сохранить _модуль как WAV..." -#: app/menubar.c:239 +#: app/menubar.c:237 msgid "_Quit" msgstr "_Выход" -#: app/menubar.c:246 +#: app/menubar.c:244 msgid "Clear _All" msgstr "Очистить _все" -#: app/menubar.c:248 +#: app/menubar.c:246 msgid "Clear _Patterns Only" msgstr "Очистить только _паттерны" -#: app/menubar.c:250 +#: app/menubar.c:248 msgid "_Optimize Module" msgstr "_Оптимизировать модуль" -#: app/menubar.c:257 app/menubar.c:268 app/menubar.c:286 +#: app/menubar.c:255 app/menubar.c:266 app/menubar.c:284 msgid "C_ut" msgstr "Выр_езать" -#: app/menubar.c:259 app/menubar.c:270 app/menubar.c:288 +#: app/menubar.c:257 app/menubar.c:268 app/menubar.c:286 msgid "_Copy" msgstr "_Копировать" -#: app/menubar.c:261 app/menubar.c:272 app/menubar.c:290 +#: app/menubar.c:259 app/menubar.c:270 app/menubar.c:288 msgid "_Paste" msgstr "_Вставить" -#: app/menubar.c:274 +#: app/menubar.c:272 msgid "_Insert" msgstr "_Добавить" -#: app/menubar.c:276 +#: app/menubar.c:274 msgid "_Delete" msgstr "_Удалить" -#: app/menubar.c:284 +#: app/menubar.c:282 msgid "_Mark" msgstr "_Отметить" -#: app/menubar.c:297 +#: app/menubar.c:295 msgid "_Jazz Edit Mode" msgstr "Режим редактирования _Jazz" -#: app/menubar.c:302 +#: app/menubar.c:300 msgid "Transp_osition..." msgstr "_Транспозиция" -#: app/menubar.c:307 app/menubar.c:385 +#: app/menubar.c:305 app/menubar.c:390 msgid "_Pattern" msgstr "П_аттерн" -#: app/menubar.c:308 +#: app/menubar.c:306 msgid "_Track" -msgstr "_Трек" +msgstr "Тр_ек" -#: app/menubar.c:309 +#: app/menubar.c:307 msgid "_Selection" msgstr "_Выделение" -#: app/menubar.c:315 +#: app/menubar.c:313 msgid "_Find Unused Pattern" msgstr "_Найти свободный паттерн" -#: app/menubar.c:317 +#: app/menubar.c:315 msgid "_Copy Current to Unused Pattern" msgstr "_Копировать текущий паттерн в свободный" -#: app/menubar.c:319 +#: app/menubar.c:317 msgid "C_lear Unused Patterns" msgstr "_Очистить свободные паттерны" -#: app/menubar.c:321 +#: app/menubar.c:319 msgid "_Pack Patterns" msgstr "_Упаковать паттерны" -#: app/menubar.c:328 +#: app/menubar.c:326 msgid "_Load XI..." msgstr "_Загрузить XI..." +#: app/menubar.c:328 +msgid "_Save XI..." +msgstr "_Сохранить XI..." + #: app/menubar.c:333 +msgid "_Clear Current" +msgstr "_Очистить текущий" + +#: app/menubar.c:338 msgid "_Delete Unused Instruments" msgstr "_Удалить неиспользуемые инструменты" -#: app/menubar.c:341 +#: app/menubar.c:346 msgid "Display _Oscilloscopes" msgstr "_Осциллографы" -#: app/menubar.c:343 +#: app/menubar.c:348 msgid "Use _Backing Store" -msgstr "Использовать _склад" +msgstr "_Использовать X Backing Store" -#: app/menubar.c:348 +#: app/menubar.c:353 msgid "_Keyboard Configuration..." msgstr "_Конфигурация клавиатуры..." -#: app/menubar.c:350 +#: app/menubar.c:355 msgid "_Audio Configuration..." msgstr "Конфигурация _аудио..." -#: app/menubar.c:352 +#: app/menubar.c:357 msgid "_Playback Effects..." msgstr "_Эффекты воспроизведения..." -#: app/menubar.c:354 +#: app/menubar.c:359 msgid "_GUI Configuration..." msgstr "Кон_фигурация GUI..." -#: app/menubar.c:359 +#: app/menubar.c:364 msgid "_Save Settings now" msgstr "_Сохранить настройки" -#: app/menubar.c:361 +#: app/menubar.c:366 msgid "Save Settings on _Exit" msgstr "Сохранять настройки при _выходе" -#: app/menubar.c:368 +#: app/menubar.c:373 msgid "_About..." msgstr "_О программе..." -#: app/menubar.c:373 +#: app/menubar.c:378 msgid "Show _Tips..." msgstr "_Подсказки..." -#: app/menubar.c:375 +#: app/menubar.c:380 msgid "_XM Effects..." msgstr "_Эффекты XM..." -#: app/menubar.c:382 +#: app/menubar.c:387 msgid "_File" msgstr "_Файл" -#: app/menubar.c:383 +#: app/menubar.c:388 msgid "_Module" msgstr "_Модуль" -#: app/menubar.c:384 +#: app/menubar.c:389 msgid "_Edit" msgstr "_Правка" -#: app/menubar.c:386 +#: app/menubar.c:391 msgid "_Instrument" msgstr "_Инструмент" -#: app/menubar.c:387 +#: app/menubar.c:392 msgid "_Settings" msgstr "_Настройки" -#: app/menubar.c:388 +#: app/menubar.c:393 msgid "_Help" msgstr "_Справка" -#: app/menubar.c:416 +#: app/menubar.c:423 msgid "/_File" msgstr "/_Файл" -#: app/menubar.c:417 +#: app/menubar.c:424 msgid "/File/_Open..." msgstr "/Файл/_Открыть..." -#: app/menubar.c:418 +#: app/menubar.c:425 msgid "/File/Save _as..." msgstr "/Файл/Сохранить _как..." -#: app/menubar.c:419 app/menubar.c:421 +#: app/menubar.c:426 app/menubar.c:428 msgid "/File/-" msgstr "/Файл/-" -#: app/menubar.c:420 +#: app/menubar.c:427 msgid "/File/Save Module as _WAV..." msgstr "/Файл/Сохранить _модуль как WAV..." -#: app/menubar.c:422 +#: app/menubar.c:429 msgid "/File/_Quit" msgstr "/Файл/_Выход" -#: app/menubar.c:423 +#: app/menubar.c:430 msgid "/_Module" msgstr "/_Модуль" -#: app/menubar.c:424 +#: app/menubar.c:431 msgid "/Module/Clear _All" msgstr "/Модуль/Очистить _все" -#: app/menubar.c:425 +#: app/menubar.c:432 msgid "/Module/Clear _Patterns Only" msgstr "/Модуль/Очистить только _паттерны" -#: app/menubar.c:426 +#: app/menubar.c:433 msgid "/Module/_Optimize Module" msgstr "/Модуль/_Оптимизировать модуль" -#: app/menubar.c:427 +#: app/menubar.c:434 msgid "/_Edit" msgstr "/_Правка" -#: app/menubar.c:428 +#: app/menubar.c:435 msgid "/Edit/_Jazz Edit Mode" msgstr "/Правка/Режим редактирования _Jazz" -#: app/menubar.c:429 app/menubar.c:431 +#: app/menubar.c:436 app/menubar.c:438 msgid "/Edit/-" msgstr "/Правка/-" -#: app/menubar.c:430 +#: app/menubar.c:437 msgid "/Edit/_Transposition..." msgstr "/Правка/_Транспозиция" -#: app/menubar.c:432 +#: app/menubar.c:439 msgid "/Edit/_Pattern" msgstr "/Правка/_Паттерн" -#: app/menubar.c:433 +#: app/menubar.c:440 msgid "/Edit/Pattern/C_ut" msgstr "/Правка/Паттерн/Выр_езать" -#: app/menubar.c:434 +#: app/menubar.c:441 msgid "/Edit/Pattern/_Copy" msgstr "/Правка/Паттерн/_Копировать" -#: app/menubar.c:435 +#: app/menubar.c:442 msgid "/Edit/Pattern/_Paste" msgstr "/Правка/Паттерн/_Вставить" -#: app/menubar.c:436 +#: app/menubar.c:443 msgid "/Edit/_Track" msgstr "/Правка/_Трек" -#: app/menubar.c:437 +#: app/menubar.c:444 msgid "/Edit/Track/C_ut" msgstr "/Правка/_Трек/Выр_езать" -#: app/menubar.c:438 +#: app/menubar.c:445 msgid "/Edit/Track/_Copy" msgstr "/Правка/_Трек/_Копировать" -#: app/menubar.c:439 +#: app/menubar.c:446 msgid "/Edit/Track/_Paste" msgstr "/Правка/_Трек/_Вставить" -#: app/menubar.c:440 +#: app/menubar.c:447 msgid "/Edit/Track/_Insert" msgstr "/Правка/_Трек/_Добавить" -#: app/menubar.c:441 +#: app/menubar.c:448 msgid "/Edit/Track/_Delete" msgstr "/Правка/_Трек/_Удалить" -#: app/menubar.c:442 +#: app/menubar.c:449 msgid "/Edit/_Selection" msgstr "/Правка/_Выделение" -#: app/menubar.c:443 +#: app/menubar.c:450 msgid "/Edit/Selection/_Mark" msgstr "/Правка/_Выделение/_Отметить" -#: app/menubar.c:444 +#: app/menubar.c:451 msgid "/Edit/Selection/C_ut" msgstr "/Правка/_Выделение/Выр_езать" -#: app/menubar.c:445 +#: app/menubar.c:452 msgid "/Edit/Selection/_Copy" msgstr "/Правка/_Выделение/_Копировать" -#: app/menubar.c:446 +#: app/menubar.c:453 msgid "/Edit/Selection/_Paste" msgstr "/Правка/_Выделение/_Вставить" -#: app/menubar.c:447 +#: app/menubar.c:454 msgid "/_Pattern" msgstr "/П_аттерн" -#: app/menubar.c:448 +#: app/menubar.c:455 msgid "/Pattern/_Find Unused Pattern" msgstr "/П_аттерн/_Найти свободный паттерн" -#: app/menubar.c:449 +#: app/menubar.c:456 msgid "/Pattern/_Copy Current to Unused Pattern" msgstr "/П_аттерн/_Копировать текущий паттерн в свободный" -#: app/menubar.c:450 +#: app/menubar.c:457 msgid "/Pattern/C_lear Unused Patterns" msgstr "/П_аттерн/_Очистить свободные паттерны" -#: app/menubar.c:451 +#: app/menubar.c:458 msgid "/Pattern/_Pack Patterns" msgstr "/П_аттерн/_Упаковать паттерны" -#: app/menubar.c:452 +#: app/menubar.c:459 msgid "/_Instrument" msgstr "/_Инструмент" -#: app/menubar.c:453 +#: app/menubar.c:460 msgid "/Instrument/_Load XI..." msgstr "/Инструмент/_Загрузить XI..." -#: app/menubar.c:454 +#: app/menubar.c:461 +msgid "/Instrument/_Save XI..." +msgstr "/Инструмент/_Сохраниать XI..." + +#: app/menubar.c:462 app/menubar.c:464 msgid "/Instrument/-" msgstr "/Инструмент/-" -#: app/menubar.c:455 +#: app/menubar.c:463 +msgid "/Instrument/_Clear Current" +msgstr "/Инструмент/Удалить _текущий" + +#: app/menubar.c:465 msgid "/Instrument/_Delete Unused Instruments" msgstr "/Инструмент/_Удалить неиспользуемые инструменты" -#: app/menubar.c:456 +#: app/menubar.c:466 msgid "/_Settings" msgstr "/Св_ойства" -#: app/menubar.c:457 +#: app/menubar.c:467 msgid "/Settings/Display _Oscilloscopes" msgstr "/Свойства/_Осциллографы" -#: app/menubar.c:458 +#: app/menubar.c:468 msgid "/Settings/Use _Backing Store" -msgstr "/Свойства/Использовать _склад" +msgstr "/Свойства/_Использовать X Backing Store" -#: app/menubar.c:459 app/menubar.c:464 +#: app/menubar.c:469 app/menubar.c:474 msgid "/Settings/-" msgstr "/Свойства/-" -#: app/menubar.c:460 +#: app/menubar.c:470 msgid "/Settings/_Keyboard Configuration..." msgstr "/Свойства/_Конфигурация клавиатуры..." -#: app/menubar.c:461 +#: app/menubar.c:471 msgid "/Settings/_Audio Configuration..." msgstr "/Свойства/Конфигурация _аудио..." -#: app/menubar.c:462 +#: app/menubar.c:472 msgid "/Settings/_Playback Effects..." msgstr "/Свойства/_Эффекты воспроизведения..." -#: app/menubar.c:463 +#: app/menubar.c:473 msgid "/Settings/_GUI Configuration..." msgstr "/Свойства/Кон_фигурация GUI..." -#: app/menubar.c:465 +#: app/menubar.c:475 msgid "/Settings/_Save Settings now" msgstr "/Свойства/_Сохранить свойства" -#: app/menubar.c:466 +#: app/menubar.c:476 msgid "/Settings/Save Settings on _Exit" msgstr "/Свойства/Сохранять свойства при _выходе" -#: app/menubar.c:467 +#: app/menubar.c:477 msgid "/_Help" msgstr "/_Справка" -#: app/menubar.c:468 +#: app/menubar.c:478 msgid "/Help/_About..." msgstr "/Справка/_О программе..." -#: app/menubar.c:469 +#: app/menubar.c:479 msgid "/Help/-" msgstr "/Справка/-" -#: app/menubar.c:470 +#: app/menubar.c:480 msgid "/Help/Show _Tips..." msgstr "/Справка/_Подсказки..." -#: app/menubar.c:471 +#: app/menubar.c:481 msgid "/Help/_XM Effects..." msgstr "/Справка/_Эффекты XM..." -#: app/menubar.c:485 -msgid "/Settings/Display Oscilloscopes" -msgstr "/Свойства/_Осциллографы" - -#: app/menubar.c:487 -msgid "/Settings/Use Backing Store" -msgstr "/Свойства/Использовать _склад" - -#: app/menubar.c:489 -msgid "/Settings/Save Settings on Exit" -msgstr "/Свойства/Сохранять свойства при _выходе" - #: app/module-info.c:116 msgid "Instrument Name" msgstr "Название инструмента" #: app/module-info.c:116 msgid "#smpl" -msgstr "сэмплов" +msgstr "#смпл" #: app/module-info.c:117 msgid "Sample Name" @@ -960,7 +990,7 @@ msgid "Linear" msgstr "Линейно" -#: app/module-info.c:118 app/sample-editor.c:167 +#: app/module-info.c:118 app/sample-editor.c:182 msgid "Amiga" msgstr "Amiga" @@ -980,204 +1010,253 @@ msgid "ProTracker Mode" msgstr "Режим ProTracker" +#: app/playlist.c:292 +msgid "Song length" +msgstr "Длина песни" + +#: app/playlist.c:293 +msgid "Current pos" +msgstr "Позиция" + +#: app/playlist.c:295 +msgid "Restart pos" +msgstr "Рестарт с" + #: app/preferences.c:58 msgid "" "A directory called '.soundtracker' has been created in your\n" "home directory to store configuration files.\n" msgstr "" -"Каталог под названием '~/.soundtracker' создан, чтобы\n" -"хранить в нем файлы конфигурации.\n" +"Каталог под названием '.soundtracker' создан в вашем домашнем\n" +"каталоге для хранения в нем файлов конфигурации.\n" -#: app/sample-editor.c:166 +#: app/sample-editor.c:181 msgid "No loop" msgstr "Нет цикла" -#: app/sample-editor.c:168 +#: app/sample-editor.c:183 msgid "PingPong" msgstr "Пинг-понг" -#: app/sample-editor.c:172 +#: app/sample-editor.c:187 msgid "8 bits" msgstr "8 бит" -#: app/sample-editor.c:173 +#: app/sample-editor.c:188 msgid "16 bits" msgstr "16 бит" -#: app/sample-editor.c:179 +#: app/sample-editor.c:194 msgid "Sample Editor" msgstr "Редактор сэмплов" -#: app/sample-editor.c:219 +#: app/sample-editor.c:234 msgid "Volume" msgstr "Громкость" -#: app/sample-editor.c:220 +#: app/sample-editor.c:235 msgid "Panning" msgstr "Панорамирование" -#: app/sample-editor.c:221 +#: app/sample-editor.c:236 msgid "Finetune" msgstr "Подстройка" -#: app/sample-editor.c:232 +#: app/sample-editor.c:247 msgid "SelStart" msgstr "Нач. выделения" -#: app/sample-editor.c:233 +#: app/sample-editor.c:248 msgid "SelEnd" msgstr "Кон. выделения" -#: app/sample-editor.c:236 -msgid "Reset Sel" -msgstr "Сброс выделения" +#: app/sample-editor.c:256 +msgid "Sel None" +msgstr "Сброс" -#: app/sample-editor.c:241 +#: app/sample-editor.c:262 +msgid "Sel All" +msgstr "Выделить все" + +#: app/sample-editor.c:268 msgid "RelNote" msgstr "Отн. нота" -#: app/sample-editor.c:242 +#: app/sample-editor.c:269 msgid "Length: 0" msgstr "Длина: 0" -#: app/sample-editor.c:255 -msgid "Load Sample.." +#: app/sample-editor.c:282 +msgid "Load Sample..." msgstr "Загрузить сэмпл..." -#: app/sample-editor.c:256 -msgid "Save WAV.." +#: app/sample-editor.c:284 +msgid "Save WAV..." msgstr "Сохранить WAV..." -#: app/sample-editor.c:259 -msgid "Load Sample" -msgstr "Загрузить сэмпл" +#: app/sample-editor.c:286 +msgid "Save region as WAV..." +msgstr "Сохранить участок как WAV..." -#: app/sample-editor.c:268 +#: app/sample-editor.c:299 msgid "Save WAV" msgstr "Сохранить WAV" -#: app/sample-editor.c:278 -msgid "Clear" -msgstr "Очистить" +#: app/sample-editor.c:309 +msgid "Save Region" +msgstr "Сохранить участок" -#: app/sample-editor.c:284 +#: app/sample-editor.c:320 msgid "Monitor" msgstr "Следить" -#: app/sample-editor.c:290 +#: app/sample-editor.c:326 msgid "Volume Ramp" msgstr "Спад громкости" -#: app/sample-editor.c:300 +#: app/sample-editor.c:336 msgid "Zoom to selection" msgstr "Увеличить выделение" -#: app/sample-editor.c:306 +#: app/sample-editor.c:342 msgid "Show all" msgstr "Показать все" -#: app/sample-editor.c:312 +#: app/sample-editor.c:348 msgid "Zoom in (+50%)" msgstr "Увеличить (+50%)" -#: app/sample-editor.c:318 +#: app/sample-editor.c:354 msgid "Zoom out (-50%)" msgstr "Уменьшить (-50%)" -#: app/sample-editor.c:324 -msgid "Resample" -msgstr "Перецифровать" +#: app/sample-editor.c:360 +msgid "Reverse" +msgstr "Перевернуть" -#: app/sample-editor.c:335 +#: app/sample-editor.c:370 msgid "Cut" msgstr "Вырезать" -#: app/sample-editor.c:341 +#: app/sample-editor.c:376 msgid "Remove" msgstr "Удалить" -#: app/sample-editor.c:347 +#: app/sample-editor.c:382 msgid "Copy" msgstr "Копировать" -#: app/sample-editor.c:353 +#: app/sample-editor.c:388 msgid "Paste" msgstr "Вставить" -#: app/sample-editor.c:359 -msgid "Filter" -msgstr "Фильтр" +#: app/sample-editor.c:394 +msgid "Clear Sample" +msgstr "Очистить сэмпл" -#: app/sample-editor.c:459 +#: app/sample-editor.c:481 #, c-format msgid "Length: %d" msgstr "Длина: %d" -#: app/sample-editor.c:957 +#: app/sample-editor.c:1033 msgid "" msgstr "<только вставлено>" -#: app/sample-editor.c:1034 +#: app/sample-editor.c:1117 +msgid "Read error." +msgstr "Ошибка чтения." + +#: app/sample-editor.c:1233 +msgid "Load stereo sample" +msgstr "Загрузить стереосэмпл" + +#: app/sample-editor.c:1241 +msgid "" +"You have selected a stereo sample!\n" +"(SoundTracker can only handle mono samples!)\n" +"\n" +"Please choose which channel to load:" +msgstr "" +"Вы выбрали стереосэмпл!\n" +"(SoundTracker обрабатывает только моносэмплы)\n" +"\n" +"Выберите, какой из каналов загрузить:" + +#: app/sample-editor.c:1252 +msgid "Left" +msgstr "Левый" + +#: app/sample-editor.c:1258 +msgid "Mix" +msgstr "Объединить" + +#: app/sample-editor.c:1264 +msgid "Right" +msgstr "Правый" + +#: app/sample-editor.c:1303 msgid "Can't read sample" msgstr "Невозможно прочитать сэмпл" -#: app/sample-editor.c:1040 +#: app/sample-editor.c:1309 msgid "Sample is too long for current mixer module. Loading anyway." msgstr "Сэмпл слишком длинный для текущего миксер-модуля. Но грузим." -#: app/sample-editor.c:1054 -msgid "Can only handle mono 8 and 16 bit samples" -msgstr "Поддерживаются только моно-сэмплы 8/16 бит" +#: app/sample-editor.c:1323 +msgid "Can only handle 8 and 16 bit samples with up to 2 channels" +msgstr "Поддерживаются только сэмплы 8/16 бит, до 2 каналов" + +#: app/sample-editor.c:1415 +msgid "Nothing to save." +msgstr "Нечего сохранять." -#: app/sample-editor.c:1065 -msgid "Read error." -msgstr "Ошибка чтения." - -#: app/sample-editor.c:1157 +#: app/sample-editor.c:1442 msgid "OK" msgstr "ОК" -#: app/sample-editor.c:1165 +#: app/sample-editor.c:1450 msgid "Start sampling" msgstr "Начать оцифровку" -#: app/sample-editor.c:1200 app/sample-editor.c:1203 +#: app/sample-editor.c:1485 app/sample-editor.c:1488 msgid "Sampling Window" msgstr "Окно оцифровки" -#: app/sample-editor.c:1303 +#: app/sample-editor.c:1588 msgid "" msgstr "<только оцифровано>" -#: app/sample-editor.c:1333 +#: app/sample-editor.c:1618 msgid "Recorded sample is too long for current mixer module. Using it anyway." -msgstr "Записанный сэмпл слишком длинный для текущего миксер-модуля. Но грузим." +msgstr "" +"Записанный сэмпл слишком длинный для текущего миксер-модуля. Но грузим." -#: app/sample-editor.c:1365 +#: app/sample-editor.c:1650 msgid "Normalize" msgstr "Нормализовать" -#: app/sample-editor.c:1366 +#: app/sample-editor.c:1651 msgid "Execute" msgstr "Выполнить" -#: app/sample-editor.c:1367 app/tips-dialog.c:165 +#: app/sample-editor.c:1652 app/tips-dialog.c:165 msgid "Close" msgstr "Закрыть" -#: app/sample-editor.c:1376 app/sample-editor.c:1379 +#: app/sample-editor.c:1661 app/sample-editor.c:1664 msgid "Volume Ramping" msgstr "Спад громкости" -#: app/sample-editor.c:1396 +#: app/sample-editor.c:1681 msgid "Perform linear volume fade on Selection" msgstr "Произвести линейное спадание громкости на выбранном участке" -#: app/sample-editor.c:1408 +#: app/sample-editor.c:1693 msgid "Left [%]:" msgstr "Левый [%]:" -#: app/sample-editor.c:1413 +#: app/sample-editor.c:1698 msgid "Right [%]:" msgstr "Правый [%]:" @@ -1207,7 +1286,7 @@ "Добро пожаловать в SoundTracker!\n" "\n" "Если вы новичок в подобных программах, вам, вероятно, захочется\n" -"собрать несколько готовых файлов XM/MOD и посмотреть для начала них." +"найти несколько готовых файлов XM/MOD и посмотреть для начала них." #: app/tips-dialog.c:256 msgid "" @@ -1232,7 +1311,7 @@ "If you want to know more about tracking, and how the various commands\n" "work, have a look at http://www.united-trackers.org/" msgstr "" -"Усли вы хотите узнать больше о трекерах,\n" +"Если вы хотите узнать больше о трекерах,\n" "загляните на http://www.united-trackers.org/" #: app/tips-dialog.c:266 @@ -1244,11 +1323,15 @@ "Вы можете привязать сэмплы инструмента к определенным клавишам,\n" "активировав нужный сэмпл и клацнув по клавиатуре на страничке\n" "редактора инструментов." - -#: app/track-editor.c:82 + +#: app/track-editor.c:108 msgid "Jazz Edit:" msgstr "Редактирование Jazz:" +#: app/track-editor.c:147 +msgid "Tracker" +msgstr "Трекер" + #: app/transposition.c:166 msgid "Whole Song" msgstr "Вся песня" @@ -1330,7 +1413,7 @@ msgid "Pattern length out of range: %d.\n" msgstr "Длина паттерна вне диапазона: %d.\n" -#: app/xm.c:441 app/xm.c:510 +#: app/xm.c:441 app/xm.c:512 #, c-format msgid "Invalid vibtype %d, using Sine.\n" msgstr "Неверный тип вибрато %d, использую синусоиду.\n" @@ -1344,27 +1427,27 @@ msgid "Unknown XI version 0x%x\n" msgstr "Неверная версия XI 0x%x\n" -#: app/xm.c:702 +#: app/xm.c:757 msgid "No FastTracker XM and no supported MOD format!" -msgstr "Неподдерживаемый формат MOD или не FastTracker-XM!" +msgstr "Неподдерживаемый формат MOD или не FastTracker XM!" -#: app/xm.c:716 app/xm.c:816 +#: app/xm.c:771 app/xm.c:876 msgid "Error while loading patterns." msgstr "Ошибка при загрузке паттернов." -#: app/xm.c:774 +#: app/xm.c:829 msgid "Can't open file" msgstr "Невозможно открыть файл" -#: app/xm.c:788 +#: app/xm.c:843 msgid "XM header length != 276. Maybe a pre-0.0.12 SoundTracker module? :-)\n" msgstr "Длина заголовка XM != 276. Может, это от SoundTracker <0.0.12? :-)\n" -#: app/xm.c:822 +#: app/xm.c:882 msgid "Error while loading instruments." msgstr "Ошибка при загрузке инструментов." -#: app/xm.c:833 +#: app/xm.c:893 #, c-format msgid "" "Module contains sample(s) that are too long for the current mixer.\n" diff -urN soundtracker-0.3.10/po/soundtracker.pot soundtracker-0.5.0/po/soundtracker.pot --- soundtracker-0.3.10/po/soundtracker.pot Sat Jan 22 15:32:38 2000 +++ soundtracker-0.5.0/po/soundtracker.pot Mon Mar 13 13:56:03 2000 @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"POT-Creation-Date: 2000-01-22 15:32+0100\n" +"POT-Creation-Date: 2000-03-13 13:56+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -14,26 +14,47 @@ "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: ENCODING\n" -#: app/audioconfig.c:55 +#: app/audioconfig.c:59 msgid "Playback Output" msgstr "" -#: app/audioconfig.c:61 +#: app/audioconfig.c:65 msgid "Editing Output" msgstr "" -#: app/audioconfig.c:67 +#: app/audioconfig.c:71 msgid "Sampling" msgstr "" -#: app/audioconfig.c:179 +#: app/audioconfig.c:222 msgid "Driver Module" msgstr "" -#: app/audioconfig.c:187 app/audioconfig.c:190 +#: app/audioconfig.c:223 +msgid "Mixer Module" +msgstr "" + +#: app/audioconfig.c:224 +msgid "Description" +msgstr "" + +#: app/audioconfig.c:232 app/audioconfig.c:235 msgid "Audio Configuration" msgstr "" +#: app/audioconfig.c:250 +msgid "Drivers" +msgstr "" + +#: app/audioconfig.c:287 +msgid "Mixers" +msgstr "" + +#: app/audioconfig.c:320 app/gui-settings.c:319 app/sample-editor.c:1607 +#: app/tips-dialog.c:165 app/transposition.c:313 +msgid "Close" +msgstr "" + #: app/drivers/alsa-input.c:125 app/drivers/alsa-output.c:134 #, c-format msgid "(%d bytes)" @@ -120,7 +141,7 @@ msgid "no settings (yet), sorry!" msgstr "" -#: app/drivers/file-output.c:161 app/sample-editor.c:1364 +#: app/drivers/file-output.c:161 app/sample-editor.c:1312 msgid "Can't open file for writing." msgstr "" @@ -143,14 +164,6 @@ "%s" msgstr "" -#: app/effectsconfig.c:56 -msgid "Master Reverb" -msgstr "" - -#: app/effectsconfig.c:153 app/effectsconfig.c:156 -msgid "Playback Effects Configuration" -msgstr "" - #: app/envelope-box.c:740 msgid "Length" msgstr "" @@ -196,91 +209,95 @@ msgid "Loop" msgstr "" -#: app/envelope-box.c:876 app/sample-editor.c:222 +#: app/envelope-box.c:876 app/sample-editor.c:225 msgid "Start" msgstr "" -#: app/envelope-box.c:877 app/sample-editor.c:223 +#: app/envelope-box.c:877 app/sample-editor.c:226 msgid "End" msgstr "" -#: app/file-operations.c:145 +#: app/file-operations.c:150 msgid "Load Module" msgstr "" -#: app/file-operations.c:146 +#: app/file-operations.c:151 msgid "Save Module" msgstr "" -#: app/file-operations.c:147 +#: app/file-operations.c:152 msgid "Render WAV" msgstr "" -#: app/file-operations.c:148 app/sample-editor.c:290 +#: app/file-operations.c:153 app/sample-editor.c:325 msgid "Load Sample" msgstr "" -#: app/file-operations.c:149 +#: app/file-operations.c:154 msgid "Save Sample" msgstr "" -#: app/file-operations.c:150 +#: app/file-operations.c:155 msgid "Load Instrument" msgstr "" -#: app/file-operations.c:151 +#: app/file-operations.c:156 msgid "Save Instrument" msgstr "" -#: app/file-operations.c:157 +#: app/file-operations.c:162 msgid "File" msgstr "" -#: app/file-operations.c:208 +#: app/file-operations.c:213 msgid "Operation not supported." msgstr "" -#: app/gui-settings.c:78 +#: app/gui-settings.c:86 msgid "Scopes Frequency" msgstr "" -#: app/gui-settings.c:81 +#: app/gui-settings.c:89 msgid "Tracker Frequency" msgstr "" -#: app/gui-settings.c:173 app/gui-settings.c:176 +#: app/gui-settings.c:188 app/gui-settings.c:191 msgid "GUI Configuration" msgstr "" -#: app/gui-settings.c:201 +#: app/gui-settings.c:217 msgid "Use Hexadecimal Numbers" msgstr "" -#: app/gui-settings.c:208 +#: app/gui-settings.c:224 msgid "Use upper case letters for hex numbers" msgstr "" -#: app/gui-settings.c:215 -msgid "Advance Cursor in FX Columns" +#: app/gui-settings.c:231 +msgid "Advance cursor horizontally in effect columns" +msgstr "" + +#: app/gui-settings.c:238 +msgid "Asynchronous Editing" msgstr "" -#: app/gui-settings.c:222 +#: app/gui-settings.c:245 msgid "Use anti-aliased envelope editor" msgstr "" -#: app/gui-settings.c:228 +#: app/gui-settings.c:251 msgid "You need to restart SoundTracker for this change to come into effect." msgstr "" -#: app/gui-settings.c:237 +#: app/gui-settings.c:260 msgid "Scopes buffer size [MB]" msgstr "" -#: app/gui-settings.c:256 +#: app/gui-settings.c:279 msgid "Highlight rows:" msgstr "" -#: app/gui-settings.c:274 +#: app/gui-settings.c:297 msgid "`Save XM' saves all non-empty patterns" msgstr "" @@ -288,7 +305,8 @@ msgid "Question" msgstr "" -#: app/gui-subs.c:447 app/sample-editor.c:1277 app/sample-editor.c:1457 +#: app/gui-subs.c:447 app/keys.c:702 app/sample-editor.c:1225 +#: app/sample-editor.c:1412 msgid "Cancel" msgstr "" @@ -304,65 +322,65 @@ msgid "Tempo" msgstr "" -#: app/gui.c:214 +#: app/gui.c:217 msgid "" "Are you sure you want to free the current project?\n" "All changes will be lost!" msgstr "" -#: app/gui.c:228 app/gui.c:242 +#: app/gui.c:231 app/gui.c:245 msgid "Are you sure you want to overwrite the file?" msgstr "" -#: app/gui.c:1119 +#: app/gui.c:1145 msgid "Load XM..." msgstr "" -#: app/gui.c:1121 +#: app/gui.c:1147 msgid "Save XM..." msgstr "" -#: app/gui.c:1124 +#: app/gui.c:1150 msgid "Render module as WAV..." msgstr "" -#: app/gui.c:1176 +#: app/gui.c:1202 msgid "Play Song" msgstr "" -#: app/gui.c:1182 +#: app/gui.c:1208 msgid "Play Pattern" msgstr "" -#: app/gui.c:1188 +#: app/gui.c:1214 msgid "Stop" msgstr "" -#: app/gui.c:1207 +#: app/gui.c:1233 msgid "Number of Channels:" msgstr "" -#: app/gui.c:1223 app/playlist.c:294 +#: app/gui.c:1249 app/playlist.c:294 msgid "Pattern" msgstr "" -#: app/gui.c:1239 +#: app/gui.c:1265 msgid "PatLength" msgstr "" -#: app/gui.c:1331 +#: app/gui.c:1357 msgid "Octave" msgstr "" -#: app/gui.c:1339 +#: app/gui.c:1365 msgid "Jump" msgstr "" -#: app/gui.c:1347 +#: app/gui.c:1373 msgid "Instr" msgstr "" -#: app/gui.c:1362 +#: app/gui.c:1388 msgid "Sample" msgstr "" @@ -446,492 +464,488 @@ msgid "The key that inserts the special keyoff note for FastTracker modules." msgstr "" -#: app/keys.c:135 +#: app/keys.c:136 msgid "Upper Octave Keys..." msgstr "" -#: app/keys.c:136 +#: app/keys.c:137 msgid "" "These are the keys on the upper half of the keyboard. The c key is normally " "the key to the right of the TAB key. The rest of the keys should be ordered " "in a piano keyboard fashion, including the number keys row above." msgstr "" -#: app/keys.c:142 +#: app/keys.c:143 msgid "Lower Octave Keys..." msgstr "" -#: app/keys.c:143 +#: app/keys.c:144 msgid "" "These are the keys on the lower half of the keyboard. The c key is normally " "the first character key to the right of the left Shift key. The rest of the " "keys should be ordered in a piano keyboard fashion, including the row above." msgstr "" -#: app/keys.c:149 +#: app/keys.c:150 msgid "Other Keys..." msgstr "" -#: app/keys.c:150 +#: app/keys.c:151 msgid "Various other keys" msgstr "" -#: app/keys.c:437 +#: app/keys.c:504 msgid "Function" msgstr "" -#: app/keys.c:438 +#: app/keys.c:505 msgid "Assignment" msgstr "" -#: app/keys.c:447 app/keys.c:450 +#: app/keys.c:514 app/keys.c:517 msgid "Keyboard Configuration" msgstr "" -#: app/keys.c:495 +#: app/keys.c:566 msgid "Key Group Explanation" msgstr "" -#: app/keys.c:512 +#: app/keys.c:583 msgid "Key Explanation" msgstr "" -#: app/keys.c:543 +#: app/keys.c:614 msgid "Modifiers:" msgstr "" -#: app/keys.c:569 +#: app/keys.c:640 msgid "Learn selected key" msgstr "" -#: app/keys.c:575 +#: app/keys.c:646 msgid "Learn all keys" msgstr "" -#: app/keys.c:581 +#: app/keys.c:652 msgid "" "Please press the desired key combination!\n" "Click into left list to cancel" msgstr "" -#: app/keys.c:645 +#: app/keys.c:682 app/menubar.c:94 +msgid "Ok" +msgstr "" + +#: app/keys.c:692 +msgid "Apply" +msgstr "" + +#: app/keys.c:760 msgid "" "The keyboard configuration file is defective.\n" "Please use the Keyboard Configuration dialog." msgstr "" -#: app/keys.c:895 +#: app/keys.c:1010 msgid "" "Automatic key configuration unsuccessful.\n" "Please use the Keyboard Configuration dialog\n" "in the Settings menu." msgstr "" -#: app/menubar.c:95 -msgid "Ok" -msgstr "" - -#: app/menubar.c:131 +#: app/menubar.c:130 msgid "" "Are you sure you want to do this?\n" "All changes will be lost!" msgstr "" -#: app/menubar.c:153 +#: app/menubar.c:152 msgid "" "Are you sure you want to quit?\n" "All changes will be lost!" msgstr "" -#: app/menubar.c:224 +#: app/menubar.c:223 msgid "_Open..." msgstr "" -#: app/menubar.c:226 +#: app/menubar.c:225 msgid "Save _as..." msgstr "" -#: app/menubar.c:232 +#: app/menubar.c:231 msgid "Save Module as _WAV..." msgstr "" -#: app/menubar.c:237 +#: app/menubar.c:236 msgid "_Quit" msgstr "" -#: app/menubar.c:244 +#: app/menubar.c:243 msgid "Clear _All" msgstr "" -#: app/menubar.c:246 +#: app/menubar.c:245 msgid "Clear _Patterns Only" msgstr "" -#: app/menubar.c:248 +#: app/menubar.c:247 msgid "_Optimize Module" msgstr "" -#: app/menubar.c:255 app/menubar.c:266 app/menubar.c:284 +#: app/menubar.c:254 app/menubar.c:265 app/menubar.c:283 msgid "C_ut" msgstr "" -#: app/menubar.c:257 app/menubar.c:268 app/menubar.c:286 +#: app/menubar.c:256 app/menubar.c:267 app/menubar.c:285 msgid "_Copy" msgstr "" -#: app/menubar.c:259 app/menubar.c:270 app/menubar.c:288 +#: app/menubar.c:258 app/menubar.c:269 app/menubar.c:287 msgid "_Paste" msgstr "" -#: app/menubar.c:272 +#: app/menubar.c:271 msgid "_Insert" msgstr "" -#: app/menubar.c:274 +#: app/menubar.c:273 msgid "_Delete" msgstr "" -#: app/menubar.c:282 +#: app/menubar.c:281 msgid "_Mark" msgstr "" -#: app/menubar.c:295 +#: app/menubar.c:294 msgid "_Jazz Edit Mode" msgstr "" -#: app/menubar.c:300 +#: app/menubar.c:299 msgid "Transp_osition..." msgstr "" -#: app/menubar.c:305 app/menubar.c:390 +#: app/menubar.c:304 app/menubar.c:387 msgid "_Pattern" msgstr "" -#: app/menubar.c:306 +#: app/menubar.c:305 msgid "_Track" msgstr "" -#: app/menubar.c:307 +#: app/menubar.c:306 msgid "_Selection" msgstr "" -#: app/menubar.c:313 +#: app/menubar.c:312 msgid "_Find Unused Pattern" msgstr "" -#: app/menubar.c:315 +#: app/menubar.c:314 msgid "_Copy Current to Unused Pattern" msgstr "" -#: app/menubar.c:317 +#: app/menubar.c:316 msgid "C_lear Unused Patterns" msgstr "" -#: app/menubar.c:319 +#: app/menubar.c:318 msgid "_Pack Patterns" msgstr "" -#: app/menubar.c:326 +#: app/menubar.c:325 msgid "_Load XI..." msgstr "" -#: app/menubar.c:328 +#: app/menubar.c:327 msgid "_Save XI..." msgstr "" -#: app/menubar.c:333 +#: app/menubar.c:332 msgid "_Clear Current" msgstr "" -#: app/menubar.c:338 +#: app/menubar.c:337 msgid "_Delete Unused Instruments" msgstr "" -#: app/menubar.c:346 +#: app/menubar.c:345 msgid "Display _Oscilloscopes" msgstr "" -#: app/menubar.c:348 +#: app/menubar.c:347 msgid "Use _Backing Store" msgstr "" -#: app/menubar.c:353 +#: app/menubar.c:352 msgid "_Keyboard Configuration..." msgstr "" -#: app/menubar.c:355 +#: app/menubar.c:354 msgid "_Audio Configuration..." msgstr "" -#: app/menubar.c:357 -msgid "_Playback Effects..." -msgstr "" - -#: app/menubar.c:359 +#: app/menubar.c:356 msgid "_GUI Configuration..." msgstr "" -#: app/menubar.c:364 +#: app/menubar.c:361 msgid "_Save Settings now" msgstr "" -#: app/menubar.c:366 +#: app/menubar.c:363 msgid "Save Settings on _Exit" msgstr "" -#: app/menubar.c:373 +#: app/menubar.c:370 msgid "_About..." msgstr "" -#: app/menubar.c:378 +#: app/menubar.c:375 msgid "Show _Tips..." msgstr "" -#: app/menubar.c:380 +#: app/menubar.c:377 msgid "_XM Effects..." msgstr "" -#: app/menubar.c:387 +#: app/menubar.c:384 msgid "_File" msgstr "" -#: app/menubar.c:388 +#: app/menubar.c:385 msgid "_Module" msgstr "" -#: app/menubar.c:389 +#: app/menubar.c:386 msgid "_Edit" msgstr "" -#: app/menubar.c:391 +#: app/menubar.c:388 msgid "_Instrument" msgstr "" -#: app/menubar.c:392 +#: app/menubar.c:389 msgid "_Settings" msgstr "" -#: app/menubar.c:393 +#: app/menubar.c:390 msgid "_Help" msgstr "" -#: app/menubar.c:423 +#: app/menubar.c:420 msgid "/_File" msgstr "" -#: app/menubar.c:424 +#: app/menubar.c:421 msgid "/File/_Open..." msgstr "" -#: app/menubar.c:425 +#: app/menubar.c:422 msgid "/File/Save _as..." msgstr "" -#: app/menubar.c:426 app/menubar.c:428 +#: app/menubar.c:423 app/menubar.c:425 msgid "/File/-" msgstr "" -#: app/menubar.c:427 +#: app/menubar.c:424 msgid "/File/Save Module as _WAV..." msgstr "" -#: app/menubar.c:429 +#: app/menubar.c:426 msgid "/File/_Quit" msgstr "" -#: app/menubar.c:430 +#: app/menubar.c:427 msgid "/_Module" msgstr "" -#: app/menubar.c:431 +#: app/menubar.c:428 msgid "/Module/Clear _All" msgstr "" -#: app/menubar.c:432 +#: app/menubar.c:429 msgid "/Module/Clear _Patterns Only" msgstr "" -#: app/menubar.c:433 +#: app/menubar.c:430 msgid "/Module/_Optimize Module" msgstr "" -#: app/menubar.c:434 +#: app/menubar.c:431 msgid "/_Edit" msgstr "" -#: app/menubar.c:435 +#: app/menubar.c:432 msgid "/Edit/_Jazz Edit Mode" msgstr "" -#: app/menubar.c:436 app/menubar.c:438 +#: app/menubar.c:433 app/menubar.c:435 msgid "/Edit/-" msgstr "" -#: app/menubar.c:437 +#: app/menubar.c:434 msgid "/Edit/_Transposition..." msgstr "" -#: app/menubar.c:439 +#: app/menubar.c:436 msgid "/Edit/_Pattern" msgstr "" -#: app/menubar.c:440 +#: app/menubar.c:437 msgid "/Edit/Pattern/C_ut" msgstr "" -#: app/menubar.c:441 +#: app/menubar.c:438 msgid "/Edit/Pattern/_Copy" msgstr "" -#: app/menubar.c:442 +#: app/menubar.c:439 msgid "/Edit/Pattern/_Paste" msgstr "" -#: app/menubar.c:443 +#: app/menubar.c:440 msgid "/Edit/_Track" msgstr "" -#: app/menubar.c:444 +#: app/menubar.c:441 msgid "/Edit/Track/C_ut" msgstr "" -#: app/menubar.c:445 +#: app/menubar.c:442 msgid "/Edit/Track/_Copy" msgstr "" -#: app/menubar.c:446 +#: app/menubar.c:443 msgid "/Edit/Track/_Paste" msgstr "" -#: app/menubar.c:447 +#: app/menubar.c:444 msgid "/Edit/Track/_Insert" msgstr "" -#: app/menubar.c:448 +#: app/menubar.c:445 msgid "/Edit/Track/_Delete" msgstr "" -#: app/menubar.c:449 +#: app/menubar.c:446 msgid "/Edit/_Selection" msgstr "" -#: app/menubar.c:450 +#: app/menubar.c:447 msgid "/Edit/Selection/_Mark" msgstr "" -#: app/menubar.c:451 +#: app/menubar.c:448 msgid "/Edit/Selection/C_ut" msgstr "" -#: app/menubar.c:452 +#: app/menubar.c:449 msgid "/Edit/Selection/_Copy" msgstr "" -#: app/menubar.c:453 +#: app/menubar.c:450 msgid "/Edit/Selection/_Paste" msgstr "" -#: app/menubar.c:454 +#: app/menubar.c:451 msgid "/_Pattern" msgstr "" -#: app/menubar.c:455 +#: app/menubar.c:452 msgid "/Pattern/_Find Unused Pattern" msgstr "" -#: app/menubar.c:456 +#: app/menubar.c:453 msgid "/Pattern/_Copy Current to Unused Pattern" msgstr "" -#: app/menubar.c:457 +#: app/menubar.c:454 msgid "/Pattern/C_lear Unused Patterns" msgstr "" -#: app/menubar.c:458 +#: app/menubar.c:455 msgid "/Pattern/_Pack Patterns" msgstr "" -#: app/menubar.c:459 +#: app/menubar.c:456 msgid "/_Instrument" msgstr "" -#: app/menubar.c:460 +#: app/menubar.c:457 msgid "/Instrument/_Load XI..." msgstr "" -#: app/menubar.c:461 +#: app/menubar.c:458 msgid "/Instrument/_Save XI..." msgstr "" -#: app/menubar.c:462 app/menubar.c:464 +#: app/menubar.c:459 app/menubar.c:461 msgid "/Instrument/-" msgstr "" -#: app/menubar.c:463 +#: app/menubar.c:460 msgid "/Instrument/_Clear Current" msgstr "" -#: app/menubar.c:465 +#: app/menubar.c:462 msgid "/Instrument/_Delete Unused Instruments" msgstr "" -#: app/menubar.c:466 +#: app/menubar.c:463 msgid "/_Settings" msgstr "" -#: app/menubar.c:467 +#: app/menubar.c:464 msgid "/Settings/Display _Oscilloscopes" msgstr "" -#: app/menubar.c:468 +#: app/menubar.c:465 msgid "/Settings/Use _Backing Store" msgstr "" -#: app/menubar.c:469 app/menubar.c:474 +#: app/menubar.c:466 app/menubar.c:470 msgid "/Settings/-" msgstr "" -#: app/menubar.c:470 +#: app/menubar.c:467 msgid "/Settings/_Keyboard Configuration..." msgstr "" -#: app/menubar.c:471 +#: app/menubar.c:468 msgid "/Settings/_Audio Configuration..." msgstr "" -#: app/menubar.c:472 -msgid "/Settings/_Playback Effects..." -msgstr "" - -#: app/menubar.c:473 +#: app/menubar.c:469 msgid "/Settings/_GUI Configuration..." msgstr "" -#: app/menubar.c:475 +#: app/menubar.c:471 msgid "/Settings/_Save Settings now" msgstr "" -#: app/menubar.c:476 +#: app/menubar.c:472 msgid "/Settings/Save Settings on _Exit" msgstr "" -#: app/menubar.c:477 +#: app/menubar.c:473 msgid "/_Help" msgstr "" -#: app/menubar.c:478 +#: app/menubar.c:474 msgid "/Help/_About..." msgstr "" -#: app/menubar.c:479 +#: app/menubar.c:475 msgid "/Help/-" msgstr "" -#: app/menubar.c:480 +#: app/menubar.c:476 msgid "/Help/Show _Tips..." msgstr "" -#: app/menubar.c:481 +#: app/menubar.c:477 msgid "/Help/_XM Effects..." msgstr "" @@ -951,7 +965,7 @@ msgid "Linear" msgstr "" -#: app/module-info.c:118 app/sample-editor.c:182 +#: app/module-info.c:118 app/sample-editor.c:185 msgid "Amiga" msgstr "" @@ -989,148 +1003,143 @@ "home directory to store configuration files.\n" msgstr "" -#: app/sample-editor.c:181 +#: app/sample-editor.c:184 msgid "No loop" msgstr "" -#: app/sample-editor.c:183 +#: app/sample-editor.c:186 msgid "PingPong" msgstr "" -#: app/sample-editor.c:187 +#: app/sample-editor.c:190 msgid "8 bits" msgstr "" -#: app/sample-editor.c:188 +#: app/sample-editor.c:191 msgid "16 bits" msgstr "" -#: app/sample-editor.c:194 +#: app/sample-editor.c:197 msgid "Sample Editor" msgstr "" -#: app/sample-editor.c:234 +#: app/sample-editor.c:237 msgid "Volume" msgstr "" -#: app/sample-editor.c:235 +#: app/sample-editor.c:238 msgid "Panning" msgstr "" -#: app/sample-editor.c:236 +#: app/sample-editor.c:239 msgid "Finetune" msgstr "" -#: app/sample-editor.c:247 -msgid "SelStart" +#: app/sample-editor.c:259 +msgid "Selection:" msgstr "" -#: app/sample-editor.c:248 -msgid "SelEnd" +#: app/sample-editor.c:263 +msgid "None" msgstr "" -#: app/sample-editor.c:256 -msgid "Sel None" +#: app/sample-editor.c:269 +msgid "All" msgstr "" -#: app/sample-editor.c:262 -msgid "Sel All" +#: app/sample-editor.c:290 +msgid "Length:" msgstr "" -#: app/sample-editor.c:268 +#: app/sample-editor.c:306 msgid "RelNote" msgstr "" -#: app/sample-editor.c:269 -msgid "Length: 0" -msgstr "" - -#: app/sample-editor.c:282 +#: app/sample-editor.c:317 msgid "Load Sample..." msgstr "" -#: app/sample-editor.c:284 +#: app/sample-editor.c:319 msgid "Save WAV..." msgstr "" -#: app/sample-editor.c:286 +#: app/sample-editor.c:321 msgid "Save region as WAV..." msgstr "" -#: app/sample-editor.c:299 +#: app/sample-editor.c:334 msgid "Save WAV" msgstr "" -#: app/sample-editor.c:309 +#: app/sample-editor.c:344 msgid "Save Region" msgstr "" -#: app/sample-editor.c:320 +#: app/sample-editor.c:355 msgid "Monitor" msgstr "" -#: app/sample-editor.c:326 +#: app/sample-editor.c:361 msgid "Volume Ramp" msgstr "" -#: app/sample-editor.c:336 +#: app/sample-editor.c:371 msgid "Zoom to selection" msgstr "" -#: app/sample-editor.c:342 +#: app/sample-editor.c:377 msgid "Show all" msgstr "" -#: app/sample-editor.c:348 +#: app/sample-editor.c:383 msgid "Zoom in (+50%)" msgstr "" -#: app/sample-editor.c:354 +#: app/sample-editor.c:389 msgid "Zoom out (-50%)" msgstr "" -#: app/sample-editor.c:360 +#: app/sample-editor.c:395 msgid "Reverse" msgstr "" -#: app/sample-editor.c:370 +#: app/sample-editor.c:405 msgid "Cut" msgstr "" -#: app/sample-editor.c:376 +#: app/sample-editor.c:411 msgid "Remove" msgstr "" -#: app/sample-editor.c:382 +#: app/sample-editor.c:417 msgid "Copy" msgstr "" -#: app/sample-editor.c:388 +#: app/sample-editor.c:423 msgid "Paste" msgstr "" -#: app/sample-editor.c:394 +#: app/sample-editor.c:429 msgid "Clear Sample" msgstr "" -#: app/sample-editor.c:481 -#, c-format -msgid "Length: %d" +#: app/sample-editor.c:467 +msgid "(no selection)" msgstr "" -#: app/sample-editor.c:1033 +#: app/sample-editor.c:1000 msgid "" msgstr "" -#: app/sample-editor.c:1117 +#: app/sample-editor.c:1076 msgid "Read error." msgstr "" -#: app/sample-editor.c:1233 +#: app/sample-editor.c:1181 msgid "Load stereo sample" msgstr "" -#: app/sample-editor.c:1241 +#: app/sample-editor.c:1189 msgid "" "You have selected a stereo sample!\n" "(SoundTracker can only handle mono samples!)\n" @@ -1138,79 +1147,75 @@ "Please choose which channel to load:" msgstr "" -#: app/sample-editor.c:1252 +#: app/sample-editor.c:1200 msgid "Left" msgstr "" -#: app/sample-editor.c:1258 +#: app/sample-editor.c:1206 msgid "Mix" msgstr "" -#: app/sample-editor.c:1264 +#: app/sample-editor.c:1212 msgid "Right" msgstr "" -#: app/sample-editor.c:1303 +#: app/sample-editor.c:1251 msgid "Can't read sample" msgstr "" -#: app/sample-editor.c:1309 +#: app/sample-editor.c:1257 msgid "Sample is too long for current mixer module. Loading anyway." msgstr "" -#: app/sample-editor.c:1323 +#: app/sample-editor.c:1271 msgid "Can only handle 8 and 16 bit samples with up to 2 channels" msgstr "" -#: app/sample-editor.c:1415 +#: app/sample-editor.c:1370 msgid "Nothing to save." msgstr "" -#: app/sample-editor.c:1442 +#: app/sample-editor.c:1397 msgid "OK" msgstr "" -#: app/sample-editor.c:1450 +#: app/sample-editor.c:1405 msgid "Start sampling" msgstr "" -#: app/sample-editor.c:1485 app/sample-editor.c:1488 +#: app/sample-editor.c:1440 app/sample-editor.c:1443 msgid "Sampling Window" msgstr "" -#: app/sample-editor.c:1588 +#: app/sample-editor.c:1543 msgid "" msgstr "" -#: app/sample-editor.c:1618 +#: app/sample-editor.c:1573 msgid "Recorded sample is too long for current mixer module. Using it anyway." msgstr "" -#: app/sample-editor.c:1650 +#: app/sample-editor.c:1605 msgid "Normalize" msgstr "" -#: app/sample-editor.c:1651 +#: app/sample-editor.c:1606 msgid "Execute" msgstr "" -#: app/sample-editor.c:1652 app/tips-dialog.c:165 -msgid "Close" -msgstr "" - -#: app/sample-editor.c:1661 app/sample-editor.c:1664 +#: app/sample-editor.c:1616 app/sample-editor.c:1619 msgid "Volume Ramping" msgstr "" -#: app/sample-editor.c:1681 +#: app/sample-editor.c:1636 msgid "Perform linear volume fade on Selection" msgstr "" -#: app/sample-editor.c:1693 +#: app/sample-editor.c:1648 msgid "Left [%]:" msgstr "" -#: app/sample-editor.c:1698 +#: app/sample-editor.c:1653 msgid "Right [%]:" msgstr "" @@ -1324,72 +1329,72 @@ msgid "Transposition Tools" msgstr "" -#: app/transposition.c:217 +#: app/transposition.c:218 msgid "Scope of the operation:" msgstr "" -#: app/transposition.c:224 +#: app/transposition.c:225 msgid "Note Transposition" msgstr "" -#: app/transposition.c:254 +#: app/transposition.c:255 msgid "Instrument Changing" msgstr "" -#: app/transposition.c:269 +#: app/transposition.c:270 msgid "Instrument 1:" msgstr "" -#: app/transposition.c:271 app/transposition.c:281 +#: app/transposition.c:272 app/transposition.c:282 msgid "Current instrument" msgstr "" -#: app/transposition.c:279 +#: app/transposition.c:280 msgid "Instrument 2:" msgstr "" -#: app/xm.c:161 +#: app/xm.c:170 #, c-format msgid "Pattern length out of range: %d.\n" msgstr "" -#: app/xm.c:441 app/xm.c:512 +#: app/xm.c:455 app/xm.c:526 #, c-format msgid "Invalid vibtype %d, using Sine.\n" msgstr "" -#: app/xm.c:472 +#: app/xm.c:486 msgid "File is no XI instrument." msgstr "" -#: app/xm.c:482 +#: app/xm.c:496 #, c-format msgid "Unknown XI version 0x%x\n" msgstr "" -#: app/xm.c:757 -msgid "No FastTracker XM and no supported MOD format!" -msgstr "" - -#: app/xm.c:771 app/xm.c:876 +#: app/xm.c:787 app/xm.c:901 msgid "Error while loading patterns." msgstr "" -#: app/xm.c:829 +#: app/xm.c:851 msgid "Can't open file" msgstr "" -#: app/xm.c:843 +#: app/xm.c:865 msgid "XM header length != 276. Maybe a pre-0.0.12 SoundTracker module? :-)\n" msgstr "" -#: app/xm.c:882 +#: app/xm.c:907 msgid "Error while loading instruments." msgstr "" -#: app/xm.c:893 +#: app/xm.c:918 #, c-format msgid "" "Module contains sample(s) that are too long for the current mixer.\n" "Maximum sample length is %d." +msgstr "" + +#: app/xm.c:1234 +msgid "No FastTracker XM and no supported MOD format!" msgstr "" diff -urN soundtracker-0.3.10/soundtracker.spec soundtracker-0.5.0/soundtracker.spec --- soundtracker-0.3.10/soundtracker.spec Wed Jan 26 18:53:02 2000 +++ soundtracker-0.5.0/soundtracker.spec Mon Mar 13 14:02:01 2000 @@ -1,6 +1,6 @@ %define name soundtracker -%define version 0.3.10 -%define release 11 +%define version 0.5.0 +%define release 12 %define prefix /usr Summary: Sound modules editor/player