Slide 1

Slide 1 text

!J04%$%BZ J5VOFTɾ͓΅͍͑ͯ·͔͢ ʙ4DSJQUJOH#SJEHFࠓੲ෺ޠʙ

Slide 2

Slide 2 text

Slide 3

Slide 3 text

No content

Slide 4

Slide 4 text

No content

Slide 5

Slide 5 text

#SFBLJOHDIBOHFTJO.VTJDBQQ *ONZDBTF w 4PNFBSUXPSLIBTOPMPOHFSCFFOSFDPHOJ[FE w 4PSUSF fl FDUJPOGVODUJPOTBSFPCTPMFUFE w (FOSFTBSFPWFSXSJUUFOCZ"QQMF.VTJD XPQFSNJTTJPO w FUD

Slide 6

Slide 6 text

#SFBLJOHDIBOHFTJO.VTJDBQQ *ONZDBTF w 4PNFBSUXPSLIBTOPMPOHFSCFFOSFDPHOJ[FE w 4PSUSF fl FDUJPOGVODUJPOTBSFPCTPMFUFE w (FOSFTBSFPWFSXSJUUFOCZ"QQMF.VTJD XPQFSNJTTJPO w FUD 😱

Slide 7

Slide 7 text

4PNFBSUXPSLIBTOPMPOHFSCFFOSFDPHOJ[FE 4BNFEBUB🤔

Slide 8

Slide 8 text

)PXUPGJYJU

Slide 9

Slide 9 text

4DSJQUJOH#SJEHF

Slide 10

Slide 10 text

4DSJQUJOH#SJEHF w 4DSJQUJOH#SJEHFJTBUFDIOPMPHZUIBUMFUTZPVDPOUSPMTDSJQUBCMF "QQMFBOEUIJSEQBSUZBQQMJDBUJPOTVTJOHTUBOEBSE0CKFDUJWF$TZOUBY w *OUSPEVDFEJO049 -FPQBSE w %ZOBNJDBMMZJNQMFNFOUTBO0CKFDUJWF$CSJEHFUP04"DPNQMJBOU BQQMJDBUJPOT w 04"0QFO4DSJQUJOH"SDIJUFDUVSF

Slide 11

Slide 11 text

.VTJDBQQ .VTJDTEFG .VTJDI TEFG TEQ ˞TEFGTDSJQUJOHEF fi OJUJPOFYUSBDUPS TEQTDSJQUJOHEF fi OJUJPOQSPDFTTPS

Slide 12

Slide 12 text

.VTJDBQQ .VTJDI .Z"QQ

Slide 13

Slide 13 text

.VTJDI /* * Music.h */ #import #import @class MusicApplication, MusicItem, MusicAirPlayDevice, MusicArtwork, MusicEncoder, MusicEQPreset, MusicPlaylist, MusicAudioCDPlaylist, MusicLibraryPlaylist, MusicRadioTunerPlaylist, MusicSource, MusicSubscriptionPlaylist, MusicTrack, MusicAudioCDTrack, MusicFileTrack, MusicSharedTrack, MusicURLTrack, MusicUserPlaylist, MusicFolderPlaylist, MusicVisual, MusicWindow, MusicBrowserWindow, MusicEQWindow, MusicMiniplayerWindow, MusicPlaylistWindow, MusicVideoWindow; enum MusicEKnd { MusicEKndTrackListing = 'kTrk' /* a basic listing of tracks within a playlist */, MusicEKndAlbumListing = 'kAlb' /* a listing of a playlist grouped by album */, MusicEKndCdInsert = 'kCDi' /* a printout of the playlist for jewel case inserts */ }; typedef enum MusicEKnd MusicEKnd; enum MusicEnum { MusicEnumStandard = 'lwst' /* Standard PostScript error handling */, MusicEnumDetailed = 'lwdt' /* print a detailed report of PostScript errors */ }; typedef enum MusicEnum MusicEnum; enum MusicEPlS { MusicEPlSStopped = 'kPSS', MusicEPlSPlaying = 'kPSP', MusicEPlSPaused = 'kPSp', MusicEPlSFastForwarding = 'kPSF', MusicEPlSRewinding = 'kPSR' }; typedef enum MusicEPlS MusicEPlS;

Slide 14

Slide 14 text

