
    UHjP                    N   d Z ddlmZ ddlZddlZddlZddlZddlmZ ddl	m
Z
 ddlmZ ddlmZmZ  e
e      j#                         j$                  d   Zed	z  Zd
dddZddZddZddZddZd dZd dZd!dZd!dZefd"dZd#dZd$dZ efd%dZ!d&dZ"e#dk(  r e"        yy)'z;Summarize where WLK and MLK audio display titles come from.    )annotationsN)Counter)Path)Any)load_mlk_archiveload_wlk_archive   outz	title bgmzmap bgmz
battle bgm)000108c                    d}t        d      D ];  }|t        |       k\  rt        d      | |   }|dz  }|dz  |dz  z  }|dz  r7||fc S  ||fS )Nr      z'unterminated MIDI variable-length valuer	            )rangelen
ValueError)dataoffsetvalue_bytes        =/home/exedev/hwanse/tools/summarize_audio_title_provenance.pyread_varlenr      ss    E1X !SYFGGF|!!t,d{&= ! &=    c                    dD ]  }	 | j                  |      } n | j                  dd      }|j                  dd      j                         S # t        $ r Y Vw xY w)N)cp932	shift_jisutf-8r   replace)errors  )decodeUnicodeDecodeErrorr"   strip)payloadencodingtexts      r   decode_textr,   &   si    3 9	>>(+D9 ~~gi~8<<#))++	 " 		s   A	AAc           
        | d d dk7  rt        d      t        j                  d| d      d   }| dd|z    }t        |      dk  rt        d      t        j                  d	|d      \  }}}d|z   }g }g }d}	t	        |      D ]V  }
| ||dz    d
k7  rt        d|d      t        j                  d| |dz         d   }|dz  }||z   }d }|	dz  }	||k  rt        | |      \  }}||k\  rn|}| |   }|dz  r|dz  }|dk  r|}n||}nt        d      |dk(  rz||k\  rn| |   }|dz  }t        | |      \  }}| |||z    }||z  }|dk(  rCt        |      }|j                  |d|d||t        |       d       |r|j                  |       |dk(  r@nF|dv rt        | |      \  }}||z  }n&|dz  }|dv rdnd}| |dz
     dz  r||z  }n||dz
  z  }||k  r|}Y ||	|||dS )Nr   s   MThdz%MIDI payload does not start with MThdz>Ir         zshort MIDI headerz>HHHs   MTrkzmissing MTrk at 0xxr	   r      z3MIDI running status without previous channel status      0x04X)r   	offsetHexlengthr+   empty/   )r1      )         )format
