@atmosx/event-product-parser 3.0.48 → 3.0.52

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (141) hide show
  1. package/.vscode/settings.json +3 -3
  2. package/CODE_OF_CONDUCT.md +9 -9
  3. package/CONTRIBUTING.md +29 -29
  4. package/LICENSE +17 -17
  5. package/README.md +443 -417
  6. package/SECURITY.md +20 -20
  7. package/SUPPORTED_EVENTS.md +369 -368
  8. package/dist/cjs/index.cjs +1925 -1885
  9. package/dist/esm/index.mjs +1927 -1887
  10. package/package.json +52 -52
  11. package/src/@building/building.attachments.ts +82 -82
  12. package/src/@building/building.clean.ts +29 -29
  13. package/src/@building/building.create.ts +55 -41
  14. package/src/@building/building.enhance.ts +59 -59
  15. package/src/@building/building.geometry.ts +47 -47
  16. package/src/@building/building.headers.ts +36 -36
  17. package/src/@building/building.office.ts +42 -42
  18. package/src/@building/building.polygon.ts +69 -70
  19. package/src/@building/building.properties.ts +95 -95
  20. package/src/@building/building.signature.ts +60 -61
  21. package/src/@building/building.tags.ts +23 -23
  22. package/src/@building/building.tracking.ts +67 -67
  23. package/src/@building/building.validate.ts +152 -146
  24. package/src/@core/core.clearEvents.ts +30 -31
  25. package/src/@core/core.createListener.ts +23 -23
  26. package/src/@core/core.getEvents.ts +23 -24
  27. package/src/@core/core.getNodes.ts +23 -24
  28. package/src/@core/core.getRandomEvent.ts +23 -24
  29. package/src/@core/core.getVersion.ts +23 -24
  30. package/src/@core/core.manualEvent.ts +38 -0
  31. package/src/@core/core.query.ts +38 -38
  32. package/src/@core/core.setNode.ts +80 -80
  33. package/src/@core/core.start.ts +60 -60
  34. package/src/@core/core.stop.ts +31 -31
  35. package/src/@dictionaries/dictionaries.actions.ts +27 -27
  36. package/src/@dictionaries/dictionaries.awips.ts +363 -363
  37. package/src/@dictionaries/dictionaries.cancellation.ts +30 -30
  38. package/src/@dictionaries/dictionaries.causes.ts +35 -35
  39. package/src/@dictionaries/dictionaries.correlations.ts +42 -42
  40. package/src/@dictionaries/dictionaries.enhanced.ts +66 -109
  41. package/src/@dictionaries/dictionaries.events.ts +82 -82
  42. package/src/@dictionaries/dictionaries.expressions.ts +28 -28
  43. package/src/@dictionaries/dictionaries.global.ts +24 -0
  44. package/src/@dictionaries/dictionaries.hail.ts +35 -35
  45. package/src/@dictionaries/dictionaries.icao.ts +258 -258
  46. package/src/@dictionaries/dictionaries.matches.ts +54 -35
  47. package/src/@dictionaries/dictionaries.products.ts +24 -24
  48. package/src/@dictionaries/dictionaries.records.ts +25 -25
  49. package/src/@dictionaries/dictionaries.severity.ts +27 -27
  50. package/src/@dictionaries/dictionaries.shapefiles.ts +35 -35
  51. package/src/@dictionaries/dictionaries.states.ts +71 -71
  52. package/src/@dictionaries/dictionaries.status.ts +30 -30
  53. package/src/@dictionaries/dictionaries.tags.ts +92 -92
  54. package/src/@dictionaries/dictionaries.testing.ts +24 -24
  55. package/src/@events/events.api.ts +116 -118
  56. package/src/@events/events.text.ts +84 -81
  57. package/src/@events/events.ugc.ts +89 -85
  58. package/src/@events/events.vtec.ts +86 -87
  59. package/src/@manager/manager.mkEvent.ts +97 -88
  60. package/src/@manager/manager.rmEvent.ts +56 -49
  61. package/src/@manager/manager.setHash.ts +35 -36
  62. package/src/@manager/manager.updateEvents.ts +32 -34
  63. package/src/@manager/manager.updateListener.ts +154 -159
  64. package/src/@manager/manager.updateNodes.ts +53 -54
  65. package/src/@modules/@database/database.broadcastify.ts +66 -66
  66. package/src/@modules/@database/database.cache.ts +49 -47
  67. package/src/@modules/@database/database.init.ts +58 -57
  68. package/src/@modules/@database/database.shapefiles.ts +92 -92
  69. package/src/@modules/@database/database.stanza.ts +46 -47
  70. package/src/@modules/@eas/eas.getCleanDescription.ts +91 -91
  71. package/src/@modules/@eas/eas.getFloatPCM16.ts +29 -29
  72. package/src/@modules/@eas/eas.getMergedPCM16.ts +32 -32
  73. package/src/@modules/@eas/eas.getPCM16.ts +52 -52
  74. package/src/@modules/@eas/eas.getPCMToFloat.ts +26 -26
  75. package/src/@modules/@eas/eas.getSampledPCM16.ts +36 -36
  76. package/src/@modules/@eas/eas.getTTS.ts +54 -54
  77. package/src/@modules/@eas/eas.getWavPCM16.ts +52 -52
  78. package/src/@modules/@eas/eas.setAFSK.ts +51 -52
  79. package/src/@modules/@eas/eas.setAsciiToBits.ts +31 -32
  80. package/src/@modules/@eas/eas.setAttentionTone.ts +40 -40
  81. package/src/@modules/@eas/eas.setEasTone.ts +151 -147
  82. package/src/@modules/@eas/eas.setNoise.ts +32 -31
  83. package/src/@modules/@eas/eas.setRadioEffect.ts +50 -49
  84. package/src/@modules/@eas/eas.setSameHeader.ts +44 -45
  85. package/src/@modules/@stanza/stanza.getAwipsType.ts +45 -45
  86. package/src/@modules/@stanza/stanza.validate.ts +49 -49
  87. package/src/@modules/@utilities/utilities.createHttp.ts +70 -70
  88. package/src/@modules/@utilities/utilities.getFormattedTime.ts +43 -43
  89. package/src/@modules/@utilities/utilities.getLatestIssuance.ts +32 -32
  90. package/src/@modules/@utilities/utilities.getMatched.ts +33 -0
  91. package/src/@modules/@utilities/utilities.getSettings.ts +25 -25
  92. package/src/@modules/@utilities/utilities.getShapeNearestPoint.ts +114 -114
  93. package/src/@modules/@utilities/utilities.setCronSchedule.ts +94 -94
  94. package/src/@modules/@utilities/utilities.setDebug.ts +38 -0
  95. package/src/@modules/@utilities/utilities.setEventEmit.ts +41 -41
  96. package/src/@modules/@utilities/utilities.setListener.ts +30 -30
  97. package/src/@modules/@utilities/utilities.setSettings.ts +42 -42
  98. package/src/@modules/@utilities/utilities.setSleep.ts +33 -33
  99. package/src/@modules/@utilities/utilities.setTimeoutAction.ts +62 -58
  100. package/src/@modules/@utilities/utilities.setWarning.ts +34 -34
  101. package/src/@modules/@xmpp/xmpp.xDeploy.ts +57 -58
  102. package/src/@modules/@xmpp/xmpp.xError.ts +26 -28
  103. package/src/@modules/@xmpp/xmpp.xOffline.ts +36 -37
  104. package/src/@modules/@xmpp/xmpp.xOnline.ts +45 -44
  105. package/src/@modules/@xmpp/xmpp.xReconnect.ts +64 -64
  106. package/src/@modules/@xmpp/xmpp.xStanza.ts +62 -62
  107. package/src/@parsers/@hvtec/hvtec.extract.ts +39 -39
  108. package/src/@parsers/@pvtec/pvtec.expires.ts +25 -25
  109. package/src/@parsers/@pvtec/pvtec.extract.ts +48 -48
  110. package/src/@parsers/@text/text.getDescriptionFromProduct.ts +52 -52
  111. package/src/@parsers/@text/text.getEmbed.ts +55 -57
  112. package/src/@parsers/@text/text.getPolygonFromProduct.ts +53 -32
  113. package/src/@parsers/@text/text.getTextFromProduct.ts +42 -42
  114. package/src/@parsers/@text/text.getXML.ts +60 -60
  115. package/src/@parsers/@ugc/ugc.coordinates.ts +110 -109
  116. package/src/@parsers/@ugc/ugc.expiry.ts +31 -31
  117. package/src/@parsers/@ugc/ugc.extract.ts +36 -36
  118. package/src/@parsers/@ugc/ugc.getCache.ts +24 -0
  119. package/src/@parsers/@ugc/ugc.header.ts +29 -29
  120. package/src/@parsers/@ugc/ugc.locations.ts +57 -29
  121. package/src/@parsers/@ugc/ugc.setCache.ts +28 -0
  122. package/src/@parsers/@ugc/ugc.zones.ts +51 -51
  123. package/src/@types/type.attributes.ts +28 -28
  124. package/src/@types/type.compiled.ts +34 -34
  125. package/src/@types/type.event.ts +69 -69
  126. package/src/@types/type.hash.ts +24 -24
  127. package/src/@types/type.hvtec.ts +25 -25
  128. package/src/@types/type.listener.ts +32 -32
  129. package/src/@types/type.properties.ts +77 -77
  130. package/src/@types/type.pvtec.ts +30 -30
  131. package/src/@types/type.settings.ts +84 -83
  132. package/src/@types/type.stanza.ts +37 -37
  133. package/src/@types/type.ugc.ts +24 -24
  134. package/src/bootstrap.ts +115 -112
  135. package/src/index.ts +74 -74
  136. package/test.js +92 -98
  137. package/tsconfig.json +13 -13
  138. package/tsup.config.ts +15 -15
  139. package/dist/index.d.mts +0 -299
  140. package/dist/index.d.ts +0 -299
  141. package/src/@core/core.createEvent.ts +0 -83