.VTJDI /* * Music Suite */ // The application program @interface MusicApplication : SBApplication - (SBElementArray *) playlists; - (SBElementArray *) sources; - (SBElementArray *) tracks; @property (copy, readonly) MusicPlaylist *currentPlaylist; // the playlist containing the currently targeted track @property (copy, readonly) MusicTrack *currentTrack; // the current targeted track @property BOOL fullScreen; // is the application using the entire screen? @property (copy, readonly) NSString *name; // the name of the application @property BOOL mute; // has the sound output been muted? @property double playerPosition; // the player’s position within the currently playing track in seconds. @property (readonly) MusicEPlS playerState; // is the player stopped, paused, or playing? @property BOOL shuffleEnabled; // are songs played in random order? @property MusicEShM shuffleMode; // the playback shuffle mode @property MusicERpt songRepeat; // the playback repeat mode @property NSInteger soundVolume; // the sound output volume (0 = minimum, 100 = maximum) @property (copy, readonly) NSString *version; // the version of the application - (void) run; // Run the application - (void) quit; // Quit the application - (void) backTrack; // reposition to beginning of current track or go to previous track if already at start of current track - (void) fastForward; // skip forward in a playing track - (void) nextTrack; // advance to the next track in the current playlist - (void) pause; // pause playback - (void) playOnce:(BOOL)once; // play the current track or the specified track or file. - (void) playpause; // toggle the playing/paused state of the current track - (void) previousTrack; // return to the previous track in the current playlist - (void) resume; // disable fast forward/rewind and resume playback, if playing. - (void) stop; // stop playback @end

Slide 15

Slide 15 text

.VTJDI @property (copy, readonly) MusicTrack *currentTrack; // the current targeted track

Slide 16

Slide 16 text

.VTJDI // playable audio source @interface MusicTrack : MusicItem - (SBElementArray *) artworks; @property (copy) NSString *album; // the album name of the track @property (copy) NSString *albumArtist; // the album artist of the track @property (copy) NSString *artist; // the artist/source of the track @property (copy) NSString *composer; // the composer of the track @property NSInteger discCount; // the total number of discs in the source album @property NSInteger discNumber; // the index of the disc containing this track on the source album @property (copy) NSString *genre; // the music/audio genre (category) of the track @property (copy) NSString *lyrics; // the lyrics of the track @property (copy) NSString *sortAlbum; // override string to use for the track when sorting by album @property (copy) NSString *sortArtist; // override string to use for the track when sorting by artist @property (copy) NSString *sortAlbumArtist; // override string to use for the track when sorting by album artist @property (copy) NSString *sortName; // override string to use for the track when sorting by name @property (copy) NSString *sortComposer; // override string to use for the track when sorting by composer @property NSInteger trackCount; // the total number of tracks on the source album @property NSInteger trackNumber; // the index of the track on the source album @property NSInteger year; // the year the track was recorded/released @end // a track representing an audio file (MP3, AIFF, etc.) @interface MusicFileTrack : MusicTrack @property (copy) NSURL *location; // the location of the file represented by this track - (void) refresh; // update file track information from the current information in the track’s file @end

Slide 17

Slide 17 text

3FTUPSF"SUXPSL 4BNFEBUB🤔

Slide 18

Slide 18 text

3FTUPSF"SUXPSL func restoreArtwork(for track: MusicTrack) { guard let artworks = track.artworks?() else { return } artworks.lazy .compactMap { $0 as? MusicArtwork } .forEach { artwork in guard let data = artwork.data else { return } artwork.setData?(data) } }

Slide 19

Slide 19 text

%FNP

Slide 20

Slide 20 text

No content

Slide 21

Slide 21 text

'JO 🤔

Slide 22

Slide 22 text

$POWFSU0CK$IFBEFSUP4XJGU

Slide 23

Slide 23 text

$POWFSU0CK$IFBEFSUP4XJGU 3FRVJSFNFOUT w $MBOH4XJGU w 4XJGUXSBQQFSGPSMJCDMBOH w IUUQTHJUIVCDPNMMWNTXJGU$MBOH4XJGU w TXJGUTZOUBY w IUUQTHJUIVCDPNTXJGUMBOHTXJGUTZOUBY

Slide 24

Slide 24 text

$POWFSU0CK$IFBEFSUP4XJGU MJCDMBOH .VTJDI

Slide 25

Slide 25 text

$POWFSU0CK$IFBEFSUP4XJGU MJCDMBOH

Slide 26

Slide 26 text

$POWFSU0CK$IFBEFSUP4XJGU MJCDMBOH

Slide 27

Slide 27 text

$POWFSU0CK$IFBEFSUP4XJGU MJCDMBOH 5SBOTMBUJPO6OJU

Slide 28

Slide 28 text

$POWFSU0CK$IFBEFSUP4XJGU TXJGUTZOUBY

Slide 29

Slide 29 text

$POWFSU0CK$IFBEFSUP4XJGU TXJGUTZOUBY

Slide 30

Slide 30 text