trackCountdivision
trackNamestrackNameEvents)	r   structunpack_fromr   r   r   r,   appendbool)r)   header_sizeheaderfmttrack_countr@   r   namestrack_name_eventstracks_seen_track_index
track_sizeendrunning_status_deltastatus_offsetstatus	meta_typer7   meta_payloadr+   
event_typedata_lens                          r   parse_midi_track_namesrY   2   s   r{g@AA$$T7A6q9KQq;'F
6{Q,--!'!3!3FFA!FCh_FE.0Kk* 86&1*%01&<==''gvzB1E
!z!%)qsl(&9NFF}"MV_F}!D=%+N+' !VWW~S=#FO	!!,Wf!=&vfvo>& $&|4D%,,&3+-mC-@)A&,$()-d^ T*$<'!,Wf!=& #d]
 *l :16A:&-h&Fhl*F_ sl` q8t !, r   c                P   | dz  dz  }|j                         sy|j                  d      }d| d}|j                  |      }|dk  ry|j                  d	|      }|dk  ryd}t        |t	        |            D ],  }||   }|d	k(  r|d
z  }|dk(  s|d
z  }|dk(  s$||d
z   | c S  y)Nwebz	game.htmlr%   r!   r*   zconst z = {r   {r	   })exists	read_textfindr   r   )	rootnamepathr+   markerstartdepthindexchars	            r   extract_web_game_blockrj      s    %<+%D;;=>>7>+DdV5!FIIfEqyIIc5!EqyEuc$i( -E{3;QJES[QJEzEAIe,,- r   c           	        t        | d      }g }|j                         D ]  }|j                         j                  d      }|rd|vr)|j	                  dd      \  }}|j                         }|j                         j                  d      }|j                  d      r|j                  d      st        |      j                  }|j                         s|j                  ||d| dd	d
d        |S )NSOUND_ASSETS,:r	   "z../extract_wlk/.wavextract_wlk/z2web/game.html SOUND_ASSETS browser cue key; EXE idFkeyexeIdfilesourceisArchiveTitle)rj   
splitlinesr(   rstripsplit
startswithendswithr   stemisdigitrE   )rb   blockrowslinestrippedrs   r   exe_ids           r   extract_web_game_wlk_cuesr      s    "48E!#D  " 
::<&&s+3h.^^C+
Uiik##C( 12%..:Pe!!~~&vhd3N"'	

* Kr   c           	        t        | d      }g }|j                         D ]I  }|j                         j                  d      }|rd|vsd|vr.|j	                  dd      d   j                         }|}d}d}d	}	d
}
||v r(|j	                  |d      d   j	                  dd      d   }|j	                  |d      d   j	                  dd      d   }d}|
|v r(|j	                  |
d      d   j	                  dd      d   }t        |      }|	|v r?t        |j	                  |	d      d   j	                  dd      d   j                               }|j                  ||d| dd| ddd       L |S )N
MUSIC_CUESrm   rn   z../extract_mlk/r	   r   zkey: "zsrc: "../extract_mlk/zindex: z	source: "ro   .midMIDDATA.MLKextract_mlk/z2web/game.html MUSIC_CUES browser cue key; archive=z; EXE idFrr   )rj   rx   r(   ry   rz   intrE   )rb   r   r   r   r   cue_namers   
key_marker
src_markerindex_markersource_markerr   rv   rh   s                 r   extract_web_game_mlk_cuesr      s   "46E!#D  " 
::<&&s+3h.2C82S>>#q)!,224
,
 #!..Q/288a@CC
A.q177B1EH$^^M15a8>>sAFqIFF8#|Q7:@@aHKQQSTE&vhd3NvhV^_"'	
'
8 Kr   c                   t        |       }|d   }g }t               }t               }d}|d   D ]  }|d   }|d   }	|d   }
d| }d}||d	   j                         j                  d
d
      xx   dz  cc<   ||	 dxx   dz  cc<   |
r|dz  }|j	                  i d|d|d   d|d   dddd| dd|d   j                         d	|d	   j                         d|d   d|d   d|d   d|d   d|	d|d   d|d   d|d   d|
d|d   d d||d        t        d |D              }d}t        |      }dt        | j                  t                    |d    ||d!   j                         |d"   d#||||t        t        |j                                     t        t        |j                                     ||d$S )%Ncountr   entriesrt   bitDepthloopzWLK id EXE id fallbackflagsHexr0   r	   z-bitidexeIndexarchivePCMDATA.WLKru   rq   rp   	statusHexr   r6   payloadBytes
sampleRatechannelsgaingainRawdurationSecondszno embedded WLK name)embeddedTitletitleSourceLabeldisplayLabeldisplayLabelSourcec              3  ,   K   | ]  }|d    s	d  ywr   r	   N .0entrys     r   	<genexpr>z summarize_wlk.<locals>.<genexpr>        Ju53IJ   
magicarchiveFlagsHexentrySizeBytesabsent)r   rd   r   r   r   r   titleStorageembeddedTitleCountbrowserCueLabelCountexeIdLabelCountfallbackLabelCount
flagCountsbitDepthCounts	loopCountr   )r   r   lowerr"   rE   sumr   strrelative_toROOTdictsorteditems)rd   manifestr   r   flag_countsbit_depth_counts
loop_countrv   entry_id	bit_depthr   labellabel_sourceembedded_countbrowser_cue_label_countfallback_label_counts                   r   summarize_wlkr      s   %HWE$&G '	K%,YJ9% "
'?:&	f~($(F:&,,.66sC@AQFAI;d+,1,!OJhF:.  =	
 ,xj5 VK0668 F:.446 &* VK0 ~ 6 f\2 I F:. v 6),  !" "6*;#<#$ "&$: %&2+	
"
F JJJNw< D$$T*+'"#$56<<>"#34 , 7/26+"3"3"567v&6&<&<&>?@ r   c                   t        |       }| j                         }|d   }|d   }g }t               }|d   D ]  }|d   }|d   }	|d   }
||	|	|
z    }t        |      }|d}|d   r|d   d	   nd }t        j                  |      }|xs	 |xs d
| }|rdnd}|rdn|rdnd}||d   j                         xx   dz  cc<   |j                  i d|d|d   d|d   dddd| dd|	d|d   d|
d|d   j                         d|d   d|d   d|d   d|d   d|d   d|d   r|d   d	   d   nd d |d!||||d"        t        d# |D              }t        d$ |D              }t        d% |D              }dt        | j                  t                    ||d&   ||d'   d(|||z
  |||D cg c]  }|d    r	|d    c}t        t        |j                                     |d)S c c}w )*Nr   
bodyOffsetr   r   r   r   02drA   r   zMLK id zembedded MIDI titlezno embedded MIDI titlezbrowser cue usage labelr   entryFlagHexr	   r   rt   r   r   ru   r   r   r6   r>   r?   r@   embeddedTrackNamesembeddedTrackNameEventsrB   embeddedTrackNameOffsetHexr   
usageLabel)r   r   r   c              3  ,   K   | ]  }|d    s	d  ywr   r   r   s     r   r   z summarize_mlk.<locals>.<genexpr>A  r   r   c              3  ,   K   | ]  }|d    s	d  yw)r   r	   Nr   r   s     r   r   z summarize_mlk.<locals>.<genexpr>B  s     DEl0CaDr   c              3  2   K   | ]  }|d    dk(  sd  yw)r   r   r	   Nr   r   s     r   r   z summarize_mlk.<locals>.<genexpr>C  s     du59M3NRc3cds   tableOffsetr   z$standard MIDI track-name meta events)r   rd   r   r   r   r   r   r   noEmbeddedTitleCountbrowserCueUsageLabelCountr   noEmbeddedTitleIdsentryFlagCountsr   )r   
read_bytesr   rY   MLK_USAGE_LABELSgetr   rE   r   r   r   r   r   r   r   )rd   r   r   r   	table_endr   r   rv   rh   r   sizer)   midir   embedded_titleusage_labelr   title_sourcer   r   usage_countfallback_countr   s                          r   summarize_mlkr     s   %H??DWE&I$&G '	K9% $
z"!n%vftm,%g.C[26|2Dl+A.$&**84E+E78*1E0>,D\0>,bmE^  tEF>*0023q83hF:.  =	
 ,xj5 & VK0  ~ 6 < < > $x. d<0 D, %d<&8 *40A+B -Y]^oYpd3D.Ea.H.Uvz   !" k#$ %1 %&2)	
$
J JJJNDWDDKdddN D$$T*+."#34>, % 6%0,8?^uu_G]uT{^{'8'8': ;<  _s   4
G-?G-c           	         t        | dz        }t        | dz        }t        |       }t        |       }t	        |      |d<   ||d<   t	        |      |d<   ||d<   dd||ddd	d
dddS )Nr   r   browserRuntimeCueCountbrowserRuntimeCueszaudio title provenancea  PCMDATA.WLK has no embedded effect-name storage, so WLK viewer labels stay as EXE id entries instead of inferred effect names; WLK browser cue names from web/game.html are provenance only, not titles. MIDDATA.MLK stores titles only where the contained MIDI has a track-name meta event.zWLK id NN plus NN.wavu>   PCMDATA.WLK · no embedded WLK name · flag/bit-depth metadataz:embedded MIDI title, usage label, or MLK id NN plus NN.midu;   usage label when present · embedded/no embedded MIDI title)wlkFirstLinewlkMetadataLinemlkFirstLinemlkMetadataLinezOresource-viewer provenance only; does not promote route, battle, or event proof)rv   
conclusionwlkmlkdisplayLabelContractcompletionImpact)r   r   r   r   r   )rb   r   r   wlk_runtime_cuesmlk_runtime_cuess        r   build_summaryr   V  s    
},
-C
},
-C0606$'(8$9C ! 0C$'(8$9C ! 0C*c
 3_X\	!
 n! r   c                    | j                  d      xs i gd   }|sy|j                  d      rdnd}|j                  dd       d|j                  dd       d	| S )
Nr   r   -r8   titler6   z len r7    )r   )r   eventtitle_statuss      r   midi_track_event_labelr  s  sd    YY019bT1=E#ii07gLiiS)*%		(C0H/I<.YYr   c                   | d   j                  dg       D ci c]  }|d   |
 c}dj                  d | d   j                  dg       D              }dj                  d | d   d   D              }dj                  fd	| d   d   D              }dj                  d
 | d   j                  dg       D              }dj                  g dt        j                  | d          d| d   d    d| d   d    d| d   j                  dd       d| d   d    dt        j                  | d   d          d| d   d    d| d   d    d| d   j                  dd       d| d   d    dt        j                  | d   d          d| d| d| d| dt        j                  | d          d      S c c}w )Nr   r   rt   
c              3     K   | ]k  }d t        j                  |d          dt        j                  |d          dt        j                  |d          dt        j                  |d          d	 m y	w
<tr><td>rs   	</td><td>rt   </td><td><code>ru   </code></td><td>rv   
</td></tr>Nhtmlescaper   cues     r   r   zhtml_page.<locals>.<genexpr>}         	{{3u:&' ({{3w<() *[[V-. /{{3x=)* +		   A1A3r   c              3  B  K   | ]  }d t        j                  |d          dt        j                  |d          dt        j                  |d          dt        j                  |d          dt        j                  |d          d|d    d|d	    d
|d   dd  yw)r  r   r  r   r   r   r   r   z-bit r   z Hz</td><td>r   z.3fzs</td></tr>Nr  r   s     r   r   zhtml_page.<locals>.<genexpr>  s       	{{5;'( ){{5012 3{{5!5678 9{{5!3456 7{{5,-. /Z !u\':&; <&', -	s   BBr   c              3    K   | ]  }d t        j                  |d          dt        j                  |d          dt        j                  |d          dt        j                  |d   xs d       dt        j                  t        |             dt        j                  j                  |d   i       j                  d	d             dt        j                  |d
          dt        j                  |d          d  yw)r  r   r  ru   r	  r   r  r   r   rs   r   r   r
  N)r  r  r  r   )r   r   mlk_cues_by_ids     r   r   zhtml_page.<locals>.<genexpr>  s      ;;uT{+, -U6]34 5;;u^456 7;;u_5<=> ?;;5e<=> ?;;~11%+rBFFucRST U;;u%9:;< =;;u%789: ;	s   C?Dc              3     K   | ]k  }d t        j                  |d          dt        j                  |d          dt        j                  |d          dt        j                  |d          d	 m y	wr  r  r  s     r   r   zhtml_page.<locals>.<genexpr>  r  r  r%   a  <!doctype html>
<html lang="ko">
<head>
  <meta charset="utf-8">
  <title>Audio Title Provenance</title>
  <style>
    body { font-family: system-ui, sans-serif; margin: 24px; line-height: 1.5; color: #202124; }
    table { border-collapse: collapse; width: 100%; margin: 16px 0 28px; }
    th, td { border: 1px solid #d7dce2; padding: 6px 8px; text-align: left; }
    th { background: #f4f6f8; }
    code { background: #f4f6f8; padding: 1px 4px; }
  </style>
</head>
<body>
  <h1>Audio Title Provenance</h1>
  <p>r   z</p>
  <h2>Summary</h2>
  <table>
  <thead><tr><th>archive</th><th>entries</th><th>embedded titles</th><th>browser cue provenance</th><th>EXE id fallback entries</th><th>title storage</th></tr></thead>
    <tbody>
      <tr><td>PCMDATA.WLK</td><td>r   r  r   r   r   r   r   z-</td></tr>
      <tr><td>MIDDATA.MLK</td><td>a  </td></tr>
    </tbody>
  </table>
  <h2>Source Boundary</h2>
  <ul>
    <li>WLK effect-name strings are not embedded in <code>PCMDATA.WLK</code>; browser cue keys in <code>web/game.html</code> are runtime provenance only.</li>
    <li>MLK music titles below are extracted from <code>0xFF 0x03</code> MIDI track-name meta events inside each restored <code>.mid</code> payload.</li>
    <li>No <code>.exe</code> file is present in the current workspace, so this report uses the WLK/MLK archives, restored files, and browser runtime code as its evidence.</li>
    <li>Browser cue keys are useful for runtime/debugging, but they are not archive titles.</li>
  </ul>
  <h2>WLK Browser Runtime Cue Provenance</h2>
  <p>These are cue keys from <code>web/game.html</code>, not <code>PCMDATA.WLK</code> title storage.</p>
  <table>
    <thead><tr><th>cue key</th><th>WLK id</th><th>file</th><th>source</th></tr></thead>
    <tbody>z</tbody>
  </table>
  <h2>WLK Numbered Entries</h2>
  <table>
    <thead><tr><th>id</th><th>viewer label</th><th>label source</th><th>title source</th><th>flags</th><th>format</th><th>duration</th></tr></thead>
    <tbody>a  </tbody>
  </table>
  <h2>MLK Extracted MIDI Track Names</h2>
  <table>
    <thead><tr><th>id</th><th>file</th><th>viewer label</th><th>MIDI track-name title</th><th>track-name event</th><th>browser cue</th><th>label source</th><th>title source</th></tr></thead>
    <tbody>a  </tbody>
  </table>
  <h2>MLK Browser Runtime Cue Provenance</h2>
  <p>These are browser music cue keys from <code>web/game.html</code>, not additional archive titles.</p>
  <table>
    <thead><tr><th>cue key</th><th>MLK id</th><th>file</th><th>source</th></tr></thead>
    <tbody>a*  </tbody>
  </table>
  <h2>WLK Cue Provenance Caveat</h2>
  <p>The WLK cue keys above are kept only as runtime provenance. They should not be treated as confirmed effect identities. Manual audition results belong in <code>docs/WLK_SOUND_TITLE_REVIEW.md</code>.</p>
  <h2>Completion Impact</h2>
  <p>r   z</p>
</body>
</html>
)r   joinr  r  )summaryrowwlk_cue_rowswlk_rowsmlk_rowsmlk_cue_rowsr  s         @r   	html_pager  {  s   3:5>3E3EFZ\^3_`Cc'lC'`N99  5>%%&:B? L yy  U^I. H yy  U^I. H 99  5>%%&:B? L; ;  ; kk','();*#;( $+5>'#:";);( <E);( FMU^ThEiDj);( kt);( u|  }B  uC  uG  uG  H`  bc  ud  te);( en);( ov  w|  o}  ~R  oS  nT);( T]);( ^b  ^i  ^i  jq  rw  jx  yG  jH  ^I  ]J);(J#);* $+5>'#:";+;* <E+;* FMU^ThEiDj+;* kt+;* u|  }B  uC  uG  uG  H`  bc  ud  te+;* en+;* ov  w|  o}  ~R  oS  nT+;* T]+;* ^b  ^i  ^i  jq  rw  jx  yG  jH  ^I  ]J+;*J+;F >G;FG;P :Q;PQ;Z :[;Z[;f >g;fg;p kk',-./q;p0q; ;] as   Gc                    |j                  dd       |dz  j                  t        j                  | dd      dz   d	       |d
z  j                  t	        |       d	       y )NT)parentsexist_okzaudio_title_provenance.jsonFr=   )ensure_asciiindentr  r!   r\   audio_title_provenance.html)mkdir
write_textjsondumpsr  )r  out_dirs     r   write_outputsr)    sd    MM$M.,,88

