params <-
list(EVAL = FALSE)

## ----setup, eval = TRUE, echo = FALSE, message=FALSE--------------------------

library(knitr)

# create custom printing method
.print_df <- function(x, highlight = NULL, ...) {
  kbl <- kableExtra::kable(
    head(as.data.frame(x)),
    align = "c",
    row.names = F,
    format = "html",
    escape = F
  )
  
  if (!is.null(highlight))
  kbl <- column_spec(kbl, column = which(names(x) %in% highlight), background = "#ccebff", bold = TRUE)
  
  kbl <-
    kableExtra::kable_styling(kbl, bootstrap_options = "striped", font_size = 14)

  
  kbl <-
    kableExtra::scroll_box(kbl, width = "100%", height = "300px")
  
  asis_output(kbl)
}

# register data frame printing method
registerS3method("knit_print", "data.frame", .print_df)

# global option chunks
knitr::opts_chunk$set(
  dpi = 70,
  fig.width = 8,
  fig.height = 4,
  out.width = "100%",
  fig.align = "center",
  message = TRUE,
  warning = TRUE
)


## ----eval = TRUE--------------------------------------------------------------

# load packages
library(viridis)
library(baRulho)
library(Rraven)

# synthesize
synth_est <- baRulho::synth_sounds(
  mar = 0.1,
  frequencies = c(0.5, 1:5),
  durations = 0.1,
  fm = FALSE,
  am = FALSE,
  sampling.rate = 12
)

# convert into a single wave object
synth_wav <- Rraven::exp_est(X = synth_est,
                             single.file = TRUE,
                             wave.object = TRUE)


# plot spectro
seewave::spectro(
  wave = synth_wav,
  scale = FALSE,
  palette = viridis,
  grid = FALSE,
  collevels = seq(-20, 0, 1),
  osc = TRUE,
  colwave = "#31688EB3",
  heights = c(2, 1),
  wl = 100
)


## ----eval = TRUE, echo = TRUE-------------------------------------------------

# synthesize
synth_est2 <- baRulho::synth_sounds(
  mar = 0.01,
  sig2 = 0.05,
  frequencies = 2:4,
  durations = c(0.1, 0.2),
  fm = TRUE,
  am = TRUE,
  shuffle = TRUE,
  seed = 123,
  sampling.rate = 12
)

# convert into a single wave object
synth_wav2 <- Rraven::exp_est(
  X = synth_est2,
  single.file = TRUE,
  path = tempdir(),
  wave.object = TRUE
)

# plot spectro
seewave::spectro(
  synth_wav2,
  tlim = c(0, 2),
  scale = FALSE,
  palette = viridis,
  grid = FALSE,
  collevels = seq(-20, 0, 1),
  osc = TRUE,
  colwave = "#31688EB3",
  heights = c(2, 1),
  wl = 140
)


## ----eval = TRUE--------------------------------------------------------------
# check first 6 rows
head(as.data.frame(synth_est2))

## ----eval = TRUE--------------------------------------------------------------

# check name of wave objects
names(attributes(synth_est2)$wave.objects)


## ----master sound file, eval = TRUE, echo = TRUE, fig.show='hide'-------------

# create master sound file
synth_master_annotations <- baRulho::master_sound_file(
  X = synth_est,
  file.name = "synthetic_master",
  dest.path = tempdir(),
  gap.duration = 0.15
)


## ----spectro master 1, eval = TRUE--------------------------------------------

# read wave file
wave <-
  tuneR::readWave(file.path(tempdir(), "synthetic_master.wav"))

# plot spectrogram
seewave::spectro(
  wave,
  scale = FALSE,
  palette = viridis,
  wl = 150,
  grid = FALSE,
  flim = c(0, 4.7)
)


## ----eval = TRUE, echo = TRUE, fig.show='hide'--------------------------------

# load example data from warbleR
data(list = c(
  "Phae.long1",
  "Phae.long2",
  "Phae.long3",
  "Phae.long4",
  "lbh_selec_table"
))

# save sound files to temporary folder
writeWave(Phae.long1, file.path(tempdir(), "Phae.long1.wav"))
writeWave(Phae.long2, file.path(tempdir(), "Phae.long2.wav"))
writeWave(Phae.long3, file.path(tempdir(), "Phae.long3.wav"))
writeWave(Phae.long4, file.path(tempdir(), "Phae.long4.wav"))

# make an extended selection table
est <- warbleR::selection_table(
  X = lbh_selec_table,
  extended = TRUE,
  confirm.extended = FALSE,
  path = tempdir(),
  pb = FALSE
)

# add sound_id column
est$sound.id <- paste0(abbreviate(est$sound.files), est$selec)

# create master sound file
master_annotations <- baRulho::master_sound_file(
  X = est,
  file.name = "example_master",
  dest.path = tempdir(),
  gap.duration = 0.3
)

## ----spectro master 2, eval = TRUE--------------------------------------------

# read wave file
wave <-
  tuneR::readWave(file.path(tempdir(), "example_master.wav"))

# plot spectrogram
seewave::spectro(
  wave,
  scale = FALSE,
  palette = viridis,
  collevels = seq(-120, 0, 5),
  wl = 500,
  grid = FALSE,
  flim = c(0, 10)
)


## ----eval = TRUE--------------------------------------------------------------