@@ -1,147 +1,151 @@
1
- /*
2
- _ _ _ __ __
3
- /\ | | | | (_) \ \ / /
4
- / \ | |_ _ __ ___ ___ ___ _ __ | |__ ___ _ __ _ ___ \ V /
5
- / /\ \| __| '_ ` _ \ / _ \/ __| '_ \| '_ \ / _ \ '__| |/ __| > <
6
- / ____ \ |_| | | | | | (_) \__ \ |_) | | | | __/ | | | (__ / . \
7
- /_/ \_\__|_| |_| |_|\___/|___/ .__/|_| |_|\___|_| |_|\___/_/ \_\
8
- | |
9
- |_|
10
-
11
- Created with ♥ by the AtmosphericX Team (KiyoWx, StarflightWx, & CJ Ziegler)
12
- Discord: https://atmosphericx-discord.scriptkitty.cafe
13
- Ko-Fi: https://ko-fi.com/k3yomi
14
- Documentation: http://localhost/documentation | https://atmosphericx.scriptkitty.cafe/documentation
15
-
16
- Internal Package: @atmosx/event-product-parser
17
-
18
- */
19
-
20
- import { TypeSettings } from "../../@types/type.settings";
21
- import { bootstrap } from "../../bootstrap";
22
- import { setWarning } from "../@utilities/utilities.setWarning";
23
- import { getWavPCM16 } from "./eas.getWavPCM16";
24
- import { getSampledPCM16 } from "./eas.getSampledPCM16";
25
- import { setRadioEffect } from "./eas.setRadioEffect";
26
- import { setSameHeader } from "./eas.setSameHeader";
27
- import { setAttentionTone } from "./eas.setAttentionTone";
28
- import { getMergedPCM16 } from "./eas.getMergedPCM16";
29
- import { setNoise } from "./eas.setNoise";
30
- import { getPCM16 } from "./eas.getPCM16";
31
- import { getTTS } from "./eas.getTTS";
32
- import { getCleanDescription } from "./eas.getCleanDescription";
33
- import { join } from 'path'
34
- import { existsSync, mkdirSync, readFileSync, writeFileSync, unlinkSync } from 'fs'
35
- import { execSync } from 'child_process'
36
- import { platform } from 'os'
37
-
38
- interface GenerateEASOptions {
39
- message: string
40
- header: string
41
- title: string
42
- }
43
-
44
- export const setEasTone = async (options: GenerateEASOptions): Promise<string> => {
45
- const settings = bootstrap.settings as TypeSettings;
46
- const directory = settings.GlobalSettings.ArchiveSettings.EasDirectory;
47
- const prefix = settings.GlobalSettings.ArchiveSettings.EasToneout;
48
- let message = options.message;
49
- let header = options.header;
50
- let title = options.title ?? `${Math.random().toString(36).substring(2, 15)}-${header.replace(/[^a-zA-Z0-9]/g, '')}`;
51
- if (!message || !header) {
52
- setWarning({
53
- title: `EAS`,
54
- message: `Message and header are required to generate an EAS tone.`
55
- })
56
- return null;
57
- }
58
- let buffTTS: Buffer;
59
- let buffRadio: any;
60
- let buffFull: any[] = [];
61
-
62
- if (!existsSync(directory)) {
63
- mkdirSync(directory, { recursive: true });
64
- }
65
- if (!existsSync(join(directory, `/tts`))) {
66
- mkdirSync(join(directory, `/tts`), { recursive: true });
67
- }
68
- if (!existsSync(join(directory, `/encoded`))) {
69
- mkdirSync(join(directory, `/encoded`), { recursive: true });
70
- }
71
-
72
- const tmpTTS = join(directory, `/tts/${title}.wav`)
73
- const outTTS = join(directory, `/encoded/${title}.wav`)
74
- const vPlatform = platform();
75
-
76
- if (vPlatform === 'darwin') {
77
- setWarning({
78
- title: `EAS`,
79
- message: `EAS tone generation is not supported on macOS.`
80
- });
81
- return null
82
- }
83
-
84
-
85
- await new Promise<void>((resolve, reject) => {
86
- const tMsg = getCleanDescription(message)
87
- getTTS(tMsg, tmpTTS).then(() => {
88
- resolve();
89
- });
90
- });
91
- if (!existsSync(tmpTTS)) {
92
- return null;
93
- }
94
- buffTTS = readFileSync(tmpTTS);
95
- const vWav = getWavPCM16(buffTTS);
96
- const vSamples = getSampledPCM16(vWav.samples, vWav.sampleRate, 8000)
97
- const vRadio = setRadioEffect(vSamples, 8000)
98
-
99
- if (existsSync(prefix)) {
100
- let tBuffer = readFileSync(prefix);
101
- let tWav = getWavPCM16(tBuffer);
102
-
103
- if (tWav == null) {
104
- try {
105
- const converted = join(directory, `/tts/${title}.converted.wav`)
106
- execSync(`ffmpeg -y -i "${prefix}" -ar 8000 -ac 1 -sample_fmt s16 "${converted}"`, { stdio: 'ignore' })
107
- if (existsSync(converted)) {
108
- tBuffer = readFileSync(converted)
109
- tWav = getWavPCM16(tBuffer)
110
- try { unlinkSync(converted) } catch {}
111
- }
112
- } catch (e) {}
113
- }
114
-
115
- if (tWav == null) {
116
- setWarning({ title: `EAS`, message: `Intro tone isn't a valid .WAV file or isn't in PCM 16-bit format. Converted attempt failed; please convert it then try again.` })
117
- return null;
118
- }
119
-
120
- const tSamples = (tWav.sampleRate != 8000 ? getSampledPCM16(tWav.samples, tWav.sampleRate, 8000) : tWav.samples)
121
- buffRadio = setRadioEffect(tSamples, 8000)
122
- }
123
-
124
- buffFull = buffRadio != null ? [buffRadio, new Int16Array(Math.floor(0.5 * 8000))] : [];
125
- buffFull.push(
126
- setSameHeader(header, 3, 8000, {
127
- preMarkSec: 1.1,
128
- gapSec: 0.5,
129
- }),
130
- new Int16Array(Math.floor(0.5 * 8000)),
131
- setAttentionTone(8, 8000),
132
- new Int16Array(Math.floor(0.5 * 8000)),
133
- vRadio
134
- )
135
- for (let i = 0; i < 3; i++) {
136
- buffFull.push(setSameHeader(header, 1, 8000, { preMarkSec: 0.5, gapSec: 0.1 }))
137
- buffFull.push(new Int16Array(Math.floor(0.5 * 8000)));
138
- }
139
- const aSamples = getMergedPCM16(buffFull);
140
- const aFinal = setNoise(aSamples, 0.002);
141
- const aBuffer = getPCM16(Array.from(aFinal).map(v => ({ value: v })), 8000);
142
- writeFileSync(outTTS, aBuffer)
143
- try{ unlinkSync(tmpTTS) } catch {}
144
- return outTTS;
145
- }
146
-
147
-
1
+ /*
2
+ _ _ _ __ __
3
+ /\ | | | | (_) \ \ / /
4
+ / \ | |_ _ __ ___ ___ ___ _ __ | |__ ___ _ __ _ ___ \ V /
5
+ / /\ \| __| '_ ` _ \ / _ \/ __| '_ \| '_ \ / _ \ '__| |/ __| > <
6
+ / ____ \ |_| | | | | | (_) \__ \ |_) | | | | __/ | | | (__ / . \
7
+ /_/ \_\__|_| |_| |_|\___/|___/ .__/|_| |_|\___|_| |_|\___/_/ \_\
8
+ | |
9
+ |_|
10
+
11
+ Created with ♥ by the AtmosphericX Team (KiyoWx, StarflightWx, & CJ Ziegler)
12
+ Discord: https://atmosphericx-discord.scriptkitty.cafe
13
+ Ko-Fi: https://ko-fi.com/k3yomi
14
+ Documentation: http://localhost/documentation | https://atmosphericx.scriptkitty.cafe/documentation
15
+
16
+ Internal Package: @atmosx/event-product-parser
17
+
18
+ */
19
+
20
+ import { TypeSettings } from "../../@types/type.settings";
21
+ import { bootstrap } from "../../bootstrap";
22
+ import { setWarning } from "../@utilities/utilities.setWarning";
23
+ import { getWavPCM16 } from "./eas.getWavPCM16";
24
+ import { getSampledPCM16 } from "./eas.getSampledPCM16";
25
+ import { setRadioEffect } from "./eas.setRadioEffect";
26
+ import { setSameHeader } from "./eas.setSameHeader";
27
+ import { setAttentionTone } from "./eas.setAttentionTone";
28
+ import { getMergedPCM16 } from "./eas.getMergedPCM16";
29
+ import { setNoise } from "./eas.setNoise";
30
+ import { getPCM16 } from "./eas.getPCM16";
31
+ import { getTTS } from "./eas.getTTS";
32
+ import { getCleanDescription } from "./eas.getCleanDescription";
33
+ import { setDebug } from "../@utilities/utilities.setDebug";
34
+ import { join } from 'path'
35
+ import { existsSync, mkdirSync, readFileSync, writeFileSync, unlinkSync } from 'fs'
36
+ import { execSync } from 'child_process'
37
+ import { platform } from 'os'
38
+
39
+
40
+ interface GenerateEASOptions {
41
+ message: string
42
+ header: string
43
+ title: string
44
+ }
45
+
46
+ export const setEasTone = async (options: GenerateEASOptions): Promise<string> => {
47
+ const tick = performance.now()
48
+ const settings = bootstrap.settings as TypeSettings;
49
+ const directory = settings.GlobalSettings.ArchiveSettings.EasDirectory;
50
+ const prefix = settings.GlobalSettings.ArchiveSettings.EasToneout;
51
+ let message = options.message;
52
+ let header = options.header;
53
+ let title = (options.title ?? `${Math.random().toString(36).substring(2, 15)}-${header.replace(/[^a-zA-Z0-9]/g, '')}`).replace(/[\\:*?"<>|]/g, "_").replace(/\s+/g, " ").trim();
54
+ if (!message || !header) {
55
+ setWarning({
56
+ title: `EAS`,
57
+ message: `Message and header are required to generate an EAS tone.`
58
+ })
59
+ return null;
60
+ }
61
+ let buffTTS: Buffer;
62
+ let buffRadio: any;
63
+ let buffFull: any[] = [];
64
+
65
+ if (!existsSync(directory)) {
66
+ mkdirSync(directory, { recursive: true });
67
+ }
68
+ if (!existsSync(join(directory, `/tts`))) {
69
+ mkdirSync(join(directory, `/tts`), { recursive: true });
70
+ }
71
+ if (!existsSync(join(directory, `/encoded`))) {
72
+ mkdirSync(join(directory, `/encoded`), { recursive: true });
73
+ }
74
+
75
+ const tmpTTS = join(directory, `/tts/${title}.wav`)
76
+ const outTTS = join(directory, `/encoded/${title}.wav`)
77
+ const vPlatform = platform();
78
+
79
+ if (vPlatform === 'darwin') {
80
+ setWarning({
81
+ title: `EAS`,
82
+ message: `EAS tone generation is not supported on macOS.`
83
+ });
84
+ return null
85
+ }
86
+
87
+
88
+ await new Promise<void>((resolve, reject) => {
89
+ const tMsg = getCleanDescription(message)
90
+ getTTS(tMsg, tmpTTS).then(() => {
91
+ resolve();
92
+ });
93
+ });
94
+ if (!existsSync(tmpTTS)) {
95
+ return null;
96
+ }
97
+ buffTTS = readFileSync(tmpTTS);
98
+ const vWav = getWavPCM16(buffTTS);
99
+ const vSamples = getSampledPCM16(vWav.samples, vWav.sampleRate, 8000)
100
+ const vRadio = setRadioEffect(vSamples, 8000)
101
+
102
+ if (existsSync(prefix)) {
103
+ let tBuffer = readFileSync(prefix);
104
+ let tWav = getWavPCM16(tBuffer);
105
+
106
+ if (tWav == null) {
107
+ try {
108
+ const converted = join(directory, `/tts/${title}.converted.wav`)
109
+ execSync(`ffmpeg -y -i "${prefix}" -ar 8000 -ac 1 -sample_fmt s16 "${converted}"`, { stdio: 'ignore' })
110
+ if (existsSync(converted)) {
111
+ tBuffer = readFileSync(converted)
112
+ tWav = getWavPCM16(tBuffer)
113
+ try { unlinkSync(converted) } catch {}
114
+ }
115
+ } catch (e) {}
116
+ }
117
+
118
+ if (tWav == null) {
119
+ setWarning({ title: `EAS`, message: `Intro tone isn't a valid .WAV file or isn't in PCM 16-bit format. Converted attempt failed; please convert it then try again.` })
120
+ return null;
121
+ }
122
+
123
+ const tSamples = (tWav.sampleRate != 8000 ? getSampledPCM16(tWav.samples, tWav.sampleRate, 8000) : tWav.samples)
124
+ buffRadio = setRadioEffect(tSamples, 8000)
125
+ }
126
+
127
+ buffFull = buffRadio != null ? [buffRadio, new Int16Array(Math.floor(0.5 * 8000))] : [];
128
+ buffFull.push(
129
+ setSameHeader(header, 3, 8000, {
130
+ preMarkSec: 1.1,
131
+ gapSec: 0.5,
132
+ }),
133
+ new Int16Array(Math.floor(0.5 * 8000)),
134
+ setAttentionTone(8, 8000),
135
+ new Int16Array(Math.floor(0.5 * 8000)),
136
+ vRadio
137
+ )
138
+ for (let i = 0; i < 3; i++) {
139
+ buffFull.push(setSameHeader(header, 1, 8000, { preMarkSec: 0.5, gapSec: 0.1 }))
140
+ buffFull.push(new Int16Array(Math.floor(0.5 * 8000)));
141
+ }
142
+ const aSamples = getMergedPCM16(buffFull);
143
+ const aFinal = setNoise(aSamples, 0.002);
144
+ const aBuffer = getPCM16(Array.from(aFinal).map(v => ({ value: v })), 8000);
145
+ writeFileSync(outTTS, aBuffer)
146
+ try{ unlinkSync(tmpTTS) } catch {}
147
+ setDebug({ title: `@eas.setEasTone`, message: `EAS tone generation took ${performance.now() - tick} ms` })
148
+ return outTTS;
149
+ }
150
+
151
+
@@ -1,31 +1,32 @@
1
- /*
2
- _ _ _ __ __
3
- /\ | | | | (_) \ \ / /
4
- / \ | |_ _ __ ___ ___ ___ _ __ | |__ ___ _ __ _ ___ \ V /
5
- / /\ \| __| '_ ` _ \ / _ \/ __| '_ \| '_ \ / _ \ '__| |/ __| > <
6
- / ____ \ |_| | | | | | (_) \__ \ |_) | | | | __/ | | | (__ / . \
7
- /_/ \_\__|_| |_| |_|\___/|___/ .__/|_| |_|\___|_| |_|\___/_/ \_\
8
- | |
9
- |_|
10
-
11
- Created with ♥ by the AtmosphericX Team (KiyoWx, StarflightWx, & CJ Ziegler)
12
- Discord: https://atmosphericx-discord.scriptkitty.cafe
13
- Ko-Fi: https://ko-fi.com/k3yomi
14
- Documentation: http://localhost/documentation | https://atmosphericx.scriptkitty.cafe/documentation
15
-
16
- Internal Package: @atmosx/event-product-parser
17
-
18
-
19
- */
20
- import { getPCMToFloat } from "./eas.getPCMToFloat";
21
- import { getFloatPCM16 } from "./eas.getFloatPCM16";
22
-
23
- export const setNoise = (int16: Int16Array, noiseLevel: number = 0.02): Int16Array => {
24
- const x = getPCMToFloat(int16);
25
- for (let i = 0; i < x.length; i++) x[i] += (Math.random() * 2 - 1) * noiseLevel;
26
- let peak = 0;
27
- for (let i = 0; i < x.length; i++) peak = Math.max(peak, Math.abs(x[i]));
28
- if (peak > 1) for (let i = 0; i < x.length; i++) x[i] *= 0.98 / peak;
29
- return getFloatPCM16(x);
30
- }
31
-
1
+ /*
2
+ _ _ _ __ __
3
+ /\ | | | | (_) \ \ / /
4
+ / \ | |_ _ __ ___ ___ ___ _ __ | |__ ___ _ __ _ ___ \ V /
5
+ / /\ \| __| '_ ` _ \ / _ \/ __| '_ \| '_ \ / _ \ '__| |/ __| > <
6
+ / ____ \ |_| | | | | | (_) \__ \ |_) | | | | __/ | | | (__ / . \
7
+ /_/ \_\__|_| |_| |_|\___/|___/ .__/|_| |_|\___|_| |_|\___/_/ \_\
8
+ | |
9
+ |_|
10
+
11
+ Created with ♥ by the AtmosphericX Team (KiyoWx, StarflightWx, & CJ Ziegler)
12
+ Discord: https://atmosphericx-discord.scriptkitty.cafe
13
+ Ko-Fi: https://ko-fi.com/k3yomi
14
+ Documentation: http://localhost/documentation | https://atmosphericx.scriptkitty.cafe/documentation
15
+
16
+ Internal Package: @atmosx/event-product-parser
17
+
18
+
19
+ */
20
+
21
+ import { getPCMToFloat } from "./eas.getPCMToFloat";
22
+ import { getFloatPCM16 } from "./eas.getFloatPCM16";
23
+
24
+ export const setNoise = (int16: Int16Array, noiseLevel: number = 0.02): Int16Array => {
25
+ const x = getPCMToFloat(int16);
26
+ for (let i = 0; i < x.length; i++) x[i] += (Math.random() * 2 - 1) * noiseLevel;
27
+ let peak = 0;
28
+ for (let i = 0; i < x.length; i++) peak = Math.max(peak, Math.abs(x[i]));
29
+ if (peak > 1) for (let i = 0; i < x.length; i++) x[i] *= 0.98 / peak;
30
+ return getFloatPCM16(x);
31
+ }
32
+
@@ -1,49 +1,50 @@
1
- /*
2
- _ _ _ __ __
3
- /\ | | | | (_) \ \ / /
4
- / \ | |_ _ __ ___ ___ ___ _ __ | |__ ___ _ __ _ ___ \ V /
5
- / /\ \| __| '_ ` _ \ / _ \/ __| '_ \| '_ \ / _ \ '__| |/ __| > <
6
- / ____ \ |_| | | | | | (_) \__ \ |_) | | | | __/ | | | (__ / . \
7
- /_/ \_\__|_| |_| |_|\___/|___/ .__/|_| |_|\___|_| |_|\___/_/ \_\
8
- | |
9
- |_|
10
-
11
- Created with ♥ by the AtmosphericX Team (KiyoWx, StarflightWx, & CJ Ziegler)
12
- Discord: https://atmosphericx-discord.scriptkitty.cafe
13
- Ko-Fi: https://ko-fi.com/k3yomi
14
- Documentation: http://localhost/documentation | https://atmosphericx.scriptkitty.cafe/documentation
15
-
16
- Internal Package: @atmosx/event-product-parser
17
-
18
-
19
- */
20
- import { getPCMToFloat } from "./eas.getPCMToFloat";
21
- import { getFloatPCM16 } from "./eas.getFloatPCM16";
22
-
23
- export const setRadioEffect = (int16: Int16Array, sampleRate: number): Int16Array => {
24
- const hpCut = 3555;
25
- const lpCut = 1600;
26
- const x = getPCMToFloat(int16);
27
- const dt = 1 / sampleRate;
28
- const rcHP = 1 / (2 * Math.PI * hpCut);
29
- const aHP = rcHP / (rcHP + dt);
30
- let yHP = 0, xPrev = 0;
31
- for (let i = 0; i < x.length; i++) {
32
- const xi = x[i];
33
- yHP = aHP * (yHP + xi - xPrev);
34
- xPrev = xi;
35
- x[i] = yHP;
36
- }
37
- const rcLP = 1 / (2 * Math.PI * lpCut);
38
- const aLP = dt / (rcLP + dt);
39
- let yLP = 0;
40
- for (let i = 0; i < x.length; i++) {
41
- yLP = yLP + aLP * (x[i] - yLP);
42
- x[i] = yLP;
43
- }
44
- const compGain = 2.0;
45
- const norm = Math.tanh(compGain);
46
- for (let i = 0; i < x.length; i++) x[i] = Math.tanh(x[i] * compGain) / norm;
47
- return getFloatPCM16(x);
48
- }
49
-
1
+ /*
2
+ _ _ _ __ __
3
+ /\ | | | | (_) \ \ / /
4
+ / \ | |_ _ __ ___ ___ ___ _ __ | |__ ___ _ __ _ ___ \ V /
5
+ / /\ \| __| '_ ` _ \ / _ \/ __| '_ \| '_ \ / _ \ '__| |/ __| > <
6
+ / ____ \ |_| | | | | | (_) \__ \ |_) | | | | __/ | | | (__ / . \
7
+ /_/ \_\__|_| |_| |_|\___/|___/ .__/|_| |_|\___|_| |_|\___/_/ \_\
8
+ | |
9
+ |_|
10
+
11
+ Created with ♥ by the AtmosphericX Team (KiyoWx, StarflightWx, & CJ Ziegler)
12
+ Discord: https://atmosphericx-discord.scriptkitty.cafe
13
+ Ko-Fi: https://ko-fi.com/k3yomi
14
+ Documentation: http://localhost/documentation | https://atmosphericx.scriptkitty.cafe/documentation
15
+
16
+ Internal Package: @atmosx/event-product-parser
17
+
18
+
19
+ */
20
+
21
+ import { getPCMToFloat } from "./eas.getPCMToFloat";
22
+ import { getFloatPCM16 } from "./eas.getFloatPCM16";
23
+
24
+ export const setRadioEffect = (int16: Int16Array, sampleRate: number): Int16Array => {
25
+ const hpCut = 3555;
26
+ const lpCut = 1600;
27
+ const x = getPCMToFloat(int16);
28
+ const dt = 1 / sampleRate;
29
+ const rcHP = 1 / (2 * Math.PI * hpCut);
30
+ const aHP = rcHP / (rcHP + dt);
31
+ let yHP = 0, xPrev = 0;
32
+ for (let i = 0; i < x.length; i++) {
33
+ const xi = x[i];
34
+ yHP = aHP * (yHP + xi - xPrev);
35
+ xPrev = xi;
36
+ x[i] = yHP;
37
+ }
38
+ const rcLP = 1 / (2 * Math.PI * lpCut);
39
+ const aLP = dt / (rcLP + dt);
40
+ let yLP = 0;
41
+ for (let i = 0; i < x.length; i++) {
42
+ yLP = yLP + aLP * (x[i] - yLP);
43
+ x[i] = yLP;
44
+ }
45
+ const compGain = 2.0;
46
+ const norm = Math.tanh(compGain);
47
+ for (let i = 0; i < x.length; i++) x[i] = Math.tanh(x[i] * compGain) / norm;
48
+ return getFloatPCM16(x);
49
+ }
50
+
@@ -1,45 +1,44 @@
1
- /*
2
- _ _ _ __ __
3
- /\ | | | | (_) \ \ / /
4
- / \ | |_ _ __ ___ ___ ___ _ __ | |__ ___ _ __ _ ___ \ V /
5
- / /\ \| __| '_ ` _ \ / _ \/ __| '_ \| '_ \ / _ \ '__| |/ __| > <
6
- / ____ \ |_| | | | | | (_) \__ \ |_) | | | | __/ | | | (__ / . \
7
- /_/ \_\__|_| |_| |_|\___/|___/ .__/|_| |_|\___|_| |_|\___/_/ \_\
8
- | |
9
- |_|
10
-
11
- Created with ♥ by the AtmosphericX Team (KiyoWx, StarflightWx, & CJ Ziegler)
12
- Discord: https://atmosphericx-discord.scriptkitty.cafe
13
- Ko-Fi: https://ko-fi.com/k3yomi
14
- Documentation: http://localhost/documentation | https://atmosphericx.scriptkitty.cafe/documentation
15
-
16
- Internal Package: @atmosx/event-product-parser
17
-
18
-
19
- */
20
-
21
-
22
- import { setAFSK } from "./eas.setAFSK";
23
- import { setAsciiToBits } from "./eas.setAsciiToBits";
24
- import { getMergedPCM16 } from "./eas.getMergedPCM16";
25
-
26
- export const setSameHeader = (vtec: string, repeats: number, sampleRate: number = 8000, options: {preMarkSec?: number, gapSec?: number} = {}): Int16Array => {
27
- const preMarkSec = options.preMarkSec ?? 0.3;
28
- const gapSec = options.gapSec ?? 0.1;
29
- const bursts = [];
30
- const gap = new Int16Array(Math.floor(gapSec * sampleRate));
31
- for (let i = 0; i < repeats; i++) {
32
- const bodyBits = setAsciiToBits(vtec);
33
- const body = setAFSK(bodyBits, sampleRate);
34
- const extendedBodyDuration = Math.round(preMarkSec * sampleRate);
35
- const extendedBody = new Int16Array(extendedBodyDuration + gap.length);
36
- for (let j = 0; j < extendedBodyDuration; j++) {
37
- extendedBody[j] = Math.round(body[j % body.length] * 0.2);
38
- }
39
- extendedBody.set(gap, extendedBodyDuration);
40
- bursts.push(extendedBody);
41
- if (i !== repeats - 1) bursts.push(gap);
42
- }
43
- return getMergedPCM16(bursts);
44
- }
45
-
1
+ /*
2
+ _ _ _ __ __
3
+ /\ | | | | (_) \ \ / /
4
+ / \ | |_ _ __ ___ ___ ___ _ __ | |__ ___ _ __ _ ___ \ V /
5
+ / /\ \| __| '_ ` _ \ / _ \/ __| '_ \| '_ \ / _ \ '__| |/ __| > <
6
+ / ____ \ |_| | | | | | (_) \__ \ |_) | | | | __/ | | | (__ / . \
7
+ /_/ \_\__|_| |_| |_|\___/|___/ .__/|_| |_|\___|_| |_|\___/_/ \_\
8
+ | |
9
+ |_|
10
+
11
+ Created with ♥ by the AtmosphericX Team (KiyoWx, StarflightWx, & CJ Ziegler)
12
+ Discord: https://atmosphericx-discord.scriptkitty.cafe
13
+ Ko-Fi: https://ko-fi.com/k3yomi
14
+ Documentation: http://localhost/documentation | https://atmosphericx.scriptkitty.cafe/documentation
15
+
16
+ Internal Package: @atmosx/event-product-parser
17
+
18
+
19
+ */
20
+
21
+ import { setAFSK } from "./eas.setAFSK";
22
+ import { setAsciiToBits } from "./eas.setAsciiToBits";
23
+ import { getMergedPCM16 } from "./eas.getMergedPCM16";
24
+
25
+ export const setSameHeader = (vtec: string, repeats: number, sampleRate: number = 8000, options: {preMarkSec?: number, gapSec?: number} = {}): Int16Array => {
26
+ const preMarkSec = options.preMarkSec ?? 0.3;
27
+ const gapSec = options.gapSec ?? 0.1;
28
+ const bursts = [];
29
+ const gap = new Int16Array(Math.floor(gapSec * sampleRate));
30
+ for (let i = 0; i < repeats; i++) {
31
+ const bodyBits = setAsciiToBits(vtec);
32
+ const body = setAFSK(bodyBits, sampleRate);
33
+ const extendedBodyDuration = Math.round(preMarkSec * sampleRate);
34
+ const extendedBody = new Int16Array(extendedBodyDuration + gap.length);
35
+ for (let j = 0; j < extendedBodyDuration; j++) {
36
+ extendedBody[j] = Math.round(body[j % body.length] * 0.2);
37
+ }
38
+ extendedBody.set(gap, extendedBodyDuration);
39
+ bursts.push(extendedBody);
40
+ if (i !== repeats - 1) bursts.push(gap);
41
+ }
42
+ return getMergedPCM16(bursts);
43
+ }
44
+