7q9D@ 9  ,,8879KV]8^r   c                 H   t        j                         } | j                  dt        t               | j                  dt        t
               | j                         }t        |j                        }t        ||j                         t        d|j                  dz          y )Nz--root)typedefaultz	--out-dirz wrote audio title provenance -> r#  )argparseArgumentParseradd_argumentr   r   OUT
parse_argsr   rb   r)  r(  print)parserargsr  s      r   mainr5    s    $$&F
tT:
$<DDII&G'4<<(	,T\\<Y-Y,Z
[\r   __main__)r   bytesr   r   returnztuple[int, int])r)   r7  r8  r   )r)   r7  r8  dict[str, Any])rb   r   rc   r   r8  r   )rb   r   r8  zlist[dict[str, Any]])rd   r   r8  r9  )rb   r   r8  r9  )r   r9  r8  r   )r  r9  r8  r   )r  r9  r(  r   r8  None)r8  r:  )$__doc__
__future__r   r-  r  r&  rC   collectionsr   pathlibr   typingr   audio_archive_manifestr   r   __file__resolver  r   r0  r   r   r,   rY   rj   r   r   r   r   r   r  r  r)  r5  __name__r   r   r   <module>rD     s    A "        E H~''*
Ul 

 
	,K\06D=@>B  $ :ZjZ <? _] zF r   