Rraven::exp_raven(master_annotations, path = tempdir(),
                  file.name = "example_master_selection_table")

## -----------------------------------------------------------------------------
knitr::include_graphics("example_master_table.jpg")

## ----eval = TRUE--------------------------------------------------------------

data("master_est")

data("test_sounds_est")


## ----eval = TRUE--------------------------------------------------------------

unique(master_est$sound.files)
unique(test_sounds_est$sound.files)


## -----------------------------------------------------------------------------


# first remove any other wave file in the temporary working directory (dont do it with your data!)
unlink(list.files(
  path = tempdir(),
  full.names = TRUE,
  pattern = ".wav"
))

# save master sound file
writeWave(object = attr(master_est, "wave.objects")[[1]],
          file.path(tempdir(), "master.wav"))

# save test sound files
for (i in unique(test_sounds_est$sound.files)) {
  writeWave(object = attr(test_sounds_est, "wave.objects")[[i]], file.path(tempdir(), i))
}

# make annotations a data frame
master_annotations <- as.data.frame(master_est)

## -----------------------------------------------------------------------------
master_annotations

## ----eval = TRUE--------------------------------------------------------------

markers_position <-
  baRulho::find_markers(X = master_annotations, path = tempdir())

markers_position

## ----eval = TRUE--------------------------------------------------------------

# lower window length
markers_position <-
  baRulho::find_markers(X = master_annotations,
                        hop.size = 4,
                        path = tempdir())

markers_position


## ----eval = TRUE--------------------------------------------------------------

aligned_tests <-
  baRulho::align_test_files(
    X = master_annotations,
    Y = markers_position,
    by.song = TRUE,
    remove.markers = FALSE,
    path = tempdir()
  )

## ----eval = TRUE--------------------------------------------------------------

is.data.frame(aligned_tests)

aligned_tests

## ----eval = TRUE--------------------------------------------------------------

aligned_imgs <- baRulho::plot_aligned_sounds(
  X = aligned_tests,
  path = tempdir(),
  dest.path = tempdir(),
  duration = 2.4,
  ovlp = 0
)

aligned_imgs


## ----echo = FALSE-------------------------------------------------------------

# try to copy files to man/figures
# fc <- file.copy(from = aligned_imgs[1:2], 
#           to = file.path("../man/figures", basename(aligned_imgs[c(1, 4)])))

fc <- file.copy(from = aligned_imgs[c(1, 4)], 
          to = file.path("../vignettes", basename(aligned_imgs[c(1, 4)])),overwrite = TRUE)


## ----echo=FALSE---------------------------------------------------------------

knitr::include_graphics(basename(aligned_imgs[1]))

knitr::include_graphics(basename(aligned_imgs[4]))


## ----eval = FALSE-------------------------------------------------------------
#  
#  baRulho::manual_realign(
#    X = aligned_tests,
#    Y = master_annotations,
#    duration = 2.4,
#    path = tempdir()
#  )
#  

## ----eval = TRUE, echo=FALSE--------------------------------------------------

knitr::include_graphics("manual_realign.gif")


## ----eval = TRUE--------------------------------------------------------------

  data("test_sounds_est")
  data("master_est")
  
  # create "unaligned_test_sounds_est" by
  # adding error to "test_sounds_est" start and end
  unaligned_test_sounds_est <- test_sounds_est
  set.seed(123)
  noise_time <- sample(c(0.009, -0.01, 0.03, -0.03, 0, 0.07, -0.007),
  nrow(unaligned_test_sounds_est),
  replace = TRUE)
  
  attr(unaligned_test_sounds_est, "check.res")$start <- 
  unaligned_test_sounds_est$start <- 
  unaligned_test_sounds_est$start + noise_time
  attr(unaligned_test_sounds_est, "check.res")$end <- 
  unaligned_test_sounds_est$end  <- 
  unaligned_test_sounds_est$end + noise_time
  

## ----eval = TRUE--------------------------------------------------------------

#re align
rts <- auto_realign(X = unaligned_test_sounds_est, Y = master_est)


## ----eval = FALSE, echo = FALSE-----------------------------------------------
#  
#  # thsi code creates the images use to create the gif shown below
#  # rename sound files so aligned and unaligned sounds are intercalated
#  unalg <-
#    warbleR::rename_waves_est(
#      playback_est_unaligned,
#      playback_est_unaligned$sound.files,
#      new.selec = seq(1, 200, by = 2)[1:nrow(playback_est_unaligned)]
#    )
#  alg <-
#    warbleR::rename_waves_est(playback_est_aligned,
#                     playback_est_aligned$sound.files,
#                     new.selec = seq(2, 200, by = 2)[1:nrow(playback_est_aligned)])
#  
#  # add label
#  unalg$type <- "Before aligning"
#  alg$type <- "After aligning"
#  
#  # put together in a single ext sel tab
#  unalg.alg <- rbind(unalg, alg)
#  
#  # create spectrograms
#  warbleR::spectrograms(
#    unalg.alg[unalg.alg$sound.id != "ambient",],
#    dest.path = tempdir(),
#    res = 100,
#    wl = 300,
#    title.labels = "type",
#    sel.labels = NULL
#  )

## ----session info, echo=F-----------------------------------------------------

sessionInfo()


