{"id":1505,"date":"2025-10-22T14:28:19","date_gmt":"2025-10-22T14:28:19","guid":{"rendered":"https:\/\/altsl.com\/?page_id=1505"},"modified":"2026-04-21T13:42:08","modified_gmt":"2026-04-21T21:42:08","slug":"audio-splitter","status":"publish","type":"page","link":"https:\/\/altsl.com\/pt\/tools\/audio-splitter\/","title":{"rendered":"Divisor de \u00e1udio"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"1505\" class=\"elementor elementor-1505\" data-elementor-post-type=\"page\">\n\t\t\t\t<div data-particle_enable=\"false\" data-particle-mobile-disabled=\"false\" class=\"elementor-element elementor-element-06a856b e-flex e-con-boxed e-con e-parent\" data-id=\"06a856b\" data-element_type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div data-particle_enable=\"false\" data-particle-mobile-disabled=\"false\" class=\"elementor-element elementor-element-a2af690 e-con-full e-flex e-con e-child\" data-id=\"a2af690\" data-element_type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-97dade6 elementor-widget elementor-widget-heading\" data-id=\"97dade6\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h1 class=\"elementor-heading-title elementor-size-default\">SL AUDIO SPLITTER &amp; LSL GENERATOR<\/h1>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-dc1319d elementor-widget elementor-widget-heading\" data-id=\"dc1319d\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Split tracks precisely and get the LSL script instantly<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-c1e4bef elementor-widget elementor-widget-html\" data-id=\"c1e4bef\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<link rel=\"stylesheet\" href=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/font-awesome\/6.0.0\/css\/all.min.css\">\r\n\r\n<style>\r\n    .sl-nice-donate {\r\n        display: inline-flex;\r\n        align-items: center;\r\n        gap: 12px;\r\n        background: rgba(255, 255, 255, 0.03);\r\n        backdrop-filter: blur(8px);\r\n        -webkit-backdrop-filter: blur(8px);\r\n        padding: 6px 16px 6px 8px;\r\n        border-radius: 40px;\r\n        border: 1px solid rgba(179, 102, 255, 0.25);\r\n        cursor: pointer;\r\n        transition: all 0.4s cubic-bezier(0.175, 0.885, 0.32, 1.275);\r\n        font-family: 'Segoe UI', Roboto, sans-serif;\r\n    }\r\n\r\n    .sl-nice-donate:hover {\r\n        background: rgba(68, 0, 102, 0.4);\r\n        border-color: #d199ff;\r\n        transform: translateY(-1px);\r\n    }\r\n\r\n    .linden-circle {\r\n        background: linear-gradient(135deg, #440066, #7c4dff);\r\n        color: #fff;\r\n        width: 32px;\r\n        height: 32px;\r\n        display: flex;\r\n        align-items: center;\r\n        justify-content: center;\r\n        border-radius: 50%;\r\n        font-weight: 800;\r\n        font-size: 13px;\r\n        box-shadow: 0 0 15px rgba(124, 77, 255, 0.4);\r\n    }\r\n\r\n    .nice-content {\r\n        display: flex;\r\n        flex-direction: column;\r\n    }\r\n\r\n    .nice-title {\r\n        color: #f0f0f0;\r\n        font-size: 12px;\r\n        font-weight: 600;\r\n        letter-spacing: 0.3px;\r\n    }\r\n\r\n    .nice-subtext {\r\n        color: #b366ff;\r\n        font-size: 10px;\r\n        font-style: italic;\r\n        opacity: 0.9;\r\n    }\r\n\r\n    .success-text {\r\n        color: #00ffbb !important;\r\n        font-weight: bold;\r\n    }\r\n<\/style>\r\n\r\n<div class=\"sl-nice-donate\" onclick=\"copyNiceName()\" title=\"Support the creator\">\r\n    <div class=\"linden-circle\" id=\"n-icon\">L$<\/div>\r\n    \r\n    <div class=\"nice-content\">\r\n        <span class=\"nice-title\" id=\"n-title\">Love our tools?<\/span>\r\n        <span class=\"nice-subtext\" id=\"n-sub\">Click to tip: OG.Resident<\/span>\r\n    <\/div>\r\n<\/div>\r\n\r\n<script>\r\nfunction copyNiceName() {\r\n    const avatar = \"OG.Resident\";\r\n    const profileURL = \"secondlife:\/\/\/app\/agent\/8e7df4ff-0d3f-4763-b840-e012b30a8c19\/about\";\r\n    \r\n    navigator.clipboard.writeText(avatar).then(() => {\r\n        const title = document.getElementById('n-title');\r\n        const sub = document.getElementById('n-sub');\r\n        const icon = document.getElementById('n-icon');\r\n\r\n        title.innerText = \"You're amazing!\";\r\n        title.classList.add('success-text');\r\n        sub.innerText = \"Name copied. Opening profile...\";\r\n        icon.innerHTML = \"<i class='fas fa-heart'><\/i>\";\r\n        icon.style.background = \"#00ffbb\";\r\n\r\n        window.location.href = profileURL;\r\n\r\n        setTimeout(() => {\r\n            title.innerText = \"Love our tools?\";\r\n            title.classList.remove('success-text');\r\n            sub.innerText = \"Click to tip: \" + avatar;\r\n            icon.innerText = \"L$\";\r\n            icon.style.background = \"linear-gradient(135deg, #440066, #7c4dff)\";\r\n        }, 4000);\r\n    });\r\n}\r\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div data-particle_enable=\"false\" data-particle-mobile-disabled=\"false\" class=\"elementor-element elementor-element-ece22fc e-con-full e-flex e-con e-parent\" data-id=\"ece22fc\" data-element_type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-136732a elementor-widget elementor-widget-html\" data-id=\"136732a\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<div class=\"asl-wrapper\">\r\n  <style>\r\n    \/* Elementor Global Defaults (assuming a dark theme) *\/\r\n    .asl-wrapper { \r\n      font-family: var(--e-global-typography-text-font-family, \"Onest\", sans-serif); \r\n      color: var(--e-global-color-text, #ABABAB); \/* Light gray for main text *\/\r\n      font-size: 14px;\r\n    }\r\n    \r\n    \/* Matching the Dark, Bordered, and Shadowed style:\r\n      - Background is very dark\/black.\r\n      - Subtle 1px border.\r\n      - Box-shadow for depth.\r\n      - Accent color is a white\/light color.\r\n    *\/\r\n    \r\n    .asl-card { \r\n      background: #0A0A0A; \/* Very dark background *\/\r\n      border-radius: 4px; \/* Slightly sharper corners *\/\r\n      padding: 18px; \r\n      box-shadow: 0 0 10px rgba(0,0,0,0.5); \/* Subtle shadow for depth *\/\r\n      border: 1px solid rgba(255,255,255,0.08); \/* Light, subtle border *\/\r\n    }\r\n    \r\n.asl-container { \r\n  width: 100%;\r\n  max-width: 100%;\r\n  margin: 0;\r\n  display: grid; \r\n  grid-template-columns: 1fr 420px; \r\n  gap: 20px;\r\n  align-items: start;\r\n  box-sizing: border-box;\r\n}\r\n    \r\n    .asl-header { \r\n      display: flex; \r\n      justify-content: space-between; \r\n      gap: 12px; \r\n      margin-bottom: 15px; \r\n      border-bottom: 1px solid rgba(255,255,255,0.05); \/* Separator line *\/\r\n      padding-bottom: 15px;\r\n    }\r\n    \r\n    .asl-title { \r\n      display: flex; \r\n      align-items: center;\r\n    }\r\n    \r\n    .asl-title h1 { \r\n      margin: 0; \r\n      font-size: 20px; \/* Slightly larger title *\/\r\n      color: var(--e-global-color-accent, #FFFFFF); \r\n      font-weight: 700; \/* Bolder font *\/\r\n      letter-spacing: 0.5px;\r\n    }\r\n    \r\n    .asl-lead { \r\n      margin: 0; \r\n      color: var(--e-global-color-text, #999999); \/* Slightly darker gray *\/\r\n      font-size: 14px;\r\n    }\r\n    \r\n    \/* Input\/Drop Zone Styles *\/\r\n    .asl-drop { \r\n      border: 2px dashed rgba(255,255,255,0.15); \/* More visible dashed line *\/\r\n      border-radius: 4px; \r\n      padding: 25px 18px; \/* More vertical padding *\/\r\n      display: flex; \r\n      gap: 12px; \r\n      align-items: center; \r\n      justify-content: center; \/* Center text *\/\r\n      background: rgba(255,255,255,0.01); \/* Very slight background tint *\/\r\n      cursor: copy; \r\n      transition: all .2s ease;\r\n      font-size: 16px;\r\n    }\r\n    \r\n    .asl-drop.drag { \r\n      border-color: var(--e-global-color-accent, #FFFFFF); \/* White\/accent on drag *\/\r\n      transform: scale(1.01); \/* Subtle lift on drag *\/\r\n      background: rgba(255,255,255,0.03);\r\n    }\r\n    \r\n    .asl-controls { \r\n      display: flex; \r\n      gap: 10px; \r\n      align-items: center; \r\n      margin-top: 15px;\r\n      justify-content: flex-start; \/* Align buttons to the left *\/\r\n    }\r\n    \r\n    \/* Button Styles to match screenshot\r\n       - Fixed width for consistent sizing.\r\n    *\/\r\n    .asl-button {\r\n      flex: 1; \/* Allow buttons to take equal space *\/\r\n      min-width: 180px; \/* Set a minimum width *\/\r\n      max-width: 380px; \/* Set a maximum width *\/\r\n      padding: 12px 18px; \r\n      border-radius: 4px; \r\n      border: none; \/* No border *\/\r\n      color: var(--e-global-color-accent, #FFFFFF); \r\n      font-weight: 600; \r\n      cursor: pointer;\r\n      transition: background 0.2s ease, transform 0.1s ease;\r\n      text-transform: uppercase;\r\n      letter-spacing: 1px;\r\n      font-size: 13px;\r\n      display: flex; \r\n      align-items: center;\r\n      justify-content: center;\r\n      gap: 12px; \/* INCREASED GAP for button spacing fix *\/\r\n    }\r\n\r\n    \/* Specific styles for each button to match distinct colors *\/\r\n    #splitBtn {\r\n      background: #5D0090; \/* Dark purple\/magenta *\/\r\n    }\r\n    #splitBtn:hover:not(:disabled) {\r\n      background: #8A00C0; \/* Lighter purple on hover *\/\r\n      transform: translateY(-1px);\r\n    }\r\n\r\n    #zipBtn {\r\n      background: #004A8F; \/* Dark blue *\/\r\n    }\r\n    #zipBtn:hover:not(:disabled) {\r\n      background: #007CE0; \/* Lighter blue on hover *\/\r\n      transform: translateY(-1px);\r\n    }\r\n    \r\n    .asl-button:disabled {\r\n        opacity: 0.5;\r\n        cursor: not-allowed;\r\n        background: #333333 !important; \/* Disabled background *\/\r\n        color: #AAAAAA !important;\r\n        transform: none !important;\r\n    }\r\n\r\n    .asl-button i {\r\n        font-size: 16px; \/* Icon size *\/\r\n    }\r\n\r\n    .asl-meta { \r\n      font-size: 12px; \r\n      color: var(--e-global-color-text, #777777); \/* Darker gray for meta text *\/\r\n    }\r\n    \r\n    .asl-wave { \r\n      width: 100%; \r\n      height: 84px; \r\n      border-radius: 4px; \r\n      \/* Updated background to match the dark aesthetic *\/\r\n      background: #050505; \r\n      border: 1px solid rgba(255,255,255,0.06); \r\n      margin-top: 15px;\r\n    }\r\n    \r\n    \/* File List\/Segments styles *\/\r\n    .asl-list { \r\n      display: flex; \r\n      flex-direction: column; \r\n      gap: 6px; \r\n      max-height: 400px; \r\n      overflow-y: auto; \r\n      padding-right: 6px;\r\n      margin-top: 10px;\r\n    }\r\n    \r\n    .asl-list::-webkit-scrollbar { width: 6px; }\r\n    .asl-list::-webkit-scrollbar-thumb { background: rgba(255,255,255,0.15); border-radius: 3px; }\r\n    .asl-list::-webkit-scrollbar-track { background: transparent; }\r\n    \r\n    .asl-file { \r\n      display: flex; \r\n      justify-content: space-between; \r\n      align-items: center; \r\n      gap: 8px; \r\n      padding: 8px 10px; \r\n      border-radius: 4px; \r\n      background: rgba(255,255,255,0.03); \/* Subtle dark file background *\/\r\n      border: 1px solid transparent;\r\n      transition: background 0.15s ease;\r\n    }\r\n    .asl-file:hover {\r\n        background: rgba(255,255,255,0.05);\r\n    }\r\n    \r\n    \/* LSL Textarea and Form *\/\r\n    .asl-lsl { \r\n      width: 100%; \r\n      height: 250px; \/* Slightly shorter *\/\r\n      margin-top: 12px; \r\n      background: #000000; \/* Pure black for code blocks *\/\r\n      border-radius: 4px; \r\n      padding: 12px; \r\n      font-family: monospace; \r\n      color: #00FF99; \/* Green\/Cyan color for code readability *\/\r\n      overflow: auto; \r\n      resize: vertical;\r\n      border: 1px solid rgba(255,255,255,0.06);\r\n      font-size: 12px;\r\n      line-height: 1.4;\r\n    }\r\n\r\n    .asl-form-row {\r\n        display: flex;\r\n        justify-content: space-between;\r\n        align-items: center;\r\n        margin-top: 5px;\r\n        font-size: 14px;\r\n    }\r\n\r\n    .asl-form-row label {\r\n        color: var(--e-global-color-accent, #FFFFFF);\r\n        font-weight: 600;\r\n    }\r\n\r\n    .asl-form-row input {\r\n        width: 80px;\r\n        padding: 6px 8px;\r\n        border-radius: 4px;\r\n        border: 1px solid rgba(255,255,255,0.1);\r\n        background: #000000;\r\n        color: var(--e-global-color-accent, #FFFFFF);\r\n        font-size: 14px;\r\n    }\r\n    \r\n    \/* Media Query *\/\r\n    @media(max-width:980px){ \r\n      .asl-container{ grid-template-columns: 1fr; } \r\n      .asl-controls { \r\n          flex-direction: column; \/* Stack buttons vertically on small screens *\/\r\n          align-items: stretch; \/* Make them full width *\/\r\n      }\r\n      .asl-button {\r\n          min-width: unset; \/* Remove min-width constraint *\/\r\n          max-width: unset; \/* Remove max-width constraint *\/\r\n          width: 100%; \/* Make them full width *\/\r\n      }\r\n    }\r\n  <\/style>\r\n\r\n  <div class=\"asl-card asl-container\" id=\"aslApp\">\r\n    <div>\r\n      <div class=\"asl-header\">\r\n        <div class=\"asl-title\">\r\n          \r\n<div>\r\n            <h1>Audio Splitter \u2014 30s WAVs<\/h1>\r\n            <p class=\"asl-lead\">Drop audio to generate Second Life-ready WAVs + auto LSL script.<\/p>\r\n          <\/div>\r\n        <\/div>\r\n      <\/div>\r\n\r\n      <div id=\"dropZone\" class=\"asl-drop\">\r\n        <strong style=\"color:var(--e-global-color-accent,#FFFFFF)\">Drop file here<\/strong>\r\n      <\/div>\r\n\r\n      <div class=\"asl-controls\">\r\n        \r\n<button id=\"splitBtn\" class=\"asl-button\" disabled><i class=\"fas fa-cut\"><\/i> SPLIT INTO 30S SEGMENTS<\/button>\r\n        <button id=\"zipBtn\" class=\"asl-button\" disabled><i class=\"fas fa-download\"><\/i> DOWNLOAD ZIP<\/button>\r\n      <\/div>\r\n\r\n      <div class=\"asl-wave\"><canvas id=\"waveCanvas\" width=\"800\" height=\"160\" style=\"width:100%;height:84px;\"><\/canvas><\/div>\r\n    <\/div>\r\n\r\n    <aside>\r\n      <div class=\"asl-card\" style=\"padding:14px;\">\r\n        <div style=\"display:flex;justify-content:space-between;align-items:center;\">\r\n          <div><strong>Segments<\/strong><div class=\"asl-meta\">Generated WAV files<\/div><\/div>\r\n          <div id=\"countMeta\" class=\"asl-meta\">0 files<\/div>\r\n        <\/div>\r\n        <div id=\"filesList\" class=\"asl-list\"><\/div>\r\n\r\n        <div style=\"border-top:1px dashed rgba(255,255,255,0.06);padding-top:12px;margin-top:12px\">\r\n          <div class=\"asl-form-row\">\r\n            <label for=\"lsl_volume\">Volume (0.0 - 2.0)<\/label>\r\n            <input id=\"lsl_volume\" type=\"number\" step=\"0.1\" min=\"0\" max=\"2\" value=\"1.0\" \/>\r\n          <\/div>\r\n\r\n          <div class=\"asl-meta\" style=\"margin-top:8px\">Drop WAVs & LSL into prim. Filenames must match script (no \".wav\").<\/div>\r\n\r\n          <textarea id=\"lslTextarea\" class=\"asl-lsl\" readonly placeholder=\"Generated LSL script will appear here after splitting...\"><\/textarea>\r\n        <\/div>\r\n      <\/div>\r\n    <\/aside>\r\n  <\/div>\r\n<\/div>\r\n\r\n<link rel=\"stylesheet\" href=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/font-awesome\/5.15.3\/css\/all.min.css\">\r\n<script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/jszip\/3.10.1\/jszip.min.js\"><\/script>\r\n<script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/FileSaver.js\/2.0.5\/FileSaver.min.js\"><\/script>\r\n\r\n<script>\r\ndocument.addEventListener('DOMContentLoaded', function() {\r\n  const SEG_SECONDS=30,SAMPLE_LIMIT=1323000,SAMPLE_RATE=44100;\r\n  const dropZone=document.getElementById('dropZone'),splitBtn=document.getElementById('splitBtn');\r\n  const zipBtn=document.getElementById('zipBtn'),filesList=document.getElementById('filesList'),countMeta=document.getElementById('countMeta');\r\n  const waveCanvas=document.getElementById('waveCanvas'),ctx=waveCanvas.getContext('2d');\r\n  const lslVolume=document.getElementById('lsl_volume'),lslTextarea=document.getElementById('lslTextarea');\r\n  let currentFile=null,audioBuffer=null,generatedFiles=[];\r\n\r\n  function resetUI(){filesList.innerHTML='';generatedFiles=[];countMeta.textContent='0 files';splitBtn.disabled=true;zipBtn.disabled=true;lslTextarea.value='';clearWave();}\r\n  function clearWave(){ctx.clearRect(0,0,waveCanvas.width,waveCanvas.height);ctx.fillStyle='rgba(255,255,255,0.02)';ctx.fillRect(0,0,waveCanvas.width,waveCanvas.height);ctx.fillStyle='rgba(255,255,255,0.04)';ctx.font='14px sans-serif';ctx.fillText('Waveform will appear here',12,24);}\r\n  resetUI();\r\n\r\n  \/\/ Utility to generate\/update the LSL script\r\n  function generateLSLScript(filenameBase, fileCount, volume) {\r\n    if (fileCount === 0 || !filenameBase) return;\r\n    const digits = 2, startIndex = 1;\r\n    const lines = [];\r\n    \r\n    \/\/ Convert volume to a float string with one decimal place\r\n    const safeVolume = Math.min(2.0, Math.max(0.0, parseFloat(volume) || 1.0)).toFixed(1);\r\n\r\n    lines.push('\/\/ :CATEGORY: Music');\r\n    lines.push('\/\/ :NAME:Generated_Music_Script');\r\n    lines.push('\/\/ :AUTHOR:Generated by AltSL.com Audios Splitter');\r\n    lines.push('string stringnum(integer number, integer digits){string curstring=(string)number;while(llStringLength(curstring)<digits){curstring=\"0\"+curstring;}return curstring;}');\r\n    lines.push('integer curfile;integer totalfiles='+fileCount+';integer digits='+digits+';string firstsongname=\"'+filenameBase+'-\";string secondsongname=\"\";float volume='+safeVolume+';');\r\n    lines.push('default{state_entry(){llSetSoundQueueing(TRUE);curfile='+startIndex+';if(totalfiles>=1)llPreloadSound(firstsongname+stringnum(curfile,digits)+secondsongname);if(totalfiles>=2)llPreloadSound(firstsongname+stringnum(curfile+1,digits)+secondsongname);llSetTimerEvent(30.0);if(totalfiles>=1)llPlaySound(firstsongname+stringnum(curfile,digits)+secondsongname,volume);curfile+=1;}');\r\n    lines.push('timer(){if(curfile>totalfiles){curfile='+startIndex+';}if(curfile+1<=totalfiles)llPreloadSound(firstsongname+stringnum(curfile+1,digits)+secondsongname);llPlaySound(firstsongname+stringnum(curfile,digits)+secondsongname,volume);curfile+=1;}');\r\n    lines.push('on_rez(integer param){llResetScript();}}\/\/ END \/\/');\r\n    \r\n    lslTextarea.value = lines.join('\\n');\r\n  }\r\n\r\n  \/\/ Live Volume Change Listener\r\n  lslVolume.addEventListener('input', () => {\r\n    if (generatedFiles.length > 0 && currentFile) {\r\n        const baseName = currentFile.name.replace(\/\\.[^\/.]+$\/,'');\r\n        generateLSLScript(baseName, generatedFiles.length, lslVolume.value);\r\n    }\r\n  });\r\n\r\n  \/\/ Drag & Drop Events\r\n  ['dragenter','dragover'].forEach(e=>dropZone.addEventListener(e, event=>{event.preventDefault();event.stopPropagation();dropZone.classList.add('drag');}));\r\n  ['dragleave','drop'].forEach(e=>dropZone.addEventListener(e, event=>{event.preventDefault();event.stopPropagation();dropZone.classList.remove('drag');}));\r\n  dropZone.addEventListener('drop', async event=>{\r\n    const dt = event.dataTransfer;\r\n    if(!dt || !dt.files || dt.files.length===0) return;\r\n    await loadFile(dt.files[0]);\r\n  });\r\n\r\n  async function loadFile(file){\r\n    resetUI();currentFile=file;\r\n    const arrayBuffer = await file.arrayBuffer();\r\n    const decodeCtx = new (window.AudioContext||window.webkitAudioContext)();\r\n    audioBuffer = await decodeCtx.decodeAudioData(arrayBuffer);\r\n    decodeCtx.close();\r\n    drawWave(audioBuffer);\r\n    splitBtn.disabled=false;\r\n  }\r\n\r\n  function drawWave(abuf){\r\n    const w=waveCanvas.width=waveCanvas.clientWidth*devicePixelRatio;\r\n    const h=waveCanvas.height=84*devicePixelRatio;\r\n    ctx.clearRect(0,0,w,h);\r\n    ctx.fillStyle='rgba(0,0,0,0.04)';ctx.fillRect(0,0,w,h);\r\n    const data=abuf.numberOfChannels===1?abuf.getChannelData(0):mixToMono(abuf);\r\n    const step=Math.ceil(data.length\/w),amp=h\/2;\r\n    ctx.lineWidth=1*devicePixelRatio;ctx.strokeStyle='rgba(255,255,255,0.7)';ctx.beginPath();\r\n    for(let i=0;i<w;i++){const start=i*step;let min=1,max=-1;for(let j=0;j<step;j++){const v=data[start+j];if(v<min)min=v;if(v>max)max=v;}ctx.moveTo(i,(1+min)*amp);ctx.lineTo(i,(1+max)*amp);}\r\n    ctx.stroke();\r\n  }\r\n\r\n  function mixToMono(abuf){const out=new Float32Array(abuf.length);for(let ch=0;ch<abuf.numberOfChannels;ch++){const chd=abuf.getChannelData(ch);for(let i=0;i<abuf.length;i++)out[i]+=chd[i]\/abuf.numberOfChannels;}return out;}\r\n\r\n  function renderBufferToWav(buffer,bitDepth=16){const numChannels=buffer.numberOfChannels;const sampleRate=buffer.sampleRate;const bytesPerSample=bitDepth\/8;const blockAlign=numChannels*bytesPerSample;const dataLength=buffer.length*blockAlign;const bufferLength=44+dataLength;const arrayBuffer=new ArrayBuffer(bufferLength);const view=new DataView(arrayBuffer);writeString(view,0,'RIFF');view.setUint32(4,36+dataLength,true);writeString(view,8,'WAVE');writeString(view,12,'fmt ');view.setUint32(16,16,true);view.setUint16(20,1,true);view.setUint16(22,numChannels,true);view.setUint32(24,sampleRate,true);view.setUint32(28,sampleRate*blockAlign,true);view.setUint16(32,blockAlign,true);view.setUint16(34,bitDepth,true);writeString(view,36,'data');view.setUint32(40,dataLength,true);let offset=44;const channelData=[];for(let ch=0;ch<numChannels;ch++)channelData.push(buffer.getChannelData(ch));for(let i=0;i<buffer.length;i++){for(let ch=0;ch<numChannels;ch++){let sample=channelData[ch][i]||0;sample=Math.max(-1,Math.min(1,sample));const intSample=sample<0?sample*0x8000:sample*0x7FFF;view.setInt16(offset,Math.round(intSample),true);offset+=2;}}return new Blob([arrayBuffer],{type:'audio\/wav'});}\r\n  function writeString(view,offset,string){for(let i=0;i<string.length;i++)view.setUint8(offset+i,string.charCodeAt(i));}\r\n\r\n  splitBtn.addEventListener('click',async ()=>{\r\n    if(!audioBuffer||!currentFile)return;\r\n    splitBtn.disabled=true;zipBtn.disabled=true;lslTextarea.value='';\r\n    filesList.innerHTML='';generatedFiles=[];\r\n    const totalSegments=Math.ceil(audioBuffer.duration\/SEG_SECONDS);\r\n    for(let i=0;i<totalSegments;i++){\r\n      const start=i*SEG_SECONDS;\r\n      const segLength=Math.min(SEG_SECONDS,audioBuffer.duration-start);\r\n      const offlineCtx=new OfflineAudioContext(audioBuffer.numberOfChannels,SAMPLE_LIMIT,SAMPLE_RATE);\r\n      const source=offlineCtx.createBufferSource();source.buffer=audioBuffer;source.connect(offlineCtx.destination);source.start(0,start,segLength);\r\n      const rendered=await offlineCtx.startRendering();\r\n      const fixed=new Float32Array(SAMPLE_LIMIT);\r\n      const chd=rendered.numberOfChannels>1?mixToMono(rendered):rendered.getChannelData(0);\r\n      fixed.set(chd.subarray(0,SAMPLE_LIMIT));\r\n      const finalBuf=new AudioBuffer({length:SAMPLE_LIMIT,numberOfChannels:1,sampleRate:SAMPLE_RATE});finalBuf.copyToChannel(fixed,0,0);\r\n      const wavBlob=renderBufferToWav(finalBuf);\r\n      const baseName=currentFile.name.replace(\/\\.[^\/.]+$\/,'');\r\n      const filename=`${baseName}-${String(i+1).padStart(2,'0')}.wav`;\r\n      generatedFiles.push({name:filename,blob:wavBlob});\r\n      const row=document.createElement('div');row.className='asl-file';\r\n      const left=document.createElement('div');left.textContent=filename;\r\n      const actions=document.createElement('div');const dl=document.createElement('a');dl.className='asl-smallbtn';dl.textContent='Download';dl.href=URL.createObjectURL(wavBlob);dl.download=filename;actions.appendChild(dl);\r\n      row.appendChild(left);row.appendChild(actions);filesList.appendChild(row);\r\n    }\r\n    countMeta.textContent=`${generatedFiles.length} files`;\r\n    zipBtn.disabled=generatedFiles.length===0;\r\n\r\n    \/\/ Auto-generate LSL\r\n    const baseName=currentFile.name.replace(\/\\.[^\/.]+$\/,'');\r\n    generateLSLScript(baseName, generatedFiles.length, lslVolume.value);\r\n  });\r\n\r\n  zipBtn.addEventListener('click', async ()=>{\r\n    if(!generatedFiles.length)return;\r\n    const zip=new JSZip();const folder=zip.folder('split-audio');\r\n    for(const f of generatedFiles)folder.file(f.name,f.blob);\r\n    const zipBlob=await zip.generateAsync({type:'blob'});\r\n    saveAs(zipBlob,'split-audio.zip');\r\n  });\r\n});\r\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>SL AUDIO SPLITTER &amp; LSL GENERATOR Split tracks precisely and get the LSL script instantly L$ Love our tools? Click to tip: OG.Resident Audio Splitter \u2014 30s WAVs Drop audio to generate Second Life-ready WAVs + auto LSL script. Drop file here SPLIT INTO 30S SEGMENTS DOWNLOAD ZIP SegmentsGenerated WAV files 0 files Volume (0.0 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":482,"parent":1613,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-1505","page","type-page","status-publish","has-post-thumbnail","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Second Life Audio Splitter &amp; LSL Generator - Alt Weekend Sales<\/title>\n<meta name=\"description\" content=\"The fastest way to prep audio for Second Life. Split tracks and get the LSL script instantly. Upload, split, and script\u2014all in one place.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/altsl.com\/pt\/tools\/audio-splitter\/\" \/>\n<meta property=\"og:locale\" content=\"pt_PT\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Second Life Audio Splitter &amp; LSL Generator - Alt Weekend Sales\" \/>\n<meta property=\"og:description\" content=\"The fastest way to prep audio for Second Life. Split tracks and get the LSL script instantly. Upload, split, and script\u2014all in one place.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/altsl.com\/pt\/tools\/audio-splitter\/\" \/>\n<meta property=\"og:site_name\" content=\"Alt Weekend Sales\" \/>\n<meta property=\"article:modified_time\" content=\"2026-04-21T21:42:08+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/altsl.com\/wp-content\/uploads\/2025\/10\/Alt_Banner.png\" \/>\n\t<meta property=\"og:image:width\" content=\"851\" \/>\n\t<meta property=\"og:image:height\" content=\"284\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Tempo estimado de leitura\" \/>\n\t<meta name=\"twitter:data1\" content=\"3 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/altsl.com\\\/tools\\\/audio-splitter\\\/\",\"url\":\"https:\\\/\\\/altsl.com\\\/tools\\\/audio-splitter\\\/\",\"name\":\"Second Life Audio Splitter & LSL Generator - Alt Weekend Sales\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/altsl.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/altsl.com\\\/tools\\\/audio-splitter\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/altsl.com\\\/tools\\\/audio-splitter\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/altsl.com\\\/wp-content\\\/uploads\\\/2025\\\/10\\\/Alt_Banner.png\",\"datePublished\":\"2025-10-22T14:28:19+00:00\",\"dateModified\":\"2026-04-21T21:42:08+00:00\",\"description\":\"The fastest way to prep audio for Second Life. Split tracks and get the LSL script instantly. Upload, split, and script\u2014all in one place.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/altsl.com\\\/tools\\\/audio-splitter\\\/#breadcrumb\"},\"inLanguage\":\"pt-PT\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/altsl.com\\\/tools\\\/audio-splitter\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-PT\",\"@id\":\"https:\\\/\\\/altsl.com\\\/tools\\\/audio-splitter\\\/#primaryimage\",\"url\":\"https:\\\/\\\/altsl.com\\\/wp-content\\\/uploads\\\/2025\\\/10\\\/Alt_Banner.png\",\"contentUrl\":\"https:\\\/\\\/altsl.com\\\/wp-content\\\/uploads\\\/2025\\\/10\\\/Alt_Banner.png\",\"width\":851,\"height\":284},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/altsl.com\\\/tools\\\/audio-splitter\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/altsl.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Tools\",\"item\":\"https:\\\/\\\/altsl.com\\\/tools\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Audio Splitter\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/altsl.com\\\/#website\",\"url\":\"https:\\\/\\\/altsl.com\\\/\",\"name\":\"Alt Weekend Sale\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/altsl.com\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/altsl.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pt-PT\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/altsl.com\\\/#organization\",\"name\":\"Alt Weekend Sale\",\"url\":\"https:\\\/\\\/altsl.com\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-PT\",\"@id\":\"https:\\\/\\\/altsl.com\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/altsl.com\\\/wp-content\\\/uploads\\\/2025\\\/10\\\/OBzIOE4.png\",\"contentUrl\":\"https:\\\/\\\/altsl.com\\\/wp-content\\\/uploads\\\/2025\\\/10\\\/OBzIOE4.png\",\"width\":1024,\"height\":747,\"caption\":\"Alt Weekend Sale\"},\"image\":{\"@id\":\"https:\\\/\\\/altsl.com\\\/#\\\/schema\\\/logo\\\/image\\\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Divisor de \u00c1udio e Gerador LSL para Second Life - Alt Weekend Sales","description":"A maneira mais r\u00e1pida de preparar \u00e1udio para Second Life. Divida faixas e obtenha o script LSL instantaneamente. Carregue, divida e crie o script\u2014tudo em um s\u00f3 lugar.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/altsl.com\/pt\/tools\/audio-splitter\/","og_locale":"pt_PT","og_type":"article","og_title":"Second Life Audio Splitter & LSL Generator - Alt Weekend Sales","og_description":"The fastest way to prep audio for Second Life. Split tracks and get the LSL script instantly. Upload, split, and script\u2014all in one place.","og_url":"https:\/\/altsl.com\/pt\/tools\/audio-splitter\/","og_site_name":"Alt Weekend Sales","article_modified_time":"2026-04-21T21:42:08+00:00","og_image":[{"width":851,"height":284,"url":"https:\/\/altsl.com\/wp-content\/uploads\/2025\/10\/Alt_Banner.png","type":"image\/png"}],"twitter_card":"summary_large_image","twitter_misc":{"Tempo estimado de leitura":"3 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/altsl.com\/tools\/audio-splitter\/","url":"https:\/\/altsl.com\/tools\/audio-splitter\/","name":"Divisor de \u00c1udio e Gerador LSL para Second Life - Alt Weekend Sales","isPartOf":{"@id":"https:\/\/altsl.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/altsl.com\/tools\/audio-splitter\/#primaryimage"},"image":{"@id":"https:\/\/altsl.com\/tools\/audio-splitter\/#primaryimage"},"thumbnailUrl":"https:\/\/altsl.com\/wp-content\/uploads\/2025\/10\/Alt_Banner.png","datePublished":"2025-10-22T14:28:19+00:00","dateModified":"2026-04-21T21:42:08+00:00","description":"A maneira mais r\u00e1pida de preparar \u00e1udio para Second Life. Divida faixas e obtenha o script LSL instantaneamente. Carregue, divida e crie o script\u2014tudo em um s\u00f3 lugar.","breadcrumb":{"@id":"https:\/\/altsl.com\/tools\/audio-splitter\/#breadcrumb"},"inLanguage":"pt-PT","potentialAction":[{"@type":"ReadAction","target":["https:\/\/altsl.com\/tools\/audio-splitter\/"]}]},{"@type":"ImageObject","inLanguage":"pt-PT","@id":"https:\/\/altsl.com\/tools\/audio-splitter\/#primaryimage","url":"https:\/\/altsl.com\/wp-content\/uploads\/2025\/10\/Alt_Banner.png","contentUrl":"https:\/\/altsl.com\/wp-content\/uploads\/2025\/10\/Alt_Banner.png","width":851,"height":284},{"@type":"BreadcrumbList","@id":"https:\/\/altsl.com\/tools\/audio-splitter\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/altsl.com\/"},{"@type":"ListItem","position":2,"name":"Tools","item":"https:\/\/altsl.com\/tools\/"},{"@type":"ListItem","position":3,"name":"Audio Splitter"}]},{"@type":"WebSite","@id":"https:\/\/altsl.com\/#website","url":"https:\/\/altsl.com\/","name":"Alt Weekend Sale","description":"","publisher":{"@id":"https:\/\/altsl.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/altsl.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pt-PT"},{"@type":"Organization","@id":"https:\/\/altsl.com\/#organization","name":"Alt Weekend Sale","url":"https:\/\/altsl.com\/","logo":{"@type":"ImageObject","inLanguage":"pt-PT","@id":"https:\/\/altsl.com\/#\/schema\/logo\/image\/","url":"https:\/\/altsl.com\/wp-content\/uploads\/2025\/10\/OBzIOE4.png","contentUrl":"https:\/\/altsl.com\/wp-content\/uploads\/2025\/10\/OBzIOE4.png","width":1024,"height":747,"caption":"Alt Weekend Sale"},"image":{"@id":"https:\/\/altsl.com\/#\/schema\/logo\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/altsl.com\/pt\/wp-json\/wp\/v2\/pages\/1505","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/altsl.com\/pt\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/altsl.com\/pt\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/altsl.com\/pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/altsl.com\/pt\/wp-json\/wp\/v2\/comments?post=1505"}],"version-history":[{"count":63,"href":"https:\/\/altsl.com\/pt\/wp-json\/wp\/v2\/pages\/1505\/revisions"}],"predecessor-version":[{"id":5936,"href":"https:\/\/altsl.com\/pt\/wp-json\/wp\/v2\/pages\/1505\/revisions\/5936"}],"up":[{"embeddable":true,"href":"https:\/\/altsl.com\/pt\/wp-json\/wp\/v2\/pages\/1613"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/altsl.com\/pt\/wp-json\/wp\/v2\/media\/482"}],"wp:attachment":[{"href":"https:\/\/altsl.com\/pt\/wp-json\/wp\/v2\/media?parent=1505"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}