further utilize sound interface - part 2

Expand windsound to support SNDCAP_USERSOUNDS (existing),
SNDCAP_SOUNDEFFECTS, SNDCAP_HEROMUSIC.

Place a small number of wav files into sound/wav that are considered
more specific to some game stuff in the core, namely: playing
instruments by the hero, squeaky board traps. The intention is that
those ones can be integrated into the game without requiring user
file deposits or mappings. Building soundlib support for sound/windsound
searches for them as resources, so they should "just work."

No actual instrument playback is available in the base sound/windsound
soundlib implementation (yet, at least), so it works around that in
a cheap way by using the note-variant wav sounds to concoct the
notes. There are better ways of doing music generation than that,
of course, but this will do in the early going. Any other soundlib
port (such as Qt) can probably easily do the exact same thing. If it
can play USER_SOUNDS, it can almost certainly use the
sound/wav/se_squeak*.wav and sound/wav/sound_*.wav files for
SND_HEROMUSIC and squeaky board sounds soundeffects.

A few of the se_ sounds in sound/wav are free yet licensed, and
there is a file called attributions.txt to meticulously attempt
to comply with the two license variations involved.

SND_SOUNDEFFECTS_AUTOMAP

If SND_SOUNDEFFECTS_AUTOMAP is defined, and a SND_LIB_ interface
that supports SNDPROC_SOUNDEFFECTS is also defined to integrate
soundlib support, the following gets added:

  o If sounddir is defined (existing longstanding feature that's
    been used with USER_SOUNDS for many, many years) any wav file
    present in SOUNDDIR with a name that matches one of the defined
    sound effects in include/sndproc.h will get played each time
    that soundeffect comes up. So, just drop appropriate wav files
    into sounddir and rename it to match.

    No tedious config file entries are required to get soundeffects.

    [ The only config file change required is to
      set SOUNDDIR to point to your directory with the wav files.
      Note: SOUNDDIR only works in your config file if NetHack
      was built with USER_SOUNDS defined. ]

    This is new so there may certainly be some bugs in here.
    Please kindly report them if you encounter any.

    For those that don't read C very well, these are the file names
    that should trigger the SOUNDEFFECTS_AUTOMAP, assuming it is working.

        se_faint_splashing.wav
        se_crackling_of_hellfire.wav
        se_heart_beat.wav
        se_typing_noise.wav
        se_hollow_sound.wav
        se_rustling_paper.wav
        se_crushing_sound.wav
        se_splash.wav
        se_chains_rattling_gears_turning.wav
        se_smashing_and_crushing.wav
        se_gears_turning_chains_rattling.wav
        se_loud_splash.wav
        se_lound_crash.wav
        se_crashing_rock.wav
        se_sizzling.wav
        se_crashing_boulder.wav
        se_boulder_drop.wav
        se_item_tumble_downwards.wav
        se_drain_noises.wav
        se_ring_in_drain.wav
        se_groans_and_moans.wav
        se_scratching.wav
        se_glass_shattering.wav
        se_egg_cracking.wav
        se_gushing_sound.wav
        se_glass_crashing.wav
        se_egg_splatting.wav
        se_sinister_laughter.wav
        se_blast.wav
        se_stone_breaking.wav
        se_stone_crumbling.wav
        se_snakes_hissing.wav
        se_loud_pop.wav
        se_clanking_pipe.wav
        se_sewer_song.wav
        se_monster_behind_boulder.wav
        se_wailing_of_the_banshee.wav
        se_swoosh.wav
        se_explosion.wav
        se_crashing_sound.wav
        se_someone_summoning.wav
        se_rushing_wind_noise.wav
        se_splat_from_engulf.wav
        se_faint_sloshing.wav
        se_crunching_sound.wav
        se_slurping_sound.wav
        se_masticating_sound.wav
        se_distant_thunder.wav
        se_applause.wav
        se_shrill_whistle.wav
        se_someone_yells.wav
        se_door_unlock_and_open.wav
        se_door_open.wav
        se_door_crash_open.wav
        se_dry_throat_rattle.wav
        se_cough.wav
        se_angry_snakes.wav
        se_zap_then_explosion.wav
        se_zap.wav
        se_horn_being_played.wav
        se_mon_chugging_potion.wav
        se_bugle_playing_reveille.wav
        se_crash_through_floor.wav
        se_thump.wav
        se_scream.wav
        se_tumbler_click.wav
        se_gear_turn.wav
        se_divine_music.wav
        se_thunderclap.wav
        se_sad_wailing.wav
        se_maniacal_laughter.wav
        se_rumbling_of_earth.wav
        se_clanging_sound.wav
        se_mutter_imprecations.wav
        se_mutter_incantation.wav
        se_angry_voice.wav
        se_sceptor_pounding.wav
        se_courtly_conversation.wav
        se_low_buzzing.wav
        se_angry_drone.wav
        se_bees.wav
        se_someone_searching.wav
        se_guards_footsteps.wav
        se_faint_chime.wav
        se_loud_click.wav
        se_soft_click.wav
        se_squeak.wav
        se_squeak_C.wav
        se_squeak_D_flat.wav
        se_squeak_D.wav
        se_squeak_E_flat.wav
        se_squeak_E.wav
        se_squeak_F.wav
        se_squeak_F_sharp.wav
        se_squeak_G.wav
        se_squeak_G_sharp.wav
        se_squeak_A.wav
        se_squeak_B_flat.wav
        se_squeak_B.wav
        se_someone_bowling.wav
        se_rumbling.wav
        se_loud_crash.wav
        se_deafening_roar_atmospheric.wav
        se_low_hum.wav
        se_laughter.wav
        se_cockatrice_hiss.wav
        se_chant.wav
        se_cracking_sound.wav
        se_ripping_sound.wav
        se_thud.wav
        se_clank.wav
        se_crumbling_sound.wav
        se_soft_crackling.wav
        se_crackling.wav
        se_sharp_crack.wav
        se_wall_of_force.wav
        se_alarm.wav
        se_kick_door_it_shatters.wav
        se_kick_door_it_crashes_open.wav
        se_bubble_rising.wav
        se_bolt_of_lightning.wav
        se_board_squeak.wav
        se_board_squeaks_loudly.wav
        se_boing.wav
        se_crashed_ceiling.wav
        se_clash.wav
        se_crash_door.wav
        se_crash.wav
        se_crash_throne_destroyed.wav
        se_crash_something_broke.wav
        se_kadoom_boulder_falls_in.wav
        se_klunk_pipe.wav
        se_kerplunk_boulder_gone.wav
        se_klunk.wav
        se_klick.wav
        se_kaboom_door_explodes.wav
        se_kaboom_boom_boom.wav
        se_kaablamm_of_mine.wav
        se_kaboom.wav
        se_splat_egg.wav
        se_destroy_web.wav
        se_iron_ball_dragging_you.wav
        se_iron_ball_hits_you.wav
        se_lid_slams_open_falls_shut.wav
        se_chain_shatters.wav
        se_furious_bubbling.wav
        se_air_crackles.wav
        se_potion_crash_and_break.wav
        se_hiss.wav
        se_growl.wav
        se_canine_bark.wav
        se_canine_growl.wav
        se_canine_whine.wav
        se_canine_yip.wav
        se_canine_howl.wav
        se_feline_yowl.wav
        se_feline_meow.wav
        se_feline_purr.wav
        se_feline_yip.wav
        se_feline_mew.wav
        se_roar.wav
        se_snarl.wav
        se_buzz.wav
        se_squeek.wav
        se_squawk.wav
        se_squeal.wav
        se_screech.wav
        se_equine_neigh.wav
        se_equine_whinny.wav
        se_equine_whicker.wav
        se_bovine_moo.wav
        se_bovine_bellow.wav
        se_wail.wav
        se_groan.wav
        se_grunt.wav
        se_gurgle.wav
        se_elephant_trumpet.wav
        se_snake_rattle.wav
        se_hallu_growl.wav

