From 64e93ae67b2f99d8ccea5d4a793e39a3847c462b Mon Sep 17 00:00:00 2001 From: Raspbeguy Date: Thu, 10 Apr 2014 14:33:33 +0200 Subject: [PATCH] =?UTF-8?q?Maintenant=20la=20fonction=20lecture=20ne=20fai?= =?UTF-8?q?t=20plus=20planter=20le=20programme.=20Mais=20=C3=A7a=20marche?= =?UTF-8?q?=20toujours=20pas.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 4 +- sources/instrument/SDL_mixer.h | 634 --------------------------------- sources/instrument/main.c | 13 +- sources/instrument/trigger.wav | Bin 0 -> 64722 bytes sources/lecture/lecture.c | 11 +- sources/tests/makefile | 19 + sources/tests/test.c | 45 +++ 7 files changed, 79 insertions(+), 647 deletions(-) delete mode 100644 sources/instrument/SDL_mixer.h create mode 100644 sources/instrument/trigger.wav create mode 100644 sources/tests/makefile create mode 100644 sources/tests/test.c diff --git a/.gitignore b/.gitignore index 1ffcf12..0e4f413 100644 --- a/.gitignore +++ b/.gitignore @@ -31,4 +31,6 @@ sources/lecture/.lecture.h.swp sources/lecture/lecture.o sources/GUI/premierTest sources/lecture.o -sources/GUI/coucou \ No newline at end of file +sources/GUI/coucou +sources/tests/test +sources/instrument/main \ No newline at end of file diff --git a/sources/instrument/SDL_mixer.h b/sources/instrument/SDL_mixer.h deleted file mode 100644 index 9c25ef6..0000000 --- a/sources/instrument/SDL_mixer.h +++ /dev/null @@ -1,634 +0,0 @@ -/* - SDL_mixer: An audio mixer library based on the SDL library - Copyright (C) 1997-2012 Sam Lantinga - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -/* $Id$ */ - -#ifndef _SDL_MIXER_H -#define _SDL_MIXER_H - -#include "SDL_types.h" -#include "SDL_rwops.h" -#include "SDL_audio.h" -#include "SDL_endian.h" -#include "SDL_version.h" -#include "begin_code.h" - -/* Set up for C function definitions, even when using C++ */ -#ifdef __cplusplus -extern "C" { -#endif - -/* Printable format: "%d.%d.%d", MAJOR, MINOR, PATCHLEVEL -*/ -#define SDL_MIXER_MAJOR_VERSION 1 -#define SDL_MIXER_MINOR_VERSION 2 -#define SDL_MIXER_PATCHLEVEL 12 - -/* This macro can be used to fill a version structure with the compile-time - * version of the SDL_mixer library. - */ -#define SDL_MIXER_VERSION(X) \ -{ \ - (X)->major = SDL_MIXER_MAJOR_VERSION; \ - (X)->minor = SDL_MIXER_MINOR_VERSION; \ - (X)->patch = SDL_MIXER_PATCHLEVEL; \ -} - -/* Backwards compatibility */ -#define MIX_MAJOR_VERSION SDL_MIXER_MAJOR_VERSION -#define MIX_MINOR_VERSION SDL_MIXER_MINOR_VERSION -#define MIX_PATCHLEVEL SDL_MIXER_PATCHLEVEL -#define MIX_VERSION(X) SDL_MIXER_VERSION(X) - -/* This function gets the version of the dynamically linked SDL_mixer library. - it should NOT be used to fill a version structure, instead you should - use the SDL_MIXER_VERSION() macro. - */ -extern DECLSPEC const SDL_version * SDLCALL Mix_Linked_Version(void); - -typedef enum -{ - MIX_INIT_FLAC = 0x00000001, - MIX_INIT_MOD = 0x00000002, - MIX_INIT_MP3 = 0x00000004, - MIX_INIT_OGG = 0x00000008, - MIX_INIT_FLUIDSYNTH = 0x00000010 -} MIX_InitFlags; - -/* Loads dynamic libraries and prepares them for use. Flags should be - one or more flags from MIX_InitFlags OR'd together. - It returns the flags successfully initialized, or 0 on failure. - */ -extern DECLSPEC int SDLCALL Mix_Init(int flags); - -/* Unloads libraries loaded with Mix_Init */ -extern DECLSPEC void SDLCALL Mix_Quit(void); - - -/* The default mixer has 8 simultaneous mixing channels */ -#ifndef MIX_CHANNELS -#define MIX_CHANNELS 8 -#endif - -/* Good default values for a PC soundcard */ -#define MIX_DEFAULT_FREQUENCY 22050 -#if SDL_BYTEORDER == SDL_LIL_ENDIAN -#define MIX_DEFAULT_FORMAT AUDIO_S16LSB -#else -#define MIX_DEFAULT_FORMAT AUDIO_S16MSB -#endif -#define MIX_DEFAULT_CHANNELS 2 -#define MIX_MAX_VOLUME 128 /* Volume of a chunk */ - -/* The internal format for an audio chunk */ -typedef struct Mix_Chunk { - int allocated; - Uint8 *abuf; - Uint32 alen; - Uint8 volume; /* Per-sample volume, 0-128 */ -} Mix_Chunk; - -/* The different fading types supported */ -typedef enum { - MIX_NO_FADING, - MIX_FADING_OUT, - MIX_FADING_IN -} Mix_Fading; - -typedef enum { - MUS_NONE, - MUS_CMD, - MUS_WAV, - MUS_MOD, - MUS_MID, - MUS_OGG, - MUS_MP3, - MUS_MP3_MAD, - MUS_FLAC, - MUS_MODPLUG -} Mix_MusicType; - -/* The internal format for a music chunk interpreted via mikmod */ -typedef struct _Mix_Music Mix_Music; - -/* Open the mixer with a certain audio format */ -extern DECLSPEC int SDLCALL Mix_OpenAudio(int frequency, Uint16 format, int channels, - int chunksize); - -/* Dynamically change the number of channels managed by the mixer. - If decreasing the number of channels, the upper channels are - stopped. - This function returns the new number of allocated channels. - */ -extern DECLSPEC int SDLCALL Mix_AllocateChannels(int numchans); - -/* Find out what the actual audio device parameters are. - This function returns 1 if the audio has been opened, 0 otherwise. - */ -extern DECLSPEC int SDLCALL Mix_QuerySpec(int *frequency,Uint16 *format,int *channels); - -/* Load a wave file or a music (.mod .s3m .it .xm) file */ -extern DECLSPEC Mix_Chunk * SDLCALL Mix_LoadWAV_RW(SDL_RWops *src, int freesrc); -#define Mix_LoadWAV(file) Mix_LoadWAV_RW(SDL_RWFromFile(file, "rb"), 1) -extern DECLSPEC Mix_Music * SDLCALL Mix_LoadMUS(const char *file); - -/* Load a music file from an SDL_RWop object (Ogg and MikMod specific currently) - Matt Campbell (matt@campbellhome.dhs.org) April 2000 */ -extern DECLSPEC Mix_Music * SDLCALL Mix_LoadMUS_RW(SDL_RWops *rw); - -/* Load a music file from an SDL_RWop object assuming a specific format */ -extern DECLSPEC Mix_Music * SDLCALL Mix_LoadMUSType_RW(SDL_RWops *rw, Mix_MusicType type, int freesrc); - -/* Load a wave file of the mixer format from a memory buffer */ -extern DECLSPEC Mix_Chunk * SDLCALL Mix_QuickLoad_WAV(Uint8 *mem); - -/* Load raw audio data of the mixer format from a memory buffer */ -extern DECLSPEC Mix_Chunk * SDLCALL Mix_QuickLoad_RAW(Uint8 *mem, Uint32 len); - -/* Free an audio chunk previously loaded */ -extern DECLSPEC void SDLCALL Mix_FreeChunk(Mix_Chunk *chunk); -extern DECLSPEC void SDLCALL Mix_FreeMusic(Mix_Music *music); - -/* Get a list of chunk/music decoders that this build of SDL_mixer provides. - This list can change between builds AND runs of the program, if external - libraries that add functionality become available. - You must successfully call Mix_OpenAudio() before calling these functions. - This API is only available in SDL_mixer 1.2.9 and later. - - // usage... - int i; - const int total = Mix_GetNumChunkDecoders(); - for (i = 0; i < total; i++) - printf("Supported chunk decoder: [%s]\n", Mix_GetChunkDecoder(i)); - - Appearing in this list doesn't promise your specific audio file will - decode...but it's handy to know if you have, say, a functioning Timidity - install. - - These return values are static, read-only data; do not modify or free it. - The pointers remain valid until you call Mix_CloseAudio(). -*/ -extern DECLSPEC int SDLCALL Mix_GetNumChunkDecoders(void); -extern DECLSPEC const char * SDLCALL Mix_GetChunkDecoder(int index); -extern DECLSPEC int SDLCALL Mix_GetNumMusicDecoders(void); -extern DECLSPEC const char * SDLCALL Mix_GetMusicDecoder(int index); - -/* Find out the music format of a mixer music, or the currently playing - music, if 'music' is NULL. -*/ -extern DECLSPEC Mix_MusicType SDLCALL Mix_GetMusicType(const Mix_Music *music); - -/* Set a function that is called after all mixing is performed. - This can be used to provide real-time visual display of the audio stream - or add a custom mixer filter for the stream data. -*/ -extern DECLSPEC void SDLCALL Mix_SetPostMix(void (*mix_func) - (void *udata, Uint8 *stream, int len), void *arg); - -/* Add your own music player or additional mixer function. - If 'mix_func' is NULL, the default music player is re-enabled. - */ -extern DECLSPEC void SDLCALL Mix_HookMusic(void (*mix_func) - (void *udata, Uint8 *stream, int len), void *arg); - -/* Add your own callback when the music has finished playing. - This callback is only called if the music finishes naturally. - */ -extern DECLSPEC void SDLCALL Mix_HookMusicFinished(void (*music_finished)(void)); - -/* Get a pointer to the user data for the current music hook */ -extern DECLSPEC void * SDLCALL Mix_GetMusicHookData(void); - -/* - * Add your own callback when a channel has finished playing. NULL - * to disable callback. The callback may be called from the mixer's audio - * callback or it could be called as a result of Mix_HaltChannel(), etc. - * do not call SDL_LockAudio() from this callback; you will either be - * inside the audio callback, or SDL_mixer will explicitly lock the audio - * before calling your callback. - */ -extern DECLSPEC void SDLCALL Mix_ChannelFinished(void (*channel_finished)(int channel)); - - -/* Special Effects API by ryan c. gordon. (icculus@icculus.org) */ - -#define MIX_CHANNEL_POST -2 - -/* This is the format of a special effect callback: - * - * myeffect(int chan, void *stream, int len, void *udata); - * - * (chan) is the channel number that your effect is affecting. (stream) is - * the buffer of data to work upon. (len) is the size of (stream), and - * (udata) is a user-defined bit of data, which you pass as the last arg of - * Mix_RegisterEffect(), and is passed back unmolested to your callback. - * Your effect changes the contents of (stream) based on whatever parameters - * are significant, or just leaves it be, if you prefer. You can do whatever - * you like to the buffer, though, and it will continue in its changed state - * down the mixing pipeline, through any other effect functions, then finally - * to be mixed with the rest of the channels and music for the final output - * stream. - * - * DO NOT EVER call SDL_LockAudio() from your callback function! - */ -typedef void (*Mix_EffectFunc_t)(int chan, void *stream, int len, void *udata); - -/* - * This is a callback that signifies that a channel has finished all its - * loops and has completed playback. This gets called if the buffer - * plays out normally, or if you call Mix_HaltChannel(), implicitly stop - * a channel via Mix_AllocateChannels(), or unregister a callback while - * it's still playing. - * - * DO NOT EVER call SDL_LockAudio() from your callback function! - */ -typedef void (*Mix_EffectDone_t)(int chan, void *udata); - - -/* Register a special effect function. At mixing time, the channel data is - * copied into a buffer and passed through each registered effect function. - * After it passes through all the functions, it is mixed into the final - * output stream. The copy to buffer is performed once, then each effect - * function performs on the output of the previous effect. Understand that - * this extra copy to a buffer is not performed if there are no effects - * registered for a given chunk, which saves CPU cycles, and any given - * effect will be extra cycles, too, so it is crucial that your code run - * fast. Also note that the data that your function is given is in the - * format of the sound device, and not the format you gave to Mix_OpenAudio(), - * although they may in reality be the same. This is an unfortunate but - * necessary speed concern. Use Mix_QuerySpec() to determine if you can - * handle the data before you register your effect, and take appropriate - * actions. - * You may also specify a callback (Mix_EffectDone_t) that is called when - * the channel finishes playing. This gives you a more fine-grained control - * than Mix_ChannelFinished(), in case you need to free effect-specific - * resources, etc. If you don't need this, you can specify NULL. - * You may set the callbacks before or after calling Mix_PlayChannel(). - * Things like Mix_SetPanning() are just internal special effect functions, - * so if you are using that, you've already incurred the overhead of a copy - * to a separate buffer, and that these effects will be in the queue with - * any functions you've registered. The list of registered effects for a - * channel is reset when a chunk finishes playing, so you need to explicitly - * set them with each call to Mix_PlayChannel*(). - * You may also register a special effect function that is to be run after - * final mixing occurs. The rules for these callbacks are identical to those - * in Mix_RegisterEffect, but they are run after all the channels and the - * music have been mixed into a single stream, whereas channel-specific - * effects run on a given channel before any other mixing occurs. These - * global effect callbacks are call "posteffects". Posteffects only have - * their Mix_EffectDone_t function called when they are unregistered (since - * the main output stream is never "done" in the same sense as a channel). - * You must unregister them manually when you've had enough. Your callback - * will be told that the channel being mixed is (MIX_CHANNEL_POST) if the - * processing is considered a posteffect. - * - * After all these effects have finished processing, the callback registered - * through Mix_SetPostMix() runs, and then the stream goes to the audio - * device. - * - * DO NOT EVER call SDL_LockAudio() from your callback function! - * - * returns zero if error (no such channel), nonzero if added. - * Error messages can be retrieved from Mix_GetError(). - */ -extern DECLSPEC int SDLCALL Mix_RegisterEffect(int chan, Mix_EffectFunc_t f, - Mix_EffectDone_t d, void *arg); - - -/* You may not need to call this explicitly, unless you need to stop an - * effect from processing in the middle of a chunk's playback. - * Posteffects are never implicitly unregistered as they are for channels, - * but they may be explicitly unregistered through this function by - * specifying MIX_CHANNEL_POST for a channel. - * returns zero if error (no such channel or effect), nonzero if removed. - * Error messages can be retrieved from Mix_GetError(). - */ -extern DECLSPEC int SDLCALL Mix_UnregisterEffect(int channel, Mix_EffectFunc_t f); - - -/* You may not need to call this explicitly, unless you need to stop all - * effects from processing in the middle of a chunk's playback. Note that - * this will also shut off some internal effect processing, since - * Mix_SetPanning() and others may use this API under the hood. This is - * called internally when a channel completes playback. - * Posteffects are never implicitly unregistered as they are for channels, - * but they may be explicitly unregistered through this function by - * specifying MIX_CHANNEL_POST for a channel. - * returns zero if error (no such channel), nonzero if all effects removed. - * Error messages can be retrieved from Mix_GetError(). - */ -extern DECLSPEC int SDLCALL Mix_UnregisterAllEffects(int channel); - - -#define MIX_EFFECTSMAXSPEED "MIX_EFFECTSMAXSPEED" - -/* - * These are the internally-defined mixing effects. They use the same API that - * effects defined in the application use, but are provided here as a - * convenience. Some effects can reduce their quality or use more memory in - * the name of speed; to enable this, make sure the environment variable - * MIX_EFFECTSMAXSPEED (see above) is defined before you call - * Mix_OpenAudio(). - */ - - -/* Set the panning of a channel. The left and right channels are specified - * as integers between 0 and 255, quietest to loudest, respectively. - * - * Technically, this is just individual volume control for a sample with - * two (stereo) channels, so it can be used for more than just panning. - * If you want real panning, call it like this: - * - * Mix_SetPanning(channel, left, 255 - left); - * - * ...which isn't so hard. - * - * Setting (channel) to MIX_CHANNEL_POST registers this as a posteffect, and - * the panning will be done to the final mixed stream before passing it on - * to the audio device. - * - * This uses the Mix_RegisterEffect() API internally, and returns without - * registering the effect function if the audio device is not configured - * for stereo output. Setting both (left) and (right) to 255 causes this - * effect to be unregistered, since that is the data's normal state. - * - * returns zero if error (no such channel or Mix_RegisterEffect() fails), - * nonzero if panning effect enabled. Note that an audio device in mono - * mode is a no-op, but this call will return successful in that case. - * Error messages can be retrieved from Mix_GetError(). - */ -extern DECLSPEC int SDLCALL Mix_SetPanning(int channel, Uint8 left, Uint8 right); - - -/* Set the position of a channel. (angle) is an integer from 0 to 360, that - * specifies the location of the sound in relation to the listener. (angle) - * will be reduced as neccesary (540 becomes 180 degrees, -100 becomes 260). - * Angle 0 is due north, and rotates clockwise as the value increases. - * For efficiency, the precision of this effect may be limited (angles 1 - * through 7 might all produce the same effect, 8 through 15 are equal, etc). - * (distance) is an integer between 0 and 255 that specifies the space - * between the sound and the listener. The larger the number, the further - * away the sound is. Using 255 does not guarantee that the channel will be - * culled from the mixing process or be completely silent. For efficiency, - * the precision of this effect may be limited (distance 0 through 5 might - * all produce the same effect, 6 through 10 are equal, etc). Setting (angle) - * and (distance) to 0 unregisters this effect, since the data would be - * unchanged. - * - * If you need more precise positional audio, consider using OpenAL for - * spatialized effects instead of SDL_mixer. This is only meant to be a - * basic effect for simple "3D" games. - * - * If the audio device is configured for mono output, then you won't get - * any effectiveness from the angle; however, distance attenuation on the - * channel will still occur. While this effect will function with stereo - * voices, it makes more sense to use voices with only one channel of sound, - * so when they are mixed through this effect, the positioning will sound - * correct. You can convert them to mono through SDL before giving them to - * the mixer in the first place if you like. - * - * Setting (channel) to MIX_CHANNEL_POST registers this as a posteffect, and - * the positioning will be done to the final mixed stream before passing it - * on to the audio device. - * - * This is a convenience wrapper over Mix_SetDistance() and Mix_SetPanning(). - * - * returns zero if error (no such channel or Mix_RegisterEffect() fails), - * nonzero if position effect is enabled. - * Error messages can be retrieved from Mix_GetError(). - */ -extern DECLSPEC int SDLCALL Mix_SetPosition(int channel, Sint16 angle, Uint8 distance); - - -/* Set the "distance" of a channel. (distance) is an integer from 0 to 255 - * that specifies the location of the sound in relation to the listener. - * Distance 0 is overlapping the listener, and 255 is as far away as possible - * A distance of 255 does not guarantee silence; in such a case, you might - * want to try changing the chunk's volume, or just cull the sample from the - * mixing process with Mix_HaltChannel(). - * For efficiency, the precision of this effect may be limited (distances 1 - * through 7 might all produce the same effect, 8 through 15 are equal, etc). - * (distance) is an integer between 0 and 255 that specifies the space - * between the sound and the listener. The larger the number, the further - * away the sound is. - * Setting (distance) to 0 unregisters this effect, since the data would be - * unchanged. - * If you need more precise positional audio, consider using OpenAL for - * spatialized effects instead of SDL_mixer. This is only meant to be a - * basic effect for simple "3D" games. - * - * Setting (channel) to MIX_CHANNEL_POST registers this as a posteffect, and - * the distance attenuation will be done to the final mixed stream before - * passing it on to the audio device. - * - * This uses the Mix_RegisterEffect() API internally. - * - * returns zero if error (no such channel or Mix_RegisterEffect() fails), - * nonzero if position effect is enabled. - * Error messages can be retrieved from Mix_GetError(). - */ -extern DECLSPEC int SDLCALL Mix_SetDistance(int channel, Uint8 distance); - - -/* - * !!! FIXME : Haven't implemented, since the effect goes past the - * end of the sound buffer. Will have to think about this. - * --ryan. - */ -#if 0 -/* Causes an echo effect to be mixed into a sound. (echo) is the amount - * of echo to mix. 0 is no echo, 255 is infinite (and probably not - * what you want). - * - * Setting (channel) to MIX_CHANNEL_POST registers this as a posteffect, and - * the reverbing will be done to the final mixed stream before passing it on - * to the audio device. - * - * This uses the Mix_RegisterEffect() API internally. If you specify an echo - * of zero, the effect is unregistered, as the data is already in that state. - * - * returns zero if error (no such channel or Mix_RegisterEffect() fails), - * nonzero if reversing effect is enabled. - * Error messages can be retrieved from Mix_GetError(). - */ -extern no_parse_DECLSPEC int SDLCALL Mix_SetReverb(int channel, Uint8 echo); -#endif - -/* Causes a channel to reverse its stereo. This is handy if the user has his - * speakers hooked up backwards, or you would like to have a minor bit of - * psychedelia in your sound code. :) Calling this function with (flip) - * set to non-zero reverses the chunks's usual channels. If (flip) is zero, - * the effect is unregistered. - * - * This uses the Mix_RegisterEffect() API internally, and thus is probably - * more CPU intensive than having the user just plug in his speakers - * correctly. Mix_SetReverseStereo() returns without registering the effect - * function if the audio device is not configured for stereo output. - * - * If you specify MIX_CHANNEL_POST for (channel), then this the effect is used - * on the final mixed stream before sending it on to the audio device (a - * posteffect). - * - * returns zero if error (no such channel or Mix_RegisterEffect() fails), - * nonzero if reversing effect is enabled. Note that an audio device in mono - * mode is a no-op, but this call will return successful in that case. - * Error messages can be retrieved from Mix_GetError(). - */ -extern DECLSPEC int SDLCALL Mix_SetReverseStereo(int channel, int flip); - -/* end of effects API. --ryan. */ - - -/* Reserve the first channels (0 -> n-1) for the application, i.e. don't allocate - them dynamically to the next sample if requested with a -1 value below. - Returns the number of reserved channels. - */ -extern DECLSPEC int SDLCALL Mix_ReserveChannels(int num); - -/* Channel grouping functions */ - -/* Attach a tag to a channel. A tag can be assigned to several mixer - channels, to form groups of channels. - If 'tag' is -1, the tag is removed (actually -1 is the tag used to - represent the group of all the channels). - Returns true if everything was OK. - */ -extern DECLSPEC int SDLCALL Mix_GroupChannel(int which, int tag); -/* Assign several consecutive channels to a group */ -extern DECLSPEC int SDLCALL Mix_GroupChannels(int from, int to, int tag); -/* Finds the first available channel in a group of channels, - returning -1 if none are available. - */ -extern DECLSPEC int SDLCALL Mix_GroupAvailable(int tag); -/* Returns the number of channels in a group. This is also a subtle - way to get the total number of channels when 'tag' is -1 - */ -extern DECLSPEC int SDLCALL Mix_GroupCount(int tag); -/* Finds the "oldest" sample playing in a group of channels */ -extern DECLSPEC int SDLCALL Mix_GroupOldest(int tag); -/* Finds the "most recent" (i.e. last) sample playing in a group of channels */ -extern DECLSPEC int SDLCALL Mix_GroupNewer(int tag); - -/* Play an audio chunk on a specific channel. - If the specified channel is -1, play on the first free channel. - If 'loops' is greater than zero, loop the sound that many times. - If 'loops' is -1, loop inifinitely (~65000 times). - Returns which channel was used to play the sound. -*/ -#define Mix_PlayChannel(channel,chunk,loops) Mix_PlayChannelTimed(channel,chunk,loops,-1) -/* The same as above, but the sound is played at most 'ticks' milliseconds */ -extern DECLSPEC int SDLCALL Mix_PlayChannelTimed(int channel, Mix_Chunk *chunk, int loops, int ticks); -extern DECLSPEC int SDLCALL Mix_PlayMusic(Mix_Music *music, int loops); - -/* Fade in music or a channel over "ms" milliseconds, same semantics as the "Play" functions */ -extern DECLSPEC int SDLCALL Mix_FadeInMusic(Mix_Music *music, int loops, int ms); -extern DECLSPEC int SDLCALL Mix_FadeInMusicPos(Mix_Music *music, int loops, int ms, double position); -#define Mix_FadeInChannel(channel,chunk,loops,ms) Mix_FadeInChannelTimed(channel,chunk,loops,ms,-1) -extern DECLSPEC int SDLCALL Mix_FadeInChannelTimed(int channel, Mix_Chunk *chunk, int loops, int ms, int ticks); - -/* Set the volume in the range of 0-128 of a specific channel or chunk. - If the specified channel is -1, set volume for all channels. - Returns the original volume. - If the specified volume is -1, just return the current volume. -*/ -extern DECLSPEC int SDLCALL Mix_Volume(int channel, int volume); -extern DECLSPEC int SDLCALL Mix_VolumeChunk(Mix_Chunk *chunk, int volume); -extern DECLSPEC int SDLCALL Mix_VolumeMusic(int volume); - -/* Halt playing of a particular channel */ -extern DECLSPEC int SDLCALL Mix_HaltChannel(int channel); -extern DECLSPEC int SDLCALL Mix_HaltGroup(int tag); -extern DECLSPEC int SDLCALL Mix_HaltMusic(void); - -/* Change the expiration delay for a particular channel. - The sample will stop playing after the 'ticks' milliseconds have elapsed, - or remove the expiration if 'ticks' is -1 -*/ -extern DECLSPEC int SDLCALL Mix_ExpireChannel(int channel, int ticks); - -/* Halt a channel, fading it out progressively till it's silent - The ms parameter indicates the number of milliseconds the fading - will take. - */ -extern DECLSPEC int SDLCALL Mix_FadeOutChannel(int which, int ms); -extern DECLSPEC int SDLCALL Mix_FadeOutGroup(int tag, int ms); -extern DECLSPEC int SDLCALL Mix_FadeOutMusic(int ms); - -/* Query the fading status of a channel */ -extern DECLSPEC Mix_Fading SDLCALL Mix_FadingMusic(void); -extern DECLSPEC Mix_Fading SDLCALL Mix_FadingChannel(int which); - -/* Pause/Resume a particular channel */ -extern DECLSPEC void SDLCALL Mix_Pause(int channel); -extern DECLSPEC void SDLCALL Mix_Resume(int channel); -extern DECLSPEC int SDLCALL Mix_Paused(int channel); - -/* Pause/Resume the music stream */ -extern DECLSPEC void SDLCALL Mix_PauseMusic(void); -extern DECLSPEC void SDLCALL Mix_ResumeMusic(void); -extern DECLSPEC void SDLCALL Mix_RewindMusic(void); -extern DECLSPEC int SDLCALL Mix_PausedMusic(void); - -/* Set the current position in the music stream. - This returns 0 if successful, or -1 if it failed or isn't implemented. - This function is only implemented for MOD music formats (set pattern - order number) and for OGG, FLAC, MP3_MAD, and MODPLUG music (set - position in seconds), at the moment. -*/ -extern DECLSPEC int SDLCALL Mix_SetMusicPosition(double position); - -/* Check the status of a specific channel. - If the specified channel is -1, check all channels. -*/ -extern DECLSPEC int SDLCALL Mix_Playing(int channel); -extern DECLSPEC int SDLCALL Mix_PlayingMusic(void); - -/* Stop music and set external music playback command */ -extern DECLSPEC int SDLCALL Mix_SetMusicCMD(const char *command); - -/* Synchro value is set by MikMod from modules while playing */ -extern DECLSPEC int SDLCALL Mix_SetSynchroValue(int value); -extern DECLSPEC int SDLCALL Mix_GetSynchroValue(void); - -/* Set/Get/Iterate SoundFonts paths to use by supported MIDI backends */ -extern DECLSPEC int SDLCALL Mix_SetSoundFonts(const char *paths); -extern DECLSPEC const char* SDLCALL Mix_GetSoundFonts(void); -extern DECLSPEC int SDLCALL Mix_EachSoundFont(int (*function)(const char*, void*), void *data); - -/* Get the Mix_Chunk currently associated with a mixer channel - Returns NULL if it's an invalid channel, or there's no chunk associated. -*/ -extern DECLSPEC Mix_Chunk * SDLCALL Mix_GetChunk(int channel); - -/* Close the mixer, halting all playing audio */ -extern DECLSPEC void SDLCALL Mix_CloseAudio(void); - -/* We'll use SDL for reporting errors */ -#define Mix_SetError SDL_SetError -#define Mix_GetError SDL_GetError - -/* Ends C function definitions when using C++ */ -#ifdef __cplusplus -} -#endif -#include "close_code.h" - -#endif /* _SDL_MIXER_H */ diff --git a/sources/instrument/main.c b/sources/instrument/main.c index f89ba29..c74f8ed 100644 --- a/sources/instrument/main.c +++ b/sources/instrument/main.c @@ -1,23 +1,20 @@ -#include -#include +#include +#include +#include #include #include int main(int argc, char *argv[]) { int continuer = 1; - SDL_Init(SDL_INIT_VIDEO); - SDL_Surface *ecran = NULL; - ecran = SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE | SDL_DOUBLEBUF); + SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO); SDL_Event event; - SDL_WM_SetCaption("SDL_Mixer", NULL); - SDL_Flip(ecran); if(Mix_OpenAudio(44100, MIX_DEFAULT_FORMAT, MIX_DEFAULT_CHANNELS, 1024) == -1) //Initialisation de l'API Mixer { printf("%s", Mix_GetError()); } Mix_Music *musique; //Creation du pointeur de type Mix_Music - musique = Mix_LoadMUS("A Friend For Life (MIM Remix) 2.wav"); //Chargement de la musique + musique = Mix_LoadMUS("trigger.wav"); //Chargement de la musique while(continuer) { diff --git a/sources/instrument/trigger.wav b/sources/instrument/trigger.wav new file mode 100644 index 0000000000000000000000000000000000000000..0057303d5a272cc8aefe23e1565559b956359830 GIT binary patch literal 64722 zcmWifb97x>7sZc#89Png)NWsG+qTX3YTJ0VUv1lF+NLRzBKFP2vA^?;{BuUe%@{lT z>^;|S&b4lj_HEj{(Ey-t^FFP|Or90*1ONcEep;OafHnO<00NxAsNu7QpRhh-m^R>| z843J=20~l4FCwb1BIZzMfk%8_ZknzTwVVPKqHYQVwDXRn;H@O24-=Ot0}+v#g2x7O zGIr+!>Up3Ue=2WA*6qCh>|QVd=_7_0X8O~Kt06mGbFrZygFSF>OlV#1S$IvVAG0Mo zx*VA>HLQUxmx>IzTXs_U!Vn%ih_0oFxGw}RqIL_<3OBP}AX)2E;Q0P5x#o}WnHO>| zrA~V_?D6=wZ&UMsZBP05X6B2M_q%`Y&4V(Be2RG+`+afImq0&He$KS)O~t&PVh?d8 zBQ1>2^tE_1abBf@gbT5mr6<>}+S=c0PhBB#bPaElDxq72J(V6tmqsJC>G)G;bG#G#C3{h5isD;;+P&ZRGWB!r@37w=z6h`L zpLKt8{QLaO=iht3tom$f^3$vpxfe6K{yh5w$#}+w!pqFC0OlVLkZv+^S@<*8bDD9r zC>>q%Rh40}O~QW0POns<#+2$U%FT*A7x`BrSZ{IFn{mORPWPCQ=(zjwjqGKm-8=#X z;TP5CMVHL)3rzxvmEPk2)xmMccR9kY%i%$=yygc^Z{1x{x?#ZiXTa%mp zNyrMxe4Pe=uaVV24n@!E!#Ic34YP&(7t=Dfe#ks~Z20)fAL=Gl-B4<3?1nPit2U|^ zTCZEBJ26b@7qzE1yjuNGnKzMVLbgQN%FCtmY&X;-J)QVOE;8!|{>^!i9-i0Kccu8R zv=&M1r$0Y8WiQKu(x4AhUpbN^vbgL|U+wR_A8Y--oj=EOwWx7+lgu1%A`;8AKxtz* z_}tz$W>r}wVQhH2kgxGWYA&juU#(18qExr?<7@5tORndt*dzW_h44DB>yNM5t4yts zeL-DHxhlrRydtg|D}ay4O6)Kg6!2$kNMB!c&)+A1Z0dn8ZNEPKwI_FO{*Ip?-qw5@ zpH?9+KQrQ6#^)Vh+x$r{dd!L?=d(%jd;s2j30(SUONW zy5`5kdZm}eG%UTg#{Pyv4I%zT%zx#Isx_+ROnez}kU8X<7CS#~yL&h^NNy;N(3e6r z)SUd&X^(#W&dV!wW=;RT?$egfavG9*JiBblo0tB#BU3Xo^L|(Tn)9hJdEy_*^D_`x zv^z5=?}7L)cAsvDtu$|efHNtsbmMd$Nub@Pq zi~JRLuhOEbBTC)09mGA(BVi|k%hB2TCVvy}6M4Ov8rb-!-nVN%FJzU^e*dTOx8on8 zldhz_&#jYw=EH>-dq0>zs{C31E92YfPsZo6nS=a)0^tR1v+@i3E8Pf$d4rZWk3+P3 zPu!09)!_+lcgV-sDivo}2FhfGWrTE2$f|a<+JrJm5l=(Q#Ca+j<;H~hsFq|J^ToN= zeV5!ScnTJKi`1P;^`bJr9)6#b7METz=V7LqlK-~Pr!^VX@*4m2e>nAa%crxcb+RI| z&!(>Wy!Xf5qEliH|HTtsnC2S^#5jh#G&~IS;G@H4m1;WQ_8B$`W|<|@LxpQoSZ}4HvNaTkl*CXm5xv? z!yW`DQE|jQ$H%CbW$u@45t|tDSLlk;aJ4^)?czeinn(Rz_G{(C*0T`&Dx^Zx?AXoG zKZEaJ4|Nl{?Z~7tIiYZ2;TzuscDTQ1;h$f3zw}5QpWnF{%jodsKyurkHM6JZO6j3r zV?H{*Yk8R^xp}#N2Byz1>@6Jy96*S4oXa#4oIN7NkmI(V%#@&hapfw^uTV2?Zb*2< z!1C{_ONlSyzDI~LwabTBty^hb+_^AkaPzQwasS3AxhDgYjJ0Gndn`IhIOM5Wbh%g# zMDz0t5C8b|<#T#)abDrMboJZ%ueZ~P+@ivvnLtXdo^Y+GW)4&&@E6!;Ss~w!{AiL@qu^LUPUhwB;FniF zI~J}g-158J*T$*0vK|+e@}s_T1v_)SzC>s-ITiY<3^0nxN5Rt~hej-RH?{W)eO-1@ z<&$Ls;g3V_$HbN2U74)7F!o32qbRxT+DiA!mI@1^$J-i2)QTm78=wcZA=*9QJX{sX z4ouCC&%(S1_==wB^u<3;rxv9*DcoM%H6u6q^_O{>>4gV#fBYVi*7fJZOtFL){`0rV zE65upKEmb`!=P}=4I z$Qq^RmV@JZIX~h9nXRDbpBJ6a+?m!PP0RLp ztCXDh<4ftBHZ*sBQH_Gg>|?*5{pyhyEVNhe`xEltda4+gh_A#zG#ShQ&yW?vcgNNV zea-x|Z;5=LkeQGiQ$B=rwhDb+dRGM^_K^Fa^LJ>EI593YB%4TrFA}lNDlQKpDxLiC zY*lTiDRawnt7WF-UM&7la=NHa=Bn>&)1U&)SEF$3uf;#2f3M8>S+u@5B6q>Bc7JYr zB&C@W=bKgBjLSAR6F8HPuLpv`82izv6;V}!M%$xZhr@fsXO?adBRXH$$43q=H=ryK z-7k2U`*?WyxZyF^f+tf+XkD_Gv%kAJu|XQ-Z!da`soM3xxx#(9-EwOcKMiD;WTs#G zF*b9Lr>(bqKA)cOYuB%c+(q7fCEv4t{rr%f5%?l^6Ndzv`y=@-<`%lp=0^x)5;Dj2 zIV>^ka**3G&~`3(UVKso2PW;@sPLbo>F^;#vZzJbMbaRGb$p70tv5UY=s;92;;25^FMrzdRfL~mmPbyC|2L{@@OkGXSCjC)rT#6|C!DoQ^hcK`qGcrRP{GDPZ(^`* z4Uu9@;>Y{K*)TOr_ppJS@0nwZezNK870;=haT!w1a_{Yc5>DTzZJTkVDxA;;8~flSZuz#4U-y4L$8%bvZmxDWe*{pyLx z*_9#XUG)nAqd?3UoCy|I3+xr1a1V>F=Vkimf*Y}9LzlejYp4k|-YGi&5Gmj^@^$#y z*q5ObZ8MlG=bW&XF}tGc1~s9NIx0loi7knI@0^d_#LBo@gp=-ih+Q9HoPsFqFSvnB zm2@s{$cJj3qy`==XJk&j;&iUBu+$TqwIp+3(fq(5zg!rR6Olc=a3}v#^>JMb)gnRq z4^BrS!34vp-vO)J8i&NWK?0yV;@?Cbb97){yS9asG4CQI z<`wi4o9T9j9HS**ubQd+Hm<-sfe+lo!oJ0S_&@S)?s?(pY$;nUCWPkv=EB(-3$khy z|Ks28t5sAg$Cdr6__w@7OAClagZ#I&O2`CkDYDBHwUJ1QD<#xxZ-E^oHoLU&&QWc` zW;g~?e>u6R&2d~H(V7lrvRrc_H^(*(|72^&TnX6`+cox0_$&8bJK)x$2E@(|B8a0{ zS!R%<#2!lZGsg&B#eHUfsFE_!yS}iK=U8AP9~GeUjr1isEqs@`e@c>biZeE5tu0vZ zo9Ay{V9z|Bi?h|0Ba(}I<6qBR)Y{?CsbFN0eif*|^a$=8Y;!v3byRnkFLGc^LGWoN zV4EE3i5?U)Bx1NLh3OkqF?v+wNar_VD&CB|#hkL&BlfE0xKox+InB%B?~)A#TA}Pq zz}9$|6yuDU@u8>l9gMb6TrsfOrgcrE_P@pt(A$he?9I@zv;&x<=2JttIg zuMEl$ZxTPY)QIr8jts~8;NxLZXsWY4ejV(A3Cv`whMB}EfqB9*C0`lGc?z0jtNG*o zwF0#YL$We5>*X~leq0hLnw1sv`*_y4l7;Ncl6!d}c~3ozwA0w5BT^FIU%Q6&u$5&# zU@MT<1nYK0y@^=oYQ@ZO?u@t@J284?XkT|?P+TMzuf#@%&U7rYe{zL}RS1i++u$r< zHU1af2&<`0;F!QOZm{x6X&A`MHM1HQ-SoHdJuO(2T_ekxJFwXFzAOyOsQ;VGdFR~} zc;u;(KQ@25caKHHC-nrWy%=l!#9!F@F%9rfh)KQ)?iw{HJjA({S>hTU@g^oKYHDbf z3k@n2^>=)um~J6$>?4@UuGFxckj<0}oC-SeK7{bvKCOEL={7s~z?+6M5l(Lzp;j{<$Ee;hk) z0O7`tFvG%@M1$eEjwBlqG(B=j?AqvKp@Up!g3d%0#g&dZ9@LNOKwWaz2=}|LVF!V6 z;1nc)q=GG!8@|RRiTrT2huEulXHK2GnZ>hxqR&~}CVN}P*8FDvQ@-u_nHg`hW)=+& zq;im-D1KQylb6f{c&PbV>96*KM$^BYrR*-8#A?}_h98W47QD~C#CFYfI($-0kEnq` zeeHAIQIX!54iQgnjj(;B;u3?-GLPW1Mwl@SSOAR!jtlRKmwT4*OXTD1pu&qe$+@SC z?)X;uUlo?kG&7zT-u9pM{*`|&Yj|$7C!XVlCTxe2$KC^SFSrW&e4q; zy9%1mpFb>({dMj zzVme?PoPeT;?Gg%!@ZDw0Ha468_?d4WA1;LU07|hmb-d*i?BgK^&A!LH{9K$2F1zY ze>-p6<3qBet4E)6&n0URN0>p*BFAxRBD7B3s9pqHBcXasz*ds%&lkpsW}riHP~Nfp zioWhV>|dNWIBRI$;F2`|3-8{-I=PYgt^8NyHS)PYjPDD7*tm*xMn8fr^(BUr$aA%E zAE9<&pD4r~6EW^TDhMfZ)7f@j$_*uDgJjtmZ~Yp;jz#(ZR!t(3hOuVipy zZ*>i{A4*UPd{aw!|6QS)^q##?p+*TSKBz;TK3XO%btPsAK~6o(gw6mTWwg@Zy* z|CPe=`BjShvK^&nd>v2o!V&&8>Qr-$2Foj@IPC*`pSndggr67&(#G*LsFahT+mM^7 z2adNPQ0Qa(H@t+xg71a527`XH_m>z!KYfZ)dTZR{uAIjBMCH1{v65jF*{##FK2p|-)1 z`YP=P*d8;WM^dQ&lK+hOSREt(@SiEHQuxz%OiUM^c|R7MF1+h&C3F##spLF&dT2fOQmPKo zl>yx;!Hrxc6B3gq3z5p{J5}n0@YJAqg%ou^3U&71TM#M#h45)q~n%=nw*%{RO-K zVPKlnPn{uNEm=}fuGq$w2tU|qo-6rR3p)DB3pe-^B}w_7qWxSy#VZ}`2UiU}=*%QHl53pH!^rT#K^1K0sY~{8AqioJo%;w9 z{eqpRm)d?1thqs{uNOnb@Nc~Xf5Mj+*dfKKO@#NJ`vsI|A3IKH#u~--^B)&{@I4e( z@IKGK1-m?d@q{u&-Xr+g&)h@xH=Kn&G8-#@>&>tQOdF;xVIY^$4fJgH;-EV=j3^=I zIVOkf4;|t@L(d~;+kuerA&T9D_d&*BtLS)}hW9lGsDlg+S_&8G{|FR&mM^Dv(yEKQ zebY;9fhh5(bb+7dT~So4WB|Wh_V8LsQ_pVyHt~D4$ek9>7+uje$N}A@elr{5 zYiWgAfe%Kmq0O0du9wajdJaCFjCY&}-e~#1+T;@=-OdK>a#v>hqWz&uXmxrmeG(a^ zNpcVU68H>!s*dNz`3Zi#a!wh>5AeS6#Q2N&%F-Hcz2{>AR#IDNA!l)JukMlkHKZ85 zhdxm{&wZ6@L4WYdXq>r5w^)YQZ0lv4K=|NL47crZnT~%b9&1Ysw!aBp7M#a8u&sEQ z{kH3-qavw+)658@BE=G`fsay>=+>$MBg`1Nz`xg<$laHx%WK&JPiGI|m-!pwT6RqF z?1CNMx>7(s&NcNm^!{LPDp7#b%$M%)X{rsQC$6q)}ao9IW*6vsZYA-aXA>ueLe z#C47yOiZB0yTGs`!5+F6_JlZV=Ug2fW$*)T#2(} zJ3Cgw#3p{Y*ijVYP3L+EUwy+13iFTqUW!em`|KI-e(xeKQ+ok^Hug&A#Mb5+Jci=1 zGf-J*5!S{&Cg`BEfUJ!_q<6TthYSj$>@z6B_IGen_~zio%oakWPC1&n&)fgPzL`Zp zB%VVWXtW`S^(DXd9!M}Eg<8HVzHB~H9wTlH^zoQQjeR2DMVRHCSx~ts!~an@A%w6F zZ&Jx6E?FCD2B{H3g7`~+1@q_}xShGo_ydE?E_-V#0bPtB~Z> z1U`s`{F#!X!iS!x>`^g7EW^Uys=n#se50P(OKC4?Vi#j4G8y|DI;l@EHlZ7sSlc-w z63K$!5knnW?v9R61Wrt}_Ye6PqB`HubIGYpZ8sX+-d+#80N2JVFe7bFaxu6@8)wWw zj$zfnl`{#Rv_s-! zHl9DGMnhfTm&Q6}gVrAQ67$K+=rk}CY=TX;Rd;@&XJdD;@ysa~@2X|bBQ9c1sIHDt zj&0;ucpAhbG}(uW!*&{Hm3%!69t1ZqZc3em_TqH4#5k@>gj#OpUv-4MNv{Rg1aj2Y;wSbRw^VT& zH{>tAYM$%<-r_q66mIyVylKAE!heb^g>x7E1>7C=B#>gBSGtQgl`@co{Xsu~C1wlg zKE90E$CM)m!&g?iwRvDaob zIa&hM-Fhc|lgzTCeQ|6ld4Y0+>*JA&3cUxo;{w2K@=o-u^Nklq$u{XHd(=Ocf1_;! zN13ISRH>JK4sMBG!S=%oz(epXi&9G4Vu*dnMEs{M+U;?A=^eylaaLVUS7?&;?g7>=m^gRvNgBf2%Lu2J-E^vrA&x z@?t6<>!&>ji`V#$^Nqwo+y!52UssM+F#VbJ`89$=I|aQ*nnCl;2c`o5OJ*>SXpC5o zEhOtY&bj|_ZlSl6&1@gto?yilVbiE(%p=Ef*Jwv7c>!sPL=ayo58e{Ip`m&o-~*Uv zWg8qD&sG;E%ax_Qf!CgM9*=)9PjTl<1{E$V8tfax+4<#xD&8q2o!P$>N{f`{a1(|0 zS|2bN-U`wtVS>mVYL+cPjmE?9AJj7EvY`I1IZQg$&ruT0hBS1$>|2--wo%U6Zqc!x z^uvphSHwXI#-{-zv|{bEnF%b{M~Wi@9{)tXi8NkF@wto36nF8BVR!rI7gsJAT{y91 zL0})7;`0?lo|P3<=%__JtdtAFXU$wEbw^!b=kkYTZ(c#FuzM4B4-L|{1b7QHWHGNdC*%k z6k1JGwAHa6XU>!TNQd1Y>+9}FgA=PA@$gBuIQ&)GtPPX+}!P#fSF=1vMu z4;d9y%ifB~cXSJ$7OaRPvZG3JJ*xk?&|e-dlj18bNQ4X+hM*vGggFaZkFB8m z^cP|T`V|j%Y!CYEnq%K@^V<8l`ULL``QVztyrWr1+n_!!nP#!UXe`m0Zb3~(I$Kqz z(7X@qGeflNLM^rp|3qFSk7a{PE_!$`9QYQf=zm;Xy>PMT4*QjV9mw!j@pWd8h<24! zyNWaTT=_p>CQL)0fR8{W=m7Q)oklmrA0jeQ)v?P}$JyOZ+OnAk4kWl+aDB&Ss+pyg zey7`Uf_jTiMF!(ls9MBo=(_P!pJ>cAJD8lx@)+A!AeAA~)qq}dv!uWq66nu1@Lwr5 z3+)zZwB;+Y4gJmhZ`rw0OYL7ZUUEs_v`AT3p_MxBX7LL}oLUJH=$5zo*n# zzZ-aJ(dTIGq5eWel`!>^F#t}*mSY{PxAGJnOMkLS^cwOQxs++|T<+fIin3e3W1cx* zx?`L{G(p@X(&$>Y0QnL*3ku*?_y}?XZf&B<1ZjfW&fwI3!ok3iz-sOnPw)r*s;7@< zu^7ENqua@AiMDT*kb4vXu~Ga4Q&_b zwd8Ixg1O^Ja2w7^Hi`PgaL#`20gf|NRiYi)go(3NrAD9)ph3`LBpz#Ed5#H+DG$;| znGdv$;ujX7-%{>{I9I&L9Sz*DngluOP3@4fUW!!;jfe0v3D<%dAy!_;H$aEpflF-==b@N%k%-mrJ$vqY_Ak zT5cO>`$4ur8^9-!WjI0z@N9$8Bs~@A0W8x9X(IoI?=N*x%1CwD4Zi7tg90O6<*Np+ z_)-HlQIV_5JTI|N`SD7qQQw%Www6J)B`_QL1-}I@o3){Zm_{bj5o9H7CRT}#b%r=W z=09RQS-`AtbaZ6Vt%!~IJ+d6ro!*6yg7ERV^wxk3Yk< zgARR*Hp56Wla1AC9q|y?UkFuFlt^(?;G6#zw^#frPUTMq=s+JXQL3PS232BMIe7L#>1!?a|zlYY+lrT0@-@iMCkiJj_gg-#gRqk=!&-<#S@2t zBr_bu&Gy=9Z87j1nT}OON5Qq=hv)`7uvfx5k2l|>_z^>>t;xEhd?nEo0 zKZsDbkq~N1yn51DXUx!ssBYZ}eu1mP zVc<+)05lh^K{O-(!^6=n=pynolT4o?%HcY$l0RsbP9+auE73XlV{#qoMNfm>01+ID zgd(4TE_$rCL{B!F8QWAqDkYQ_f6BKNT^!79Vej)ZrG9d*#gjETNVqJgs;No`>899L zNiePeL6-O2sO1_q*o%CCAAz+&KNN+vC3li*ur#3+0{Ggvv|E8WFb zirG(o!tK^X;a4VxnNM^?qtL~8Jeh&tfe)GiV>NgI9t))zm9^b!e{GW9N?)Pu5lZpv z#Bo+_XNAdJXD&>rCsmdAhz@=XmnG~{eyT^6bg4vIt=2T#fYpHVMhoLQa2<|8Zy;mf zBT#RIB)U>gOR+1U2(J0e^w^v)DSCIzdc8^Px`g0(2fW57EqT+9ACg&=>4v z&eWDGzvZinPo1U)NvAju=aO_eT^cBS;X3er#KW>%sVG$!?g^$0=zH}6nnyXHzBQUb zjp4pvnt2--0<-9S496xSRgiC3V=9`yN>G>$t4TDXtWFStVlNO0?MHkf7GjC;Y;Y;G z6Ny9HLoaknE7Ioy|5~#=F@&`fA1FwmR=RD!Rgi?F#CE!IW);PWVs+C;3uax~Q3W5HbVW0pCCeqKm<4`UCBV5dqvY-NqO-NxCe(SF)^3c`e_Kt0)YV zG%MB1;YV;~EI0H`?jpOz+QMt`r7}=|p_jJyVw=_!NQaI=05}vl0aiusVGr=lm=8II zULh9Iqv%-j2HuRQLj9zDw3}Lm7h@Z&n)Qn;h4b(l=q213O@iG(W4*K_wa@|>!(I^M$ai=PED=YkG`b1ho}`G%#9@-A?@@h;Kj?Jy6$TTH@R3M8uoAEX ztO<1l`suUP%IX&NvZiSH$};gc-&^b{`=tHCDsBY#iT@_@(r@t{--ItKdgP(%Z)KyL zC|6K(j4>b#b~pbvV=Wgt0z)wy`XBNY4G^>FIV z_(62Em1h6ImtkJ$h53(p7MKq7HQuWkvQ2&^cUH5MS7JYI4m+5?CqxN_tRp}Lp0dq_ zP;m?YgH_oHLIru3Qr}Xr>(UN&tGNx_40JPV0bii5=rL?9b^tAn{=o)NPbjb+{F8|>R z0*eAQxw$;YeGWMNZT+L!hdd~p=DM?Y*xEuVIZ2_F<>~#IHUP zOnk=9U=-Px`D)w4?55(WE%Y(lN_%Bn5;dO8BKy-T>Ca>`wgH)dEJSak-QZ8=R-M=C z>$p`bt=$(630dN2X{orLs~IR8c)$kpH@V`#Mt`foA#Q{4PAKH-@vNnr6V*&DN&Tiw z(E?@$bO#;<$HOn-duRf2gN!FX;8lq2RBc*)mzqR%CuX85d=%M$a>y)bv3XFRuXi_E8h>kFeDAkd^Q}C>%bH_9a;2 z3cd|%h94(i(0MdKg%R}#o!m>0qeqfG@o89B{2Vcgh{J5~QE)Ic15ShDfGYZBwLneN zo@wRP;nE`O{JoSUDOIS&N&BS% zCJ0qPh9aBcx6n~I0XsH}3|O^JNBPHi4O2`__= zhw6Y=z-iE4P_=fTmbzITtkuxwE6>Cg!a|Xio=aDRH5|yr@n3~*Vq@VYx03VoUa^H7 zEFTdm5tGBUWW9-ANBgAFR_*F+<-fC_r(hVIkG3QxSZA{ywhu2L8`5W~@+3kmA=*+q zXqZ-rD!3DGPV^*C6G7Nm_!acWs&e(=?LY@(oX+d-jIluRUmZvFA z^(7V+cK|+{O@VGuDYO$-3*8OhhZ|toghb{MG5BSy1+jpNqfe4w@L>EMUXS#X*+fk& z7TJ$%z#d@L5Er=3TxM!!MIhK*rD4h~d7v7k?Ny3IR466P6Zc50DD&I7&)itymiR(E zV@+0V=N(qYUtjgg9pr~fBYljy7&r*D2T}k8K8GH#yu)s!2YTNk_q9}i@;9D=_qS?= zoxVbb6ZP<0co8v&%*Tt6UT}G2E_xYpK^sk3-=UW>W*M3msyL*v(nC2yxhV~^>Qo}1 zDmbKG;#vL#7t6mCdPsMqnIa|R2v_7<+BB_;N~n#rrG^KXY$Z*Nzh(%e~v^;INHcDHnd(7<+ zfJ}gQKpSBfwvp&X{!1Li%MyL5h0J}XiIoSGrkc_l7=bx&X@rYF$ZOO_Du`H(?nS;M z4B8PX3&ooedYld#_w@B@x>Q3fW4WrorEH-$7s_T^JQ*yEwEW-iKufkC-(74b9^y6b zrm(_#Z^`OPb&7ge8)7;k6fO%L1TR8=p_lO4mcO2lb;oazGwG>x995PqOAeyqnYqk; zssphV4<~m}7+#w6XYXtRd(nY6ZEWxJ`7*&Ey8+CGInOkBb$) z3E@I_?rq=*J3@$)#)}*Hn!H22Bd4h&v=eHgdRogiS3ogv1!xI)5;}s;Clbhq_!Eno zf~c!>7JZHCO$L*9sawn==A4yIoyQHLGWCp{j%Oij;ZN{rq&a*VK#Yaj8m+P3Qg5n8 zNuz`s;xS9N_X!UmJy_0XI~5s(K> zf;U^7-X5-wZ6{6=o$&|QNqjK*oRX+_WM5(gkw9Ic`_k>m&Q{`Im8fmG-WHeuvrsd* zEgTL-1IhYOZJ{<#AFZQmGij}OLOLy1kaNWSf|uVb^p?iT42#YNxbnA2u#xk))VvN;Ad4hMxwqQ6BM2;Z_ zV0)2~$XK){))0l@aIhWF6{rTRG_&;mYCGkN;?QQRnnZ{{g%4sE$t|@Mi}}`k9U)A5 zA#D=d3KIoRye{8RmMd?q>Q+O0WK;k;0#U$N;0YLjQ&2DZ8_7VfVqPLZp0~81gOyIw zRC)RlRgEl9Oec<#?JT0{iJw3hp{=n6)++39126=*Z)TgL%@+CsWxhODX{qAMFL9yJ zShyHk4z@K*eY}yYQvn^31l^N3|MH+HIu9y zrm^-`o+l4erYM3GCmQ?#Ugd9DD;a2!TsHd;|3OF+e)A4~GT&5eAbaFNa##7hlBx;D z0N@VL30MLgf%>8svFg}ibUxOAC?VfcE2)3T4_4ibr>$ucdKS5gC}Z_ghEOQ!#LuAf ztbKcq_CQL&edc<@Zgw{B=^vFV(rT$ddLk_ollWfTZFU~lllOB2*%E(jU=K@KH=;Dx zhy}SaR`++Sv`osBLY2naN9#K{X8{KI2~4$S0y^WBaRN`rcar<*lh$ldds?$@=0n>? z`y*Q@Gm);ybhnMQ71KU)5AhH2gV;j=cpc=8wUhbaMR2{jPy3(@QYI@k6kRfeSnDnP z&FdCbk7gBrcwm7wnQ_Wm!{WdYb|n8+SRfu3ABi_4M185(FrONYjD==>=qmCWeUHAh zICnmAfZ9XXww!NWE4^%MGi@rfgifGMI?U#0CehQ$hD1Z+KcWRu8|w>C0(*iGG#U&w zr)bZW8OlTDtTI4uD(>T#@-qcla0?Z2@C{@GtA0PU{@=coiUr&X(RnU?R_PsdXIthv*p zcpR}1Z-w56W?1_W2Gs;nbC*V|=}K!ARtH+H=NF&N-xTt#?D#!}1X@oE3XXJ~2!DOTMpu(iB8H-shP zX>pZsoqNp=;5P9!g|C)kui;wrim=9FzcbPn>8UKL$$Be`YQE`<%=h39xE>OVgd=&# z9c(vI!BVM7xQoaod(ac;R#Ydl1zC-Xw<=jbE6==*`LKHUdP_IPL9M`k;8E}~u+QkG zS@EtqS*6s~@*1&+@UO7K((oR_7A~LN&FTC%VUDnuAI%>Xj!N;$aiy2iU-_!mH^PCY zzz4G@5CL^UQqiecB}}&n@&_@G+D$DaKNJ6vwdlVXfj(ospM6$+PoSq#=ZIv?jm2Wk zuu)c*Ck~7TdIEER#wMm~3Zqm~<|}q(sioRC`SwC1v8tHK59TnA;V%n=#T=o5Fk2`V zv*aZzr7c&_s^j!xa|}2RY!4#PL3k1BwWjSpV}D~)Es|SGRirR-Dxng!tVC)uWl=w# zj4vUc697>iYln1)$HA8^m0bfYHZJN#)^0x51SMLoEsd1i@)xO#cz`#!+x$C$6;k*K zTr=*BMVGvIRBS9x7jH^_<+m23*VaaBqm9czAz0CxTUicWhYzC-@V@w9j7JUZ9`TeM zMm8lT;MsUJGC+1DZ{h!9%dkj%DSjQhYbn)!ur~AnIt4a2hwFc|%6fBssg|ucThoWS2%+0A)mD7xCxsrTSkvz6Hvm>|A~ zU;`Th*Ud-3Q|Kk)M+4|=bT3*SXUK;nNm9Vkb5R1>4b6gr;4J7HU^6aSefggHeXXL}OU@K`iQT2s(s}U(e~hchud!xO zldOq0%$jyQAzqRWOL3ARA~L4d)ctw`J)o^Ks(@Kg75F7|1-b=4MPK3*iJy3L{2Xp0 zJ5dX)+i2iE+)fhIVKS6hgndD)Vf(S#*g<4H)CC*^dM&N~ZLHN+SZT;n)voT6pIU0L z!m68_#3jOS&c;3DY6+4sL0G^K-2Jjm=2E9glV)wD0*g{Oi?bI@Qw>67Wjhar~qz^Hrm}yj1vJFX6gQ$tt*_6>l zv?V$L-G$7A8Uww|HRcc#H)NGkG$~t(mFHMl0Lu5_^0}w{MScrcm#xjNv}(mxAw)Q0 z)%2-iTX~ssQCXu@x8BAoQve2nOTbnTj+DYy;z#fvcosgAEJfF15}7vE4&+c}nSYr> zbdhyF!^nf=8FCwO50jBL$W~+L&U-IWrb59wUmY!wSWxp z1muDC!(-7^_!En*N032Ob^2fClI?(PJL92eF=K7>Y-^eR*7rEdQo$5&Witd`1zm~E zMN;4<*85m$4AQ;YNX@G}k;;q9h1$YhOB;W(Cj+rozk3~9pKTl9{QCpP*>zlXej&e) zZy+R#H!QNPtKLwHEV4`k#zVpI2zVsY7L)K_L~rsFIgJ`fA7qBwa+qKAYPz;X_oEmq z523b_AtXrNBF5uWQ4-k+cYwP=Pl3-yO})QHYK_$8@^x{UkjhWv8}S#p@obGixj=pP z1>1`~8#rt|)#e8AwS`tfSD~&LBWGB(s;BlvgAEGk4}FHqAPX&qxrH|+yHF+n=SX@F z6KOwh&$DGRpP9wB&(>b-W`@ztsjp-RwVm|g9C`|gKz6|QpkOfBD5EdX>S|@wvGPZ8 zvv809hhM^f;99VM1+E8Pv7y{Pwjx`Zy~So)E-+QNE@TVUr7Frfb+5*0Gxg_&4QvXR zMH*Q3dL$M_%pez1PFk{@-V!FmrrJDA9MhD!$lPQ4GDB#;RYlJbH;AuzEY=bM;h|75 zh=P%3uC`T0)zubXmy<3Et@+d3TTbAd+_^x5z|X*Smgc>*v0 zN2$1OGe#JB#sc69G!!wAndne#9sYr+L-nQC)79zAG;Yhc?XcZrx-#9F8O%Z^o`L9X zMJEisVa+NN1>S8!KGU_V>>$~&@k{Uu!8-> zUSwOao!R!B#Z|&z;$$&M8YZ_>K|M*=^q0nY;2l&3d58?Q`X*8M9-GmoF+QT1QJMlMTP=1+Q55b1mw? zc4CL{MWjJR(OoTNtVCC1W-%-sLJy>RSz4Jx6_CvdJATU2%9U70v^V@Wcpo?gQ~~xI z+cZq=u9Q|trGdO%{9~QVKm2?lPJsE&+*WQqzs~Z&6D=3KO!y-XvE0Z?WxV22Q?+7? zp}GT$fq5Wq%_L-_v#s>_sil@L$QRTMt47Qrqo|)$DE&W<&H>D>Y>C2$SKS@kX2%`d zwllHqOl(bT+h)ghCY<2KcE{+ek;r+GzDRH6 z-;qh9@-Xo?I^v{n8f@t!vT0uT4K;^)O-ZXPlMV@mox1d}XPYs`eYynKL)}9{C_!+o ze|G%X_-FAR|Hk-S@mb>6#gF!v4lD|sq_^^k?#f5)iC)nN7=x@1PC_x8^i*0dA6FW< z;@l~`3%#GbhkXem3q`GnsvUJT@)l~HOHpH^Hb!oWi1)4awel_T7V~s=B~!;K2^0w| znGpVbrFq>rqBqsfggOT|1||kF1ir_2__g`xJd3GVzsZKFB{qG0VncB>8!-bXQepdhus%G;jZyYAFbUEEefi^7uaM9|HEHpfA#+L z<5#Bm8^8MhTJ)<*e0_iMz?Q(aKq5HQ)Y@cL@z}U+cBAsN#W<<6oLT9rrf{$IO!i*! zM*05r36Z}dzeU!Gyc3ZS?>IySIFL-X#XG=T*E`9!sAkMz&>r=i9u5?ahBp8n2hJv-{iX;u^ah%;Su z$#>-H${ppU+S~2-JoJ9`-t#u~4U8xhDMdDpc;@?`FX&4hahsmfM3|vI?o#ghuG30d zISp)5WwDsh%U)~_H6o3(dK&#lcnSz61{F$@V9h`;f1%&CW?)HRKJjx|pjU8HXnObt zJ+E2XU69NPtDpVKzU|Zz-$?;^sgh7#L&cfU)7JaYyM=7s(N`;CPDJL2ji85OzWTm4 zzPI#Q#<;(_F1ad#E0@Z-rDmcijuE_0R_mal>-+SQ`V6fea~j@Y(m%eKIndib%%6l4 zpgj$`QG#-)KFGhe_7@%5Zgib%+E48EPFvx;SO}E*T!~h9tLI#0=x{9qKUMU)eb;=S zd<*HVY~T#`dmno%kiGu}PbG3KQl~3^X@>Yhm@J%fD%n@fHO3>ovz}R>rsXDPrweus z9uL+E&In{8THFYX3fg$*m0*=nzwjY#v>vNJ)z=sqtkdB8LCl1Q#ggbM7O63=A+GN( z)7{Zq5!<`zRee)@Z+$O(t9+8Ll{cNYtT&anxJPsSRNJVD)X_>+`I5L-$POPe)^1>x zGz%HS^itGV1+@z>F$;s=gRanW&g4=c5SSV)7@8dF8yZiXPNh}Q-{>ifc18>Hrj@}- zDx4Pvh~=baDEg?g)U>V*uJh#aD&VKLo(MFb)4h|tDZGt5cisEoZEL&Rxyq`=lvsI~ zd|v7!dW5{rczcI+#r#PB?y#0ZOQ@X;Z^uh71$1h?wlK(#0%rr!K`VGX_W0@fs35?YJRB}dvWFQK>G$Q|XW<5`0mW|FTkd}-r| z0ugy421V?l|9af_&D#>*@`_8czS4a@DwO=P~c$TW?*MvaG*utd|+v?f9OsqF4QsHLtC$3 zGS-<5ti;SJ>=Z=lrPM`sDeo1ZtE^k_l>fsKj`gPWMf<|^I_G=;@vfux|JSqD{mFIT zwUHjvLZ!3ZS=ufpM2-K`9%=P9?=$Ns8KQnByeCvOR4DW|SU5N<&?B&s{$gGHq+Bq4 za64SksjyFr(e7*S^lWBFtCg)fdz}wLZz)zD!tCY}b(HJ0`-^A3cPI$=k#{3F;+t=| zFR$;occb@~w-=>9a_@HgRmT6KMrp3|seUbYH2k-|oyoj67MAg5A4sg+%;UA^45 zJs-Wrd@sHKgCD)&OCRBjSmS%{ZR?%p-Ruo|7P%X^j;rmN@Vg`Tmb~IKCz~_X-egrX zpX$1HR9mXWhi`^v2VVsq1ri6P;IcrmK#ss-s=Z&q^r2v|LZ}ja*f9N*p{tK8*0qW3H4}yB5bq%GN^jWP%Gc7j-}}XL!1Lz!kNb>kyZTG% zulVISX^3b#Z{YW4SR2j0MsBjFSNjrf7A_D=8jm)uV2uO4wdao6-z^X!BnUJ3Vd(AR;wuexul?*KEmt-Px} zT|kpR-SMt1>Llf<+*{r+4H92D!|e%hAVom$($ASEZXYu z=5XV1>riv}`^aFO;3&EVErZ2_^Mk`e&B6!5=fjcOLlnYAOu?FH<+U3+hXqv<_hHm^PX^CKcMZ4f?&vD7YO*K~mp+Of@f<4f zzScIgta%R(;IeixJR>|moGV;EbObJFUhrNpcc@Y*G872*3pEX=)B0;mw2#_Z{k>tC z`>e9I>?9Eyh@hlT@75BTV^HbGp$FF7BE3O>3`> zhw}-AvW9EXX`2dDe>~hyOQkQ=PmnJ=QE7IxQrTVYQ}#?O;flCQY9oJ<$J65+>Z;@J z<}Tvy6eD#q+eQdtw*iwQV~nNA0KYk!+BjZxfT z@j`nX?n=g*8+O4?exj?HBeWv)J!FSog|de~!NT;^7wB85xyzaTtQdQ>{nI|^+!GQ= z+2yiKr9MHQ zse6pD5n+AjEWX;aoTWmXm`Q#t7gn|^yVP4$S~uXs@42hMN5*))-f5oHo`-NWPu)}9 zyIsfB25JRWQ+&!x>8+Rzea$x~mE*Uzn6X9~BdFKWt7#p>!O#=B%+o_TLtBGmgD-;f zLV8FFe+v}}zY8DH+QO1v)teg)&AwJ``@KEFi4iJ`3t<2zDi4&-YG2nlcWO@+KEv>d zs@^f)M&28q8uXMhd(wHMi9pvEd0yqdvk_M|5t2?spq?4biAZ_ikgj zTsRv%pb%adDj2E}`pER}mvB<8h&E4aK<`U3t7DV(>5lev3J70>`C?hAxI9c*s9I_f z*HbXmaL<0vJx`qHizgxca7*tetn##bv3syPsk?=1h`LV6gkPkTgW`YqWeTSrb=F>U zq)|m5i{*d72MdH&1ltE22dfA3fT4DPXJdn%LsvrvJ8>M9_Zq#rvBk(@x~vR#7BbdV zp}&|DP2MtPl6qgw<9g}Zj#o_ZtfRUd?%C}5?s-ohpY2ZKe(O5t>hIdA?o`gmHRZ6> zR4Of|5;8dL?Xy-1tD6~Zc=W#X%#vxH!Ye{~LLR0WvxZWHeg?mQWQFjlZ~?8ZHeSoC z=P?qR`^`Mob!(e_*m)}46Q|Sh{VJDMd$}^Z`?+tyluE?L_f&m{z}M%!FTLx%HWN+% zxu?53vl31HPx(o%cn$}$T^Qx`wkKIn%*~B;eQs1(k*@cD4;!N;t4s78((@4uaDVfVCPrh0haW zY~`kiQxO{@s!`{C^7ix=^S<+q zHFyW0&Bh7``xq2v(l5tlgIs0jZ+FL6XdkDP!HQN4EbXS5nz|nzBj&|5g8+M!NV+z7#T4ZOnHGE>hmu3RP-!x z4|5e)lQZE{MQTE=_t+kaJ!~`n)2C>W;b5?HPzjC=+=sFLJHB9it@wHId*css>k!KK zK!V_wppX2qEc`=@F-n@5ERS7`c%5GwB-d3^sTEwa-KRaXVJX{EVGWDOiu#~dg>YMAm=4tH-(hs%O{mKk^rF2$&DC~5K*e}gEqa>dBCA>Ja9}IUNG<(Fa z!$P!*--328JB(>v_ToZdVK8}Ucql_SFY1`p#sbu^P3Umi!Z12X{gn3VeAipI$NK^X zV2`g2?BugZU(}1pwUNCeyYQ1bvVKGh-(f26JLHhnu4-xqr5tmwBgG8DQoEAX+*}KP zUP}vxlEVR%4jx6rSJHo+H30JtDcgV zOZ&ukLY%YAPH8=*_HM5C)GCAvhX#QpcLquaw)zwJ563@`@9ux#f6q_4z~{h=;Du1D z@YnDb^n^vt8P*KDzEez?DkhizQP!%RT^T_N9lV{f!#q^o=_9v9dSQbeM>dX(h)fol zFmg=9B;S0hz?xLxol)qYm#0fh$Qx^%RH(B zZfwHqSNy-?i}}C#KL<_*>xFKH=7!H|xs5?^r4{VV&IBQ?v{qiD)KYz}tZ?YLy?d#< zoBPiD>PMVFq0>C#h3~NMw(o?mDBYFbo(p8yDdf^lN^2M;>)5}Djuj8Xh^-&E7&(wA^eg$r@Y?LIAH#;zS+B+Wx{*$ zZ~2z89gR>rcQ#KlqEt`cX`kV1AMsyAjz}ePc|=xv@!x#0J`qJ%4w&nM^#6j&C3&dS zMw}!Za%ORZ)oE1a#r1L8N~YcK1&h#C+#BeJa%`i2uRl7lHSj4A4x|cB3wGi(QfMo+ zYI<&?mAL?>bi30Tj&8qHT&bWz6CIZMI%~AWTMYn%@+m2oJ^#8 z?bcjHTvNdl_vmqs5nBnvsrP1D`AyNtsCNTjKMth{)uDG%Fpw)C2afwk`Ir0MfuVux zfh56ZV2eGWRpH)REGTxe5?RrinK@uIYmOK}>w3_P+w-MC#r1!pN&U+-4_cdSc zh}scpBewX;`z-HW^64JW0rw@B$JGLj*KTSZL5y?K!G$EW_8Uvk`DDxdTB`MwRRz9!qiT8}R3VM<0sCY8FMydZ(Zp*`@;$kx*#Yua*RmH4t z%+XD)xwayFAoQ3XPLE(0n3-Lu)(%qj%nY6hKBVTl9NH2duT|Aw=yQxNAZ$Og42$V6 z4U_iBXOzjR+cnjd#VvcTdg^<-QfJO0cV+jb_noD`<#@h&)_QDrA$KR&5jBZAi}U!c zL+DPoG}6gwC$$oom5r_NLMycIRNym0Ekj*HtwI??aWJ*1LL;fXL!pAYJ%Im(oF z#wTNp+0+_qPjadXAB43anlW+*MN#{yck$IUurD@qS(e-5sqE=bl>7qjFXK)KZ=KZD zT|J_>ls>XwDk-HDKeB?6_D$=jDVW8KiMpXJ(n>Rz@-;LkvzHxzgpcj%N0r8WxA8`)_2|iQvJlc zccGSA#r`d&=}3pm$h zy9&BLF3}~f7IFwZopJU-tC01t*%02gDa`F4 zII>LoGi{1iLaPdXIjeo=6VgiP2lSdotdSUv@>_GJ)xegV>C8N>6$Xkmq_z-?{tBOl@&7#uishpIP$>SwaswH+6 zra4dSD)vGv)_h@Pz$+3GEgNa?!X3jA;qRa)2*|KITsgcaoKu?y2UAABhz2#gdCwec z>DD56(&j=*@i|?D`cxW^mBGZRk*<5LMp!@$sJe=$9{u+|=#B5XTe}sMD0N(y)O_lA z<(8aLULf+v?JhbNmSq30Ti z((fAY3Sy6{I$Sv>zvV`W&7x1NC^T~h+s7=I)ev6n1wEZHT1xGDcu@FrXcYLqO=w1F zPv~Okd8im(QAXRN6=D@tji7O#$WWWQudUNYXdxDo{zr^Ts~l2#Gl{jw^??X6$DPpA z)YI6Lmg@7KI~M*jk$b%Bike@&t_)Z1%kQOlv95Sis3wea=GptLmu407jFHP2N~|mZ z(vJ;yr}msnA8i?W(|qA7;m+XuqS`fT9gTeT3O(l%Dvdb113RILFT}mDa~fXpi9BA< zb-?w>m5I9IqT69V&bUWn5mD$YJG$=EZC;=hR<6p?awBQF7!*376i)6mho3uU<~BEC z6JvEv8?L3*o`!dYTZO%0BNP)J5?&R)hHtjkjuRh$>SK)OD8+MIZadblfC_LE_o~&B z@__UEDQ}etY8mEYy1S3Nb$1!mY4ZGReLr2auGr!5cXr1m?(G+WA0vQTw;P0K?;Sg{$@eN%~1*N74E#&xh% z5&Jb2@KB+Wm>HGpDG=3DWd^Hw>}uscOq^`!S?{^z+3T6*X$u!~i&YeGZ)SpM0hYN# z3CTs}QPOoWyEs&cb?(@zUCvrzx=|jz(KG7fwUSz-wkKRYoGzR`Tq^t*dXTrU5oNUl zT033GJ05^ya$E1Lxme~yR#9BcBK?&9kqvneb4dTGgQ>hCQHRU`^}lsr<=67=IHopw zxD;1w^^8(m`9R0~p!7@3O()}>)08Oj%u3EA)GcF(k<=IfuBxJC*39tH@HkXDL&J;1 zPq2rP+A8gZ)>Thr>^9PwOUxYBV{4XO!g=QO6OxN};3R6u*W^-4tkQrf_uj5ebTn;O zQFmi^j9Yb|aJ6$Kq{R5K5xuW0|1LOx%VQC@ioZF~lZ#e0l ziFOK98GS5^JCOe~CK+RlHpX}2c2W9FW%QBu_q7_p1xl;c7K_;tIs4ZgMJlhonet z#eapC+|$$s1e4mHVkNK+a5LE>qn7bhKLq#FL69yMzeeetIHNxhzN4NGWl z-Zw{rsvp=jopszBaz|J!7L|5NZn>BI8crgLp3x98SBRSYB)7*5;7n{aPQ9S^QSZV_ zZDqD6rMyJCDkjD=vw~`~Im7IKt)kXbbE8?+++id!j_HT>UFe3A=?}G2+H2;R`s&N| z&H7!viQyR2$(p&XrKq){oPADOp$`aVCYkfKR99Xk|0~BR7nC~ccy+Kkhb&&r)dgGl zp>9?C!Uttm&njs^4l3P?iPASQgE&(7#cpPHR#StQMzb}Ac=^((U|d24G)*6;*U~Mp z!~-oMnPjVenT}cv`@o!%S=<_jYW|o#im8gfggruG@uoO|&Qdpd26Mytm5WL#n4b!2 zXZ4_Js2Y0SiS)X^DOZ)9N@?oux6(3cfRsWS#>7=BVLp>v&+Rr~h(y*w&bln;(Zcws z@7MRDpBkoDWL_gJ=dc^jKGG;)41*O~O7`w;9kueI#+Z*yP87Zgy+o1Is3fnF&%hb> zRT8Vc`Senk!J+!q0QhdKnh->PPFbNuDsAOg(q=G(57qoNA-%8)#Z&^i8LzFjmSLVY zXP6bu^F{+Bn~~cnWF!OC9MR9|QLwZpj7LTYuJkBO>3ydED%wZwYR+q?wQw38Un}vh z*h|u+LUI|ozx-Y9t*lelE62&{-<7c9QeUGAN~pY)AIRfmjpxhKVX=qk6-NkXoqWzs zCL*HAU8St+=18+Ch~^9LTMFK=snOo3N^M@k7+~C{>Yr-v20fIuK3Eg!^(Jw8IiH=8 zf=lcpo)qK7+R_cFrMyPoz;3*g>oaSxOqrq#Q-&!0hziXVTOKKAmwj|E7J^{LiYdiU z!fv6euz^XsId*kBfqjxY*8aoh3!B-wg>SV{*+^-mf<3IoTJjqCjp5+P;^r`OE_+qL zddMuta{IcS+u6h<-yR{O*abwDK-whbk~_gVt(IlFB`Z1q{mKDlo3fAlO{Ob3iI20` zrBbK|drKkow4KGY;vRfsCwhL{K4=fLlY^>C;ip0KG7~5TP1Upw#gt5k?uiKp)89N} zeu9ZfXN|BNtGYeO-e>=?>o{kfa>6>{fejutx7d%wsb{u zF;#X>j#6@wC48Xz66C84sA3LaHB01nayt18_L)ukEFKb@Q)~1Sq6NQmz^Uf^&mLsw zw&Sb~WRW!Vq-SFXlg!CX?$tM2;W_(>loHH;duuJq;Oh2Nl$Abbkn_eVfm->Xpl~K9 zM4wcZQ(p(}&o8$iQ0?(f>k!M`dN#umsUl4zinZgO`VfY4eo}p zg$!ad>@$}%N4m_Hf&5?vqvi7`S2nSZj`AFN9qMK`mH#Gbfz(gR3_sRHOfLQuE(-mH zAI>R`1Z z-|n;|G_FJJdG;kcr?bfU>ZBJcu(Ls-n|Od)G@VpKnk3yOr-h|E#E_trLiQ4`_eo== zc2W~gEJ`{q4iw9Ysl|`NK60t;oW{ETcA}lD_HbgCWqq`6TZ>plHqNFa&#hzCw%S+| znEw83CA3}S-KOAM#mU22_Hqt88HMh`Oko50G$YaLAk!AV%cTUYq@&b8${{7^t&>Y$ zZWlQr4ijsLWyNSJjl05pp@mQcZH7m<=!|xn5ixQ(ntj$DYnQk4+okxCIh_Y&s*HAV zI|hApQ*K1KY70&jcaNoVT06U)Z;tKALPnvha71_|eCLaYa$uY5#SiqpL?Tjh&ZUM_ zfWQALKH;2hh|9(5Vu<^p4hyUBh&*(6Rya$^qkZ6J;_UnOfA&Src(9!Vyqn0*W+$`X zTUV`TtfDaMs?7Zf9qmo_XKL?^PIjj;NJ8Ztt1#0yMz}Ae1gjQ9kKb2ZBYp&RXOOtU zg4(J+d!Jo$Npb9qjR&t3tBR4-8E=`gnIxnZZh;3*I2)b%j^I4D?}1Uy*$eDyScK2c zi3&HN{e)BbVdb&wasK7lk9Mr$tsPHi=dGQ_8R7iT`QgN257~twoa=Qy|FR>|;z)6e zID>QPCC(Mkg8MeJw!g&w;zY4GcVy5!K4Xux zYx3!8_p{sb=M_j@ho^uXI#AU2!2eEpw*jCIbnnH-*E0R0v3&p4a>j}ApkE~}n>i#}X6RM!| z?8g#&x4qY%0sgIP_qA8rM>whFe9qh7hz_NkBCLC$bJs~ABomU5g{q+~ya>kn2OXz%M!ZM2T ztj&M?C{!OnVln<)Xd9?rpcSN7-B1gFBqncKZbWQQ0YrKNn%`+nuKl_uM&0v5%BOdu*c* z5pX^kEhLysp&rIcLP8=@6E2hI#t0Mm^yU5EJNKwxvL0@ozlsVFIvirM;+c?x9q%UA z7YmD}#R1|%alBYjOhPm&FE$j*h<@y54Ck-XG*sv60SoqB9f)8u4gQeC`iC8yef>az+Sxy3nxWzFX~cO5Skz+2}E zzt@YkHxNpL#WM&UdCx6Gfqud;GQ%z2^b#j9fnBx)QM@N?yHPm4cM zs5dosLP6nA$c6vjWbc;}k+$+i)jMgYTNIy`AnR5L)Mgx>`{;BcK}@#A}@}> za?i3)bJ_P-^qe#CP7#9PNVM4(xmt(%?r z;e=4c)WQoU3WIs}U&12PjJxo&@jP`qXL3MTKXNc6Z?NS=LSiB8Jm7|<=iua2!gqFm33hV|>)*oO^kh$t5tCwB`$A{2bIl2J z``t+*{9|^=!#5O$*xQdzLZWRln7=d5Bdj@{kcI#9o}8MEtd>{MoptE$XC58|H_a^k;#|L@=P3_Gy+lkyVR+~_$pZX#&U{~t+} zl80UC$UBx7vhnBq1)i$U8;Sf>;?Eff!b>8g#74SvdKvKBU+7Wu3%P|4c=j^qJZt|S zelm#|u#kO@!++P2#UJC@DcG00@J>IS9PD}q-p9)mny|h;tTH3d?~ffc;$1zgB$}0G zA?BTMF7SUpXTK&9M@*F{UgN09YHaPE{2zKZRXKu5_S?rw8u0si{8?QA^6Lk1ToQiWz#G@)XFO4*1h+6>VM^jV8RmpN z#hy&A3D_cR$6os+{-2##Ujpk-L|h#2tYROUv%dN4mMB>4#Y;GzQ9SD~k!}OoHW|1( zKguRU$S$@9g>(~(5b-mU4ZDd=!Gq61kPa)okM}pjCfbv?8llqMMLb^s8XC`Y96M|$ zCB|ezqqZFkbQzVC!&+kL0Nmg^W%AP1dIayA0;`|R`E@2L?Qv4$b=^3Xy25laUN*2u zVzN#tYL|2okq2eA_*9)25-)0Y`p2`X~n*vU64Q?$2D%#3U?V?^;&YCI{m--V$TXS+@dh8YG zJ{7{k{|EL<04o0~q!$NM*X?IL&BPI`>@K)*hS-u>m*L`eFl$Ef4EuQs4bNUqIHB+f zYe`M4-%TY_mss>S@usGu+b_Td<(#7Em2QLE-q=y>OGf91{e>JooV+!OY~C6RdjTp+ zNre0fA2>u<&pC}E0#C+nB6#;*#G=i@W5LhL_F=_?seK<3EnDH^39;CE_!QqXncGeV^5jLV@;CZC zE2IMlRi!@qE~H@xmU0SNM2po_yWh-cE_fQy=P6gW?7%$HhNRlGzGg~hVAJNl4?Rd{=?}&tk@6#v{Uei zWB7i9qf{$v#rN>V&7?}K;w$xKbyieJdWffN#EY)-`x2p1yUH8f;zZL3M~Pp1K@PpK ziP?XcgDq6B6?t&-cnBv5f_N(@tC1h5EcwcGBD*;;#(#%QYkXbU2bO1 z21<$kQ|HdJYjX;1VI8X3I+f*HE0bM^N}?q7ZXtGKr+u8-YC91nJ(+w5YgtEJFA8!v zA)Msr6*zu0D_Ft_45X%c!R+o?aV)IiMC#4;M35}Rj2}cZKQ`TtQ%MY(aS6vbmCPXd zk*m!e?gg;T zC|J+>y!B3^SR*3D-&B}ud2%|wd^n?6h3MuMkAgB6;JYWmI)%u_684@{c!0$=BYO29 zqt$fc?ZZ?~Uy18+#Hv+PHHKXlA5IJ#kp`@_nD<{u>|H{%h$egG=0u8e!sn@Gu7KK( zQQZ|1E1}b5bb_^23X@J)WoMBEPpHqoidAPLpHrgB=!Q@nyi*eW@gh!OXp;p2^C; z$qvqr`}6+8@TVBOwHBVS)7jY$vxuFGv5W-dv>*7uGuZ6h zR9T;eGkC=}ELf-N837KR&YBjI^Ht)v4sOsuXM>4J{W$M&)NvjnwM-S&koPyK^9r-N z@vN^Ur_~=!5byksd^f4j8gUNO$>n3%i8yRNC6VJfwNnnUHofGGRCu4LrqhcGeA7DW zyY1}6aw0`KP*fsNh=4^7Bb&A3*?*BE-q;Vx7H%hG-?rBiIS*0Wxt!NThX;6OeWxoi zwkftVmFFh~D~7?3H9@7Pv4$OFhIeH4I@I|QFdE5-U~OQV+)P?LrS9>GPl=g5L3(4@ zg%(8rGvuusWPqhaD+N3Bk)uqI#%OyCdGjiNw}_Z97;kXwgwA(XmY9_;#|BP-298pz zb!Q*P;~CRI7g=D|V#GAmkuAjeWXpfR7?uCz@>P7xSSInSpws_MAwB{FHT{Foe%Cjb z*x84~0giJp0h5ee|sMR@9Xroz{{+a10w-}E zyuKUz?&(O*LD0fZd~%W92)4zhb6AZ}BpMMv_m2#Pj~)XnH4C<`5YO+-xr_mo)+Bq3 z;b$W;rx9^z(w~)V6u*d(QV`a44N>}+sKGrAgzu?`#=Ha3^Z|KyJRHR|p&VT7EG%sZ zkurmG%{LCvvFTDz@RmX9vNA!~{C@1JbejCfUM5Gzw3h}8JEj4Bb1j)}$87*PPv(q2AOlJ87A9O%$0RC|k)4bw2@P8y8 zVNjuL1Y-s5Pk4X~+c4fPOMLEWPvDs;ZP89;Hv^F_Aa>Ryiyg-{vXW7g;57$9;Q6UE zieewv@P#^J2{`zY#K}A2OU__4IrFIahJTvJe=AAPYb1M>4hC#Cwj9e}3vn;!KSbW? zpluJzx$bsn&V3y3`<|}dLo#SO`-gQAPWYo$f-Ewa^C@T#z-zJ)DKf$h52flW4@2G_ z+;l+5&o0FBv>9N#lu~Ox`RJS_gq!UrwV;!DmF)3?8*<{rnRt(fwG?5}djs*x1wQdm zg-s)Gya2sec;s^U&m>r7E#5qh{l>aMf4#EZ2Wv^izpsH6zks{^joed#@$SPCzl6=o z1rrb;3i-)P(d@;2(C!JW;((~52Tz9@X&brgU-7MY32rpG7zZyPlhNBzul+~%yFjcg z3bvZT^EdO?82g2F4u0B%8@`JcX%T;)jl5czHKb<0F8+z^5g@Jci;=E6N%uETWaRtb^58T5- z5W{pB;8AdquXz8TR!%xPmUYE?VnyQ{YgykY_{w;@2VQlE3g8j`aR^l9gX{a#(5LM2l|Y-%>p^261?74BEKFsAvb$)tp9ltqxl=jF>%wx+(*Gy;^@5mx}OUi?GJ@ zu=35h$^5mo!1~8JW__{Vb34!oYbu<13Nm_HTVqykBpuG|PFj#hHR4td{-iJ%b% zEpZB-+6$C>RP@5rr<7js=HF2#6qgc7=dgx(*v%fWs17@`1>0Oo?0U^k45t>INq3HK?u}`;*ZANynxMJnasAbp){@6B%wDmb4IiDh20si_CF=6D|bKj%B|G z5FsysE>lUL#NDvuC&Zti-wVXls&w%Na&n2p?PQVm_*P@^#A0wnIj~F(GRI;fLuXEX z1yLd^Q7bu59?$MK0@F2NkK%|V56JMD@$36kAn!rC(O|mo*rY?9ho*oh-3HH1VMiWt zA|5<*2LE;)c5)rAHik@^0q!=Hc${-c4-(3PcN~BfbnFm0%Aw|Iz!{XLKhcZ#chKHQ zoW&R-X+}JR~72T7+e^ zv%9dyRMd*?VeAHB3l+(SYq6`{Ti(C0! z4Z$_j;OZ9e*BH(N^*p=V$VrG2p#*)js&D~CiBfCmH-E6wlR4g5r-_vX$>Zy(PdiW@ zh3(%Q-9oVCVLF;KK(uG6@E;3hu)NFkMV1n$UyAvu08>f#{@{sZ#E1LXMSalD1R`om zaW`JkiJu1G{PE=D-?dH#=LYAH+;+1YCFtFpM+LBhsjMvY6a&PnL`2CepqaC<1WDMx zA81k1Q7v`g*_GiUdJ=h-5+NIMM^at7**T?N(iU_l9au*Y|Hw%ldJezL43a1br*eqM zU{g*10@d}QN3xno{X18b9{1wavNn6;l=I+xQqL0@kI_Ar}>9aSZMj;eGG z^5Ee$L3VqE++>2i#KfIohFa1h)IYu0jV{s}>9n+0>IBC7g^eV~GDnlSzkmWC;ZcQ! z<9J0^5Nl5740T=#&LK5Oa+6ih%1cjq3~%1S%FU-0nd29q$K>&>Q zbv|;B7fWbse}Vy6!TV3-sSnLV<`d?3Q=%8TX5K}oH=JtxI6t?oLNF+{oeh4y2W(z@ z7(<83t~6GdS(+~$=6&d6`%czHAWgU8ZQX%8BV60juE z;!EPxQaVVBh`f8rRc-0454Uu4hq>8YVRl0wblTWsJY*&-gX!ajf(WxWO0|4eS*xx! z$BHDcDCC%4@a2W5X={=lRibiy2m=3=;60Y%O}W4rM`CgpOY&#_TgFJxw~ zj@25?%o(dJb#YnjX+2r%Zy~ifi@5ZH{^@p9jI&VP?3GV2iQiUPtc*nolSE0T4250=d>k2h+j&%)W0&tJ&AgXg)D+p-?Jn)hhfPLfBfXIY zW#>vJ7Z>yS!u<<3O%ImS+B(a(%3F4C_{N7$3v&13KX|DXHd$6aEDJm@B&S9vc0f7L zI%+DJIhVqUgQX_nE{YW>_tHqSK*7U6`GT+-&uC@8#3#lOmrkNsdt{tv2QC@2(IjOx zY8o4jr^Zj?3DfqS&7j!{|Gj7_SW!VZzuz%p1qkXa5puh96Wv^MneT*9Mk?KvmfSRT z5>@9n^mA2}C{DwtT#+lWhVE2Cvb2M)?_esOlSKVO&SE>>8fDe83ZN7lgDq?}=KryW zF-8$|YgLUk#v4@4AFXt@lp0At!FFqjncIlib7AiDqKhiS_ln1$V~ntFpltnY z>@@Zo{~0fhgT`26gmK!)iG_^EE-#qnVDT!$+3bPsoC%kG2A-if8PR6$JGIuf!=i(AkHXKK{athKc^V8neY4~}`u{p8tbj1X`2b^E znJ6_6z1~=}41VY{pBv**E=CwRjn+n2?6R`a5lhWS{Mc30!6rBGd$LsCU)#hM&W-j`{g(yOf z{OP`YbQY1dZlQYbPL}E<|B@RLn-*gO2~f4pLgQUmEs5g4@}GO8+N0^bBrlW8Gu0X? zjV6O#rAE3)ML&dU|0*%+iCM>dY%FIMzO|9q*r^ZDd+LkzgD8%-a=*_HCLk^`nN!Z3 zhJS3ZiozhOWUp_|I;ND)i^-&J(qryK_%7GRAEqfsxmBnQcLq1*Op>aJ`8;QJva$^| zWnOM@jAjlZ9yD4Jy>~P^=bzSmtAh3XkJ@@L_E-$BypGbjq27f_^XsUK|6@w6j`1%O z#uM<5)YfXN7M-(>RG*3A#ySxv2cqG0qg?eWGqA$f-0z-~T{yy=%3QUTT28H`mQr

