Newer
Older
/*
* BRLTTY - A background process providing access to the console screen (when in
* text mode) for a blind person using a refreshable braille display.
*
* Copyright (C) 1995-2018 by The BRLTTY Developers.
*
* BRLTTY comes with ABSOLUTELY NO WARRANTY.
*
* This is free software, placed under the terms of the
* GNU Lesser General Public License, as published by the Free Software
* Foundation; either version 2.1 of the License, or (at your option) any
* later version. Please see the file LICENSE-LGPL for details.
*
* This software is maintained by Dave Mielke <dave@mielke.cc>.
*/
#ifndef BRLTTY_INCLUDED_FM_ADLIB
#define BRLTTY_INCLUDED_FM_ADLIB
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
/*
* Miscellaneous FM chip soundcard routines for BRLTTY.
* Implemented by Dave Mielke <dave@mielke.cc>.
* Method gleaned from sccw, a morse code program written
* by Steven J. Merrifield <sjm@ee.latrobe.edu.au> (VK3ESM).
* Must compile with -O2.
* Must link with -lm.
* May compile with -DDEBUG_ADLIB.
*/
extern void AL_writeRegister (int number, unsigned char data);
extern unsigned char AL_readStatus (void);
/* I/O ports. */
#define ALP_REGISTER 0X388 /* for writing the register number */
#define ALP_DATA (ALP_REGISTER + 1) /* for writing data to the selected register */
#define ALP_STATUS ALP_REGISTER /* for reading the status of the card */
/* Status register bits. */
#define AL_STAT_EXP 0X80 /* a timer has expired */
#define AL_STAT_EXP1 0X40 /* timer 1 has expired */
#define AL_STAT_EXP2 0X20 /* timer 2 has expired */
#define ALR_FIRST 0X01
#define ALR_LAST 0XF5
#define ALR_INIT 0X01
#define ALR_T1DATA 0X02
#define ALR_T2DATA 0X03
#define ALR_TCTL 0X04
#define AL_INIT_WFSLCT 0x20 /* wave form select */
#define AL_TCTL_RESET 0X80
#define AL_TCTL_T1MASK 0X40
#define AL_TCTL_T2MASK 0X20
#define AL_TCTL_T2START 0X02
#define AL_TCTL_T1START 0X01
extern const unsigned char AL_channelOffsets[];
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
extern const unsigned char AL_channelCount;
#define ALR_MODULATOR(group,channel) ((group) + AL_channelOffsets[(channel)])
#define ALR_CARRIER(group,channel) (ALR_MODULATOR((group),(channel)) + 3)
#define ALG_EFFECT 0X20
#define AL_EFCT_AMPLMOD 0X80 /* apply amplitude modulation */
#define AL_EFCT_VIBRATO 0X40 /* apply vibrato */
#define AL_EFCT_SUSTAIN 0X20 /* do not release */
#define AL_EFCT_KSR 0X10 /* keyboard scaling rate (faster decay at higher freq) */
#define AL_HARMONIC_SHIFT 0
#define AL_SUBHARMONIC_1 0X00 /* 1 octave lower */
#define AL_HARMONIC_1 0X01 /* the specified frequency */
#define AL_HARMONIC_2 0X02 /* 1 octave higher */
#define AL_HARMONIC_3 0X03 /* 1 octave and a 5th higher */
#define AL_HARMONIC_4 0X04 /* 2 octaves higher */
#define AL_HARMONIC_5 0X05 /* 2 octaves and a 3rd higher */
#define AL_HARMONIC_6 0X06 /* 2 octaves and a 5th higher */
#define AL_HARMONIC_7 0X07 /* 2 octaves and a diminished 7th higher */
#define AL_HARMONIC_8 0X08 /* 3 octaves higher */
#define AL_HARMONIC_9 0X09 /* 3 octaves and a 2nd higher */
#define AL_HARMONIC_10 0X0A /* 3 octaves and a 3rd higher */
#define AL_HARMONIC_11 0X0B /* 3 octaves and ? higher */
#define AL_HARMONIC_12 0X0C /* 3 octaves and a 5th higher */
#define AL_HARMONIC_13 0X0D /* 3 octaves and ? higher */
#define AL_HARMONIC_14 0X0E /* 3 octaves and a diminished 7th higher */
#define AL_HARMONIC_15 0X0F /* 3 octaves and ? higher */
#define ALG_LEVEL 0X40
#define AL_LKS_SHIFT 6 /* level key scaling (softer at higher freq) */
#define AL_LKS_0 0X00 /* 0 dB per octave */
#define AL_LKS_1p5 0X02 /* 1.5 dB per octave */
#define AL_LKS_3 0X01 /* 3 dB per octave */
#define AL_LKS_6 0X03 /* 6 dB per octave */
#define AL_VOLUME_SHIFT 0 /* each bit attenuates by specific amount */
#define AL_VOLUME_24 0X20 /* 24 dB */
#define AL_VOLUME_12 0X10 /* 12 dB */
#define AL_VOLUME_6 0X08 /* 6 dB */
#define AL_VOLUME_3 0X04 /* 3 dB */
#define AL_VOLUME_1p5 0X02 /* 1.5 dB */
#define AL_VOLUME_0p75 0X01 /* 0.75 dB */
#define AL_VOLUME_LOUD 0X00 /* loudest (no attenuation) */
#define AL_VOLUME_SOFT 0X3F /* softest (47.25 dB attenuation) */
#define ALG_ATTDEC 0X60
#define AL_ATTACK_SHIFT 4
#define AL_ATTACK_SLOW 0X0
#define AL_ATTACK_FAST 0XF
#define AL_DECAY_SHIFT 0
#define AL_DECAY_SLOW 0X0
#define AL_DECAY_FAST 0XF
#define ALG_SUSREL 0X80
#define AL_SUSTAIN_SHIFT 4
#define AL_SUSTAIN_24 0X8 /* after 24 dB decay */
#define AL_SUSTAIN_12 0X4 /* after 12 dB decay */
#define AL_SUSTAIN_6 0X2 /* after 6 dB decay */
#define AL_SUSTAIN_3 0X1 /* after 3 dB decay */
#define AL_SUSTAIN_LOUD 0X0 /* the loudest (right after attack) */
#define AL_SUSTAIN_SOFT 0XF /* the softest (after 45 dB decay) */
#define AL_RELEASE_SHIFT 0
#define AL_RELEASE_SLOW 0X0
#define AL_RELEASE_FAST 0XF
#define ALR_FREQUENCY_LSB(channel) (0XA0 + (channel))
#define ALR_FREQUENCY_MSB(channel) (0XB0 + (channel))
#define AL_OCTAVE_SHIFT 2
#define AL_FREQ_ON 0X20
#ifdef __cplusplus
}
#endif /* __cplusplus */