This needs further testing. At the moment only windsound has
this.

If nobody else looks into it for Qt, I'll take a look in a
few days.
This commit is contained in:
nhmall
2023-01-22 13:29:44 -05:00
parent 18a77b1c42
commit 5e0fea186c
62 changed files with 760 additions and 17 deletions

View File

@@ -1813,6 +1813,7 @@ extern boolean munslime(struct monst *, boolean);
extern void awaken_soldiers(struct monst *);
extern int do_play_instrument(struct obj *);
enum instruments obj_to_instr(struct obj *);
/* ### nhlsel.c ### */
@@ -2605,6 +2606,10 @@ extern void play_usersound_via_idx(int, int);
extern void assign_soundlib(int);
extern void activate_chosen_soundlib(void);
extern void get_soundlib_name(char *dest, int maxlen);
#ifdef SND_SOUNDEFFECTS_AUTOMAP
extern char *get_sound_effect_filename(int32_t seidint,
char *buf, size_t bufsz, int32_t);
#endif
/* ### sp_lev.c ### */

View File

@@ -126,12 +126,13 @@ extern struct sound_procs soundprocs;
/* subset for NetHack */
enum instruments {
ins_choir_aahs = 53, ins_trumpet = 57, ins_trombone = 58,
ins_french_horn = 61, ins_english_horn = 70, ins_piccolo = 73,
ins_cello = 43, ins_orchestral_harp = 47, ins_choir_aahs = 53,
ins_trumpet = 57, ins_trombone = 58, ins_french_horn = 61,
ins_baritone_sax = 68, ins_english_horn = 70, ins_piccolo = 73,
ins_flute = 74, ins_pan_flute = 76, ins_blown_bottle = 77,
ins_whistle = 79, ins_tinkle_bell = 113, ins_woodblock = 116,
ins_taiko_drum = 117, ins_melodic_tom = 118, ins_seashore = 123,
ins_fencepost
ins_no_instrument
};
#if 0
@@ -174,11 +175,12 @@ enum instruments_broad {
ins_guitar_fret_noise = 121, ins_breath_noise = 122, ins_seashore = 123,
ins_bird_tweet = 124, ins_telephone_ring = 125, ins_helicopter = 126,
ins_applause = 127, ins_gunshot = 128,
ins_fencepost
ins_no_instrument
};
#endif
enum sound_effect_entries {
se_zero_invalid = 0,
se_faint_splashing = 1,
se_crackling_of_hellfire = 2,
se_heart_beat = 3,
@@ -358,6 +360,7 @@ enum sound_effect_entries {
se_elephant_trumpet = 177,
se_snake_rattle = 178,
se_hallu_growl = 179,
number_of_se_entries
};
#if defined(SND_LIB_QTSOUND) || defined(SND_LIB_PORTAUDIO) \
@@ -366,6 +369,15 @@ enum sound_effect_entries {
|| defined(SND_LIB_SOUND_ESCCODES) || defined(SND_LIB_VISSOUND) \
|| defined(SND_LIB_WINDSOUND)
#define SND_LIB_INTEGRATED /* shortcut for conditional code in other files */
#define Play_usersound(filename, vol, idx) \
do { \
if (!Deaf && soundprocs.sound_play_usersound \
&& ((soundprocs.sndcap & SNDCAP_USERSOUNDS) != 0)) \
(*soundprocs.sound_play_usersound)((filename), (vol), (idx)); \
} while(0)
#define Soundeffect(seid, vol) \
do { \
if (!Deaf && soundprocs.sound_soundeffect \
@@ -373,8 +385,19 @@ enum sound_effect_entries {
(*soundprocs.sound_soundeffect)(emptystr, (seid), (vol)); \
} while(0)
#define Hero_playnotes(instrument, str, vol) \
do { \
if (!Deaf && soundprocs.sound_hero_playnotes \
&& ((soundprocs.sndcap & SNDCAP_HEROMUSIC) != 0)) \
(*soundprocs.sound_hero_playnotes)((instrument), (str), (vol)); \
} while(0)
#else
#ifdef SND_LIB_INTEGRATED
#undef SND_LIB_INTEGRATED
#endif
#define Play_usersound(filename, vol, idx)
#define Soundeffect(seid, vol)
#define Hero_playnotes(instrument, str, vol)
#endif
#endif /* SNDPROCS_H */

View File

@@ -93,6 +93,10 @@
extern void interject_assistance(int, int, genericptr_t, genericptr_t);
extern void interject(int);
#if defined(SND_LIB_WINDSOUND)
#define SND_SOUNDEFFECTS_AUTOMAP
#endif
/*
*===============================================
* Compiler-specific adjustments

63
sound/wav/README Normal file
View File

@@ -0,0 +1,63 @@
January 22, 2023 - sounds
Important: For the included se_* wav files, please refer to the file
'sound/wav attributions.txt' for the details about the
source, author, and licensing.
There were old aiif versions of some sound samples distributed
in uuencoded form in earlier versions of NetHack: bell.uu, bugle.uu,
erthdrum.uu, firehorn.uu, frsthorn.uu, lethdrum.uu, mgcflute.uu,
mgcharp.uu, toolhorn.uu, wdnflute.uu and wdnharp.uu.
Those had been removed in commit 217671e00f626e53d314757b4687950466efb360
in May 2019, at the same time built-in speaker support was removed.
Some of those original files have been converted into wav files starting
with NetHack 3.7. The pitch variation versions offer a chance for very
simple tune playback on platforms that offer a basic play-sound function
call, which many do. There is no need to manipulate the underlying sounds
with those, although sound library interfaces may certainly produce
music in more elabote and pleasing ways. Contributions are welcome.
While they make the distribution larger, they offer a more immersive
experience while playing locally on many platforms or with many
sound libraries. Also, file/distribution size is not the same
concern in 2023 that it might have been in 1995 or 2003.
This is the note that accompanied those original sound files.
------------------------------------------------------------
README for the AIFF files:
These files are sound files for the instruments in NetHack.
There are 11 sounds, one for each distinct instrument.
The sounds are in 8-bit 22kHz AIFF format, which should be
readable by a broad range of platforms. Since the sounds
came from Rolands S-750 sample library (most of them) there
should be no copyright on them when we treat them like we
do here (as instruments) - indeed, the sample library I
got from Roland didn't even bear a (c) symbol.
Some of the sounds are very adequate (Drum of Earthquake,
Wooden Flute, Magic Harp) while some are less true to the
original name (how does a Frost Horn sound?) Actually, I
don't know what a Bugle is (Bugle horn?) so I took a trumpet
sound for that. Correct me if I'm wrong.
What does this have to do with the main code? Well, nothing
so far. There are some places that are #ifdef MAC and calls
mac_speaker; that function takes an object and a tune (in
capital letters A-G) and plays the tune with the given
instrument. When playing a specific tune, that tune is of
course used. For "improvise," I use middle "C."
Ideally, we should do something equal with sound that we
have with displays, so we can use one common set of calls
in the main code, and have ports do whatever seems appropriate
for the available hardware.
Any comment on the sounds or their use is welcome:
Jon W{tte
Mac Team
nethack-bugs@nethack.org

152
sound/wav/attributions.txt Normal file
View File

@@ -0,0 +1,152 @@
/* NetHack 3.7 attributions.txt $NHDT-Date: 1652831519 2022/05/17 23:51:59 $
Attributions and credits and modifications for sounds used are listed below.
File: se_squeak_C.wav
Source: https://freesound.org/people/seth-m/sounds/269722/
Original: download/269722__seth-m__wood-creaks.wav
By: https://freesound.org/people/seth-m/
License: http://creativecommons.org/publicdomain/zero/1.0/
Download Date: January 21, 2023
Description of modifications made to the original:
- 00h00m02.194s to 00h00m02.765s as selection.
- Saved selection to file named se_squeak_C.wav
- .571 seconds
File: se_squeak_D_flat.wav
Source: https://freesound.org/people/AlienXXX/sounds/151346/
Original: download/151346__alienxxx__creaking-floor-upstairs.wav
By: https://freesound.org/people/AlienXXX/
License: https://creativecommons.org/licenses/by/4.0/
Download Date: January 21, 2023
Description of modifications made to the original:
- 00h00m37.641s to 00h00m39.320s as selection.
- Used Audacity, Effect to change selection pitch to C#/Dflat 3.
- Saved selection to file named se_squeak_D_flat.wav
- 1.679 seconds
File: se_squeak_D.wav
Source: https://freesound.org/people/Talitha5/sounds/321883/
Original: download/321883__talitha5__floorboard-creaking.mp3
By: https://freesound.org/people/Talitha5/
License: http://creativecommons.org/publicdomain/zero/1.0/
Download Date: January 21, 2023
Description of modifications made to the original:
- 00h00m24.447s to 00h00m225.790s as selection.
- Saved selection to file named se_squeak_D.wav
- 2.067 seconds
File:se_squeak_E_flat.wav
Source: https://freesound.org/people/tosha73/sounds/570864/
Original: download/570864__tosha73__creaking-boards.wav
By: https://freesound.org/people/tosha73/
License: https://creativecommons.org/licenses/by/4.0/
Download Date: January 21, 2023
Description of modifications made to the original:
- 00h00m30.192s to 00h00m30.819s as selection.
- Saved selection to file named se_squeak_E_flat.wav
- .627 seconds
File: se_squeak_E.wav
Source: https://freesound.org/people/Benboncan/sounds/101381/
Original: download/101381__benboncan__creaking-floorboard.wav
By: https://freesound.org/people/Benboncan/
License: https://creativecommons.org/licenses/by/4.0/
Download Date: January 21, 2023
Description of modifications made to the original:
- 00h00m12.892s to 00h00m14.709s as selection.
- Saved selection to file named se_squeak_E.wav
- 1.817 seconds
File: se_squeak_F.wav
Source: https://freesound.org/people/Talitha5/sounds/321883/
Original: download/321883__talitha5__floorboard-creaking.mp3
By: https://freesound.org/people/Talitha5/
License: http://creativecommons.org/publicdomain/zero/1.0/
Download Date: January 21, 2023
Description of modifications made to the original:
- 00h00m56.926s to 00h00m58.402s as selection.
- Saved selection to file named se_squeak_F.wav
- 1.476 seconds.
File: se_squeak_F_sharp.wav
Source: https://freesound.org/people/seth-m/sounds/269722/
Original: download/269722__seth-m__wood-creaks.wav
By: https://freesound.org/people/seth-m/
License: http://creativecommons.org/publicdomain/zero/1.0/
Download Date: January 21, 2023
Description of modifications made to the original:
- 00h00m04.361s to 00h00m04.795s as selection.
- Saved selection to file named se_squeak_F_sharp.wav
- .434 seconds
File: se_squeak_G.wav
Source: https://freesound.org/people/Garuda1982/sounds/420856/
Original: download/420856__garuda1982__floorboards-squeak-field-recording-with-zoom-h2n.wav
By: https://freesound.org/people/Garuda1982/
License: http://creativecommons.org/publicdomain/zero/1.0/
Download Date: January 21, 2023
Description of modifications made to the original:
- 00h00m14.369s to 00h00m15.629s as selection.
- Saved selection to file named se_squeak_G.wav
- 1.26 seconds
File: se_squeak_G_sharp.wav
Source: https://freesound.org/people/seth-m/sounds/269722/
Original: download/269722__seth-m__wood-creaks.wav
By: https://freesound.org/people/seth-m/
License: http://creativecommons.org/publicdomain/zero/1.0/
Download Date: January 21, 2023
Description of modifications made to the original:
- 00h00m03.331s to 00h00m03.966s as selection.
- Used Audacity, Effect to change selection pitch to G#/A flat 7
- Saved selection to file named se_squeak_G_sharp.wav
- .635 seconds
File: se_squeak_A.wav
Source: https://freesound.org/people/Greg_Surr/sounds/590161/
Original: download/590161__greg-surr__creaking-in-room-11.wav
By: https://freesound.org/people/Greg_Surr/
License: http://creativecommons.org/publicdomain/zero/1.0/
Download Date: January 21, 2023
Description of modifications made to the original:
- 00h00m00.209s to 00h00m01.385s as selection.
- Saved selection to file named se_squeak_A.wav
- 1.176s
File: se_squeak_B_flat.wav
Source: https://freesound.org/people/shelbyshark/sounds/487105/
Original: download/487105__shelbyshark__floorcreak.wav
By: https://freesound.org/people/shelbyshark/
License: http://creativecommons.org/publicdomain/zero/1.0/
Download Date: January 21, 2023
Description of modifications made to the original:
- 00h00m02.350s to 00h00m04.576s as selection.
- Used Audacity, Effect to change selection pitch to A#/Bflat.
- Saved selection to file named se_squeak_B_flat.wav
- 2.226 seconds
File:se_squeak_B.wav
Source: https://freesound.org/people/tosha73/sounds/570864/
Original: download/570864__tosha73__creaking-boards.wav
By: https://freesound.org/people/tosha73/
License: https://creativecommons.org/licenses/by/4.0/
Download Date: January 21, 2023
Description of modifications made to the original:
- 00h00m00.000s to 00h00m00.572s as selection.
- Saved selection to file named se_squeak_B.wav
- .572 seconds

BIN
sound/wav/se_squeak_A.wav Normal file

Binary file not shown.

BIN
sound/wav/se_squeak_B.wav Normal file

Binary file not shown.

Binary file not shown.

BIN
sound/wav/se_squeak_C.wav Normal file

Binary file not shown.

BIN
sound/wav/se_squeak_D.wav Normal file

Binary file not shown.

Binary file not shown.

BIN
sound/wav/se_squeak_E.wav Normal file

Binary file not shown.

Binary file not shown.

BIN
sound/wav/se_squeak_F.wav Normal file

Binary file not shown.

Binary file not shown.

BIN
sound/wav/se_squeak_G.wav Normal file

Binary file not shown.

Binary file not shown.

BIN
sound/wav/sound_Bell.wav Normal file

Binary file not shown.

BIN
sound/wav/sound_Bugle_A.wav Normal file

Binary file not shown.

BIN
sound/wav/sound_Bugle_B.wav Normal file

Binary file not shown.

BIN
sound/wav/sound_Bugle_C.wav Normal file

Binary file not shown.

BIN
sound/wav/sound_Bugle_D.wav Normal file

Binary file not shown.

BIN
sound/wav/sound_Bugle_E.wav Normal file

Binary file not shown.

BIN
sound/wav/sound_Bugle_F.wav Normal file

Binary file not shown.

BIN
sound/wav/sound_Bugle_G.wav Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -25,7 +25,7 @@ static void windsound_play_usersound(char *, int32_t, int32_t);
struct sound_procs windsound_procs = {
SOUNDID(windsound),
SNDCAP_USERSOUNDS,
SNDCAP_USERSOUNDS | SNDCAP_SOUNDEFFECTS | SNDCAP_HEROMUSIC,
windsound_init_nhsound,
windsound_exit_nhsound,
windsound_achievement,
@@ -53,11 +53,103 @@ windsound_achievement(schar ach1, schar ach2, int32_t repeat)
void
windsound_soundeffect(char *desc, int32_t seid, int32_t volume)
{
#ifdef SND_SOUNDEFFECTS_AUTOMAP
int reslt = 0;
char buf[PATHLEN];
const char *filename;
DWORD fdwsound;
if (seid >= se_squeak_C || seid <= se_squeak_B) {
filename = get_sound_effect_filename(seid, buf, sizeof buf, 1);
fdwsound = SND_ASYNC | SND_RESOURCE;
} else {
filename = get_sound_effect_filename(seid, buf, sizeof buf, 0);
fdwsound = SND_ASYNC | SND_NODEFAULT;
}
if (filename) {
reslt = PlaySound(filename, NULL, fdwsound);
// (void) sndPlaySound(filename, fdwsound);
}
#endif
}
#define WAVEMUSIC_SOUNDS
void
windsound_hero_playnotes(int32_t instrument, char *str, int32_t volume)
{
#ifdef WAVEMUSIC_SOUNDS
int reslt = 0;
boolean has_note_variations = FALSE;
char resourcename[120], *end_of_res = 0, *c = 0;
if (!str)
return;
resourcename[0] = '\0';
switch(instrument) {
case ins_flute: /* WOODEN_FLUTE */
Strcpy(resourcename, "sound_Wooden_Flute");
has_note_variations = TRUE;
break;
case ins_pan_flute: /* MAGIC_FLUTE */
/* wav files for sound_Magic_Flute not added yet */
Strcpy(resourcename, "sound_Wooden_Flute");
has_note_variations = TRUE;
break;
case ins_english_horn: /* TOOLED_HORN */
Strcpy(resourcename, "sound_Tooled_Horn");
has_note_variations = TRUE;
break;
case ins_french_horn: /* FROST_HORN */
Strcpy(resourcename, "sound_Frost_Horn");
break;
case ins_baritone_sax: /* FIRE_HORN */
Strcpy(resourcename, "sound_Fire_Horn");
break;
case ins_trumpet: /* BUGLE */
Strcpy(resourcename, "sound_Bugle");
has_note_variations = TRUE;
break;
case ins_orchestral_harp: /* WOODEN_HARP */
Strcpy(resourcename, "sound_Wooden_Harp");
has_note_variations = TRUE;
break;
case ins_cello: /* MAGIC_HARP */
Strcpy(resourcename, "sound_Magic_Harp");
has_note_variations = TRUE;
case ins_tinkle_bell:
Strcpy(resourcename, "sound_Bell");
break;
case ins_taiko_drum: /* DRUM_OF_EARTHQUAKE */
Strcpy(resourcename, "sound_Drum_Of_Earthquake");
break;
case ins_melodic_tom: /* LEATHER_DRUM */
Strcpy(resourcename, "sound_Leather_Drum");
break;
}
if (has_note_variations) {
int i, idx = 0, notecount = strlen(str);
static const char *const note_suffixes[]
= { "_A", "_B", "_C", "_D", "_E", "_F", "_G" };
end_of_res = eos(resourcename);
c = str;
for (i = 0; i < notecount; ++i) {
if (*c >= 'A' && *c <= 'G') {
idx = (*c) - 'A';
Strcpy(end_of_res, note_suffixes[idx]);
if (i == (notecount - 1))
break; /* drop out of for-loop and play it async below */
reslt = PlaySound(resourcename, NULL,
SND_SYNC | SND_RESOURCE);
}
c++;
}
}
/* the final, or only, one is played ASYNC */
reslt = PlaySound(resourcename, NULL, SND_ASYNC | SND_RESOURCE);
#endif
}
void
@@ -68,4 +160,3 @@ windsound_play_usersound(char *filename, int32_t volume UNUSED, int32_t idx UNUS
}
#endif /* SND_LIB_WINDSOUND */

View File

@@ -506,7 +506,7 @@ do_improvisation(struct obj* instr)
itmp.otyp -= 1;
mundane = TRUE;
}
Hero_playnotes(obj_to_instr(&itmp), "C", 50);
#define PLAY_NORMAL 0x00
#define PLAY_STUNNED 0x01
@@ -738,6 +738,7 @@ do_play_instrument(struct obj* instr)
You(!Deaf ? "extract a strange sound from %s!"
: "can feel %s emitting vibrations.", the(xname(instr)));
Hero_playnotes(obj_to_instr(instr), buf, 50);
/* Check if there was the Stronghold drawbridge near
@@ -832,4 +833,47 @@ do_play_instrument(struct obj* instr)
return ECMD_OK;
}
enum instruments
obj_to_instr(struct obj *obj) {
enum instruments ret_instr = ins_no_instrument;
#if defined(SND_LIB_INTEGRATED)
switch(obj->otyp) {
case WOODEN_FLUTE:
ret_instr = ins_flute;
break;
case MAGIC_FLUTE:
ret_instr = ins_pan_flute;
break;
case TOOLED_HORN:
ret_instr = ins_english_horn;
break;
case FROST_HORN:
ret_instr = ins_french_horn;
break;
case FIRE_HORN:
ret_instr = ins_baritone_sax;
break;
case BUGLE:
ret_instr = ins_trumpet;
break;
case WOODEN_HARP:
ret_instr = ins_orchestral_harp;
break;
case MAGIC_HARP:
ret_instr = ins_cello;
case BELL:
case BELL_OF_OPENING:
ret_instr = ins_tinkle_bell;
break;
case DRUM_OF_EARTHQUAKE:
ret_instr = ins_taiko_drum;
break;
case LEATHER_DRUM:
ret_instr = ins_melodic_tom;
break;
}
#endif
return ret_instr;
}
/*music.c*/

View File

@@ -1517,9 +1517,9 @@ play_sound_for_message(const char* msg)
if (soundprocs.sound_play_usersound) {
snd = sound_matches_message(msg);
if (snd)
(*soundprocs.sound_play_usersound)(
snd->filename, snd->volume, snd->idx);
if (snd) {
Play_usersound(snd->filename, snd->volume, snd->idx);
}
}
}
@@ -1530,9 +1530,9 @@ maybe_play_sound(const char* msg)
if (soundprocs.sound_play_usersound) {
snd = sound_matches_message(msg);
if (snd)
(*soundprocs.sound_play_usersound)(
snd->filename, snd->volume, snd->idx);
if (snd) {
Play_usersound(snd->filename, snd->volume, snd->idx);
}
}
}
@@ -1784,4 +1784,260 @@ nosound_play_usersound(char *filename, int volume, int idx)
}
#endif
#ifdef SND_SOUNDEFFECTS_AUTOMAP
struct soundeffect_automapping {
enum sound_effect_entries seid;
const char *base_filename;
};
static const struct soundeffect_automapping se_mappings_init[number_of_se_entries] = {
{ se_zero_invalid, "" },
{ se_faint_splashing, "faint_splashing" },
{ se_crackling_of_hellfire, "crackling_of_hellfire" },
{ se_heart_beat, "heart_beat" },
{ se_typing_noise, "typing_noise" },
{ se_hollow_sound, "hollow_sound" },
{ se_rustling_paper, "rustling_paper" },
{ se_crushing_sound, "crushing_sound" },
{ se_splash, "splash" },
{ se_chains_rattling_gears_turning, "chains_rattling_gears_turning" },
{ se_smashing_and_crushing, "smashing_and_crushing" },
{ se_gears_turning_chains_rattling, "gears_turning_chains_rattling" },
{ se_loud_splash, "loud_splash" },
{ se_lound_crash, "lound_crash" },
{ se_crashing_rock, "crashing_rock" },
{ se_sizzling, "sizzling" },
{ se_crashing_boulder, "crashing_boulder" },
{ se_boulder_drop, "boulder_drop" },
{ se_item_tumble_downwards, "item_tumble_downwards" },
{ se_drain_noises, "drain_noises" },
{ se_ring_in_drain, "ring_in_drain" },
{ se_groans_and_moans, "groans_and_moans" },
{ se_scratching, "scratching" },
{ se_glass_shattering, "glass_shattering" },
{ se_egg_cracking, "egg_cracking" },
{ se_gushing_sound, "gushing_sound" },
{ se_glass_crashing, "glass_crashing" },
{ se_egg_splatting, "egg_splatting" },
{ se_sinister_laughter, "sinister_laughter" },
{ se_blast, "blast" },
{ se_stone_breaking, "stone_breaking" },
{ se_stone_crumbling, "stone_crumbling" },
{ se_snakes_hissing, "snakes_hissing" },
{ se_loud_pop, "loud_pop" },
{ se_clanking_pipe, "clanking_pipe" },
{ se_sewer_song, "sewer_song" },
{ se_monster_behind_boulder, "monster_behind_boulder" },
{ se_wailing_of_the_banshee, "wailing_of_the_banshee" },
{ se_swoosh, "swoosh" },
{ se_explosion, "explosion" },
{ se_crashing_sound, "crashing_sound" },
{ se_someone_summoning, "someone_summoning" },
{ se_rushing_wind_noise, "rushing_wind_noise" },
{ se_splat_from_engulf, "splat_from_engulf" },
{ se_faint_sloshing, "faint_sloshing" },
{ se_crunching_sound, "crunching_sound" },
{ se_slurping_sound, "slurping_sound" },
{ se_masticating_sound, "masticating_sound" },
{ se_distant_thunder, "distant_thunder" },
{ se_applause, "applause" },
{ se_shrill_whistle, "shrill_whistle" },
{ se_someone_yells, "someone_yells" },
{ se_door_unlock_and_open, "door_unlock_and_open" },
{ se_door_open, "door_open" },
{ se_door_crash_open, "door_crash_open" },
{ se_dry_throat_rattle, "dry_throat_rattle" },
{ se_cough, "cough" },
{ se_angry_snakes, "angry_snakes" },
{ se_zap_then_explosion, "zap_then_explosion" },
{ se_zap, "zap" },
{ se_horn_being_played, "horn_being_played" },
{ se_mon_chugging_potion, "mon_chugging_potion" },
{ se_bugle_playing_reveille, "bugle_playing_reveille" },
{ se_crash_through_floor, "crash_through_floor" },
{ se_thump, "thump" },
{ se_scream, "scream" },
{ se_tumbler_click, "tumbler_click" },
{ se_gear_turn, "gear_turn" },
{ se_divine_music, "divine_music" },
{ se_thunderclap, "thunderclap" },
{ se_sad_wailing, "sad_wailing" },
{ se_maniacal_laughter, "maniacal_laughter" },
{ se_rumbling_of_earth, "rumbling_of_earth" },
{ se_clanging_sound, "clanging_sound" },
{ se_mutter_imprecations, "mutter_imprecations" },
{ se_mutter_incantation, "mutter_incantation" },
{ se_angry_voice, "angry_voice" },
{ se_sceptor_pounding, "sceptor_pounding" },
{ se_courtly_conversation, "courtly_conversation" },
{ se_low_buzzing, "low_buzzing" },
{ se_angry_drone, "angry_drone" },
{ se_bees, "bees" },
{ se_someone_searching, "someone_searching" },
{ se_guards_footsteps, "guards_footsteps" },
{ se_faint_chime, "faint_chime" },
{ se_loud_click, "loud_click" },
{ se_soft_click, "soft_click" },
{ se_squeak, "squeak" },
{ se_squeak_C, "squeak_C" },
{ se_squeak_D_flat, "squeak_D_flat" },
{ se_squeak_D, "squeak_D" },
{ se_squeak_E_flat, "squeak_E_flat" },
{ se_squeak_E, "squeak_E" },
{ se_squeak_F, "squeak_F" },
{ se_squeak_F_sharp, "squeak_F_sharp" },
{ se_squeak_G, "squeak_G" },
{ se_squeak_G_sharp, "squeak_G_sharp" },
{ se_squeak_A, "squeak_A" },
{ se_squeak_B_flat, "squeak_B_flat" },
{ se_squeak_B, "squeak_B" },
{ se_someone_bowling, "someone_bowling" },
{ se_rumbling, "rumbling" },
{ se_loud_crash, "loud_crash" },
{ se_deafening_roar_atmospheric, "deafening_roar_atmospheric" },
{ se_low_hum, "low_hum" },
{ se_laughter, "laughter" },
{ se_cockatrice_hiss, "cockatrice_hiss" },
{ se_chant, "chant" },
{ se_cracking_sound, "cracking_sound" },
{ se_ripping_sound, "ripping_sound" },
{ se_thud, "thud" },
{ se_clank, "clank" },
{ se_crumbling_sound, "crumbling_sound" },
{ se_soft_crackling, "soft_crackling" },
{ se_crackling, "crackling" },
{ se_sharp_crack, "sharp_crack" },
{ se_wall_of_force, "wall_of_force" },
{ se_alarm, "alarm" },
{ se_kick_door_it_shatters, "kick_door_it_shatters" },
{ se_kick_door_it_crashes_open, "kick_door_it_crashes_open" },
{ se_bubble_rising, "bubble_rising" },
{ se_bolt_of_lightning, "bolt_of_lightning" },
{ se_board_squeak, "board_squeak" },
{ se_board_squeaks_loudly, "board_squeaks_loudly" },
{ se_boing, "boing" },
{ se_crashed_ceiling, "crashed_ceiling" },
{ se_clash, "clash" },
{ se_crash_door, "crash_door" },
{ se_crash, "crash" },
{ se_crash_throne_destroyed, "crash_throne_destroyed" },
{ se_crash_something_broke, "crash_something_broke" },
{ se_kadoom_boulder_falls_in, "kadoom_boulder_falls_in" },
{ se_klunk_pipe, "klunk_pipe" },
{ se_kerplunk_boulder_gone, "kerplunk_boulder_gone" },
{ se_klunk, "klunk" },
{ se_klick, "klick" },
{ se_kaboom_door_explodes, "kaboom_door_explodes" },
{ se_kaboom_boom_boom, "kaboom_boom_boom" },
{ se_kaablamm_of_mine, "kaablamm_of_mine" },
{ se_kaboom, "kaboom" },
{ se_splat_egg, "splat_egg" },
{ se_destroy_web, "destroy_web" },
{ se_iron_ball_dragging_you, "iron_ball_dragging_you" },
{ se_iron_ball_hits_you, "iron_ball_hits_you" },
{ se_lid_slams_open_falls_shut, "lid_slams_open_falls_shut" },
{ se_chain_shatters, "chain_shatters" },
{ se_furious_bubbling, "furious_bubbling" },
{ se_air_crackles, "air_crackles" },
{ se_potion_crash_and_break, "potion_crash_and_break" },
{ se_hiss, "hiss" },
{ se_growl, "growl" },
{ se_canine_bark, "canine_bark" },
{ se_canine_growl, "canine_growl" },
{ se_canine_whine, "canine_whine" },
{ se_canine_yip, "canine_yip" },
{ se_canine_howl, "canine_howl" },
{ se_feline_yowl, "feline_yowl" },
{ se_feline_meow, "feline_meow" },
{ se_feline_purr, "feline_purr" },
{ se_feline_yip, "feline_yip" },
{ se_feline_mew, "feline_mew" },
{ se_roar, "roar" },
{ se_snarl, "snarl" },
{ se_buzz, "buzz" },
{ se_squeek, "squeek" },
{ se_squawk, "squawk" },
{ se_squeal, "squeal" },
{ se_screech, "screech" },
{ se_equine_neigh, "equine_neigh" },
{ se_equine_whinny, "equine_whinny" },
{ se_equine_whicker, "equine_whicker" },
{ se_bovine_moo, "bovine_moo" },
{ se_bovine_bellow, "bovine_bellow" },
{ se_wail, "wail" },
{ se_groan, "groan" },
{ se_grunt, "grunt" },
{ se_gurgle, "gurgle" },
{ se_elephant_trumpet, "elephant_trumpet" },
{ se_snake_rattle, "snake_rattle" },
{ se_hallu_growl, "hallu_growl" },
};
static const char *semap_basenames[SIZE(se_mappings_init)];
static boolean basenames_initialized = FALSE;
static void
initialize_semap_basenames(void)
{
int i;
/* to avoid things getting out of sequence; seid an index to the name */
for (i = 1; i < SIZE(se_mappings_init); ++i) {
if (se_mappings_init[i].seid > 0
&& se_mappings_init[i].seid < SIZE(semap_basenames))
semap_basenames[se_mappings_init[i].seid]
= se_mappings_init[i].base_filename;
}
}
char *
get_sound_effect_filename(int32_t seidint, char *buf,
size_t bufsz,
int32_t baseflag) /* non-zero means return without
directory or extension suffix */
{
static const char prefix[] = "se_", suffix[] = ".wav";
size_t consumes = 0, baselen = 0;
/* enum sound_effect_entries seid = (enum sound_effect_entries) seidint; */
char *ourdir = sounddir; /* sounddir would get set in files.c */
if (!buf || (!ourdir && baseflag == 0))
return (char *) 0;
if (!basenames_initialized) {
initialize_semap_basenames();
basenames_initialized = TRUE;
}
if (semap_basenames[seidint])
baselen = strlen(semap_basenames[seidint]);
consumes = (sizeof prefix - 1) + baselen;
if (baseflag == 0)
consumes += (sizeof suffix - 1) + strlen(ourdir);
consumes += 1 + 1; /* '\0' and '/' */
if (baselen <= 0 || consumes > bufsz)
return (char *) 0;
#if 0
if (!baseflag) {
Strcpy(buf, ourdir);
Strcat(buf, "/");
}
Strcat(buf, prefix);
Strcat(buf, semap_basenames[seidint]);
if (!baseflag) {
Strcat(buf, suffix);
}
#else
if (!baseflag)
Snprintf(buf, bufsz , "%s/%s%s%s", ourdir, prefix,
semap_basenames[seidint], suffix);
else
Snprintf(buf, bufsz , "%s%s", prefix, semap_basenames[seidint]);
#endif
return buf;
}
#endif /* SND_SOUNDEFFECTS_AUTOMAP */
/*sounds.c*/