$POWFSU0CK$IFBEFSUP4XJGU TXJGUTZOUBY

Slide 31

Slide 31 text

$POWFSU0CK$IFBEFSUP4XJGU TXJGUTZOUBY .VTJDTXJGU

Slide 32

Slide 32 text

.VTJDTXJGU // MARK: MusicTrack @objc public protocol MusicTrack: MusicItem { @objc optional func artworks() -> SBElementArray @objc optional var album: String { get } // the album name of the track @objc optional var albumArtist: String { get } // the album artist of the track @objc optional var artist: String { get } // the artist/source of the track @objc optional var composer: String { get } // the composer of the track @objc optional var discCount: Int { get } // the total number of discs in the source album @objc optional var discNumber: Int { get } // the index of the disc containing this track on the source album @objc optional var genre: String { get } // the music/audio genre (category) of the track @objc optional var lyrics: String { get } // the lyrics of the track @objc optional var sortAlbum: String { get } // override string to use for the track when sorting by album @objc optional var sortArtist: String { get } // override string to use for the track when sorting by artist @objc optional var sortAlbumArtist: String { get } // override string to use for the track when sorting by album artist @objc optional var sortName: String { get } // override string to use for the track when sorting by name @objc optional var sortComposer: String { get } // override string to use for the track when sorting by composer @objc optional var trackCount: Int { get } // the total number of tracks on the source album @objc optional var trackNumber: Int { get } // the index of the track on the source album @objc optional var year: Int { get } // the year the track was recorded/released @objc optional func setAlbum(_ album: String) // the album name of the track @objc optional func setAlbumArtist(_ albumArtist: String) // the album artist of the track @objc optional func setAlbumDisliked(_ albumDisliked: Bool) // is the album for this track disliked? @objc optional func setAlbumFavorited(_ albumFavorited: Bool) // is the album for this track favorited? @objc optional func setAlbumRating(_ albumRating: Int) // the rating of the album for this track (0 to 100) @objc optional func setArtist(_ artist: String) // the artist/source of the track @objc optional func setComposer(_ composer: String) // the composer of the track @objc optional func setDiscCount(_ discCount: Int) // the total number of discs in the source album @objc optional func setDiscNumber(_ discNumber: Int) // the index of the disc containing this track on the source album @objc optional func setGenre(_ genre: String) // the music/audio genre (category) of the track @objc optional func setLyrics(_ lyrics: String) // the lyrics of the track @objc optional func setSortAlbum(_ sortAlbum: String) // override string to use for the track when sorting by album @objc optional func setSortArtist(_ sortArtist: String) // override string to use for the track when sorting by artist @objc optional func setSortAlbumArtist(_ sortAlbumArtist: String) // override string to use for the track when sorting by album artist @objc optional func setSortName(_ sortName: String) // override string to use for the track when sorting by name @objc optional func setSortComposer(_ sortComposer: String) // override string to use for the track when sorting by composer @objc optional func setTrackCount(_ trackCount: Int) // the total number of tracks on the source album @objc optional func setTrackNumber(_ trackNumber: Int) // the index of the track on the source album @objc optional func setYear(_ year: Int) // the year the track was recorded/released } extension SBObject: MusicTrack {}

Slide 33

Slide 33 text

No content

Slide 34

Slide 34 text

'JO

Slide 35

Slide 35 text

$PODMVTJPO w .VTJDBQQCSPLFZFBSTPMEMJCSBSZ🫠 w 3FDPWFSZJTOPXJOTJHIUXJUI4DSJQUJOH#SJEHF w 4DSJQUJOH#SJEHFDBODSFBUFBGFBUVSFUIBUOPUJODMVEFEJO"QQ 4UBOEBSE w 4DSJQUJOH#SJEHFNBZQSPWJEFUIFTPMVUJPOUIBUTVJUVTFWFSZOFFE w 3FNFNCFSJ5VOFT

Slide 36

Slide 36 text

3FNFNCFSJ5VOFT

Slide 37

Slide 37 text

IUUQTHJUIVCDPN,*4DSJQUJOH#SJEHF(FO

Slide 38

Slide 38 text

TFMGEFTDSJQUJPO struct Me { let name = "Takuhiro Muta" let aka = "417.72KI" let twitter = "417_72ki" let qiita = "417_72ki" let gitHub = "417-72KI" let oss = [ "MockUserDefaults", "MultipartDataParser", "BuildConfig.swift", ] let community = [ "love-swift", "potatotips", "Chiba.swift", ] }

Slide 39

Slide 39 text

"QQFOEJY IUUQTDIJCBTXJGUDPOOQBTTDPNFWFOU