@atmosx/event-product-parser 3.0.51 → 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 (139) 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 -444
  6. package/SECURITY.md +20 -20
  7. package/SUPPORTED_EVENTS.md +369 -368
  8. package/dist/cjs/index.cjs +161 -204
  9. package/dist/esm/index.mjs +160 -203
  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 -55
  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 -69
  19. package/src/@building/building.properties.ts +95 -95
  20. package/src/@building/building.signature.ts +60 -60
  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 -151
  24. package/src/@core/core.clearEvents.ts +30 -30
  25. package/src/@core/core.createListener.ts +23 -23
  26. package/src/@core/core.getEvents.ts +23 -23
  27. package/src/@core/core.getNodes.ts +23 -23
  28. package/src/@core/core.getRandomEvent.ts +23 -23
  29. package/src/@core/core.getVersion.ts +23 -23
  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 -116
  56. package/src/@events/events.text.ts +84 -80
  57. package/src/@events/events.ugc.ts +89 -85
  58. package/src/@events/events.vtec.ts +86 -86
  59. package/src/@manager/manager.mkEvent.ts +97 -93
  60. package/src/@manager/manager.rmEvent.ts +56 -51
  61. package/src/@manager/manager.setHash.ts +35 -35
  62. package/src/@manager/manager.updateEvents.ts +32 -32
  63. package/src/@manager/manager.updateListener.ts +154 -154
  64. package/src/@manager/manager.updateNodes.ts +53 -53
  65. package/src/@modules/@database/database.broadcastify.ts +66 -66
  66. package/src/@modules/@database/database.cache.ts +49 -49
  67. package/src/@modules/@database/database.init.ts +58 -58
  68. package/src/@modules/@database/database.shapefiles.ts +92 -92
  69. package/src/@modules/@database/database.stanza.ts +46 -46
  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 -51
  79. package/src/@modules/@eas/eas.setAsciiToBits.ts +31 -31
  80. package/src/@modules/@eas/eas.setAttentionTone.ts +40 -40
  81. package/src/@modules/@eas/eas.setEasTone.ts +151 -151
  82. package/src/@modules/@eas/eas.setNoise.ts +32 -32
  83. package/src/@modules/@eas/eas.setRadioEffect.ts +50 -50
  84. package/src/@modules/@eas/eas.setSameHeader.ts +44 -44
  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 -33
  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 -38
  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 -62
  100. package/src/@modules/@utilities/utilities.setWarning.ts +34 -34
  101. package/src/@modules/@xmpp/xmpp.xDeploy.ts +57 -57
  102. package/src/@modules/@xmpp/xmpp.xError.ts +26 -26
  103. package/src/@modules/@xmpp/xmpp.xOffline.ts +36 -36
  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 -55
  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 -110
  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 +23 -23
  119. package/src/@parsers/@ugc/ugc.header.ts +29 -29
  120. package/src/@parsers/@ugc/ugc.locations.ts +56 -56
  121. package/src/@parsers/@ugc/ugc.setCache.ts +27 -27
  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 -84
  132. package/src/@types/type.stanza.ts +37 -37
  133. package/src/@types/type.ugc.ts +24 -24
  134. package/src/bootstrap.ts +115 -115
  135. package/src/index.ts +74 -74
  136. package/test.js +92 -92
  137. package/tsconfig.json +13 -13
  138. package/tsup.config.ts +15 -15
  139. package/src/@core/core.createEvent.ts +0 -82
@@ -1,151 +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 { 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
+ /*
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,32 +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
-
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
+ /*
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,50 +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
-
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
+ /*
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,44 +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
- 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
-
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
+
@@ -1,46 +1,46 @@
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 { TypeAttributes } from "../../@types/type.attributes"
21
- import { dict_awips } from "../../@dictionaries/dictionaries.awips"
22
-
23
- interface ValidateOptions {
24
- attributes: TypeAttributes
25
- }
26
-
27
- interface ValidiateResponse {
28
- type: string
29
- prefix: string
30
- }
31
-
32
- export const getAwipsType = (options: ValidateOptions): ValidiateResponse => {
33
- const attributes = options.attributes;
34
- if (!attributes.awipsid) {
35
- return {
36
- type: null,
37
- prefix: null
38
- }
39
- }
40
- for (const [prefix, type] of Object.entries(dict_awips)) {
41
- if (attributes.awipsid.startsWith(prefix)) {
42
- return { type, prefix }
43
- }
44
- }
45
- return { type: null, prefix: null }
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 { TypeAttributes } from "../../@types/type.attributes"
21
+ import { dict_awips } from "../../@dictionaries/dictionaries.awips"
22
+
23
+ interface ValidateOptions {
24
+ attributes: TypeAttributes
25
+ }
26
+
27
+ interface ValidiateResponse {
28
+ type: string
29
+ prefix: string
30
+ }
31
+
32
+ export const getAwipsType = (options: ValidateOptions): ValidiateResponse => {
33
+ const attributes = options.attributes;
34
+ if (!attributes.awipsid) {
35
+ return {
36
+ type: null,
37
+ prefix: null
38
+ }
39
+ }
40
+ for (const [prefix, type] of Object.entries(dict_awips)) {
41
+ if (attributes.awipsid.startsWith(prefix)) {
42
+ return { type, prefix }
43
+ }
44
+ }
45
+ return { type: null, prefix: null }
46
46
  }