View File

@@ -31,9 +31,9 @@ BEGIN
VALUE "FileDescription", "NetHack for Windows - TTY Interface\0"
VALUE "FileVersion", "3.7.0\0"
VALUE "InternalName", "NetHack\0"
VALUE "LegalCopyright", "Copyright (C) 1985 - 2020. By Stichting Mathematisch Centrum and M. Stephenson. See license for details.\0"
VALUE "LegalCopyright", "Copyright (C) 1985 - 2023. By Stichting Mathematisch Centrum and M. Stephenson. See license for details.\0"
VALUE "OriginalFilename", "NetHack.exe\0"
VALUE "PrivateBuild", "050102\0"
VALUE "PrivateBuild", "050107\0"
VALUE "ProductName", "NetHack\0"
VALUE "ProductVersion", "3.7.0\0"
END
@@ -43,7 +43,58 @@ BEGIN
VALUE "Translation", 0x409, 1200
END
END
se_squeak_A WAVE "..\sound\wav\se_squeak_A.wav"
se_squeak_B WAVE "..\sound\wav\se_squeak_B.wav"
se_squeak_B_flat WAVE "..\sound\wav\se_squeak_B_flat.wav"
se_squeak_C WAVE "..\sound\wav\se_squeak_C.wav"
se_squeak_D WAVE "..\sound\wav\se_squeak_D.wav"
se_squeak_D_flat WAVE "..\sound\wav\se_squeak_D_flat.wav"
se_squeak_E WAVE "..\sound\wav\se_squeak_E.wav"
se_squeak_E_flat WAVE "..\sound\wav\se_squeak_E_flat.wav"
se_squeak_F WAVE "..\sound\wav\se_squeak_F.wav"
se_squeak_F_sharp WAVE "..\sound\wav\se_squeak_F_sharp.wav"
se_squeak_G WAVE "..\sound\wav\se_squeak_G.wav"
se_squeak_G_share WAVE "..\sound\wav\se_squeak_G_sharp.wav"
sound_Bell WAVE "..\sound\wav\sound_Bell.wav"
sound_Bugle_A WAVE "..\sound\wav\sound_Bugle_A.wav"
sound_Bugle_B WAVE "..\sound\wav\sound_Bugle_B.wav"
sound_Bugle_C WAVE "..\sound\wav\sound_Bugle_C.wav"
sound_Bugle_D WAVE "..\sound\wav\sound_Bugle_D.wav"
sound_Bugle_E WAVE "..\sound\wav\sound_Bugle_E.wav"
sound_Bugle_F WAVE "..\sound\wav\sound_Bugle_F.wav"
sound_Bugle_G WAVE "..\sound\wav\sound_Bugle_G.wav"
sound_Drum_Of_Earthquake WAVE "..\sound\wav\sound_Drum_Of_Earthquake.wav"
sound_Fire_Horn WAVE "..\sound\wav\sound_Fire_Horn.wav"
sound_Frost_Horn WAVE "..\sound\wav\sound_Frost_Horn.wav"
sound_Leather_Drum WAVE "..\sound\wav\sound_Leather_Drum.wav"
sound_Magic_Harp_A WAVE "..\sound\wav\sound_Magic_Harp_A.wav"
sound_Magic_Harp_B WAVE "..\sound\wav\sound_Magic_Harp_B.wav"
sound_Magic_Harp_C WAVE "..\sound\wav\sound_Magic_Harp_C.wav"
sound_Magic_Harp_D WAVE "..\sound\wav\sound_Magic_Harp_D.wav"
sound_Magic_Harp_E WAVE "..\sound\wav\sound_Magic_Harp_E.wav"
sound_Magic_Harp_F WAVE "..\sound\wav\sound_Magic_Harp_F.wav"
sound_Magic_Harp_G WAVE "..\sound\wav\sound_Magic_Harp_G.wav"
sound_Tooled_Horn_A WAVE "..\sound\wav\sound_Tooled_Horn_A.wav"
sound_Tooled_Horn_B WAVE "..\sound\wav\sound_Tooled_Horn_B.wav"
sound_Tooled_Horn_C WAVE "..\sound\wav\sound_Tooled_Horn_C.wav"
sound_Tooled_Horn_D WAVE "..\sound\wav\sound_Tooled_Horn_D.wav"
sound_Tooled_Horn_E WAVE "..\sound\wav\sound_Tooled_Horn_E.wav"
sound_Tooled_Horn_F WAVE "..\sound\wav\sound_Tooled_Horn_F.wav"
sound_Tooled_Horn_G WAVE "..\sound\wav\sound_Tooled_Horn_G.wav"
sound_Wooden_Flute_A WAVE "..\sound\wav\sound_Wooden_Flute_A.wav"
sound_Wooden_Flute_B WAVE "..\sound\wav\sound_Wooden_Flute_B.wav"
sound_Wooden_Flute_C WAVE "..\sound\wav\sound_Wooden_Flute_C.wav"
sound_Wooden_Flute_D WAVE "..\sound\wav\sound_Wooden_Flute_D.wav"
sound_Wooden_Flute_E WAVE "..\sound\wav\sound_Wooden_Flute_E.wav"
sound_Wooden_Flute_F WAVE "..\sound\wav\sound_Wooden_Flute_F.wav"
sound_Wooden_Flute_G WAVE "..\sound\wav\sound_Wooden_Flute_G.wav"
sound_Wooden_Harp_A WAVE "..\sound\wav\sound_Wooden_Harp_A.wav"
sound_Wooden_Harp_B WAVE "..\sound\wav\sound_Wooden_Harp_B.wav"
sound_Wooden_Harp_C WAVE "..\sound\wav\sound_Wooden_Harp_C.wav"
sound_Wooden_Harp_D WAVE "..\sound\wav\sound_Wooden_Harp_D.wav"
sound_Wooden_Harp_E WAVE "..\sound\wav\sound_Wooden_Harp_E.wav"
sound_Wooden_Harp_F WAVE "..\sound\wav\sound_Wooden_Harp_F.wav"
sound_Wooden_Harp_G WAVE "..\sound\wav\sound_Wooden_Harp_G.wav"
/*console.rc*/
/*console.rc*/"