L~C3kv`!W!%@|CQ2tXKEHQ~%n(yUUtWHv^ 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 GzyAY9Q{RmM literal 0 HcmV?d00001 diff --git a/sources/lecture/lecture.c b/sources/lecture/lecture.c index a05a33d..a6424b1 100644 --- a/sources/lecture/lecture.c +++ b/sources/lecture/lecture.c @@ -4,14 +4,16 @@ void lireTick (Motif* m, int tmp, Mix_Chunk* chunk[], int nbrPortees) { // On int tempsPrecedent = SDL_GetTicks(); - for (int chaine = 0; chaine <= nbrPortees; chaine++) { // On va lire les chaines une à une par numéro croissant + for (int chaine = 0; chaine < nbrPortees; chaine++) { // On va lire les chaines une à une par numéro croissant if (m != NULL) { if (getNote(m,0,tmp) == -1) Mix_HaltChannel(chaine); // Si la note est un silence, la chaine s'arrête - else Mix_PlayChannel(chaine, chunk[getInstrument(m,nbrPortees,tmp)], -1); // Sinon le sample de la chaine est joué en boucle + else { + Mix_PlayChannel(-1, chunk[getInstrument(m,chaine,tmp)], -1); // Sinon le sample de la chaine est joué en boucle + } } - while (SDL_GetTicks() - tempsPrecedent > 250) {} // Si 250 ms se sont écoulées (il faudra régler ce temps sur le tempo) - tempsPrecedent = tempsPrecedent + 250; // On actualise l'horloge du programme } + while (SDL_GetTicks() - tempsPrecedent < 250) {} // Si 250 ms se sont écoulées (il faudra régler ce temps sur le tempo) + tempsPrecedent = tempsPrecedent + 250; } void lecture (int nombreChaines, Motif* melodie[]) { @@ -23,6 +25,7 @@ void lecture (int nombreChaines, Motif* melodie[]) { //Lecture des motifs for (courant = 0; courant < taille; courant++) { for (int i = 0; i < melodie[courant] -> nbrTmp; i++) { + printf("lecture temps %d : N=%d I=%d\n",i,getNote(melodie[courant],0,i),getInstrument(melodie[courant],0,i)); lireTick (melodie[courant], i, chunk, nombreChaines); } } diff --git a/sources/tests/makefile b/sources/tests/makefile new file mode 100644 index 0000000..e37d527 --- /dev/null +++ b/sources/tests/makefile @@ -0,0 +1,19 @@ +all : test clean + +test : test.o lecture.o melodie.o motifs.o + gcc -std=c99 -L/opt/local/lib test.o lecture.o melodie.o motifs.o -o test -lSDL2 -lSDL2_mixer + +test.o : test.c + gcc -std=c99 -I/opt/local/include -Wall -c test.c + +lecture.o : ../lecture/lecture.c ../lecture/lecture.h + gcc -std=c99 -I/opt/local/include -Wall -c ../lecture/lecture.c + +melodie.o : ../melodie/melodie.c ../melodie/melodie.h + gcc -std=c99 -Wall -c ../melodie/melodie.c + +motifs.o : ../motifs/motifs.c ../motifs/motifs.h + gcc -std=c99 -Wall -c ../motifs/motifs.c + +clean : + rm -f *.o diff --git a/sources/tests/test.c b/sources/tests/test.c new file mode 100644 index 0000000..3a75f2e --- /dev/null +++ b/sources/tests/test.c @@ -0,0 +1,45 @@ +#include +#include +#include "../lecture/lecture.h" + +#define DEF_NBR_TMP 16 +#define MAX_PATTERNS 256 + +void afficherMotif(Motif* m, int nbrPortees){ + printf("%s :\n",m->nom); + for (int tmp = 0; tmp < m->nbrTmp; tmp++){ + for (int portee = 0; portee < nbrPortees; portee++){ + printf("N=%d I=%d",getNote(m,portee,tmp),getInstrument(m,portee,tmp)); + } + printf("\n"); + } +} + +void debut(Motif* melodie[], Motif* liste, int nbrPortees){ + ajouterMotif(&liste, DEF_NBR_TMP, nbrPortees); + Motif* m = liste; + definirNote(m,0,4,5); + definirNote(m,0,2,9); + ajouterMotif(&liste, DEF_NBR_TMP, nbrPortees); + Motif* n = liste; + definirNote(n,0,10,3); + definirNote(n,0,6,7); + ajouterMotifVirtuel(melodie,0,m); + ajouterMotifVirtuel(melodie,1,n); + ajouterMotifVirtuel(melodie,2,m); + ajouterMotifVirtuel(melodie,3,n); +} + + +int main(){ + Motif* melodie[MAX_PATTERNS] = {NULL}; + Motif* liste = NULL; + int nbrPortees = 1; + courant = 0; + taille = 0; + debut(melodie, liste, nbrPortees); + for (int i = 0; i < taille; i++) { + afficherMotif(melodie[i], nbrPortees); + } + lecture(nbrPortees,melodie); +}