| 1 |
|
| 2 | #ifndef __SOUND_WAVEFRONT_H__
|
| 3 | #define __SOUND_WAVEFRONT_H__
|
| 4 |
|
| 5 | |
| 6 | * Driver for Turtle Beach Wavefront cards (Maui,Tropez,Tropez+)
|
| 7 | *
|
| 8 | * Copyright (c) by Paul Barton-Davis <[email protected]>
|
| 9 |
|
| 10 |
|
| 11 | #ifndef NUM_MIDIKEYS
|
| 12 | #define NUM_MIDIKEYS 128
|
| 13 | #endif
|
| 14 |
|
| 15 | #ifndef NUM_MIDICHANNELS
|
| 16 | #define NUM_MIDICHANNELS 16
|
| 17 | #endif
|
| 18 |
|
| 19 | |
| 20 | These are used for various driver controls and direct
|
| 21 | hardware control.
|
| 22 |
|
| 23 |
|
| 24 | #define WFC_DEBUG_DRIVER 0
|
| 25 | #define WFC_FX_IOCTL 1
|
| 26 | #define WFC_PATCH_STATUS 2
|
| 27 | #define WFC_PROGRAM_STATUS 3
|
| 28 | #define WFC_SAMPLE_STATUS 4
|
| 29 | #define WFC_DISABLE_INTERRUPTS 5
|
| 30 | #define WFC_ENABLE_INTERRUPTS 6
|
| 31 | #define WFC_INTERRUPT_STATUS 7
|
| 32 | #define WFC_ROMSAMPLES_RDONLY 8
|
| 33 | #define WFC_IDENTIFY_SLOT_TYPE 9
|
| 34 |
|
| 35 | |
| 36 |
|
| 37 |
|
| 38 | #define WFC_DOWNLOAD_SAMPLE 0x80
|
| 39 | #define WFC_DOWNLOAD_BLOCK 0x81
|
| 40 | #define WFC_DOWNLOAD_MULTISAMPLE 0x82
|
| 41 | #define WFC_DOWNLOAD_SAMPLE_ALIAS 0x83
|
| 42 | #define WFC_DELETE_SAMPLE 0x84
|
| 43 | #define WFC_REPORT_FREE_MEMORY 0x85
|
| 44 | #define WFC_DOWNLOAD_PATCH 0x86
|
| 45 | #define WFC_DOWNLOAD_PROGRAM 0x87
|
| 46 | #define WFC_SET_SYNTHVOL 0x89
|
| 47 | #define WFC_SET_NVOICES 0x8B
|
| 48 | #define WFC_DOWNLOAD_DRUM 0x90
|
| 49 | #define WFC_GET_SYNTHVOL 0x92
|
| 50 | #define WFC_GET_NVOICES 0x94
|
| 51 | #define WFC_DISABLE_CHANNEL 0x9A
|
| 52 | #define WFC_ENABLE_CHANNEL 0x9B
|
| 53 | #define WFC_MISYNTH_OFF 0x9D
|
| 54 | #define WFC_MISYNTH_ON 0x9E
|
| 55 | #define WFC_FIRMWARE_VERSION 0x9F
|
| 56 | #define WFC_GET_NSAMPLES 0xA0
|
| 57 | #define WFC_DISABLE_DRUM_PROGRAM 0xA2
|
| 58 | #define WFC_UPLOAD_PATCH 0xA3
|
| 59 | #define WFC_UPLOAD_PROGRAM 0xA4
|
| 60 | #define WFC_SET_TUNING 0xA6
|
| 61 | #define WFC_GET_TUNING 0xA7
|
| 62 | #define WFC_VMIDI_ON 0xA8
|
| 63 | #define WFC_VMIDI_OFF 0xA9
|
| 64 | #define WFC_MIDI_STATUS 0xAA
|
| 65 | #define WFC_GET_CHANNEL_STATUS 0xAB
|
| 66 | #define WFC_DOWNLOAD_SAMPLE_HEADER 0xAC
|
| 67 | #define WFC_UPLOAD_SAMPLE_HEADER 0xAD
|
| 68 | #define WFC_UPLOAD_MULTISAMPLE 0xAE
|
| 69 | #define WFC_UPLOAD_SAMPLE_ALIAS 0xAF
|
| 70 | #define WFC_IDENTIFY_SAMPLE_TYPE 0xB0
|
| 71 | #define WFC_DOWNLOAD_EDRUM_PROGRAM 0xB1
|
| 72 | #define WFC_UPLOAD_EDRUM_PROGRAM 0xB2
|
| 73 | #define WFC_SET_EDRUM_CHANNEL 0xB3
|
| 74 | #define WFC_INSTOUT_LEVELS 0xB4
|
| 75 | #define WFC_PEAKOUT_LEVELS 0xB5
|
| 76 | #define WFC_REPORT_CHANNEL_PROGRAMS 0xB6
|
| 77 | #define WFC_HARDWARE_VERSION 0xCF
|
| 78 | #define WFC_UPLOAD_SAMPLE_PARAMS 0xD7
|
| 79 | #define WFC_DOWNLOAD_OS 0xF1
|
| 80 | #define WFC_NOOP 0xFF
|
| 81 |
|
| 82 | #define WF_MAX_SAMPLE 512
|
| 83 | #define WF_MAX_PATCH 256
|
| 84 | #define WF_MAX_PROGRAM 128
|
| 85 |
|
| 86 | #define WF_SECTION_MAX 44
|
| 87 |
|
| 88 | |
| 89 | substantive data, such as samples, patches and programs.
|
| 90 |
|
| 91 |
|
| 92 | #define WF_PROGRAM_BYTES 32
|
| 93 | #define WF_PATCH_BYTES 132
|
| 94 | #define WF_SAMPLE_BYTES 27
|
| 95 | #define WF_SAMPLE_HDR_BYTES 25
|
| 96 | #define WF_ALIAS_BYTES 25
|
| 97 | #define WF_DRUM_BYTES 9
|
| 98 | #define WF_MSAMPLE_BYTES 259
|
| 99 |
|
| 100 | #define WF_ACK 0x80
|
| 101 | #define WF_DMA_ACK 0x81
|
| 102 |
|
| 103 |
|
| 104 |
|
| 105 | #define WF_MIDI_VIRTUAL_ENABLED 0x1
|
| 106 | #define WF_MIDI_VIRTUAL_IS_EXTERNAL 0x2
|
| 107 | #define WF_MIDI_IN_TO_SYNTH_DISABLED 0x4
|
| 108 |
|
| 109 |
|
| 110 |
|
| 111 | #define WF_SYNTH_SLOT 0
|
| 112 | #define WF_INTERNAL_MIDI_SLOT 1
|
| 113 | #define WF_EXTERNAL_MIDI_SLOT 2
|
| 114 |
|
| 115 | |
| 116 | emulation. Note these NEVER show up in output from the device and
|
| 117 | should NEVER be used in input unless Virtual MIDI mode has been
|
| 118 | disabled. If they do show up as input, the results are unpredictable.
|
| 119 |
|
| 120 |
|
| 121 | #define WF_EXTERNAL_SWITCH 0xFD
|
| 122 | #define WF_INTERNAL_SWITCH 0xF9
|
| 123 |
|
| 124 |
|
| 125 |
|
| 126 | #define WF_DEBUG_CMD 0x1
|
| 127 | #define WF_DEBUG_DATA 0x2
|
| 128 | #define WF_DEBUG_LOAD_PATCH 0x4
|
| 129 | #define WF_DEBUG_IO 0x8
|
| 130 |
|
| 131 |
|
| 132 |
|
| 133 | #define WF_WAVEPATCH_VERSION 120;
|
| 134 | #define WF_MAX_COMMENT 64
|
| 135 | #define WF_NUM_LAYERS 4
|
| 136 | #define WF_NAME_LENGTH 32
|
| 137 | #define WF_SOURCE_LENGTH 260
|
| 138 |
|
| 139 | #define BankFileID "Bank"
|
| 140 | #define DrumkitFileID "DrumKit"
|
| 141 | #define ProgramFileID "Program"
|
| 142 |
|
| 143 | struct wf_envelope
|
| 144 | {
|
| 145 | u8 attack_time:7;
|
| 146 | u8 Unused1:1;
|
| 147 |
|
| 148 | u8 decay1_time:7;
|
| 149 | u8 Unused2:1;
|
| 150 |
|
| 151 | u8 decay2_time:7;
|
| 152 | u8 Unused3:1;
|
| 153 |
|
| 154 | u8 sustain_time:7;
|
| 155 | u8 Unused4:1;
|
| 156 |
|
| 157 | u8 release_time:7;
|
| 158 | u8 Unused5:1;
|
| 159 |
|
| 160 | u8 release2_time:7;
|
| 161 | u8 Unused6:1;
|
| 162 |
|
| 163 | s8 attack_level;
|
| 164 | s8 decay1_level;
|
| 165 | s8 decay2_level;
|
| 166 | s8 sustain_level;
|
| 167 | s8 release_level;
|
| 168 |
|
| 169 | u8 attack_velocity:7;
|
| 170 | u8 Unused7:1;
|
| 171 |
|
| 172 | u8 volume_velocity:7;
|
| 173 | u8 Unused8:1;
|
| 174 |
|
| 175 | u8 keyboard_scaling:7;
|
| 176 | u8 Unused9:1;
|
| 177 | };
|
| 178 | typedef struct wf_envelope wavefront_envelope;
|
| 179 |
|
| 180 | struct wf_lfo
|
| 181 | {
|
| 182 | u8 sample_number;
|
| 183 |
|
| 184 | u8 frequency:7;
|
| 185 | u8 Unused1:1;
|
| 186 |
|
| 187 | u8 am_src:4;
|
| 188 | u8 fm_src:4;
|
| 189 |
|
| 190 | s8 fm_amount;
|
| 191 | s8 am_amount;
|
| 192 | s8 start_level;
|
| 193 | s8 end_level;
|
| 194 |
|
| 195 | u8 ramp_delay:7;
|
| 196 | u8 wave_restart:1;
|
| 197 |
|
| 198 | u8 ramp_time:7;
|
| 199 | u8 Unused2:1;
|
| 200 | };
|
| 201 | typedef struct wf_lfo wavefront_lfo;
|
| 202 |
|
| 203 | struct wf_patch
|
| 204 | {
|
| 205 | s16 frequency_bias;
|
| 206 |
|
| 207 | u8 amplitude_bias:7;
|
| 208 | u8 Unused1:1;
|
| 209 |
|
| 210 | u8 portamento:7;
|
| 211 | u8 Unused2:1;
|
| 212 |
|
| 213 | u8 sample_number;
|
| 214 |
|
| 215 | u8 pitch_bend:4;
|
| 216 | u8 sample_msb:1;
|
| 217 | u8 Unused3:3;
|
| 218 |
|
| 219 | u8 mono:1;
|
| 220 | u8 retrigger:1;
|
| 221 | u8 nohold:1;
|
| 222 | u8 restart:1;
|
| 223 | u8 filterconfig:2;
|
| 224 | u8 reuse:1;
|
| 225 | u8 reset_lfo:1;
|
| 226 |
|
| 227 | u8 fm_src2:4;
|
| 228 | u8 fm_src1:4;
|
| 229 |
|
| 230 | s8 fm_amount1;
|
| 231 | s8 fm_amount2;
|
| 232 |
|
| 233 | u8 am_src:4;
|
| 234 | u8 Unused4:4;
|
| 235 |
|
| 236 | s8 am_amount;
|
| 237 |
|
| 238 | u8 fc1_mode:4;
|
| 239 | u8 fc2_mode:4;
|
| 240 |
|
| 241 | s8 fc1_mod_amount;
|
| 242 | s8 fc1_keyboard_scaling;
|
| 243 | s8 fc1_bias;
|
| 244 | s8 fc2_mod_amount;
|
| 245 | s8 fc2_keyboard_scaling;
|
| 246 | s8 fc2_bias;
|
| 247 |
|
| 248 | u8 randomizer:7;
|
| 249 | u8 Unused5:1;
|
| 250 |
|
| 251 | struct wf_envelope envelope1;
|
| 252 | struct wf_envelope envelope2;
|
| 253 | struct wf_lfo lfo1;
|
| 254 | struct wf_lfo lfo2;
|
| 255 | };
|
| 256 | typedef struct wf_patch wavefront_patch;
|
| 257 |
|
| 258 | struct wf_layer
|
| 259 | {
|
| 260 | u8 patch_number;
|
| 261 |
|
| 262 | u8 mix_level:7;
|
| 263 | u8 mute:1;
|
| 264 |
|
| 265 | u8 split_point:7;
|
| 266 | u8 play_below:1;
|
| 267 |
|
| 268 | u8 pan_mod_src:2;
|
| 269 | u8 pan_or_mod:1;
|
| 270 | u8 pan:4;
|
| 271 | u8 split_type:1;
|
| 272 | };
|
| 273 | typedef struct wf_layer wavefront_layer;
|
| 274 |
|
| 275 | struct wf_program
|
| 276 | {
|
| 277 | struct wf_layer layer[WF_NUM_LAYERS];
|
| 278 | };
|
| 279 | typedef struct wf_program wavefront_program;
|
| 280 |
|
| 281 | struct wf_sample_offset
|
| 282 | {
|
| 283 | s32 Fraction:4;
|
| 284 | s32 Integer:20;
|
| 285 | s32 Unused:8;
|
| 286 | };
|
| 287 | typedef struct wf_sample_offset wavefront_sample_offset;
|
| 288 |
|
| 289 |
|
| 290 |
|
| 291 | #define WF_ST_SAMPLE 0
|
| 292 | #define WF_ST_MULTISAMPLE 1
|
| 293 | #define WF_ST_ALIAS 2
|
| 294 | #define WF_ST_EMPTY 3
|
| 295 |
|
| 296 |
|
| 297 |
|
| 298 | #define WF_ST_DRUM 4
|
| 299 | #define WF_ST_PROGRAM 5
|
| 300 | #define WF_ST_PATCH 6
|
| 301 | #define WF_ST_SAMPLEHDR 7
|
| 302 |
|
| 303 | #define WF_ST_MASK 0xf
|
| 304 |
|
| 305 | |
| 306 | as a sample type.
|
| 307 |
|
| 308 |
|
| 309 | #define WF_SLOT_USED 0x80
|
| 310 | #define WF_SLOT_FILLED 0x40
|
| 311 | #define WF_SLOT_ROM 0x20
|
| 312 |
|
| 313 | #define WF_SLOT_MASK 0xf0
|
| 314 |
|
| 315 |
|
| 316 |
|
| 317 | #define WF_CH_MONO 0
|
| 318 | #define WF_CH_LEFT 1
|
| 319 | #define WF_CH_RIGHT 2
|
| 320 |
|
| 321 |
|
| 322 |
|
| 323 | #define LINEAR_16BIT 0
|
| 324 | #define WHITE_NOISE 1
|
| 325 | #define LINEAR_8BIT 2
|
| 326 | #define MULAW_8BIT 3
|
| 327 |
|
| 328 | #define WF_SAMPLE_IS_8BIT(smpl) ((smpl)->SampleResolution&2)
|
| 329 |
|
| 330 |
|
| 331 | |
| 332 |
|
| 333 | Because most/all of the sample data we pass in via pointers has
|
| 334 | never been copied (just mmap-ed into user space straight from the
|
| 335 | disk), it would be nice to allow handling of multi-channel sample
|
| 336 | data without forcing user-level extraction of the relevant bytes.
|
| 337 |
|
| 338 | So, we need a way of specifying which channel to use (the WaveFront
|
| 339 | only handles mono samples in a given slot), and the only way to do
|
| 340 | this without using some struct other than wavefront_sample as the
|
| 341 | interface is the awful hack of using the unused bits in a
|
| 342 | wavefront_sample:
|
| 343 |
|
| 344 | Val Meaning
|
| 345 | --- -------
|
| 346 | 0 no channel selection (use channel 1, sample is MONO)
|
| 347 | 1 use first channel, and skip one
|
| 348 | 2 use second channel, and skip one
|
| 349 | 3 use third channel, and skip two
|
| 350 | 4 use fourth channel, skip three
|
| 351 | 5 use fifth channel, skip four
|
| 352 | 6 use six channel, skip five
|
| 353 |
|
| 354 |
|
| 355 | This can handle up to 4 channels, and anyone downloading >4 channels
|
| 356 | of sample data just to select one of them needs to find some tools
|
| 357 | like sox ...
|
| 358 |
|
| 359 | NOTE: values 0, 1 and 2 correspond to WF_CH_* above. This is
|
| 360 | important.
|
| 361 |
|
| 362 |
|
| 363 |
|
| 364 | #define WF_SET_CHANNEL(samp,chn) \
|
| 365 | (samp)->Unused1 = chn & 0x1; \
|
| 366 | (samp)->Unused2 = chn & 0x2; \
|
| 367 | (samp)->Unused3 = chn & 0x4
|
| 368 |
|
| 369 | #define WF_GET_CHANNEL(samp) \
|
| 370 | (((samp)->Unused3 << 2)|((samp)->Unused2<<1)|(samp)->Unused1)
|
| 371 |
|
| 372 | typedef struct wf_sample {
|
| 373 | struct wf_sample_offset sampleStartOffset;
|
| 374 | struct wf_sample_offset loopStartOffset;
|
| 375 | struct wf_sample_offset loopEndOffset;
|
| 376 | struct wf_sample_offset sampleEndOffset;
|
| 377 | s16 FrequencyBias;
|
| 378 | u8 SampleResolution:2;
|
| 379 | u8 Unused1:1;
|
| 380 | u8 Loop:1;
|
| 381 | u8 Bidirectional:1;
|
| 382 | u8 Unused2:1;
|
| 383 | u8 Reverse:1;
|
| 384 | u8 Unused3:1;
|
| 385 | } wavefront_sample;
|
| 386 |
|
| 387 | typedef struct wf_multisample {
|
| 388 | s16 NumberOfSamples;
|
| 389 | s16 SampleNumber[NUM_MIDIKEYS];
|
| 390 | } wavefront_multisample;
|
| 391 |
|
| 392 | typedef struct wf_alias {
|
| 393 | s16 OriginalSample;
|
| 394 |
|
| 395 | struct wf_sample_offset sampleStartOffset;
|
| 396 | struct wf_sample_offset loopStartOffset;
|
| 397 | struct wf_sample_offset sampleEndOffset;
|
| 398 | struct wf_sample_offset loopEndOffset;
|
| 399 |
|
| 400 | s16 FrequencyBias;
|
| 401 |
|
| 402 | u8 SampleResolution:2;
|
| 403 | u8 Unused1:1;
|
| 404 | u8 Loop:1;
|
| 405 | u8 Bidirectional:1;
|
| 406 | u8 Unused2:1;
|
| 407 | u8 Reverse:1;
|
| 408 | u8 Unused3:1;
|
| 409 |
|
| 410 | |
| 411 | original. Of course, whoever wrote their documentation didn't
|
| 412 | realize that sizeof(struct) can be >=
|
| 413 | sum(sizeof(struct-fields)) and so thought that giving a C level
|
| 414 | description of the structs used in WavePatch files was
|
| 415 | sufficient. I suppose it was, as long as you remember the
|
| 416 | standard 16->32 bit issues.
|
| 417 |
|
| 418 |
|
| 419 | u8 sixteen_bit_padding;
|
| 420 | } __packed wavefront_alias;
|
| 421 |
|
| 422 | typedef struct wf_drum {
|
| 423 | u8 PatchNumber;
|
| 424 | u8 MixLevel:7;
|
| 425 | u8 Unmute:1;
|
| 426 | u8 Group:4;
|
| 427 | u8 Unused1:4;
|
| 428 | u8 PanModSource:2;
|
| 429 | u8 PanModulated:1;
|
| 430 | u8 PanAmount:4;
|
| 431 | u8 Unused2:1;
|
| 432 | } wavefront_drum;
|
| 433 |
|
| 434 | typedef struct wf_drumkit {
|
| 435 | struct wf_drum drum[NUM_MIDIKEYS];
|
| 436 | } wavefront_drumkit;
|
| 437 |
|
| 438 | typedef struct wf_channel_programs {
|
| 439 | u8 Program[NUM_MIDICHANNELS];
|
| 440 | } wavefront_channel_programs;
|
| 441 |
|
| 442 | |
| 443 | a WFC_GET_CHANNEL_STATUS command (a struct wf_channel_programs)
|
| 444 |
|
| 445 |
|
| 446 | #define WF_CHANNEL_STATUS(ch,wcp) (wcp)[(ch/7)] & (1<<((ch)%7))
|
| 447 |
|
| 448 | typedef union wf_any {
|
| 449 | wavefront_sample s;
|
| 450 | wavefront_multisample ms;
|
| 451 | wavefront_alias a;
|
| 452 | wavefront_program pr;
|
| 453 | wavefront_patch p;
|
| 454 | wavefront_drum d;
|
| 455 | } wavefront_any;
|
| 456 |
|
| 457 | |
| 458 | might work for other wave-table based patch loading situations.
|
| 459 | Alas, his fears were correct. The WaveFront doesn't even come with
|
| 460 | just "patches", but several different kind of structures that
|
| 461 | control the sound generation process.
|
| 462 |
|
| 463 |
|
| 464 | typedef struct wf_patch_info {
|
| 465 |
|
| 466 | |
| 467 | only, and are unused by the current user-level library.
|
| 468 |
|
| 469 |
|
| 470 | s16 key;
|
| 471 | u16 devno;
|
| 472 | u8 subkey;
|
| 473 |
|
| 474 | #define WAVEFRONT_FIND_FREE_SAMPLE_SLOT 999
|
| 475 |
|
| 476 | u16 number;
|
| 477 |
|
| 478 | u32 size; |
| 479 | one of the fields in `hdrptr', or
|
| 480 | as `dataptr'.
|
| 481 |
|
| 482 | NOTE: for actual samples, this is
|
| 483 | the size of the *SELECTED CHANNEL*
|
| 484 | even if more data is actually available.
|
| 485 |
|
| 486 | So, a stereo sample (2 channels) of
|
| 487 | 6000 bytes total has `size' = 3000.
|
| 488 |
|
| 489 | See the macros and comments for
|
| 490 | WF_{GET,SET}_CHANNEL above.
|
| 491 |
|
| 492 |
|
| 493 | wavefront_any __user *hdrptr;
|
| 494 | u16 __user *dataptr;
|
| 495 |
|
| 496 | wavefront_any hdr;
|
| 497 | } wavefront_patch_info;
|
| 498 |
|
| 499 | |
| 500 | in response to a WFC_* command. This obviously doesn't cover
|
| 501 | actual sample data.
|
| 502 |
|
| 503 |
|
| 504 | #define WF_MAX_READ sizeof(wavefront_multisample)
|
| 505 | #define WF_MAX_WRITE sizeof(wavefront_multisample)
|
| 506 |
|
| 507 | |
| 508 | This allows us to execute any WF command except the download/upload
|
| 509 | ones, which are handled differently due to copyin/copyout issues as
|
| 510 | well as data-nybbling to/from the card.
|
| 511 |
|
| 512 |
|
| 513 | typedef struct wavefront_control {
|
| 514 | int cmd;
|
| 515 | char status;
|
| 516 | unsigned char rbuf[WF_MAX_READ];
|
| 517 | unsigned char wbuf[WF_MAX_WRITE];
|
| 518 | } wavefront_control;
|
| 519 |
|
| 520 | #define WFCTL_WFCMD 0x1
|
| 521 | #define WFCTL_LOAD_SPP 0x2
|
| 522 |
|
| 523 |
|
| 524 |
|
| 525 | #define WF_MOD_LFO1 0
|
| 526 | #define WF_MOD_LFO2 1
|
| 527 | #define WF_MOD_ENV1 2
|
| 528 | #define WF_MOD_ENV2 3
|
| 529 | #define WF_MOD_KEYBOARD 4
|
| 530 | #define WF_MOD_LOGKEY 5
|
| 531 | #define WF_MOD_VELOCITY 6
|
| 532 | #define WF_MOD_LOGVEL 7
|
| 533 | #define WF_MOD_RANDOM 8
|
| 534 | #define WF_MOD_PRESSURE 9
|
| 535 | #define WF_MOD_MOD_WHEEL 10
|
| 536 | #define WF_MOD_1 WF_MOD_MOD_WHEEL
|
| 537 | #define WF_MOD_BREATH 11
|
| 538 | #define WF_MOD_2 WF_MOD_BREATH
|
| 539 | #define WF_MOD_FOOT 12
|
| 540 | #define WF_MOD_4 WF_MOD_FOOT
|
| 541 | #define WF_MOD_VOLUME 13
|
| 542 | #define WF_MOD_7 WF_MOD_VOLUME
|
| 543 | #define WF_MOD_PAN 14
|
| 544 | #define WF_MOD_10 WF_MOD_PAN
|
| 545 | #define WF_MOD_EXPR 15
|
| 546 | #define WF_MOD_11 WF_MOD_EXPR
|
| 547 |
|
| 548 |
|
| 549 |
|
| 550 | typedef struct wf_fx_info {
|
| 551 | int request;
|
| 552 | long data[4];
|
| 553 | } wavefront_fx_info;
|
| 554 |
|
| 555 | |
| 556 | else has figured out which of the addresses on page 6 and page 7 of
|
| 557 | the YSS225 control each parameter. Incidentally, these come from
|
| 558 | the Windows driver interface, but again, Turtle Beach didn't
|
| 559 | document the API to use them.
|
| 560 |
|
| 561 |
|
| 562 | #define WFFX_SETOUTGAIN 0
|
| 563 | #define WFFX_SETSTEREOOUTGAIN 1
|
| 564 | #define WFFX_SETREVERBIN1GAIN 2
|
| 565 | #define WFFX_SETREVERBIN2GAIN 3
|
| 566 | #define WFFX_SETREVERBIN3GAIN 4
|
| 567 | #define WFFX_SETCHORUSINPORT 5
|
| 568 | #define WFFX_SETREVERBIN1PORT 6
|
| 569 | #define WFFX_SETREVERBIN2PORT 7
|
| 570 | #define WFFX_SETREVERBIN3PORT 8
|
| 571 | #define WFFX_SETEFFECTPORT 9
|
| 572 | #define WFFX_SETAUXPORT 10
|
| 573 | #define WFFX_SETREVERBTYPE 11
|
| 574 | #define WFFX_SETREVERBDELAY 12
|
| 575 | #define WFFX_SETCHORUSLFO 13
|
| 576 | #define WFFX_SETCHORUSPMD 14
|
| 577 | #define WFFX_SETCHORUSAMD 15
|
| 578 | #define WFFX_SETEFFECT 16
|
| 579 | #define WFFX_SETBASEALL 17
|
| 580 | #define WFFX_SETREVERBALL 18
|
| 581 | #define WFFX_SETCHORUSALL 20
|
| 582 | #define WFFX_SETREVERBDEF 22
|
| 583 | #define WFFX_SETCHORUSDEF 23
|
| 584 | #define WFFX_DELAYSETINGAIN 24
|
| 585 | #define WFFX_DELAYSETFBGAIN 25
|
| 586 | #define WFFX_DELAYSETFBLPF 26
|
| 587 | #define WFFX_DELAYSETGAIN 27
|
| 588 | #define WFFX_DELAYSETTIME 28
|
| 589 | #define WFFX_DELAYSETFBTIME 29
|
| 590 | #define WFFX_DELAYSETALL 30
|
| 591 | #define WFFX_DELAYSETDEF 32
|
| 592 | #define WFFX_SDELAYSETINGAIN 33
|
| 593 | #define WFFX_SDELAYSETFBGAIN 34
|
| 594 | #define WFFX_SDELAYSETFBLPF 35
|
| 595 | #define WFFX_SDELAYSETGAIN 36
|
| 596 | #define WFFX_SDELAYSETTIME 37
|
| 597 | #define WFFX_SDELAYSETFBTIME 38
|
| 598 | #define WFFX_SDELAYSETALL 39
|
| 599 | #define WFFX_SDELAYSETDEF 41
|
| 600 | #define WFFX_DEQSETINGAIN 42
|
| 601 | #define WFFX_DEQSETFILTER 43
|
| 602 | #define WFFX_DEQSETALL 44
|
| 603 | #define WFFX_DEQSETDEF 46
|
| 604 | #define WFFX_MUTE 47
|
| 605 | #define WFFX_FLANGESETBALANCE 48
|
| 606 | #define WFFX_FLANGESETDELAY 49
|
| 607 | #define WFFX_FLANGESETDWFFX_TH 50
|
| 608 | #define WFFX_FLANGESETFBGAIN 51
|
| 609 | #define WFFX_FLANGESETINGAIN 52
|
| 610 | #define WFFX_FLANGESETLFO 53
|
| 611 | #define WFFX_FLANGESETALL 54
|
| 612 | #define WFFX_FLANGESETDEF 56
|
| 613 | #define WFFX_PITCHSETSHIFT 57
|
| 614 | #define WFFX_PITCHSETBALANCE 58
|
| 615 | #define WFFX_PITCHSETALL 59
|
| 616 | #define WFFX_PITCHSETDEF 61
|
| 617 | #define WFFX_SRSSETINGAIN 62
|
| 618 | #define WFFX_SRSSETSPACE 63
|
| 619 | #define WFFX_SRSSETCENTER 64
|
| 620 | #define WFFX_SRSSETGAIN 65
|
| 621 | #define WFFX_SRSSETMODE 66
|
| 622 | #define WFFX_SRSSETDEF 68
|
| 623 |
|
| 624 | |
| 625 | In theory this could be used to download the FX microprogram,
|
| 626 | but it would be a little slower, and involve some weird code.
|
| 627 |
|
| 628 |
|
| 629 | #define WFFX_MEMSET 69
|
| 630 |
|
| 631 | #endif
|