View File

@@ -391,6 +391,60 @@ BEGIN
IDS_APP_TITLE_SHORT "NetHack for Windows"
END
se_squeak_A WAVE "..\sound\wav\se_squeak_A.wav"
se_squeak_B WAVE "..\sound\wav\se_squeak_B.wav"
se_squeak_B_flat WAVE "..\sound\wav\se_squeak_B_flat.wav"
se_squeak_C WAVE "..\sound\wav\se_squeak_C.wav"
se_squeak_D WAVE "..\sound\wav\se_squeak_D.wav"
se_squeak_D_flat WAVE "..\sound\wav\se_squeak_D_flat.wav"
se_squeak_E WAVE "..\sound\wav\se_squeak_E.wav"
se_squeak_E_flat WAVE "..\sound\wav\se_squeak_E_flat.wav"
se_squeak_F WAVE "..\sound\wav\se_squeak_F.wav"
se_squeak_F_sharp WAVE "..\sound\wav\se_squeak_F_sharp.wav"
se_squeak_G WAVE "..\sound\wav\se_squeak_G.wav"
se_squeak_G_share WAVE "..\sound\wav\se_squeak_G_sharp.wav"
sound_Bell WAVE "..\sound\wav\sound_Bell.wav"
sound_Bugle_A WAVE "..\sound\wav\sound_Bugle_A.wav"
sound_Bugle_B WAVE "..\sound\wav\sound_Bugle_B.wav"
sound_Bugle_C WAVE "..\sound\wav\sound_Bugle_C.wav"
sound_Bugle_D WAVE "..\sound\wav\sound_Bugle_D.wav"
sound_Bugle_E WAVE "..\sound\wav\sound_Bugle_E.wav"
sound_Bugle_F WAVE "..\sound\wav\sound_Bugle_F.wav"
sound_Bugle_G WAVE "..\sound\wav\sound_Bugle_G.wav"
sound_Drum_Of_Earthquake WAVE "..\sound\wav\sound_Drum_Of_Earthquake.wav"
sound_Fire_Horn WAVE "..\sound\wav\sound_Fire_Horn.wav"
sound_Frost_Horn WAVE "..\sound\wav\sound_Frost_Horn.wav"
sound_Leather_Drum WAVE "..\sound\wav\sound_Leather_Drum.wav"
sound_Magic_Harp_A WAVE "..\sound\wav\sound_Magic_Harp_A.wav"
sound_Magic_Harp_B WAVE "..\sound\wav\sound_Magic_Harp_B.wav"
sound_Magic_Harp_C WAVE "..\sound\wav\sound_Magic_Harp_C.wav"
sound_Magic_Harp_D WAVE "..\sound\wav\sound_Magic_Harp_D.wav"
sound_Magic_Harp_E WAVE "..\sound\wav\sound_Magic_Harp_E.wav"
sound_Magic_Harp_F WAVE "..\sound\wav\sound_Magic_Harp_F.wav"
sound_Magic_Harp_G WAVE "..\sound\wav\sound_Magic_Harp_G.wav"
sound_Tooled_Horn_A WAVE "..\sound\wav\sound_Tooled_Horn_A.wav"
sound_Tooled_Horn_B WAVE "..\sound\wav\sound_Tooled_Horn_B.wav"
sound_Tooled_Horn_C WAVE "..\sound\wav\sound_Tooled_Horn_C.wav"
sound_Tooled_Horn_D WAVE "..\sound\wav\sound_Tooled_Horn_D.wav"
sound_Tooled_Horn_E WAVE "..\sound\wav\sound_Tooled_Horn_E.wav"
sound_Tooled_Horn_F WAVE "..\sound\wav\sound_Tooled_Horn_F.wav"
sound_Tooled_Horn_G WAVE "..\sound\wav\sound_Tooled_Horn_G.wav"
sound_Wooden_Flute_A WAVE "..\sound\wav\sound_Wooden_Flute_A.wav"
sound_Wooden_Flute_B WAVE "..\sound\wav\sound_Wooden_Flute_B.wav"
sound_Wooden_Flute_C WAVE "..\sound\wav\sound_Wooden_Flute_C.wav"
sound_Wooden_Flute_D WAVE "..\sound\wav\sound_Wooden_Flute_D.wav"
sound_Wooden_Flute_E WAVE "..\sound\wav\sound_Wooden_Flute_E.wav"
sound_Wooden_Flute_F WAVE "..\sound\wav\sound_Wooden_Flute_F.wav"
sound_Wooden_Flute_G WAVE "..\sound\wav\sound_Wooden_Flute_G.wav"
sound_Wooden_Harp_A WAVE "..\sound\wav\sound_Wooden_Harp_A.wav"
sound_Wooden_Harp_B WAVE "..\sound\wav\sound_Wooden_Harp_B.wav"
sound_Wooden_Harp_C WAVE "..\sound\wav\sound_Wooden_Harp_C.wav"
sound_Wooden_Harp_D WAVE "..\sound\wav\sound_Wooden_Harp_D.wav"
sound_Wooden_Harp_E WAVE "..\sound\wav\sound_Wooden_Harp_E.wav"
sound_Wooden_Harp_F WAVE "..\sound\wav\sound_Wooden_Harp_F.wav"
sound_Wooden_Harp_G WAVE "..\sound\wav\sound_Wooden_Harp_G.wav"
#endif // English (United States) resources
/////////////////////////////////////////////////////////////////////////////