@atmosx/event-product-parser 3.0.51 → 3.0.53
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.
- package/{CODE_OF_CONDUCT.md → .github/CODE_OF_CONDUCT.md} +9 -9
- package/{CONTRIBUTING.md → .github/CONTRIBUTING.md} +29 -29
- package/{LICENSE → .github/LICENSE} +17 -17
- package/{README.md → .github/README.md} +466 -444
- package/{SECURITY.md → .github/SECURITY.md} +20 -20
- package/{SUPPORTED_EVENTS.md → .github/SUPPORTED_EVENTS.md} +369 -368
- package/.vscode/settings.json +3 -3
- package/dist/cjs/index.cjs +243 -213
- package/dist/esm/index.mjs +242 -212
- package/package.json +52 -52
- package/src/@building/building.attachments.ts +82 -82
- package/src/@building/building.clean.ts +29 -29
- package/src/@building/building.create.ts +55 -55
- package/src/@building/building.enhance.ts +59 -59
- package/src/@building/building.geometry.ts +47 -47
- package/src/@building/building.headers.ts +36 -36
- package/src/@building/building.office.ts +42 -42
- package/src/@building/building.polygon.ts +69 -69
- package/src/@building/building.properties.ts +95 -95
- package/src/@building/building.signature.ts +60 -60
- package/src/@building/building.tags.ts +23 -23
- package/src/@building/building.tracking.ts +67 -67
- package/src/@building/building.validate.ts +152 -151
- package/src/@core/core.clearEvents.ts +30 -30
- package/src/@core/core.createListener.ts +23 -23
- package/src/@core/core.getEvents.ts +23 -23
- package/src/@core/core.getNodes.ts +23 -23
- package/src/@core/core.getRandomEvent.ts +23 -23
- package/src/@core/core.getVersion.ts +23 -23
- package/src/@core/core.manualEvent.ts +38 -0
- package/src/@core/core.query.ts +38 -38
- package/src/@core/core.setNode.ts +80 -80
- package/src/@core/core.start.ts +60 -60
- package/src/@core/core.stop.ts +31 -31
- package/src/@dictionaries/dictionaries.actions.ts +27 -27
- package/src/@dictionaries/dictionaries.awips.ts +363 -363
- package/src/@dictionaries/dictionaries.cancellation.ts +30 -30
- package/src/@dictionaries/dictionaries.causes.ts +35 -35
- package/src/@dictionaries/dictionaries.correlations.ts +42 -42
- package/src/@dictionaries/dictionaries.enhanced.ts +66 -109
- package/src/@dictionaries/dictionaries.events.ts +82 -82
- package/src/@dictionaries/dictionaries.expressions.ts +28 -28
- package/src/@dictionaries/dictionaries.global.ts +24 -0
- package/src/@dictionaries/dictionaries.hail.ts +35 -35
- package/src/@dictionaries/dictionaries.icao.ts +258 -258
- package/src/@dictionaries/dictionaries.matches.ts +54 -35
- package/src/@dictionaries/dictionaries.products.ts +24 -24
- package/src/@dictionaries/dictionaries.records.ts +25 -25
- package/src/@dictionaries/dictionaries.severity.ts +27 -27
- package/src/@dictionaries/dictionaries.shapefiles.ts +35 -35
- package/src/@dictionaries/dictionaries.states.ts +71 -71
- package/src/@dictionaries/dictionaries.status.ts +30 -30
- package/src/@dictionaries/dictionaries.tags.ts +92 -92
- package/src/@dictionaries/dictionaries.testing.ts +24 -24
- package/src/@events/events.api.ts +116 -116
- package/src/@events/events.text.ts +84 -80
- package/src/@events/events.ugc.ts +89 -85
- package/src/@events/events.vtec.ts +86 -86
- package/src/@manager/manager.mkEvent.ts +97 -93
- package/src/@manager/manager.rmEvent.ts +56 -51
- package/src/@manager/manager.setHash.ts +35 -35
- package/src/@manager/manager.updateEvents.ts +32 -32
- package/src/@manager/manager.updateListener.ts +179 -154
- package/src/@manager/manager.updateNodes.ts +53 -53
- package/src/@modules/@database/database.broadcastify.ts +66 -66
- package/src/@modules/@database/database.cache.ts +49 -49
- package/src/@modules/@database/database.init.ts +58 -58
- package/src/@modules/@database/database.shapefiles.ts +92 -92
- package/src/@modules/@database/database.stanza.ts +46 -46
- package/src/@modules/@eas/eas.getCleanDescription.ts +91 -91
- package/src/@modules/@eas/eas.getFloatPCM16.ts +29 -29
- package/src/@modules/@eas/eas.getMergedPCM16.ts +32 -32
- package/src/@modules/@eas/eas.getPCM16.ts +52 -52
- package/src/@modules/@eas/eas.getPCMToFloat.ts +26 -26
- package/src/@modules/@eas/eas.getSampledPCM16.ts +36 -36
- package/src/@modules/@eas/eas.getTTS.ts +54 -54
- package/src/@modules/@eas/eas.getWavPCM16.ts +52 -52
- package/src/@modules/@eas/eas.setAFSK.ts +51 -51
- package/src/@modules/@eas/eas.setAsciiToBits.ts +31 -31
- package/src/@modules/@eas/eas.setAttentionTone.ts +40 -40
- package/src/@modules/@eas/eas.setEasTone.ts +151 -151
- package/src/@modules/@eas/eas.setNoise.ts +32 -32
- package/src/@modules/@eas/eas.setRadioEffect.ts +50 -50
- package/src/@modules/@eas/eas.setSameHeader.ts +44 -44
- package/src/@modules/@stanza/stanza.getAwipsType.ts +45 -45
- package/src/@modules/@stanza/stanza.validate.ts +49 -49
- package/src/@modules/@utilities/utilities.createHttp.ts +83 -70
- package/src/@modules/@utilities/utilities.getFormattedTime.ts +43 -43
- package/src/@modules/@utilities/utilities.getLatestIssuance.ts +32 -32
- package/src/@modules/@utilities/utilities.getMatched.ts +33 -33
- package/src/@modules/@utilities/utilities.getSettings.ts +25 -25
- package/src/@modules/@utilities/utilities.getShapeNearestPoint.ts +114 -114
- package/src/@modules/@utilities/utilities.setCronSchedule.ts +94 -94
- package/src/@modules/@utilities/utilities.setDebug.ts +38 -38
- package/src/@modules/@utilities/utilities.setEventEmit.ts +41 -41
- package/src/@modules/@utilities/utilities.setListener.ts +30 -30
- package/src/@modules/@utilities/utilities.setSettings.ts +42 -42
- package/src/@modules/@utilities/utilities.setSleep.ts +33 -33
- package/src/@modules/@utilities/utilities.setTimeoutAction.ts +62 -62
- package/src/@modules/@utilities/utilities.setWarning.ts +34 -34
- package/src/@modules/@xmpp/xmpp.xDeploy.ts +57 -57
- package/src/@modules/@xmpp/xmpp.xError.ts +26 -26
- package/src/@modules/@xmpp/xmpp.xOffline.ts +36 -36
- package/src/@modules/@xmpp/xmpp.xOnline.ts +45 -44
- package/src/@modules/@xmpp/xmpp.xReconnect.ts +64 -64
- package/src/@modules/@xmpp/xmpp.xStanza.ts +62 -62
- package/src/@parsers/@hvtec/hvtec.extract.ts +39 -39
- package/src/@parsers/@pvtec/pvtec.expires.ts +25 -25
- package/src/@parsers/@pvtec/pvtec.extract.ts +48 -48
- package/src/@parsers/@text/text.getDescriptionFromProduct.ts +52 -52
- package/src/@parsers/@text/text.getEmbed.ts +55 -55
- package/src/@parsers/@text/text.getPolygonFromProduct.ts +53 -32
- package/src/@parsers/@text/text.getRaw.ts +54 -0
- package/src/@parsers/@text/text.getTextFromProduct.ts +42 -42
- package/src/@parsers/@text/text.getXML.ts +60 -60
- package/src/@parsers/@ugc/ugc.coordinates.ts +110 -110
- package/src/@parsers/@ugc/ugc.expiry.ts +31 -31
- package/src/@parsers/@ugc/ugc.extract.ts +36 -36
- package/src/@parsers/@ugc/ugc.getCache.ts +23 -23
- package/src/@parsers/@ugc/ugc.header.ts +29 -29
- package/src/@parsers/@ugc/ugc.locations.ts +56 -56
- package/src/@parsers/@ugc/ugc.setCache.ts +27 -27
- package/src/@parsers/@ugc/ugc.zones.ts +51 -51
- package/src/@types/type.attributes.ts +28 -28
- package/src/@types/type.compiled.ts +34 -34
- package/src/@types/type.event.ts +69 -69
- package/src/@types/type.hash.ts +24 -24
- package/src/@types/type.hvtec.ts +25 -25
- package/src/@types/type.listener.ts +37 -32
- package/src/@types/type.properties.ts +77 -77
- package/src/@types/type.pvtec.ts +30 -30
- package/src/@types/type.settings.ts +93 -84
- package/src/@types/type.stanza.ts +37 -37
- package/src/@types/type.ugc.ts +24 -24
- package/src/bootstrap.ts +124 -115
- package/src/index.ts +74 -74
- package/{test.js → testing/init.js} +105 -92
- package/tsconfig.json +13 -13
- package/tsup.config.ts +15 -15
- package/src/@core/core.createEvent.ts +0 -82
|
@@ -1,91 +1,91 @@
|
|
|
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
|
-
export const getCleanDescription = (message: string): string => {
|
|
22
|
-
const patches: { regex: RegExp, replacement: string }[] = [
|
|
23
|
-
{ regex: /\.{3,}/g, replacement: ". " },
|
|
24
|
-
{ regex: /\bUTC\b/g, replacement: 'Coordinated Universal Time' },
|
|
25
|
-
{ regex: /\bGMT\b/g, replacement: 'Greenwich Mean Time' },
|
|
26
|
-
{ regex: /\bEST\b(?!\w)/g, replacement: 'Eastern Standard Time' },
|
|
27
|
-
{ regex: /\bEDT\b(?!\w)/g, replacement: 'Eastern Daylight Time' },
|
|
28
|
-
{ regex: /\bCST\b(?!\w)/g, replacement: 'Central Standard Time' },
|
|
29
|
-
{ regex: /\bCDT\b(?!\w)/g, replacement: 'Central Daylight Time' },
|
|
30
|
-
{ regex: /\bMST\b(?!\w)/g, replacement: 'Mountain Standard Time' },
|
|
31
|
-
{ regex: /\bMDT\b(?!\w)/g, replacement: 'Mountain Daylight Time' },
|
|
32
|
-
{ regex: /\bPST\b(?!\w)/g, replacement: 'Pacific Standard Time' },
|
|
33
|
-
{ regex: /\bPDT\b(?!\w)/g, replacement: 'Pacific Daylight Time' },
|
|
34
|
-
{ regex: /\bAKST\b(?!\w)/g, replacement: 'Alaska Standard Time' },
|
|
35
|
-
{ regex: /\bAKDT\b(?!\w)/g, replacement: 'Alaska Daylight Time' },
|
|
36
|
-
{ regex: /\bHST\b(?!\w)/g, replacement: 'Hawaii Standard Time' },
|
|
37
|
-
{ regex: /\bHDT\b(?!\w)/g, replacement: 'Hawaii Daylight Time' },
|
|
38
|
-
{ regex: /\bmph\b(?!\w)/g, replacement: 'miles per hour' },
|
|
39
|
-
{ regex: /\bkm\/h\b(?!\w)/g, replacement: 'kilometers per hour' },
|
|
40
|
-
{ regex: /\bkmh\b(?!\w)/g, replacement: 'kilometers per hour' },
|
|
41
|
-
{ regex: /\bkt\b(?!\w)/g, replacement: 'knots' },
|
|
42
|
-
{ regex: /\bNE\b(?!\w)/g, replacement: 'northeast' },
|
|
43
|
-
{ regex: /\bNW\b(?!\w)/g, replacement: 'northwest' },
|
|
44
|
-
{ regex: /\bSE\b(?!\w)/g, replacement: 'southeast' },
|
|
45
|
-
{ regex: /\bSW\b(?!\w)/g, replacement: 'southwest' },
|
|
46
|
-
{ regex: /\bNM\b(?!\w)/g, replacement: 'nautical miles' },
|
|
47
|
-
{ regex: /\bdeg\b(?!\w)/g, replacement: 'degrees' },
|
|
48
|
-
{ regex: /\btstm\b(?!\w)/g, replacement: 'thunderstorm' },
|
|
49
|
-
{ regex: /\bmm\b(?!\w)/g, replacement: 'millimeters' },
|
|
50
|
-
{ regex: /\bcm\b(?!\w)/g, replacement: 'centimeters' },
|
|
51
|
-
{ regex: /\bin.\b(?!\w)/g, replacement: 'inches' },
|
|
52
|
-
{ regex: /\bft\b(?!\w)/g, replacement: 'feet' },
|
|
53
|
-
{ regex: /\bmi\b(?!\w)/g, replacement: 'miles' },
|
|
54
|
-
{ regex: /\bhr\b(?!\w)/g, replacement: 'hour' },
|
|
55
|
-
{ regex: /\bhourly\b(?!\w)/g, replacement: 'per hour' },
|
|
56
|
-
{ regex: /\bkg\b(?!\w)/g, replacement: 'kilograms' },
|
|
57
|
-
{ regex: /\bg\/kg\b(?!\w)/g, replacement: 'grams per kilogram' },
|
|
58
|
-
{ regex: /\bmb\b(?!\w)/g, replacement: 'millibars' },
|
|
59
|
-
{ regex: /\bhPa\b(?!\w)/g, replacement: 'hectopascals' },
|
|
60
|
-
{ regex: /\bPa\b(?!\w)/g, replacement: 'pascals' },
|
|
61
|
-
{ regex: /\bKPa\b(?!\w)/g, replacement: 'kilopascals' },
|
|
62
|
-
{ regex: /\bC\/hr\b(?!\w)/g, replacement: 'degrees Celsius per hour' },
|
|
63
|
-
{ regex: /\bF\/hr\b(?!\w)/g, replacement: 'degrees Fahrenheit per hour' },
|
|
64
|
-
{ regex: /\bC\/min\b(?!\w)/g, replacement: 'degrees Celsius per minute' },
|
|
65
|
-
{ regex: /\bF\/min\b(?!\w)/g, replacement: 'degrees Fahrenheit per minute' },
|
|
66
|
-
{ regex: /\bC\b(?!\w)/g, replacement: 'degrees Celsius' },
|
|
67
|
-
{ regex: /\bF\b(?!\w)/g, replacement: 'degrees Fahrenheit' },
|
|
68
|
-
]
|
|
69
|
-
const hours: Record<number, string> = {
|
|
70
|
-
0: "twelve", 1: "one", 2: "two", 3: "three", 4: "four",
|
|
71
|
-
5: "five", 6: "six", 7: "seven", 8: "eight", 9: "nine",
|
|
72
|
-
10: "ten", 11: "eleven", 12: "twelve",
|
|
73
|
-
};
|
|
74
|
-
const minWord = (m: number) => m === 0 ? "o'clock" : m < 10 ? `oh ${m}` : `${m}`;
|
|
75
|
-
const fmt = (h: number, m: number, ap: string) => `${hours[h % 12]} ${minWord(m)} ${ap}`;
|
|
76
|
-
for (const {regex, replacement} of patches) {
|
|
77
|
-
message = message.replace(regex, replacement)
|
|
78
|
-
}
|
|
79
|
-
return message
|
|
80
|
-
.replace(/'/g, "''")
|
|
81
|
-
.replace(/\b(\d{1,2}):(\d{2})\s*(AM|PM)\b/gi, (_, h, m, ap) => fmt(+h, +m, ap.toUpperCase()))
|
|
82
|
-
.replace(/\b(\d{1,2})\s+(\d{2})\s+(AM|PM)\b/gi, (_, h, m, ap) => fmt(+h, +m, ap.toUpperCase()))
|
|
83
|
-
.replace(/\b(\d{2})(\d{2})\s+(AM|PM)\b/gi, (_, hh, mm, ap) => fmt(+hh, +mm, ap.toUpperCase()))
|
|
84
|
-
.replace(/\b(\d{1,2})\s+(AM|PM)\b/gi, (_, h, ap) => fmt(+h, 0, ap.toUpperCase()))
|
|
85
|
-
.replace(/\*+/g, " ")
|
|
86
|
-
.replace(/-/g, " ")
|
|
87
|
-
.replace(/\n/g, " ")
|
|
88
|
-
.trim();
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
|
|
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
|
+
export const getCleanDescription = (message: string): string => {
|
|
22
|
+
const patches: { regex: RegExp, replacement: string }[] = [
|
|
23
|
+
{ regex: /\.{3,}/g, replacement: ". " },
|
|
24
|
+
{ regex: /\bUTC\b/g, replacement: 'Coordinated Universal Time' },
|
|
25
|
+
{ regex: /\bGMT\b/g, replacement: 'Greenwich Mean Time' },
|
|
26
|
+
{ regex: /\bEST\b(?!\w)/g, replacement: 'Eastern Standard Time' },
|
|
27
|
+
{ regex: /\bEDT\b(?!\w)/g, replacement: 'Eastern Daylight Time' },
|
|
28
|
+
{ regex: /\bCST\b(?!\w)/g, replacement: 'Central Standard Time' },
|
|
29
|
+
{ regex: /\bCDT\b(?!\w)/g, replacement: 'Central Daylight Time' },
|
|
30
|
+
{ regex: /\bMST\b(?!\w)/g, replacement: 'Mountain Standard Time' },
|
|
31
|
+
{ regex: /\bMDT\b(?!\w)/g, replacement: 'Mountain Daylight Time' },
|
|
32
|
+
{ regex: /\bPST\b(?!\w)/g, replacement: 'Pacific Standard Time' },
|
|
33
|
+
{ regex: /\bPDT\b(?!\w)/g, replacement: 'Pacific Daylight Time' },
|
|
34
|
+
{ regex: /\bAKST\b(?!\w)/g, replacement: 'Alaska Standard Time' },
|
|
35
|
+
{ regex: /\bAKDT\b(?!\w)/g, replacement: 'Alaska Daylight Time' },
|
|
36
|
+
{ regex: /\bHST\b(?!\w)/g, replacement: 'Hawaii Standard Time' },
|
|
37
|
+
{ regex: /\bHDT\b(?!\w)/g, replacement: 'Hawaii Daylight Time' },
|
|
38
|
+
{ regex: /\bmph\b(?!\w)/g, replacement: 'miles per hour' },
|
|
39
|
+
{ regex: /\bkm\/h\b(?!\w)/g, replacement: 'kilometers per hour' },
|
|
40
|
+
{ regex: /\bkmh\b(?!\w)/g, replacement: 'kilometers per hour' },
|
|
41
|
+
{ regex: /\bkt\b(?!\w)/g, replacement: 'knots' },
|
|
42
|
+
{ regex: /\bNE\b(?!\w)/g, replacement: 'northeast' },
|
|
43
|
+
{ regex: /\bNW\b(?!\w)/g, replacement: 'northwest' },
|
|
44
|
+
{ regex: /\bSE\b(?!\w)/g, replacement: 'southeast' },
|
|
45
|
+
{ regex: /\bSW\b(?!\w)/g, replacement: 'southwest' },
|
|
46
|
+
{ regex: /\bNM\b(?!\w)/g, replacement: 'nautical miles' },
|
|
47
|
+
{ regex: /\bdeg\b(?!\w)/g, replacement: 'degrees' },
|
|
48
|
+
{ regex: /\btstm\b(?!\w)/g, replacement: 'thunderstorm' },
|
|
49
|
+
{ regex: /\bmm\b(?!\w)/g, replacement: 'millimeters' },
|
|
50
|
+
{ regex: /\bcm\b(?!\w)/g, replacement: 'centimeters' },
|
|
51
|
+
{ regex: /\bin.\b(?!\w)/g, replacement: 'inches' },
|
|
52
|
+
{ regex: /\bft\b(?!\w)/g, replacement: 'feet' },
|
|
53
|
+
{ regex: /\bmi\b(?!\w)/g, replacement: 'miles' },
|
|
54
|
+
{ regex: /\bhr\b(?!\w)/g, replacement: 'hour' },
|
|
55
|
+
{ regex: /\bhourly\b(?!\w)/g, replacement: 'per hour' },
|
|
56
|
+
{ regex: /\bkg\b(?!\w)/g, replacement: 'kilograms' },
|
|
57
|
+
{ regex: /\bg\/kg\b(?!\w)/g, replacement: 'grams per kilogram' },
|
|
58
|
+
{ regex: /\bmb\b(?!\w)/g, replacement: 'millibars' },
|
|
59
|
+
{ regex: /\bhPa\b(?!\w)/g, replacement: 'hectopascals' },
|
|
60
|
+
{ regex: /\bPa\b(?!\w)/g, replacement: 'pascals' },
|
|
61
|
+
{ regex: /\bKPa\b(?!\w)/g, replacement: 'kilopascals' },
|
|
62
|
+
{ regex: /\bC\/hr\b(?!\w)/g, replacement: 'degrees Celsius per hour' },
|
|
63
|
+
{ regex: /\bF\/hr\b(?!\w)/g, replacement: 'degrees Fahrenheit per hour' },
|
|
64
|
+
{ regex: /\bC\/min\b(?!\w)/g, replacement: 'degrees Celsius per minute' },
|
|
65
|
+
{ regex: /\bF\/min\b(?!\w)/g, replacement: 'degrees Fahrenheit per minute' },
|
|
66
|
+
{ regex: /\bC\b(?!\w)/g, replacement: 'degrees Celsius' },
|
|
67
|
+
{ regex: /\bF\b(?!\w)/g, replacement: 'degrees Fahrenheit' },
|
|
68
|
+
]
|
|
69
|
+
const hours: Record<number, string> = {
|
|
70
|
+
0: "twelve", 1: "one", 2: "two", 3: "three", 4: "four",
|
|
71
|
+
5: "five", 6: "six", 7: "seven", 8: "eight", 9: "nine",
|
|
72
|
+
10: "ten", 11: "eleven", 12: "twelve",
|
|
73
|
+
};
|
|
74
|
+
const minWord = (m: number) => m === 0 ? "o'clock" : m < 10 ? `oh ${m}` : `${m}`;
|
|
75
|
+
const fmt = (h: number, m: number, ap: string) => `${hours[h % 12]} ${minWord(m)} ${ap}`;
|
|
76
|
+
for (const {regex, replacement} of patches) {
|
|
77
|
+
message = message.replace(regex, replacement)
|
|
78
|
+
}
|
|
79
|
+
return message
|
|
80
|
+
.replace(/'/g, "''")
|
|
81
|
+
.replace(/\b(\d{1,2}):(\d{2})\s*(AM|PM)\b/gi, (_, h, m, ap) => fmt(+h, +m, ap.toUpperCase()))
|
|
82
|
+
.replace(/\b(\d{1,2})\s+(\d{2})\s+(AM|PM)\b/gi, (_, h, m, ap) => fmt(+h, +m, ap.toUpperCase()))
|
|
83
|
+
.replace(/\b(\d{2})(\d{2})\s+(AM|PM)\b/gi, (_, hh, mm, ap) => fmt(+hh, +mm, ap.toUpperCase()))
|
|
84
|
+
.replace(/\b(\d{1,2})\s+(AM|PM)\b/gi, (_, h, ap) => fmt(+h, 0, ap.toUpperCase()))
|
|
85
|
+
.replace(/\*+/g, " ")
|
|
86
|
+
.replace(/-/g, " ")
|
|
87
|
+
.replace(/\n/g, " ")
|
|
88
|
+
.trim();
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
|
|
@@ -1,29 +1,29 @@
|
|
|
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
|
-
export const getFloatPCM16 = (float32: Float32Array): Int16Array => {
|
|
22
|
-
const out = new Int16Array(float32.length);
|
|
23
|
-
for (let i = 0; i < float32.length; i++) {
|
|
24
|
-
let v = Math.max(-1, Math.min(1, float32[i]));
|
|
25
|
-
out[i] = Math.round(v * 32767);
|
|
26
|
-
}
|
|
27
|
-
return out;
|
|
28
|
-
}
|
|
29
|
-
|
|
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
|
+
export const getFloatPCM16 = (float32: Float32Array): Int16Array => {
|
|
22
|
+
const out = new Int16Array(float32.length);
|
|
23
|
+
for (let i = 0; i < float32.length; i++) {
|
|
24
|
+
let v = Math.max(-1, Math.min(1, float32[i]));
|
|
25
|
+
out[i] = Math.round(v * 32767);
|
|
26
|
+
}
|
|
27
|
+
return out;
|
|
28
|
+
}
|
|
29
|
+
|
|
@@ -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
|
-
export const getMergedPCM16 = (arrays: Int16Array[]): Int16Array => {
|
|
22
|
-
let total = 0;
|
|
23
|
-
for (const a of arrays) total += a.length;
|
|
24
|
-
const out = new Int16Array(total);
|
|
25
|
-
let o = 0;
|
|
26
|
-
for (const a of arrays) {
|
|
27
|
-
out.set(a, o);
|
|
28
|
-
o += a.length;
|
|
29
|
-
}
|
|
30
|
-
return out;
|
|
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
|
+
export const getMergedPCM16 = (arrays: Int16Array[]): Int16Array => {
|
|
22
|
+
let total = 0;
|
|
23
|
+
for (const a of arrays) total += a.length;
|
|
24
|
+
const out = new Int16Array(total);
|
|
25
|
+
let o = 0;
|
|
26
|
+
for (const a of arrays) {
|
|
27
|
+
out.set(a, o);
|
|
28
|
+
o += a.length;
|
|
29
|
+
}
|
|
30
|
+
return out;
|
|
31
|
+
}
|
|
32
|
+
|
|
@@ -1,52 +1,52 @@
|
|
|
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
|
-
export const getPCM16 = (samples: Record<string, number>[], sampleRate: number): Buffer => {
|
|
22
|
-
let o = 0;
|
|
23
|
-
const bytesPerSample = 2;
|
|
24
|
-
const blockAlign = 1 * bytesPerSample;
|
|
25
|
-
const byteRate = sampleRate * blockAlign;
|
|
26
|
-
const subchunk2Size = samples.length * bytesPerSample;
|
|
27
|
-
const chunkSize = 36 + subchunk2Size;
|
|
28
|
-
const buffer = Buffer.alloc(44 + subchunk2Size);
|
|
29
|
-
|
|
30
|
-
buffer.write("RIFF", o); o += 4;
|
|
31
|
-
buffer.writeUInt32LE(chunkSize, o); o += 4;
|
|
32
|
-
buffer.write("WAVE", o); o += 4;
|
|
33
|
-
|
|
34
|
-
buffer.write("fmt ", o); o += 4;
|
|
35
|
-
buffer.writeUInt32LE(16, o); o += 4;
|
|
36
|
-
buffer.writeUInt16LE(1, o); o += 2;
|
|
37
|
-
buffer.writeUInt16LE(1, o); o += 2;
|
|
38
|
-
buffer.writeUInt32LE(sampleRate, o); o += 4;
|
|
39
|
-
buffer.writeUInt32LE(byteRate, o); o += 4;
|
|
40
|
-
buffer.writeUInt16LE(blockAlign, o); o += 2;
|
|
41
|
-
buffer.writeUInt16LE(16, o); o += 2;
|
|
42
|
-
|
|
43
|
-
buffer.write("data", o); o += 4;
|
|
44
|
-
buffer.writeUInt32LE(subchunk2Size, o); o += 4;
|
|
45
|
-
|
|
46
|
-
for (let i = 0; i < samples.length; i++, o += 2) {
|
|
47
|
-
buffer.writeInt16LE(samples[i].value, o);
|
|
48
|
-
}
|
|
49
|
-
return buffer;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
|
|
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
|
+
export const getPCM16 = (samples: Record<string, number>[], sampleRate: number): Buffer => {
|
|
22
|
+
let o = 0;
|
|
23
|
+
const bytesPerSample = 2;
|
|
24
|
+
const blockAlign = 1 * bytesPerSample;
|
|
25
|
+
const byteRate = sampleRate * blockAlign;
|
|
26
|
+
const subchunk2Size = samples.length * bytesPerSample;
|
|
27
|
+
const chunkSize = 36 + subchunk2Size;
|
|
28
|
+
const buffer = Buffer.alloc(44 + subchunk2Size);
|
|
29
|
+
|
|
30
|
+
buffer.write("RIFF", o); o += 4;
|
|
31
|
+
buffer.writeUInt32LE(chunkSize, o); o += 4;
|
|
32
|
+
buffer.write("WAVE", o); o += 4;
|
|
33
|
+
|
|
34
|
+
buffer.write("fmt ", o); o += 4;
|
|
35
|
+
buffer.writeUInt32LE(16, o); o += 4;
|
|
36
|
+
buffer.writeUInt16LE(1, o); o += 2;
|
|
37
|
+
buffer.writeUInt16LE(1, o); o += 2;
|
|
38
|
+
buffer.writeUInt32LE(sampleRate, o); o += 4;
|
|
39
|
+
buffer.writeUInt32LE(byteRate, o); o += 4;
|
|
40
|
+
buffer.writeUInt16LE(blockAlign, o); o += 2;
|
|
41
|
+
buffer.writeUInt16LE(16, o); o += 2;
|
|
42
|
+
|
|
43
|
+
buffer.write("data", o); o += 4;
|
|
44
|
+
buffer.writeUInt32LE(subchunk2Size, o); o += 4;
|
|
45
|
+
|
|
46
|
+
for (let i = 0; i < samples.length; i++, o += 2) {
|
|
47
|
+
buffer.writeInt16LE(samples[i].value, o);
|
|
48
|
+
}
|
|
49
|
+
return buffer;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
|
|
@@ -1,26 +1,26 @@
|
|
|
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
|
-
export const getPCMToFloat = (int16: Int16Array): Float32Array => {
|
|
22
|
-
const out = new Float32Array(int16.length);
|
|
23
|
-
for (let i = 0; i < int16.length; i++) out[i] = int16[i] / 32768;
|
|
24
|
-
return out;
|
|
25
|
-
}
|
|
26
|
-
|
|
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
|
+
export const getPCMToFloat = (int16: Int16Array): Float32Array => {
|
|
22
|
+
const out = new Float32Array(int16.length);
|
|
23
|
+
for (let i = 0; i < int16.length; i++) out[i] = int16[i] / 32768;
|
|
24
|
+
return out;
|
|
25
|
+
}
|
|
26
|
+
|
|
@@ -1,36 +1,36 @@
|
|
|
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
|
-
export const getSampledPCM16 = (int16: Int16Array, originalRate: number, targetRate: number): Int16Array => {
|
|
22
|
-
if (originalRate === targetRate) return int16;
|
|
23
|
-
const ratio = targetRate / originalRate;
|
|
24
|
-
const outLen = Math.max(1, Math.round(int16.length * ratio));
|
|
25
|
-
const out = new Int16Array(outLen);
|
|
26
|
-
for (let i = 0; i < outLen; i++) {
|
|
27
|
-
const pos = i / ratio;
|
|
28
|
-
const i0 = Math.floor(pos);
|
|
29
|
-
const i1 = Math.min(i0 + 1, int16.length - 1);
|
|
30
|
-
const frac = pos - i0;
|
|
31
|
-
const v = int16[i0] * (1 - frac) + int16[i1] * frac;
|
|
32
|
-
out[i] = Math.round(v);
|
|
33
|
-
}
|
|
34
|
-
return out;
|
|
35
|
-
}
|
|
36
|
-
|
|
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
|
+
export const getSampledPCM16 = (int16: Int16Array, originalRate: number, targetRate: number): Int16Array => {
|
|
22
|
+
if (originalRate === targetRate) return int16;
|
|
23
|
+
const ratio = targetRate / originalRate;
|
|
24
|
+
const outLen = Math.max(1, Math.round(int16.length * ratio));
|
|
25
|
+
const out = new Int16Array(outLen);
|
|
26
|
+
for (let i = 0; i < outLen; i++) {
|
|
27
|
+
const pos = i / ratio;
|
|
28
|
+
const i0 = Math.floor(pos);
|
|
29
|
+
const i1 = Math.min(i0 + 1, int16.length - 1);
|
|
30
|
+
const frac = pos - i0;
|
|
31
|
+
const v = int16[i0] * (1 - frac) + int16[i1] * frac;
|
|
32
|
+
out[i] = Math.round(v);
|
|
33
|
+
}
|
|
34
|
+
return out;
|
|
35
|
+
}
|
|
36
|
+
|